본문 바로가기

[Pandas] 피벗 테이블과 크로스탭 활용하기

Hub's 2024. 5. 2.

판다스 로고
판다스 로고

데이터 분석에서 데이터를 요약하고 다양한 차원에서 분석하는 것은 매우 중요합니다. 판다스(Pandas) 라이브러리는 이러한 요구를 충족시키는 데 필수적인 기능인 피벗 테이블(pivot_table)과 크로스탭(crosstab) 메서드를 제공합니다. 이 글에서는 판다스에서 피벗 테이블과 크로스탭을 어떻게 활용할 수 있는지 자세히 설명하고, 실제 예제를 통해 그 사용법을 보여드리겠습니다.

1. 피벗 테이블(Pivot Table)

피벗 테이블은 데이터 요약의 한 형태로, 데이터의 행과 열을 재구성하여 다차원적인 요약을 제공합니다. 데이터의 특정 변수들에 대한 통계 요약(합계, 평균, 최대값 등)을 쉽게 볼 수 있도록 합니다.

import pandas as pd
import numpy as np

# 샘플 데이터 생성
data = {'날짜': ['2020-01-01', '2020-01-01', '2020-01-01', '2020-01-02', '2020-01-02', '2020-01-02'],
        '사용자': ['김철수', '이영희', '박지성', '김철수', '이영희', '박지성'],
        '점수': [25, 80, 70, 90, 40, 60]}

df = pd.DataFrame(data)

# 피벗 테이블 생성
pivot_table = pd.pivot_table(df, values='점수', index='날짜', columns='사용자', aggfunc=np.mean)

print(pivot_table)
  • 날짜별로 각 사용자의 점수를 평균내어 표를 재구성했습니다. 이를 통해 각 날짜에 대한 사용자별 점수 분포를 쉽게 확인할 수 있습니다.

출력값 

사용자         김철수  박지성  이영희
날짜                            
2020-01-01    25    70    80
2020-01-02    90    60    40

2. 크로스탭(Crosstab)

크로스탭은 특정한 두 카테고리 변수의 빈도수를 세어서 표 형태로 정리해 주는 기능입니다. 주로 두 변수 사이의 관계를 쉽게 파악할 수 있도록 사용됩니다.

# 크로스탭 생성
crosstab = pd.crosstab(df['날짜'], df['사용자'])

print(crosstab)
  • 각 날짜에 각 사용자가 몇 번 데이터에 등장하는지를 세어 표로 만들었습니다. 이는 특정 기간 동안 사용자의 활동 빈도 등을 분석할 때 유용합니다.

출력값

사용자     김철수  박지성  이영희
날짜                      
2020-01-01     1     1     1
2020-01-02     1     1     1

3. 피벗 테이블 예시 

3-1. 예시 - 다중 인텍스 피벗 테이블

날짜와 사용자를 인덱스로 사용하여 점수를 합계로 계산했습니다. 각 사용자의 일자별 총 점수를 확인할 수 있습니다.

# 다중 인덱스 피벗 테이블 생성
pivot_multi_index = pd.pivot_table(df, values='점수', index=['날짜', '사용자'], aggfunc=np.sum)

print(pivot_multi_index)
                  점수
날짜        사용자       
2020-01-01 김철수   25
           박지성   70
           이영희   80
2020-01-02 김철수   90
           박지성   60
           이영희   40

3-2. 예시 - 여러 집계 함수 사용

평균(mean)과 최대값(amax)을 동시에 계산하여 각 사용자별로 제공합니다. 날짜별로 각 사용자의 평균 점수와 최고 점수를 확인할 수 있습니다.

# 여러 집계 함수를 사용한 피벗 테이블
pivot_agg_funcs = pd.pivot_table(df, values='점수', index='날짜', columns='사용자', 
                                 aggfunc=[np.mean, np.max])

print(pivot_agg_funcs)
           mean            amax        
사용자     김철수 박지성 이영희  김철수 박지성 이영희
날짜                                             
2020-01-01  25  70   80   25  70   80
2020-01-02  90  60   40   90  60   40

3-3. 예시 - 결측치 처리

 결측치가 있다면 0으로 채우는 옵션(fill_value=0)을 사용했습니다. 사용자별로 데이터가 없는 날짜는 점수가 0으로 표시됩니다.

# 결측치를 포함한 피벗 테이블
pivot_fill_value = pd.pivot_table(df, values='점수', index='날짜', columns='사용자', 
                                  fill_value=0)

print(pivot_fill_value)
사용자     김철수 박지성 이영희
날짜                        
2020-01-01  25   70   80
2020-01-02  90   60   40

4. 크로스탭 예시 

4-1. 행 합계 및 열 합계 포함

margins=True 옵션을 사용하여 각 행과 열의 합계를 추가했습니다. 각 날짜별로 등장한 횟수와 전체 합계를 확인할 수 있습니다.

# 행 합계 및 열 합계를 포함한 크로스탭
crosstab_totals = pd.crosstab(df['날짜'], df['사용자'], margins=True)

print(crosstab_totals)
사용자     김철수 박지성 이영희 All
날짜                              
2020-01-01     1    1    1   3
2020-01-02     1    1    1   3
All            2    2    2   6

4-2. 다중 변수 크로스탭

예시에서는 점수를 '저점'과 '고점'으로 구분하고, 날짜와 점수 범주를 기준으로 사용자의 빈도를 계산했습니다.

# 점수 범주 추가
df['점수 범주'] = pd.cut(df['점수'], bins=[0, 50, 100], labels=['저점', '고점'])

# 다중 변수를 사용한 크로스탭
crosstab_multi = pd.crosstab([df['날짜'], df['점수 범주']], df['사용자'])

print(crosstab_multi)
사용자          김철수 박지성 이영희
날짜       점수 범주            
2020-01-01 저점     1    0    0
           고점     0    1    1
2020-01-02 저점     0    1    1
           고점     1    0    0

4-3. 집계 크로스탭

예시에서는 values와 aggfunc=np.sum 옵션을 사용하여 각 사용자의 점수 합계를 날짜별로 계산했습니다.

# 값 집계를 포함한 크로스탭
crosstab_values = pd.crosstab(df['날짜'], df['사용자'], values=df['점수'], aggfunc=np.sum)

print(crosstab_values)
사용자     김철수 박지성 이영희
날짜                        
2020-01-01  25   70   80
2020-01-02  90   60   40

피벗 테이블과 크로스탭은 판다스에서 제공하는 데이터 요약 도구입니다. 이러한 기능을 사용하면 복잡한 데이터 세트에서도 필요한 정보를 쉽게 추출하고 분석할 수 있습니다. 데이터를 다양한 방향에서 조망하며 인사이트를 도출하는 데 큰 도움이 됩니다.

데이터 분석을 진행하면서 이러한 도구들을 적극 활용해 보세요. 각 기능의 다양한 옵션을 실험하며 최적의 데이터 요약 방법을 찾아보는 것도 좋은 연습이 될 것입니다.

감사합니다.

 

공식 홈페이지 링크 : Pivot_table, Crosstab

 

pandas.pivot_table — pandas 2.2.2 documentation

This only applies if any of the groupers are Categoricals. If True: only show observed values for categorical groupers. If False: show all values for categorical groupers. Deprecated since version 2.2.0: The default value of False is deprecated and will ch

pandas.pydata.org

 

 

pandas.crosstab — pandas 2.2.2 documentation

If passed ‘all’ or True, will normalize over all values.

pandas.pydata.org

 

댓글