✅ 구간화 (Binning)
구간화 (Binning) |
• 연속형 수치데이터를 특정 구간으로 나눠서, 범주형 데이터로 변환하는 것. • 구간화하는 이유: 이상치로 발생 가능한 문제를 줄임, 분석 결과 해석이 쉬워질 수 있음.
|
pd.cut() |
• 구간값을 직접 입력해서 지정함.
|
pd.qcut() |
• 구간 개수를 입력함. 따라서 각 구간에 동일한 개수의 데이터가 들어가게 됨. |
0️⃣ 패키지 & 데이터프레임 불러오기
- 예시가 될 데이터셋은 Kaggle에서 가져온 Flight Price Prediction 입니다.
# 패키지 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터셋 불러오기
df = pd.read_csv('./Clean_Dataset.csv', encoding='cp949')
df = df.drop([df.columns[0]], axis=1)
- 비행시간(duration)에 따라서, 단거리/중거리/장거리 비행으로 구간화 하고자 합니다.
- 그 전에 duration 칼럼의 분포와 정보를 알아봤습니다. 5시간 미만쯤에 많이 몰려있고 30시간 이후로는 빈도가 상당히 적네요.
1️⃣ 구간값을 정해서 구간화 :: pd.cut()
- 비행시간(duration)을 나눌 구간값을 정해서 구간화하여, 범주형 칼럼 'distance_cut'을 새로 생성해보겠습니다.
단거리: 0시간 이상~5시간 미만 / 중거리: 5시간 이상~10시간 미만 / 장거리: 10시간 이상
- 아래 코드와 같이 pd.cut() 메소드에서 bins로 구간값을 지정하고, 구간별 범주이름은 labels로 정해주면 됩니다.
# 비행시간(duration)에 따라 단/중/장거리로 구간화
df['distance_cut'] = pd.cut(
df['duration'],
bins = [0, 5, 10, df['duration'].max()],
labels = ['short', 'medium', 'long']
)
- 위와 같이 value_counts로 빈도를 세보니 장거리(long)에 가장 많이 몰렸고, 중거리, 단거리로 갈수록 거의 절반씩 줄어드네요.
2️⃣ 구간 개수를 정해서 구간화 :: pd.qcut()
- 이번에는 구간 개수를 정해서 구간화하여, 범주형 칼럼 'distance_qcut'을 만들어 보겠습니다.
똑같이 단거리, 중거리, 장거리 3개 구간으로 나눌 거에요.
- 아래 코드와 같이 pd.qcut() 메소드를 사용하면 되는데요, q로 구간개수를 지정하고, 구간별 범주는 labels로 정해주면 됩니다.
중복 데이터가 없다면, 구간별로 포함된 데이터 개수가 동일하게 나눠질 겁니다.
# 비행시간(duration)을 단/중/장거리 3개 구간으로 나누기
df['distance_qcut'] = pd.qcut(
df['duration'],
q = 3,
labels = ['short', 'medium', 'long']
)
- value_counts로 세보니, 구간마다 데이터 개수가 약 10만개로 비슷하되 똑같지는 않습니다. 중복데이터가 있었기 때문이에요.
- 구간값은 알아서 정해졌으므로, 보고 싶다면 위와 같이 groupby(), aggregate()로 min, max값들을 뽑아봐야 합니다.
단거리는 0~8.25시간, 중거리는 8.33~14.25시간, 장거리는 그 이상으로 나눠졌네요.