Data Analyst KIM

[빅데이터 분석기사-실기] 작업형1. 결측값 처리 예제 본문

일상/자격증

[빅데이터 분석기사-실기] 작업형1. 결측값 처리 예제

김두연 2023. 5. 23. 23:25
반응형

t1-결측치 문제

  • 주어진 데이터에서 결측치가 80%이상 되는 컬럼은 삭제하고, 80% 미만인 결측치가 있는 컬럼은 'city'별 중앙값으로 값을 대체하고 'f1'컬럼의 평균값을 출력해라
  • 데이터 : basic1.csv
# 라이브러리 및 데이터 불러오기
import numpy as np
import pandas as pd
ex = pd.read_csv("C:/Users/USER/OneDrive/바탕 화면/6688/PART 02 파이썬 분석/csv1/basic1.csv")
ex
  id age city f1 f2 f3 f4 f5
0 id01 2.0 서울 NaN 0 NaN ENFJ 91.297791
1 id02 9.0 서울 70.0 1 NaN ENFJ 60.339826
2 id03 27.0 서울 61.0 1 NaN ISTJ 17.252986
3 id04 75.0 서울 NaN 2 NaN INFP 52.667078
4 id05 24.0 서울 85.0 2 NaN ISFJ 29.269869
... ... ... ... ... ... ... ... ...
95 id96 92.0 경기 53.0 1 NaN ENTJ 52.667078
96 id97 100.0 경기 NaN 0 NaN INFP 67.886373
97 id98 39.0 경기 58.0 2 NaN INFP 98.429899
98 id99 1.0 경기 47.0 0 NaN ESFJ 97.381034
99 id100 47.0 경기 53.0 0 vip ESFP 33.308999

100 rows × 8 columns

# EDA - 결측값 확인(비율 확인)
ex.shape
(100, 8)
ex.isnull().sum()
id       0
age      0
city     0
f1      31
f2       0
f3      95
f4       0
f5       0
dtype: int64
ex.isnull().sum()/ex.shape[0]
id      0.00
age     0.00
city    0.00
f1      0.31
f2      0.00
f3      0.95
f4      0.00
f5      0.00
dtype: float64
# 80%이상 결측치 컬럼, 삭제
ex = ex.drop(['f3'],axis=1)
# or ex.drop(columns=['f3'])
ex.head()
  id age city f1 f2 f4 f5
0 id01 2.0 서울 NaN 0 ENFJ 91.297791
1 id02 9.0 서울 70.0 1 ENFJ 60.339826
2 id03 27.0 서울 61.0 1 ISTJ 17.252986
3 id04 75.0 서울 NaN 2 INFP 52.667078
4 id05 24.0 서울 85.0 2 ISFJ 29.269869
# 80%미만 결측치 컬럼, city별 중앙값으로 대체
ex['city'].unique()
array(['서울', '부산', '대구', '경기'], dtype=object)
# 도시별 중앙값 계산
s=ex[ex['city']=='서울']['f1'].median()
k=ex[ex['city']=='경기']['f1'].median()
b=ex[ex['city']=='부산']['f1'].median()
d=ex[ex['city']=='대구']['f1'].median()
s, k, b, d
(68.0, 58.0, 62.0, 75.0)
# 대체 전 데이터 샘플 출력
ex[15:21]
  id age city f1 f2 f4 f5
15 id16 68.0 서울 85.0 0 ESFP 16.283854
16 id17 74.0 서울 NaN 1 ISTP 67.886373
17 id18 41.0 서울 87.0 2 ISFJ 80.138280
18 id19 53.0 서울 NaN 0 ISFP 83.685380
19 id20 11.0 서울 51.0 1 INTJ 91.297791
20 id21 90.0 부산 NaN 1 ISFP 29.269869
# city별 중앙값으로 대체
ex['f1'] = ex['f1'].fillna(ex['city'].map({'서울':s,'경기':k,'부산':b,'대구':d}))
#만약 그냥 f1을 중앙값으로 대체한다면?
# ex['f1'] = ex['f1'].fillna(ex['f1'].median())
# 대체 후 데이터 샘플 출력
ex[15:21]
  id age city f1 f2 f4 f5
15 id16 68.0 서울 85.0 0 ESFP 16.283854
16 id17 74.0 서울 68.0 1 ISTP 67.886373
17 id18 41.0 서울 87.0 2 ISFJ 80.138280
18 id19 53.0 서울 68.0 0 ISFP 83.685380
19 id20 11.0 서울 51.0 1 INTJ 91.297791
20 id21 90.0 부산 62.0 1 ISFP 29.269869
# f1 평균값 결과 출력
print(ex['f1'].median())
62.0
반응형