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