본문 바로가기

빅데이터분석기사_실기/제1유형: 데이터 전처리

결측치 처리

결측치 처리 실습

  • 실습용 타이타닉 데이터 준비
from google.colab import drive
drive.mount('/content/drive')
import pandas as pd

file_path = '/content/drive/MyDrive/data/titanic_train.csv'
df = pd.read_csv(file_path)

결측치 확인

df.info()

result

Non-Null Count 컬럼을 통해 Age, Cabin, Embarked 컬럼에 결측치가 존재함을 알 수 있당.

df.isnull().sum()

print

각 컬럼별 결측치 개수 확인

Age 컬럼에 177개, Cabin 컬럼에 687개, Embarked 컬럼에 2개가 존재함


결측치 제거

  • 완전 분석법: 결측값이 있는 행을 삭제
print(df.shape)
df_1 = df.dropna(axis=0)

print(df_1.isnull().sum())
print(df_1.shape)

원래 891개의 행, 12개의 컬럼이 있었는데

dropna(axis=0)을 통해 결측치가 존재하는 컬럼을 제거 한 후 

데이터프레임의 사이즈가 183개의 행으로 줄어든 것을 확인할 수 있당!

또한 어떤 컬럼에도 결측치가 없음을 확인할 수 있당!


결측치 대체

  • 결측치를 평균값으로 대치
print(df["Age"].isnull().sum())

# 결측치를 평균값으로 대치
age_mean = df["Age"].mean()
df["Age"].fillna(age_mean, inplace=True)

print(df["Age"].isnull().sum())

Age 컬럼의 결측값을 fillna() 함수를 이용하여 age_mean(Age 컬럼의 평균값을 담은 변수)값으로 변경함!

원래 Age 컬럼에 있는 결측값 개수가 177개 였는데 대치 후 0개로 줄어들었다.

 

** inplace = True 옵션을 추가하면 원본 데이터프레임에 변경사항이 적용된당.**


  • 결측치를 최빈값으로 대치: scipy 패키지의 mode 함수 이용
from scipy.stats import mode

print(df["Embarked"].isnull().sum())

#결측치를 최빈값으로 대치
embarked_mode = df["Embarked"].mode()
df["Embarked"].fillna(embarked_mode[0], inplace = True)

최빈값이 한 개가 아니기 때문에 embarked_mode[0] 처럼 인덱스를 표기

 


  • 결측치를 인접한 값으로 대체: ffill(직전 행의 값으로 대체), bfill(다음 행의 값으로 대체)
df["Cabin"].fillna(method='ffill', inplace= True)
df["Cabin"].fillna(method='bfill', inplace=True)

print(df["Cabin"].isnull().sum())

Cabin 컬럼에 결측치 개수가 0이 됨을 확인


 

  • 결측치를 그룹별 평균값으로 대체
print(df.groupby("Sex")['Age'].mean())
print(df.groupby("Pclass")['Age'].mean())

result

성별에 따른 Age의 평균값의 차이는 크지 않지만,

좌석등급에 따른 Age의 평균값은 차이가 큼을 확인할 수 있음

=> 결측치를 대치할 때, 좌석등급에 따라서 다른 평균값으로 대치하면 좋을듯!

df["Age"].fillna(df.groupby("Pclass")['Age'].transform('mean'), inplace = True)

Pclass 별 Age 평균으로 Age 컬럼의 결측치를 대체