일상/자격증
[빅데이터 분석기사-실기] 작업형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
반응형