[Pandas] 피벗 테이블과 크로스탭 활용하기
데이터 분석에서 데이터를 요약하고 다양한 차원에서 분석하는 것은 매우 중요합니다. 판다스(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
'IT 세상 > Pandas 정복하기' 카테고리의 다른 글
[Pandas] map, apply, applymap 차이점 및 활용 (1) | 2024.05.03 |
---|---|
[Pandas] 판다스를 활용한 결측치 처리 방법 (0) | 2024.05.02 |
댓글