데이터 분석에서 가장 자주 필요한 작업 중 하나는 데이터의 구조를 변환하는 것입니다. 특히 데이터를 재구성하여 다른 관점에서 볼 수 있게 하는 피벗팅(pivoting)은 매우 유용한 기술입니다. 이번 포스트에서는 pandas의 groupby 메서드를 활용하여 데이터를 효과적으로 피벗팅하는 방법에 대해 알아보겠습니다.
1. 피벗팅이란?
피벗팅은 데이터의 행과 열을 재구성하여 데이터를 다른 관점에서 보는 기술입니다. 엑셀의 피벗 테이블과 유사한 개념으로, 원본 데이터를 집계하고 요약하여 새로운 형태로 표현합니다.
2. pandas의 groupby 소개
groupby는 pandas에서 데이터를 그룹화하는 핵심 메서드입니다. SQL의 GROUP BY 절과 비슷한 기능을 수행하며, 데이터를 특정 열이나 조건에 따라 그룹화하고 집계할 수 있습니다.
import pandas as pd
import numpy as np
# 샘플 데이터 생성
data = {
'날짜': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-03'],
'지역': ['서울', '부산', '서울', '부산', '서울'],
'제품': ['A', 'B', 'A', 'B', 'A'],
'판매량': [100, 150, 200, 100, 300],
'수익': [1000, 1500, 2000, 1000, 3000]
}
df = pd.DataFrame(data)
print(df)
3. groupby를 활용한 기본 피벗팅
groupby를 사용한 기본적인 피벗팅은 다음과 같이 수행할 수 있습니다:
# 지역과 제품별 판매량 합계 계산
pivoted = df.groupby(['지역', '제품'])['판매량'].sum()
print(pivoted)
# 인덱스 리셋하여 테이블 형태로 변환
pivoted_reset = pivoted.reset_index()
print(pivoted_reset)
# unstack() 메서드를 사용하여 피벗 테이블 형태로 변환
pivoted_table = pivoted.unstack()
print(pivoted_table)
여기서 unstack()
메서드는 다중 인덱스의 가장 안쪽 레벨을 열로 변환합니다. 이를 통해 전형적인 피벗 테이블 형태를 얻을 수 있습니다.
4. 다양한 집계 함수 적용하기
groupby와 함께 다양한 집계 함수를 사용하여 더 풍부한 분석이 가능합니다:
# 여러 집계 함수 동시에 적용
result = df.groupby(['지역', '제품']).agg({
'판매량': ['sum', 'mean', 'count'],
'수익': ['sum', 'mean']
})
print(result)
# 사용자 정의 집계 함수 적용
def range_calc(x):
return x.max() - x.min()
custom_agg = df.groupby('지역').agg({
'판매량': ['sum', range_calc],
'수익': ['mean', 'std']
})
print(custom_agg)
5. 다중 인덱스 처리하기
groupby 결과는 종종 다중 인덱스(MultiIndex)를 갖습니다. 이를 효과적으로 처리하는 방법을 알아보겠습니다:
# 다중 인덱스 결과 생성
multi_index_result = df.groupby(['날짜', '지역', '제품']).sum()
print(multi_index_result)
# 특정 레벨 인덱스를 기준으로 unstack
result_unstack_level0 = multi_index_result.unstack(level=0) # 날짜를 열로
print(result_unstack_level0)
result_unstack_level1 = multi_index_result.unstack(level=1) # 지역을 열로
print(result_unstack_level1)
# 여러 레벨 동시에 unstack
result_unstack_multiple = multi_index_result.unstack(level=[0, 1]) # 날짜와 지역을 열로
print(result_unstack_multiple)
6. pivot_table vs groupby
pandas에는 pivot_table()
함수도 있습니다. 이는 groupby와 unstack을 결합한 것과 유사한 결과를 제공합니다:
# pivot_table 사용
pivot_result = pd.pivot_table(
df,
values='판매량',
index='지역',
columns='제품',
aggfunc='sum'
)
print(pivot_result)
# groupby + unstack과 비교
groupby_unstack = df.groupby(['지역', '제품'])['판매량'].sum().unstack()
print(groupby_unstack)
# 두 결과 비교
print("두 결과는 동일한가?", pivot_result.equals(groupby_unstack))
일반적으로:
pivot_table
은 더 간결한 구문을 제공합니다.groupby
+unstack
은 더 유연하고 세밀한 제어가 가능합니다.
7. 실전 예제
이제 좀 더 실용적인 예제를 살펴보겠습니다:
# 더 복잡한 데이터셋 생성
np.random.seed(42)
dates = pd.date_range('2023-01-01', periods=60, freq='D')
regions = ['서울', '부산', '대구', '인천', '광주']
products = ['A', 'B', 'C']
larger_data = {
'날짜': np.random.choice(dates, 500),
'지역': np.random.choice(regions, 500),
'제품': np.random.choice(products, 500),
'판매량': np.random.randint(50, 500, 500),
'비용': np.random.randint(20, 200, 500)
}
large_df = pd.DataFrame(larger_data)
large_df['수익'] = large_df['판매량'] * 10 - large_df['비용']
large_df['날짜'] = pd.to_datetime(large_df['날짜'])
large_df['월'] = large_df['날짜'].dt.month
# 월별, 지역별, 제품별 총 수익 분석
monthly_profit = large_df.groupby(['월', '지역', '제품'])['수익'].sum().unstack(['제품'])
print(monthly_profit)
# 수익성이 가장 높은 제품-지역 조합 찾기
profit_by_region_product = large_df.groupby(['지역', '제품'])['수익'].sum()
top_performers = profit_by_region_product.nlargest(5)
print("가장 수익성 높은 제품-지역 조합:")
print(top_performers)
8. 성능 고려사항
대용량 데이터를 처리할 때는 성능에 주의해야 합니다:
# 대용량 데이터셋에서의 효율적인 그룹화
# 필요한 열만 선택하여 메모리 사용량 감소
efficient_groupby = large_df[['월', '지역', '제품', '수익']].groupby(['월', '지역', '제품'])['수익'].sum()
# 카테고리 데이터 타입 활용
large_df['지역'] = large_df['지역'].astype('category')
large_df['제품'] = large_df['제품'].astype('category')
대용량 데이터 처리 팁:
- 필요한 열만 선택하여 연산합니다.
- 카테고리 데이터 타입을 활용하면 메모리 사용량이 감소합니다.
- 경우에 따라
dask
또는vaex
같은 라이브러리를 고려할 수 있습니다.
9. 마무리
pandas의 groupby를 활용한 피벗팅은 데이터 분석에서 핵심적인 기술입니다. 이 기능을 마스터하면 다양한 관점에서 데이터를 분석하고 통찰력을 얻을 수 있습니다. 본 포스트에서 소개한 기법들을 실제 데이터에 적용해 보시고, 자신만의 데이터 분석 워크플로우를 개발해 보세요.
데이터 분석에서 성공적인 결과를 얻기 위해서는 원본 데이터를 다양한 방식으로 재구성하고 탐색하는 능력이 중요합니다. groupby와 피벗팅은 이러한 데이터 탐색의 강력한 도구입니다.
즐거운 데이터 분석 되세요!
답글 남기기