본문 바로가기
빅데이터분석

[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (14) 피벗테이블 pivot

by 모닥불🔥 2024. 5. 26.

링고선생님의 파이썬 데이터분석 프로젝트 강의. 강의는 홈페이지에서 구매할 수 있음..!(사진 누르면 링크 이동)

이번에 정리할 부분은 강의자료로 3-9 내용이다. 엑셀에서도 많이 사용하는 피벗 테이블을 python에서 만들기


🔥 강의 목차

오리엔테이션
파이썬 기초 문법
데이터 전처리
데이터 시각화
마케팅 데이터 분석 및 지표 정의하기

🔥 테이블의 형태

테이블 형태는 Long Form과 Wide Form으로 나눠 볼 수 있다.

 

세로로 길게 나열된 데이터는 데이터 조작, 분석에 용이한 형태이며,

가로로 나열된 데이터는 데이터의 구조를 파악하기 쉽다는 특징이 있다.

 

위 데이터를 생성할 수 있는 코드는 아래와 같음.

import pandas as pd

# 긴 형식(Long Form) 데이터프레임 생성
long_form_data = {
    'Student': ['Alice', 'Alice', 'Alice', 'Bob', 'Bob', 'Bob'],
    'Subject': ['Math', 'Science', 'English', 'Math', 'Science', 'English'],
    'Score': [90, 85, 95, 75, 80, 78]
}
long_form_df = pd.DataFrame(long_form_data)

# 넓은 형식(Wide Form) 데이터프레임 생성
wide_form_data = {
    'Student': ['Alice', 'Bob'],
    'Math': [90, 75],
    'Science': [85, 80],
    'English': [95, 78]
}
wide_form_df = pd.DataFrame(wide_form_data)

🔥 Wide form -> Long form: Unpivot = df.melt()

먼저, 가로로 긴 형태를 분석/조작에 용이한 세로로 긴 형태로 변환하는 방법이다. 이를 unpivot이라고 부르고, df.melt() 함수를 사용한다. 기본 형태는 아래와 같다.

unpivot_df = wide_form_df.melt(
id_vars='col_1'
, value_vars = ['col_2', 'col_3',...]
, var_name='col_name_1' # variable name
, value_name='col_name_2'
)
  • id_vars: 데이터의 식별자 역할을 하는 열(들)의 이름을 나타냄. 이 열들은 그대로 유지됨.
  • value_vars: 'long form'으로 변환하고자 하는 열(들)의 이름.
  • var_name: value_vars에 해당하는 열 이름들을 담을 새로운 열의 이름.
  • value_name: value_vars에서의 값을 담을 새로운 열의 이름

글만 보면 뭐가 들어가야 할지 잘 모르겠다. 원래 형태를 보면서 하나씩 정해 보자.

 

가로 형태의 테이블을 세로로 돌릴 때, 기준이 있어야 한다.

가로 형태는 학생 / 수학 점수 / 과학 점수 / 영어 점수 로 이루어진 테이블이다.

기준은 학생이 되어야 할 것 같다. => id_vars

그 다음에 나머지, 길게 아래로 나열하고 싶은 열의 이름은 수학, 과학, 영어 점수들이다. => value_vars

수학, 과학, 영어를 묶어서 나타낼 수 있는 하나의 큰 범주명은 '과목'이다. => var_name

값을 담을 열의 이름은 '점수'라고 하면 될 것 같다. => value_name

 

즉, 아래와 같이 코드를 쓰면 원하는 대로 긴 형태의 테이블을 만들 수 있다.

unpivot_df = wide_form_df.melt(                   # df 이름.melt()
id_vars='Student'                                   # 기본키(변하지 않는 값, 기준값)
, value_vars = ['Math', 'Science', 'English']     # 이전에는 컬럼이었는데 value로 가져올 것들
, var_name='subject' # variable name           # 값으로 들어갈 이름
, value_name='score'
)
unpivot_df # wide --> long 형태
unpivot_df.sort_values('Student') # 정렬


🔥 Long form -> Wide form: df.pivot_table()

이번에는 긴 형태의 분석/조작에 용이한 표를 한 눈에 보기 쉽게 가로 형태로 바꿔보려 한다.

df.pivot_table() 함수를 사용하며, 기본 형태는 아래와 같다.

df.pivot_table(
index='col_1'
, columns='col_2'
, values='col_3'
, aggfunc='min/max/...'
)
  • index: 피벗 테이블의 로우를 그룹화하는데 사용되는 컬럼(들).
  • columns: 피벗 테이블의 컬럼을 그룹화하는데 사용되는 컬럼(들).
  • values: 분석하려는 데이터 컬럼.
  • aggfunc: 집계 함수. 예를 들어, np.sum, np.mean (기본값은 np.mean).

 

역시나 글로만 보면 어려우니 예시 데이터와 함께 살펴보면....

import pandas as pd

# 예제 데이터프레임 생성
data = pd.DataFrame({
    'year': [2020, 2020, 2021, 2021, 2020, 2020, 2021, 2021],
    'region': ['East', 'West', 'East', 'West', 'East', 'West', 'East', 'West'],
    'category': ['Electronics', 'Electronics', 'Electronics', 'Electronics', 'Clothing', 'Clothing', 'Clothing', 'Clothing'],
    'sales': [100, 200, 300, 400, 150, 250, 350, 450],
    'profit': [20, 40, 60, 80, 30, 50, 70, 90]
})
data

 

 

연도별 연봉 데이터이다. 연도별로 각 지역의 평균 연봉이 어떻게 다른지 살펴보고 싶다면 이 테이블로선 보기가 힘들다.

이럴 때 pivot_table()을 활용하여 보기 쉽게 나타낼 수 있다.

 

먼저, 지역과 연도가 기준이 되므로 그룹이 될 기준은 지역, 연도이다. => index, columns

그리고 분석하려는 컬럼, 즉 알고 싶은 값은 '연봉'의 '합계'이다.

분석 대상 컬럼에 연봉 => values,

집계함수에 합계(sum)를 넣으면 된다 => aggfunc

 

아래 테이블에서 알 수 있듯이, index에 넣은 부분은 인덱스처럼 왼쪽에 하나의 컬럼으로 나오고, columns에 넣은 부분은 가로로 나열되며 컬럼이 된다. 원하는 형태를 잘 생각해서 index와 columns를 설정하면 될 것 같다.

# 시간의 흐름에 따른 지역별 연봉 차이
data.pivot_table(
index='region'                 # rows 그룹화
, columns='year'             # 컬럼을 그룹화
, values='sales'              # 집계할 값
, aggfunc='sum'       # 집계 함수
)

# east, west 기준 -> 2020, 2021년 집계

 

카테고리와 지역별 평균 연봉을 비교하고 싶을 때도 마찬가지로 피벗 테이블을 활용하면 된다.

index와 columns에 지역과 카테고리를 넣어주고, 값은 동일하게 연봉, 집계함수에는 평균을 넣어주면 아래와 같은 결과를 확인할 수 있다.

# 카테고리별 차이
data.pivot_table(
    index = 'region'
    , columns = 'category'
    , values = 'sales'
    , aggfunc = 'mean'
)

# 지역 / 카테고리별

 

나름 원래 표가 복잡하게 생긴 데 비해, pivot_table화 한 뒤에는 굉장히 보기 편하다는 것을 알 수 있다.

세로로 긴 형태로 분석을 하더라도, 레포트를 쓸 때 등에는 가장 보여주기 쉬운 형태로 변환할 줄 알아야겠다.

 

 

* 본 게시글은 '메타코드'의 동의를 받아 작성된 글로, 강의 내용에 대한 모든 저작권은 Ringo 선생님에게 있습니다. 개인용도의 학습 외에 무단사용은 엄격히 금지됩니다. 위반 시 법적 조취가 취해질 수 있습니다.