이상치가 분포에 크게 어긋나는 특이한 데이터라면, 결측치(Missing Value)는 존재하지 않는 데이터
결측치 처리 방법
- 수치형 데이터
- 평균 값 대치: 대표적인 대치 방법
- 중앙값 대치: 데이터에 이상치가 많아 평균 값이 대표성이 없다면 중앙 값을 이용
Ex) 이상치는 평균 값을 흔들리게 함
- 범주형 데이터
- 최빈값 대치
- 사용 함수
- 간단한 삭제 & 대치
- `df.dropna(axis = 0)`: 행 삭제
- `df.dropna(axis = 1)`: 열 삭제
- Boolean Indexing
- `df.fillna(value)`: 특정 값으로 대치(평균, 중앙, 최빈값)
- 알고리즘을 이용
- `sklearn.impute.SimpleImputer`:평균, 중앙, 최빈값으로 대치
- `SimpleImputer.statistics_` : 대치한 값 확인 가능
- `sklearn.impute.IterativeImputer`: 다변량대치(회귀 대치)
- `sklearn.impute.KNNImputer`: KNN 알고리즘을 이용한 대치
실습
타이타닉 데이터를 활용한 결측치
#데이터 불러오기
import pandas as pd
titanic_df = pd.read_csv('데이터경로')
titanic_df.info()
#결측 값이 있는 지 확인
#Age, Cabin등의 값 결측 확인
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
titanic_df.dropna(axis = 0).info()
#dropna가 잘못 사용되어지는 경우
#결측값이 행에 하나라도 있으면 제거되므로 이는 데이터 분석을 하는데 영향을 준다
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 183 non-null int64
1 Survived 183 non-null int64
2 Pclass 183 non-null int64
3 Name 183 non-null object
4 Sex 183 non-null object
5 Age 183 non-null float64
6 SibSp 183 non-null int64
7 Parch 183 non-null int64
8 Ticket 183 non-null object
9 Fare 183 non-null float64
10 Cabin 183 non-null object
11 Embarked 183 non-null object
#Age가 비어있지 않은 값만 확인하여 결측치 조회
cond3 = (titanic_df['Age'].notna())
titanic_df[cond3].info()
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 714 non-null int64
1 Survived 714 non-null int64
2 Pclass 714 non-null int64
3 Name 714 non-null object
4 Sex 714 non-null object
5 Age 714 non-null float64
6 SibSp 714 non-null int64
7 Parch 714 non-null int64
8 Ticket 714 non-null object
9 Fare 714 non-null float64
10 Cabin 185 non-null object
11 Embarked 712 non-null object
#fillna 이용한 대치
age_mean = titanic_df['Age'].mean().round(2) #Age 전체 평균값
titanic_df['Age_mean'] = titanic_df['Age'].fillna(age_mean) #비어있는 값에 평균값 대치
titanic_df.info() #데이터 갯수 확인하여 대치한 값이 갯수에 영향을 주지 않음을 recheck
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
12 Age_mean 891 non-null float64
Simpleimputer를 이용한 대치
from sklearn.impute import SimpleImputer
si = SimpleImputer()
si.fit(titanic_df[['Age']])
#평균
si.statistics_
array([29.69911765])
#평균값을 이용하여 결측치 대치
titanic_df['Age_si_mean'] = si.transform(titanic_df[['Age']])
titanic_df.info()
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
12 Age_mean 891 non-null float64
13 Age_si_mean 891 non-null float64