프로그래밍/파이썬

데이터 분석 - 데이터 정제(결측치 이상치 제거, 대체)

매 석 2023. 1. 11. 12:46
반응형

1. 빠진 데이터 찾기

결측치 : 누락된 값, 비어 있는 값을 의미한다.

pandas - isna() : 결측치 확인(boolean값으로 반환)
         inna().sum() : 결측치 빈도 확인
         dropna(subset=[]) : 결측치 제거
         dropna() : 모든 변수에 결측치 제거 (꼭 필요할 때만 사용)

원본 코드

import pandas as pd
import numpy as np

df = pd.DataFrame({'sex':['M','F',np.nan,'M','F']},
                'score':[5,4,3,4,np.nan])
print(df)
print(pd.isna(df))
print(pd.isna(df).sum())
print(df.dropna(subset=['score']))
print(df.dropna())

결과값

 

2. 결측치 대체하기

 

원본 코드

import pandas as pd
import numpy as np

df = pd.DataFrame({'sex':['M','F',np.nan,'M','F'],
                'score': [5,4,3,4,np.nan]})
df['sex']=df['sex'].fillna('M')
a=df['score'].mean()
df['score']=df['score'].fillna(a)
print(df)

결과값

 

3. 이상치 정제하기

이상치 : 정상 범위에서 크게 벗어난 값

이상치 확인 : value_coubts().sort_index()로 값 확인

결측 처리 : np.where(df[]==?, np.nan, df[])

평균 구하기 : dropna(subset=[]).groupby('').agg(mean_score=(''))

원본 코드

import pandas as pd
import numpy as np

df = pd.DataFrame({'sex':[1,2,1,3,2,1],
                'score': [5,4,3,4,2,6]})
print(df['sex'].value_counts().sort_index())
df['score']=np.where(df['score']>5, np.nan, df['score'])
df.dropna(subset=['sex','score']).groupby('sex').agg(mean_score=('score','mean'))
print(df)

결과값

 

 

4. 극단치 제거하기

극단치 : 논리적으로 가능하지만, 극단적으로 크거나 작은 값

원본 코드

import pandas as pd
import numpy as np

mpg = pd.read_csv('mpg.csv')
import seaborn as sns 
sns.boxplot(data=mpg, y='hwy')

결과값

상자 그림
설명
상자 아래 세로선
아랫수염
하위 0~25%
상자 밑면
1사분위수(Q1)
하위 25%
상자 내 굵은 선
2사분위수(Q2)
하위 50%
상자 윗면
3사분위수(Q3)
하위 75%
상자 위 세로선
윗수염
하위 75~100%
상자 밖 가로선
극단치 경계
Q1, Q3 밖 1.5 IQR 내 최대값
상자 밖 점 표식
극단치
Q1, Q3 밖 1.5 IQR을 벗어난 값

1,3사분위수 구하기

pct25 = mpg['hwy'].quantile(.25)
pct75 = mpg['hwy'].quantile(.75)
iqr=pct75-pct25

하한, 상한 구하기

pct25 -1.5*iqr
pct75 +1.5*iqr

극단치 결측 처리

mpg['hwy'] = np.where((mpg['hwy']<4.5| (mpg['hwy']>40.5),
np.nan, mpg['hwy']))