이 글은 수치형 데이터를 범주형 데이터로 변환하는 방법에 관한 기록입니다.
아래의 코드 사용된 데이터셋은 이곳에서 다운로드 받을 수 있습니다.
수치형 데이터를 범주형 데이터로 만들기
# 패키지 불러오기
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'
|
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()
함수는 bins
와 labels
를 인자로 갖는데, 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'])
|
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()
함수는 q
와 labels
를 인자로 갖는데, q
에는 범주의 개수를 넣어주고, 인자 q=
에는 범주의 개수를 지정해주고, labels
에는 각 범주의 범주명을 리스트로 넣어줍니다.
df['Age_qcut'] = 0
df['Age_qcut'] = pd.qcut(df['Age'], q=5, labels=['A','B','C','D','E'])
|
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 |
앞서 살펴본 경우와 달리 각 범주 별 빈도가 비슷한 것을 볼 수 있습니다.
댓글남기기