티스토리 뷰

머신러닝

[데이터전처리_2] missing value 처리

느린 개미 2018. 10. 17. 00:13
반응형

아래 내용은 인프런 : 밑바닥부터 시작하는 머신러닝 입문 과정의 최성철 교수님 강의를 수강하고, 나름대로 한번 정리를 하여 더 오래 기억하고자 작성한 사항입니다.

일부 추가, 삭제, 수정한 사항들도 있습니다.

1. Missing value 란?

  • 데이터를 보면 값이 없는 경우가 있다. 이런 경우 missing value 가 있다고 한다.
  • 아래 데이터를 보면 index 1, 2 의 데이터가 missing value
In [53]:
import pandas as pd
import numpy as np
In [54]:
# Eaxmple from - https://chrisalbon.com/python/pandas_missing_data.html
raw_data = {'first_name': ['Jason', np.nan, 'Tina', 'Jake', 'Amy'],
        'last_name': ['Miller', np.nan, 'Ali', 'Milner', 'Cooze'],
        'age': [42, np.nan, 36, 24, 73],
        'sex': ['m', np.nan, 'f', 'm', 'f'],
        'preTestScore': [4, np.nan, np.nan, 2, 3],
        'postTestScore': [25, np.nan, np.nan, 62, 70]}

df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'sex', 'preTestScore', 'postTestScore'])
df
Out[54]:
first_namelast_nameagesexpreTestScorepostTestScore
0JasonMiller42.0m4.025.0
1NaNNaNNaNNaNNaNNaN
2TinaAli36.0fNaNNaN
3JakeMilner24.0m2.062.0
4AmyCooze73.0f3.070.0

2. Missing value 처리 전략들

  • 1) 데이터가 거의 없는 feature 는 feature 자체를 drop
  • 2) 데이터가 없으면 drop
  • 3) 데이터의 최소 개수를 정해서 drop
  • 4) 최빈값, 평균값, 0 등의 값으로 비어있는 데이터를 채우기

1)데이터가 거의 없는 feature 는 feature 자체를 drop

  • 아래와 같이 feature 별 데이터가 없는 % 를 알아볼 수 있음 ( null 개수의 합 / 데이터의 길이)
In [55]:
df.isnull().sum()
Out[55]:
first_name       1
last_name        1
age              1
sex              1
preTestScore     2
postTestScore    2
dtype: int64
In [56]:
df.isnull().sum() / len(df)
Out[56]:
first_name       0.2
last_name        0.2
age              0.2
sex              0.2
preTestScore     0.4
postTestScore    0.4
dtype: float64

2) 데이터가 없으면 drop

In [57]:
df_no_missing = df.dropna()
df_no_missing
Out[57]:
first_namelast_nameagesexpreTestScorepostTestScore
0JasonMiller42.0m4.025.0
3JakeMilner24.0m2.062.0
4AmyCooze73.0f3.070.0
In [58]:
df
Out[58]:
first_namelast_nameagesexpreTestScorepostTestScore
0JasonMiller42.0m4.025.0
1NaNNaNNaNNaNNaNNaN
2TinaAli36.0fNaNNaN
3JakeMilner24.0m2.062.0
4AmyCooze73.0f3.070.0

3) 데이터의 최소 개수를 정해서 drop

  • 데이터가 한개라도 없으면 drop 해라 (how='any')
  • 모든 데이터가 없으면 drop 해라 (how='all')
In [78]:
df_cleaned = df.dropna(how='any')
df_cleaned
Out[78]:
first_namelast_nameagesexpreTestScorepostTestScore
0JasonMiller42.0m4.025.0
3JakeMilner24.0m2.062.0
4AmyCooze73.0f3.070.0
In [79]:
df_cleaned = df.dropna(how='all')
df_cleaned
Out[79]:
first_namelast_nameagesexpreTestScorepostTestScore
0JasonMiller42.0m4.025.0
2TinaAli36.0f3.0NaN
3JakeMilner24.0m2.062.0
4AmyCooze73.0f3.070.0
In [60]:
df['location'] = np.nan
df
Out[60]:
first_namelast_nameagesexpreTestScorepostTestScorelocation
0JasonMiller42.0m4.025.0NaN
1NaNNaNNaNNaNNaNNaNNaN
2TinaAli36.0fNaNNaNNaN
3JakeMilner24.0m2.062.0NaN
4AmyCooze73.0f3.070.0NaN
In [61]:
df.dropna(axis=1, how='all')
Out[61]:
first_namelast_nameagesexpreTestScorepostTestScore
0JasonMiller42.0m4.025.0
1NaNNaNNaNNaNNaNNaN
2TinaAli36.0fNaNNaN
3JakeMilner24.0m2.062.0
4AmyCooze73.0f3.070.0
  • axis=0 (행) 방향으로 데이터가 최소 5개 이상일 때만 남기고 나머지는 drop 해라
