[데이터 사전 처리/범주형(카테고리) 데이터 처리] 구간 분할

2022. 12. 2. 13:50

데이터 분석 알고리즘에 따라서는 연속 데이터를 그대로 사용하기 보다는 일정한 구간(bin)으로 나눠서 분석하는 것이 효율적인 경우가 있다.

가격, 비용, 효율 등 연속적인 값을 일정한 수준이나 정도를 나타내는 이산적인 값으로 나타내어 구간별 차이를 드러내는 것이다.

 

이처럼 연속 변수를 일정한 구간으로 나누고, 각 구간을 범주형 이산 변수로 변환하는 과정구간 분할(binning)이라고 한다.

판다스 cut() 함수를 이용하면 연속 데이터를 여러 구간으로 나누고 범주형 데이터로 변환할 수 있다.

 

그림 1

 

다음 예제에서 'horsepower' 열은 엔진 출력을 나타낸다. 경우에 따라서는 엔진 출력을 숫자로 표시하는 대신

'저출력', '보통출력', '고출력' 등 구간으로 나누어서 표시하는 것이 효율적일 수 있다.

판다스 cut() 메소드를 활용하려면 먼저 구간을 나누어야 한다.

'저출력', '보통출력', '고출력' 이라는 3개의 구간으로 구분하려면 [그림 1]과 같이 총 4개의 경계값이 필요하다.

 

경계값을 구하는 방법 중에서 Numpy 라이브러리의 histogram() 함수를 활용하는 방법을 설명한다.

나누려는 구간(bin) 개수를 bins 옵션에 입력하면 각 구간에 속하는 값의 개수(count)와 경계값 리스트(bin_dividers)를 반환한다.

# 예제 5-10(1)

import pandas as pd
import numpy as np

df = pd.read_csv('auto-mpg.csv', header=None)

df.columns = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']

df['horsepower'].replace('?', np.nan, inplace=True)
df.dropna(subset=['horsepower'], axis=0, inplace=True)
df['horsepower'] = df['horsepower'].astype('float')

count, bin_dividers = np.histogram(df['horsepower'], bins=3)
print(bin_dividers)

위 예제에서는 모두 4개의 경계값을 생성하고 3개의 구간이 만들어진다.

 

예제 5-10(1) 출력 결과

 

판다스 cut() 함수의 옵션을 설정한다. 앞에서 구한 경계값의 리스트(bin_dividers)를 bins옵션에 할당하고 각 구간의 이름(bin_names)을 labels 옵션에 할당한다.

# 예제 5-10(2)

import pandas as pd
import numpy as np

df = pd.read_csv('auto-mpg.csv', header=None)

df.columns = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight', 'acceleration', 'model year', 'origin', 'name']

df['horsepower'].replace('?', np.nan, inplace=True)
df.dropna(subset=['horsepower'], axis=0, inplace=True)
df['horsepower'] = df['horsepower'].astype('float')

count, bin_dividers = np.histogram(df['horsepower'], bins=3)

bin_names = ['저출력', '보통출력', '고출력']

df['hp_bin'] = pd.cut(x=df['horsepower'],
                     bins=bin_dividers,
                     labels=bin_names,
                     include_lowest=True)

print(df[['horsepower', 'hp_bin']].head(15))

include_lowest=Ture 옵션을 사용하면 각 구간의 낮은 경계값을 포함한다.

'horsepower'열의 숫자 데이터를 3개의 구간에 할당하고, 각 구간의 이름('저출력', '보통출력', '고출력')으로 입력하여 'hp_bin' 열에 저장한다.

 

예제 5-10(2) 출력 결과


파이썬 머신러닝 판다스 데이터분석
저자 : 오승환
출판 : 정보문화사
발매 : 2019.06.05

 

BELATED ARTICLES

more