Pandas Crosstab 함수로 교차표 분석하고, 시각화까지 해보기!
0️⃣ 라이브러리 및 데이터셋 불러오기
# 라이브러리 불러오기
import pandas as pd
import numpy as np
# 데이터셋 가져와서 확인해보기
df_clean = pd.read_csv('./Clean_Dataset.csv', encoding='cp949')
df_clean
1️⃣-1. 범주형 데이터 2개로 교차표 만들기 (crosstab)
- pd.crosstab 함수로 교차표를 만들 수 있습니다.
- index에 행이 될 칼럼의 이름, columns에 열이 될 칼럼의 이름을 넣어주시면 됩니다.
# crosstab으로 범주형 데이터 2개에 대한 교차표 만들기
pd.crosstab(
index = df_clean['source_city'],
columns = df_clean['destination_city']
)
1️⃣-2. 교차표에 행/열별로 합계 추가하기 (subtotal, margins)
- pd.crosstab 함수에 margins = True 파라미터를 추가해서, 아래와 같이 행/열별로 합계를 볼 수 있습니다.
1️⃣-3. 교차표에 나오는 값들을 정규화하기 (normalize)
- 교차표를 만들어도 값들이 너무 많고 제각각이라서 비교하기 힘들다면, 정규화하는 것도 방법 중에 하나입니다.
- normalize = True 파라미터를 추가하면, 표의 값들이 전부 0~1 사이의 값으로 정규화됩니다.
2️⃣ 교차표에 나오는 값들을 차트로 시각화하기 (plot)
- 특정변수에 교차표를 넣고, 이 변수에 plot 함수를 사용해서 차트를 그릴 수 있습니다.
- 범주형 데이터이므로, kind = 'bar' 파라미터를 넣어서 막대그래프를 그렸습니다.
- 그냥 막대그래프는 눈에 잘 안들어오네요.. stacked = True 파라미터를 추가해 누적 막대그래프로 변경했습니다.
# 교차표 생성
ct_1 = pd.crosstab(
index = df_clean['source_city'],
columns = df_clean['destination_city']
)
# 막대그래프 그리기
ct_1.plot(kind = 'bar')
# 누적 막대그래프 그리기
ct_1.plot(kind = 'bar', stacked = True)
3️⃣. 교차표에서 수치형 데이터 값 집계하기 (Aggregation)
- 교차표 자체는 범주형데이터 2개를 교차해서 만들지만, 내용을 수치형 데이터의 집계값으로 넣을 수 있습니다.
- 아래처럼 행은 출발도시, 열은 도착도시로 두고, 각 셀에 넣을 값들은 티켓가격의 평균값으로 설정해보았습니다.
values 파라미터에 집계할 수치데이터 칼럼을 넣고, aggfunc = 'mean' 으로 지정했습니다.
- aggfunc 파라미터는 'mean', 'median', 'sum', 'max', 'min', 'std', 'var' 등으로 다양하게 넣을 수 있습니다.
# 데이터프레임 내 숫자 포맷 고정하기 (소수점 아래 2자리까지)
pd.options.display.float_format = '{:,.2f}'.format
# 출발-도착도시별로 티켓가격 평균 확인하기
pd.crosstab(
index = df_clean['source_city'],
columns = df_clean['destination_city'],
values = df_clean['price'],
aggfunc = 'mean'
)
4️⃣ 교차표로 히트맵 그리기 (heatmap)
- seaborn 라이브러리를 활용해서 히트맵까지 그려보겠습니다.
- 히트맵을 그리니까 확실히 한눈에 비교되네요!
import seaborn as sns
# 교차표 생성해서 변수에 넣기
ct_2 = pd.crosstab(
index = df_clean['source_city'],
columns = df_clean['destination_city'],
values = df_clean['price'],
aggfunc = 'mean'
)
# 히트맵 그리기
sns.heatmap(ct_2, cmap = 'coolwarm', annot = True)