이번 글은 코드잇 강의를 수강하면서 배운 내용을 주로 하여 정리되어 있습니다. (코드잇 스프린트 데이터 애널리스트 트랙 1기 훈련생)
그룹별로 분석하기
Groupby
Pandas의 groupby는 데이터프레임의 데이터를 특정 기준으로 그룹화하고, 그룹별로 요약 통계나 다른 연산을 수행할 수 있는 매우 유용한 기능입니다.
groupby를 사용하려면, 먼저 데이터프레임을 특정 열을 기준으로 그룹화합니다.
그런 다음, 각 그룹에 대해 집계 함수(예: 합계, 평균, 개수 등)를 적용할 수 있습니다.
자주 사용하는 집계 함수
- sum() : 그룹별 합계를 계산합니다.
- mean() : 그룹별 평균을 계산합니다.
- count() : 그룹별 항목 수를 계산합니다.
- max(), min() : 그룹별 최대값과 최소값을 계산합니다.
import pandas as pd
data = {
'카테고리': ['A', 'B', 'A', 'B', 'A', 'B'],
'값': [10, 20, 30, 40, 50, 60]
}
df = pd.DataFrame(data)
# 카테고리 열을 기준으로 그룹화하고, 각 그룹의 값 열에 대해 개수를 계산하기
grouped_count = df.groupby('카테고리').count()
# 카테고리 열을 기준으로 그룹화하고, 각 그룹의 값이 몇개씩인지 확인하기
df.groupby('카테고리').size()
# 각 그룹의 값 열에 대해 최솟값을 계산하기(파라미터를 주지 않는 경우, 숫자 데이터 뿐만 아니라 문자열까지 오름차순에 따라 최솟값이 결과로 출력됨)
grouped_min = df.groupby('카테고리').min()
# 각 그룹의 값 열에 대해 숫자 데이터만 요약해서 최솟값을 계산하기
grouped_min = df.groupby('카테고리').min(numeric_only=True)
# 각 그룹의 값 열에 대해 숫자 데이터만 요약해서 최댓값을 계산하기
grouped_max = df.groupby('카테고리').max(numeric_only=True)
# 각 그룹의 값 열에 대해 숫자 데이터만 요약해서 평균을 계산하기
grouped_mean = df.groupby('카테고리').mean(numeric_only=True)
# 각 그룹의 값 열에 대해 숫자 데이터만 요약해서 합계를 계산하기
grouped_sum = df.groupby('카테고리').sum(numeric_only=True)
print(grouped_sum)
''' 출력결과 :
카테고리 값
A 90
B 120
'''
data = {
'카테고리': ['A', 'B', 'A', 'B', 'A', 'B'],
'값1': [10, 20, 30, 40, 50, 60]
'값2': [15, 25, 35, 45, 55, 65]
}
df = pd.DataFrame(data)
# 각 그룹의 특정 값 열에 대한 평균을 계산하기
df.groupby('카테고리')['값2'].sum()
이와 같이 groupby는 데이터를 그룹화하고 그룹별로 다양한 연산을 수행할 때 매우 유용합니다.
더 복잡한 분석을 할 때에도 groupby를 활용하여 데이터를 효과적으로 요약하고 분석할 수 있습니다.
Category 데이터 타입 다루기
Pandas의 category 데이터 타입은 범주형 데이터를 표현하는 데 사용됩니다. 범주형 데이터는 제한된 범위 내에서 몇 가지 값을 가지는 데이터를 의미합니다. 예를 들어, 옷 사이즈(XS, S, M, L, XL)나 혈액형(A형, B형, O형, AB형) 등이 있습니다.
Category 타입의 특징과 장점
- 메모리 사용량 감소: Category 타입은 메모리를 적게 사용합니다.
- 순서 지정 가능: 범주에 순서를 매길 수 있습니다.
import pandas as pd
clothes_df = pd.DataFrame({
'size': ['L', 'S', 'XS', 'L', 'S', 'XL', 'L', 'S', 'M', 'XS',
'M', 'M', 'XS', 'L', 'XL', 'XS', 'M', 'S', 'L', 'XL'],
'sales': [130, 200, 120, 120, 140, 160, 190, 90, 110, 100,
150, 180, 100, 200, 80, 140, 150, 90, 80, 130]
})
기본적으로 object 타입인 category 컬럼은 알파벳 순으로 정렬됩니다.
sorted_data = data.sort_values(by='category')
grouped_data = data.groupby('category').mean()
Category 타입으로 변환
pd.Categorical() 함수를 사용하여 category 컬럼을 category 타입으로 변환하고 순서를 지정할 수 있습니다.
data['category'] = pd.Categorical(data['category'],
ordered=True,
categories=['XS', 'S', 'M', 'L', 'XL'])
Category 타입을 적용하면 지정한 순서대로 정렬됩니다.
# 오름차순 정렬
sorted_data = data.sort_values(by='category')
# groupby 결과
grouped_data = data.groupby('category').mean()
- category 타입을 사용하면 범주형 데이터의 메모리 사용량을 줄이고, 데이터의 순서를 지정하여 정렬, groupby, 그래프 등을 더욱 의미 있게 표현할 수 있습니다.
- 예시에서는 범주형 데이터를 category 타입으로 변환하여 원하는 순서대로 정렬하고 시각화하는 방법을 보여주었습니다.
Groupby와 멀티 인덱스
멀티 인덱스는 여러 수준의 인덱스를 사용하여 데이터 프레임을 계층적으로 구성할 수 있게 해줍니다.
이 기능은 데이터 분석에서 매우 유용하게 사용됩니다.
Groupby
groupby는 데이터 프레임을 지정한 열을 기준으로 그룹화하고, 그룹별로 집계 함수(예: mean, sum, count 등)를 적용할 수 있습니다. groupby는 다음 단계를 포함합니다:
- Splitting: 데이터를 특정 기준에 따라 그룹으로 나눕니다.
- Applying: 각 그룹에 함수(예: 집계, 변환, 필터링 등)를 적용합니다.
- Combining: 결과를 하나의 데이터 프레임으로 결합합니다.
import pandas as pd
# 예시 데이터 생성
data = {
'city': ['Seoul', 'Busan', 'Seoul', 'Busan', 'Seoul', 'Incheon'],
'year': [2020, 2020, 2021, 2021, 2022, 2022],
'population': [9.7, 3.4, 9.8, 3.5, 9.9, 3.6]
}
df = pd.DataFrame(data)
# year 기준으로 그룹화하고, population의 평균을 계산
grouped_df = df.groupby('year').mean()
print(grouped_df)
멀티 인덱스
멀티 인덱스는 데이터 프레임에 여러 수준의 인덱스를 추가하여 데이터를 계층적으로 구성할 수 있게 해줍니다.
이를 통해 데이터를 더 효율적으로 관리하고 분석할 수 있습니다.
# city와 year 기준으로 그룹화하고, population의 합계를 계산
multi_grouped_df = df.groupby(['city', 'year']).sum()
print(multi_grouped_df)
# 멀티 인덱스 데이터 프레임
print(multi_grouped_df.index)
Groupby와 멀티 인덱스의 결합 사용
groupby로 생성된 결과는 멀티 인덱스를 포함할 수 있습니다. 멀티 인덱스를 사용하면 더 복잡한 계층적 데이터를 쉽게 다룰 수 있습니다.
# city와 year 기준으로 그룹화하고, population의 평균을 계산
multi_grouped_df = df.groupby(['city', 'year']).mean()
# 순서를 바꿔 year와 city 기준으로 그룹화하고, population의 평균을 계산
multi_grouped_df = df.groupby(['year', 'city']).mean()
# year와 city 기준으로 그룹화하고, population의 평균을 계산하고 2020년의 결과만 가져오기
multi_grouped_df = df.groupby(['year', 'city']).mean().loc[2020]
# year와 city 기준으로 그룹화하고, population의 평균을 계산하고 2020년과 seoul의 결과만 가져오기
multi_grouped_df = df.groupby(['year', 'city']).mean().loc[2020, 'Seoul']
# year와 city 기준으로 그룹화하고, population의 평균을 계산하고 2020년과 seoul과 busan의 결과만 가져오기
multi_grouped_df = df.groupby(['year', 'city']).mean().loc[(2020, ['Seoul', 'Busan']), :]
# 멀티 인덱스 데이터 프레임
print(multi_grouped_df)
다양한 통계값 계산하기
pandas에서 또한 groupby와 agg 집계 함수를 이용하여 다양한 통계값 계산을 할 수 있는데, 밑에서 이 방법에 대해 설명하겠습니다.
groupby와 agg()를 활용하여 여러 통계값을 한 번에 계산하는 방법들
import pandas as pd
# 예시 데이터프레임 생성
data = {
'Category': ['A', 'A', 'B', 'B', 'C', 'C', 'A', 'B', 'C', 'A'],
'SubCategory': ['X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'X', 'Y', 'Y'],
'Values': [10, 15, 10, 20, 30, 25, 5, 15, 35, 25],
'Scores': [100, 85, 75, 90, 95, 80, 60, 70, 85, 95]
}
df = pd.DataFrame(data)
# Category별로 그룹화하여 Values의 평균 계산하기
df.groupby('Category')['Values'].agg('mean')
# Category별로 그룹화하여 Values의 평균, 최댓값, 최솟값 계산하기
df.groupby('Category')['Values'].agg(['mean', 'max', 'min'])
# groupby와 agg()를 활용하여 여러 통계값 계산하기
df.groupby(['Category', 'SubCategory'].agg({'Values': ['mean', 'sum', 'std'], 'Scores': ['mean', 'max', 'min']})
피벗테이블
피벗 테이블(Pivot Table)은 데이터를 요약하고 분석하는 데 매우 유용한 도구입니다.
피벗 테이블을 사용하면 데이터의 특정 열을 기준으로 그룹화하여 다양한 요약 통계(평균, 합계, 개수 등)를 계산할 수 있습니다.
Pandas에서는 pivot_table 함수를 사용하여 피벗 테이블을 생성할 수 있습니다.
기본 사용법
pivot_table 함수는 다음과 같은 주요 매개변수를 가집니다:
- data: 피벗 테이블을 생성할 데이터프레임
- values: 요약할 데이터 열
- index: 행 인덱스로 사용할 열
- columns: 열 인덱스로 사용할 열 (선택 사항)
- aggfunc: 집계 함수 (기본값은 'mean')
Pivot Table를 만들고 다루기
import pandas as pd
# 예시 데이터프레임 생성
data = {
'Category': ['A', 'A', 'B', 'B', 'C', 'C', 'A', 'B', 'C', 'A'],
'SubCategory': ['X', 'Y', 'X', 'Y', 'X', 'Y', 'X', 'X', 'Y', 'Y'],
'nums': [10, 15, 10, 20, 30, 25, 5, 15, 35, 25],
'Scores': [100, 85, 75, 90, 95, 80, 60, 70, 85, 95]
}
df = pd.DataFrame(data)
# 데이터프레임에서 피벗 테이블 생성하기 (집계 함수를 지정해주지 않으면 디폴트로 평균이 산출됨)
pd.pivot_table(df, values=='nums', index='Category', columns='SubCategory')
# 데이터프레임에서 최대값으로 집계된 값이 구성된 피벗 테이블 생성하기
pd.pivot_table(df, values=='nums', index='Category', columns='SubCategory', aggfunc='max')
원하는 시간 간격으로 묶기
Pandas의 resample 함수는 시간 시계열 데이터를 지정한 시간 간격으로 묶어 요약 통계값을 계산하는 데 매우 유용한 도구입니다.
resample은 주로 시간 기반 인덱스를 가진 데이터프레임이나 시리즈에서 사용되며, 데이터의 빈도를 재조정하거나 요약할 때 사용됩니다.
기본 사용법
resample 함수는 주로 시간 시계열 데이터에 적용됩니다. 예를 들어, 일별 데이터를 월별 데이터로 변환할 수 있습니다.
- 예시 데이터 생성
import pandas as pd
date_rng = pd.date_range(start='2022-01-01', end='2023-01-10', freq='D')
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = pd.Series([1, 3, 5, 2, 8, 6, 7, 8, 5, 2])
df = df.set_index('date')
print(df)
- 시간 간격으로 재샘플링
# 주별 합계 계산
weekly_sum = df.resample('W').sum(numeric_omly=True)
print(weekly_sum)
# 주별 평균 계산
weekly_mean = df.resample('W').mean(numeric_omly=True)
print(weekly_mean)
# 주별 최대값 계산
weekly_max = df.resample('W').max(numeric_omly=True)
print(weekly_max)
# 여러 집계 함수 적용
weekly_agg = df.resample('W').agg(['mean', 'sum', 'max'])
print(weekly_agg)
# 연도별 합계 계산
weekly_sum = df.resample('Y').sum(numeric_omly=True)
print(weekly_sum)
다양한 시간 간격
resample에서 사용할 수 있는 시간 간격은 매우 다양합니다.
- 'D': 일별
- 'W': 주별
- 'M': 월별
- 'Q': 분기별
- 'Y': 연별
- 'H': 시간별
- 'T' 또는 'min': 분별
- 'S': 초별
이번 글에서는 그룹별로 분석하기 / groupby / category 데이터 타입 / groupby와 멀티 인덱스 / 다양한 통계값 계산하기 / 피벗테이블 / resample이 포함된 내용을 정리했으며, 파이썬에서 데이터 분석을 하거나 프로그래밍을 하는 사람들에게 알아두면 유용한 개념들로 이번 기회를 통해 다른 분들도 정리하면 좋을 것 같습니다.
글 읽어주셔서 감사합니다.
출처 및 참고자료 : 코드잇 사이트 강의 'DataFrame 마스터하기' https://www.codeit.kr/topics/mastering-dataframe
'프로그래밍 언어 > Python' 카테고리의 다른 글
[파이썬 개념 정리 18] scipy 라이브러리 (0) | 2024.08.02 |
---|---|
[파이썬 개념 정리 17] scikit-learn 라이브러리 (0) | 2024.08.02 |
[파이썬 개념 정리 15] Pandas의 DataFrame 마스터하기 5️⃣ (데이터 합치기) (0) | 2024.08.01 |
[파이썬 개념 정리 14] Pandas의 DataFrame 마스터하기 4️⃣ (날짜와 시간 데이터 다루기) (0) | 2024.07.31 |
[파이썬 개념 정리 13] Pandas의 DataFrame 마스터하기 3️⃣ (문자 데이터 가공하기, 숫자 데이터 가공하기) (0) | 2024.07.29 |
데이터 분석을 공부하고 카페를 열심히 돌아다니는 이야기
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!