In [62]:
df.dropna(axis=0, thresh=5)
Out[62]:
first_namelast_nameagesexpreTestScorepostTestScorelocation
0JasonMiller42.0m4.025.0NaN
3JakeMilner24.0m2.062.0NaN
4AmyCooze73.0f3.070.0NaN

4) Missing value 채우기

  • 빈 데이터를 0 으로 채워라
In [63]:
df.fillna(0)
Out[63]:
first_namelast_nameagesexpreTestScorepostTestScorelocation
0JasonMiller42.0m4.025.00.0
1000.000.00.00.0
2TinaAli36.0f0.00.00.0
3JakeMilner24.0m2.062.00.0
4AmyCooze73.0f3.070.00.0
In [64]:
df["preTestScore"].mean()# 평균값
Out[64]:
3.0
In [65]:
df["preTestScore"].median() #중간값
Out[65]:
3.0
In [66]:
df["preTestScore"].mode() #최빈값
Out[66]:
0    2.0
1    3.0
2    4.0
dtype: float64
  • preTestScore 열의 빈값을, 평균값으로 즉시(inplace=True) 채워라
In [67]:
df["preTestScore"].fillna( df["preTestScore"].mean(), inplace=True)
In [68]:
df
Out[68]:
first_namelast_nameagesexpreTestScorepostTestScorelocation
0JasonMiller42.0m4.025.0NaN
1NaNNaNNaNNaN3.0NaNNaN
2TinaAli36.0f3.0NaNNaN
3JakeMilner24.0m2.062.0NaN
4AmyCooze73.0f3.070.0NaN
  • preTestScore 열의 빈값을, 성별(sex)별 평균값으로 즉시(inplace=True) 채워라
In [69]:
# Eaxmple from - https://chrisalbon.com/python/pandas_missing_data.html
raw_data = {'first_name': ['Jason', np.nan, 'Tina', 'Jake', 'Amy'],
        'last_name': ['Miller', np.nan, 'Ali', 'Milner', 'Cooze'],
        'age': [42, np.nan, 36, 24, 73],
        'sex': ['m', np.nan, 'f', 'm', 'f'],
        'preTestScore': [4, np.nan, np.nan, 2, 3],
        'postTestScore': [25, np.nan, np.nan, 62, 70]}

df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'sex', 'preTestScore', 'postTestScore'])
df
Out[69]:
first_namelast_nameagesexpreTestScorepostTestScore
0JasonMiller42.0m4.025.0
1NaNNaNNaNNaNNaNNaN
2TinaAli36.0fNaNNaN
3JakeMilner24.0m2.062.0
4AmyCooze73.0f3.070.0
In [70]:
df.groupby("sex")["preTestScore"].mean()
Out[70]:
sex
f    3.0
m    3.0
Name: preTestScore, dtype: float64
In [71]:
df.groupby("sex")["preTestScore"].transform("mean")
Out[71]:
0    3.0
1    NaN
2    3.0
3    3.0
4    3.0
Name: preTestScore, dtype: float64
In [72]:
df
Out[72]:
first_namelast_nameagesexpreTestScorepostTestScore
0JasonMiller42.0m4.025.0
1NaNNaNNaNNaNNaNNaN
2TinaAli36.0fNaNNaN
3JakeMilner24.0m2.062.0
4AmyCooze73.0f3.070.0
In [73]:
df["preTestScore"].fillna(
    df.groupby("sex")["preTestScore"].transform("mean"), inplace=True)
df
Out[73]:
first_namelast_nameagesexpreTestScorepostTestScore
0JasonMiller42.0m4.025.0
1NaNNaNNaNNaNNaNNaN
2TinaAli36.0f3.0NaN
3JakeMilner24.0m2.062.0
4AmyCooze73.0f3.070.0

5) Missing value 가 아닌 데이터만 찾기

  • [ ] 안에 조건을 줌

age 와 sex 가 Null 이 아닌 경우만 보여줌

In [74]:
df[df["age"].notnull() & df["sex"].notnull()]
Out[74]:
first_namelast_nameagesexpreTestScorepostTestScore
0JasonMiller42.0m4.025.0
2TinaAli36.0f3.0NaN
3JakeMilner24.0m2.062.0
4AmyCooze73.0f3.070.0
In [ ]:
 


반응형

'머신러닝' 카테고리의 다른 글

kaggle 타이타닉 EDA  (0) 2018.10.25
[데이터전처리_3] Category Data 처리  (0) 2018.10.17
[데이터전처리_1] Feature Scaling  (0) 2018.10.16
Pandas 너 뭐니?_두번째  (0) 2018.06.26
Pandas 너 뭐니?_첫번째  (0) 2018.06.10