데이터 변형

Keywords

python, 파이썬, numpy, 넘파이, 넘피, pandas, 판다스, machine learning, 기계학습, 머신러닝, 회귀, 분류, 군집

데이터 변형은 적재한 데이터가 분석에 용이한 형태로 자료형이나 구조를 바꾸는 방법이다. wide format을 long format으로 변형하거나 범주형 변수를 원핫 인코딩을 통해 수치형 변수로 바꾸는 등이 이에 해당한다.

실습 코드는 Palmer Penguins 데이터셋을 이용한다.

import pandas as pd
from palmerpenguins import load_penguins

df = load_penguins()
df.head()
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 male 2007
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 female 2007
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 female 2007
3 Adelie Torgersen NaN NaN NaN NaN NaN 2007
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 female 2007

자료형 처리

df.dtypes
species               object
island                object
bill_length_mm       float64
bill_depth_mm        float64
flipper_length_mm    float64
body_mass_g          float64
sex                   object
year                   int64
dtype: object

species, island, sex는 문자열 자료형인 object로 적재되었다. 이 자료형을 범주 자료형으로 변환한다.

df_cat = df.copy()

cat_cols = ['species', 'island', 'sex']
df_cat[cat_cols] = df[cat_cols].astype('category')

df_cat.dtypes 
species              category
island               category
bill_length_mm        float64
bill_depth_mm         float64
flipper_length_mm     float64
body_mass_g           float64
sex                  category
year                    int64
dtype: object

astype() 함수는 넘파이 배열이나 판단스 데이터프레임에 있는 컬럼 요소의 자료형을 변환하는 함수이다.

DataFrame.astype(dtype, copy=True, errors='raise')

dtype은 변경할 자료형을 뜻한다. - int, float, str, bool, category, datetime64 등

데이터 구조 변형

특정 컬럼 추출 및 파생 변수 생성

df_cols = df[['species', 'bill_length_mm', 'bill_depth_mm']].copy()

df_cols['bill_ratio'] = df_cols['bill_length_mm'] / df_cols['bill_depth_mm']

df_cols.head()
species bill_length_mm bill_depth_mm bill_ratio
0 Adelie 39.1 18.7 2.090909
1 Adelie 39.5 17.4 2.270115
2 Adelie 40.3 18.0 2.238889
3 Adelie NaN NaN NaN
4 Adelie 36.7 19.3 1.901554

자료 구조 변경

Long format을 Wide format으로 변경

Long format으로 구성된 자료를 Wide format으로 변경한다.

df_long = df[['species', 'body_mass_g']].copy().reset_index()
# 범주별 인덱스 부여
df_long['index'] = df_long.groupby('species').cumcount()

df_long01 = df_long.pivot(index='index', columns='species', values='body_mass_g')
df_long01
species Adelie Chinstrap Gentoo
index
0 3750.0 3500.0 4500.0
1 3800.0 3900.0 5700.0
2 3250.0 3650.0 4450.0
3 NaN 3525.0 5700.0
4 3450.0 3725.0 5400.0
... ... ... ...
147 3475.0 NaN NaN
148 3450.0 NaN NaN
149 3750.0 NaN NaN
150 3700.0 NaN NaN
151 4000.0 NaN NaN

152 rows × 3 columns

df_long = df[['species', 'body_mass_g']].copy().reset_index()

df_long02 = df_long.pivot_table(index=None, columns='species', values='body_mass_g',
aggfunc='mean'
)
df_long02
species Adelie Chinstrap Gentoo
body_mass_g 3700.662252 3733.088235 5076.01626
df_long = df[['species', 'body_mass_g']].copy().reset_index()

df_long03 = df_long.pivot_table(index=None, columns='species', values='body_mass_g',
aggfunc='count'
)
df_long03
species Adelie Chinstrap Gentoo
body_mass_g 151 68 123

Wide format을 Long format으로 변경

df_long01 데이터프레임을 이용하여 wide format을 long format으로 변경한다.

df_long02 = df_long01.reset_index()

# df_long02
df_long02.melt(id_vars='index', var_name='species', value_name='body_mass_g')
index species body_mass_g
0 0 Adelie 3750.0
1 1 Adelie 3800.0
2 2 Adelie 3250.0
3 3 Adelie NaN
4 4 Adelie 3450.0
... ... ... ...
451 147 Gentoo NaN
452 148 Gentoo NaN
453 149 Gentoo NaN
454 150 Gentoo NaN
455 151 Gentoo NaN

456 rows × 3 columns

범주형 데이터 처리

더미 변수 생성

조건문을 통해 간단히 더미 변수를 생성할 수 있다.

df_dum = df[['species', 'sex']].copy()

df_dum['is_male'] = (df_dum['sex'] == 'male')*1

df_dum.head()
species sex is_male
0 Adelie male 1
1 Adelie female 0
2 Adelie female 0
3 Adelie NaN 0
4 Adelie female 0

원핫 인코딩

판다스 pd.get_dummies() 함수를 이용하여 간단히 더미 변수를 생성할 수 있다.

df_dum = df[['species', 'sex']].copy()

pd.get_dummies(df_dum, columns=['species'], drop_first=True)
sex species_Chinstrap species_Gentoo
0 male False False
1 female False False
2 female False False
3 NaN False False
4 female False False
... ... ... ...
339 male True False
340 female True False
341 male True False
342 male True False
343 female True False

344 rows × 3 columns

drop_first=True 인자를 통해 생성된 더비 변수 중 기준 범주 하나(첫 번째 변수)를 제거한다. 모든 범주를 더미화하게 되면 선형회귀에 있어 다중공선성 문제가 발생할 수 있다.