본문 바로가기

카테고리 없음

2024-02-01 결측치

이상치가 분포에 크게 어긋나는 특이한 데이터라면, 결측치(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