[데이터 전처리] 수치형 데이터를 범주형 데이터로 변환하기

이 글은 수치형 데이터를 범주형 데이터로 변환하는 방법에 관한 기록입니다.

아래의 코드 사용된 데이터셋은 이곳에서 다운로드 받을 수 있습니다.

수치형 데이터를 범주형 데이터로 만들기

# 패키지 불러오기
import pandas as pd
# 데이터 불러오기
df = pd.read_csv('../data/titanic/train.csv', index_col=0)
df
Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
PassengerId
1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
... ... ... ... ... ... ... ... ... ... ... ...
887 0 2 Montvila, Rev. Juozas male 27.0 0 0 211536 13.0000 NaN S
888 1 1 Graham, Miss. Margaret Edith female 19.0 0 0 112053 30.0000 B42 S
889 0 3 Johnston, Miss. Catherine Helen "Carrie" female NaN 1 2 W./C. 6607 23.4500 NaN S
890 1 1 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.0000 C148 C
891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.7500 NaN Q

891 rows × 11 columns

1. 수치형 데이터의 범위를 바탕으로 구간을 나누어 레이블링 하기

df.loc[df['Age']<10, 'Age_range'] = '0s'
df.loc[(df['Age']>=10) & (df['Age']<20), 'Age_range'] = '10s'
df.loc[(df['Age']>=20) & (df['Age']<30), 'Age_range'] = '20s'
df.loc[(df['Age']>=30) & (df['Age']<40), 'Age_range'] = '30s'
df.loc[(df['Age']>=40) & (df['Age']<50), 'Age_range'] = '40s'
df.loc[(df['Age']>=50) & (df['Age']<60), 'Age_range'] = '50s'
df.loc[(df['Age']>=60) & (df['Age']<70), 'Age_range'] = '60s'
df.loc[(df['Age']>=70) & (df['Age']<80), 'Age_range'] = '70s'
df.loc[df['Age']>=80, 'Age_range'] = '80s'
df.head()
Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Age_range
PassengerId
1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 20s
2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 30s
3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 20s
4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 30s
5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S 30s
df['Age_range'].value_counts().to_frame()
Age_range
20s 220
30s 167
10s 102
40s 89
0s 62
50s 48
60s 19
70s 6
80s 1

2. cut() 함수를 사용하여 레이블링 하기

cut() 함수는 수치형 데이터를 사용자가 설정한 구간으로 나누어 범주형 데이터를 만들 수 있도록 합니다. cut() 함수는 binslabels를 인자로 갖는데, bins에는 범주를 나누고자 하는 경계값을 리스트로 넣어주고, labels에는 각 범주의 범주명을 리스트로 넣어줍니다.

df['Age_cut'] = 0
df['Age_cut'] = pd.cut(df['Age'], bins=[0,20,40,60,80], labels=['0-20','20-40','40-60','60-80'])
df.head()
Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Age_range Age_cut
PassengerId
1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 20s 20-40
2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 30s 20-40
3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 20s 20-40
4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 30s 20-40
5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S 30s 20-40
df['Age_cut'].value_counts().to_frame()
Age_cut
20-40 385
0-20 179
40-60 128
60-80 22

3. qcut() 함수를 사용하여 레이블링 하기

qcut() 함수는 수치형 데이터를 사용자가 설정한 범주의 개수로 나누어 범주형 데이터를 만들 수 있도록 합니다. 이때 사용자는 범주의 개수만을 설정할 뿐 나머지는 판다스에서 각 범주 별로 빈도 수가 비슷하도록 자체적으로 범주를 나눕니다. qcut() 함수는 qlabels를 인자로 갖는데, q에는 범주의 개수를 넣어주고, 인자 q=에는 범주의 개수를 지정해주고, labels에는 각 범주의 범주명을 리스트로 넣어줍니다.

df['Age_qcut'] = 0
df['Age_qcut'] = pd.qcut(df['Age'], q=5, labels=['A','B','C','D','E'])
df.head()
Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Age_range Age_cut Age_qcut
PassengerId
1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 20s 20-40 B
2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 30s 20-40 D
3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 20s 20-40 C
4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 30s 20-40 D
5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S 30s 20-40 D
df['Age_qcut'].value_counts().to_frame()
Age_qcut
A 164
D 144
E 142
B 137
C 127

앞서 살펴본 경우와 달리 각 범주 별 빈도가 비슷한 것을 볼 수 있습니다.

댓글남기기