3번째 줄: |
3번째 줄: |
| | | |
| = 시작하기 전에 = | | = 시작하기 전에 = |
| + | [[특성공학:pandas]]를 보고 오자. |
| + | |
| 결측치를 처리하기 전에 전체적인 데이터셋이 어떤 형태인지 파악할 필요가 있다. | | 결측치를 처리하기 전에 전체적인 데이터셋이 어떤 형태인지 파악할 필요가 있다. |
| {| class="wikitable" | | {| class="wikitable" |
25번째 줄: |
27번째 줄: |
| |df.isnull().sum() | | |df.isnull().sum() |
| |- | | |- |
− | | | + | |셀별 null 파악 |
− | | | + | |각 데이터가 비었는지, 채워져 있는지 True, False로 보여준다. |
− | | | + | |pd.isna(df) |
| |} | | |} |
| | | |
38번째 줄: |
40번째 줄: |
| !예시 | | !예시 |
| |- | | |- |
− | |버리기 | + | |열 단위 |
| |<syntaxhighlight lang="python"> | | |<syntaxhighlight lang="python"> |
| + | # 열 단위로 버리기 |
| # 결측치가 하나라도 있는 열을 찾는다. | | # 결측치가 하나라도 있는 열을 찾는다. |
| cols_with_missing = [col for col in X_train.columns if X_train[col].isnull().any()] | | cols_with_missing = [col for col in X_train.columns if X_train[col].isnull().any()] |
− | | + | # 해당 열 버리기 |
− | # 해당 행 버리기. | |
| reduced_X_train = X_train.drop(cols_with_missing, axis=1) | | reduced_X_train = X_train.drop(cols_with_missing, axis=1) |
| reduced_X_valid = X_valid.drop(cols_with_missing, axis=1) | | reduced_X_valid = X_valid.drop(cols_with_missing, axis=1) |
| + | </syntaxhighlight> |
| + | |- |
| + | |행 단위 버리기 |
| + | |<syntaxhighlight lang="python"> |
| + | # 행 단위로 버리기 |
| + | df = df.dropna() # 하나의 속성이라도 비어있으면 행 째로 버린다. |
| + | df = df.dropna(subset = ['검사할열', '검사할열2', ...]) # 검사할 열에 결측치가 있으면 버린다. |
| </syntaxhighlight> | | </syntaxhighlight> |
| |} | | |} |
| | | |
| == 채우기 == | | == 채우기 == |
| + | 다양한 방식의 채우기가 가능하다. |
| + | |
| + | fillna 함수를 이용한다. |
| {| class="wikitable" | | {| class="wikitable" |
| |- | | |- |
60번째 줄: |
72번째 줄: |
| test_train_X = pd.DataFrame(imputer.transform(test_X)) # 테스트용 데이터에 결측치 채워넣기.(위에서 사용하는 메서드와 다르다. 무슨 차이일까..) | | test_train_X = pd.DataFrame(imputer.transform(test_X)) # 테스트용 데이터에 결측치 채워넣기.(위에서 사용하는 메서드와 다르다. 무슨 차이일까..) |
| </syntaxhighlight>[어떤 값으로 채우는 걸까?] | | </syntaxhighlight>[어떤 값으로 채우는 걸까?] |
| + | 결측치를 채우는 것만으로도 정밀도가 올라가는 경우가 많다. |
| + | |
| SimpleImputer(strategy='median') | | SimpleImputer(strategy='median') |
| | | |
− | 데이터프레임을 사용하는 경우, <code>fillna(채울값)</code> 함수가 준비되어 있다.
| + | |
| + | |- |
| + | |평균으로 채우기 |
| + | |열2 안의 결측치를 채우고 싶을 때 단순 평균을 넣을 수도 있지만, 열1이 같은 집단의 평균을 구해 넣는 게 더 정확할 것이다.(예컨대, 평균나이가 빠졌다면 남성의 결측치는 남성의 평균나이를 넣는 것.) |
| + | df.filna(df.groupby['열1'])['열2'].transform('median'), inplace=True) |
| + | |- |
| + | |바로 위 데이터로 |
| + | |해당 결측치가 위 데이터와 별반 다르지 않으리라 예상되는 경우 위 데이터의 값을 그대로 사용한다. |
| | | |
| df.fillna(method = 'ffill') # 비어 있을 경우, 바로 위 데이터를 입력 | | df.fillna(method = 'ffill') # 비어 있을 경우, 바로 위 데이터를 입력 |
− | | + | |- |
− | df.fillna(method = 'bfill') # 비어 있을 경우, 바로 아래 데이터를 입력 | + | |바로 아래 데이터로 |
| + | |df.fillna(method = 'bfill') # 비어 있을 경우, 바로 아래 데이터를 입력 |
| |} | | |} |
| | | |
93번째 줄: |
115번째 줄: |
| |} | | |} |
| [[분류:결측치 다루기]] | | [[분류:결측치 다루기]] |
| + | [[분류:Pandas]] |