링고선생님의 파이썬 데이터분석 프로젝트 강의. 강의는 홈페이지에서 구매할 수 있음..!(사진 누르면 링크 이동)
이번에 정리할 부분은 강의자료로 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 선생님에게 있습니다. 개인용도의 학습 외에 무단사용은 엄격히 금지됩니다. 위반 시 법적 조취가 취해질 수 있습니다.
'빅데이터분석' 카테고리의 다른 글
[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (16) 결측치(NA, NaN, None) 처리하기 (0) | 2024.05.29 |
---|---|
[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (15) 데이터타입 확인/변경 .astype(), to_numeric() (0) | 2024.05.29 |
[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (13) 결합: 세로로 결합/가로로 결합(JOIN, Merge) (0) | 2024.05.26 |
[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (12) groupby 그룹별 집계하기 (1) | 2024.05.19 |
[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (11) Dates & Times 날짜/시간 데이터 다루기 (0) | 2024.05.19 |