빅데이터분석기사/작업형1

[작업형1] 결측치 대체 / 사분위수 구하기

seo0seok 2023. 6. 17. 21:07

// 퇴근후딴짓 님의 강의를 참고하였습니다. //

 

Dataset :

members.csv
0.01MB

 

문제1)

  • f1컬럼의 결측치는 중앙 값으로 대체하고,
  • 나머지 결측치가 있는 데이터(행)을 모두 제거하고,
  • 앞에서부터 70% 데이터 중 views 컬럼의 3사분위 수에서 1사분위 수를 뺀 값을 구하시오.
  • (단, 데이터 70% 지점은 정수형(int) 변환)
import pandas as pd
df = pd.read_csv("members.csv")
print(df.isnull().sum())
df['f1'] = df['f1'].fillna(df['f1'].median())
print(df.isnull().sum())

실행 결과 :
id             0
age            0
city           0
f1            31
f2             0
f3            28
f4             0
f5             0
subscribed     0
views          4
dtype: int64

id             0
age            0
city           0
f1             0
f2             0
f3            28
f4             0
f5             0
subscribed     0
views          4
dtype: int64

→ f1 컬럼의 중앙값을 fillna()를 통해 결측치에 대입한 후 f1 컬럼의 결측치 숫자가 31 -> 0개로 된 것을 확인 할 수 있다.

 

print(df.shape)
df = df.dropna()
print(df.shape)

실행 결과 :
(100, 10)
(72, 10)

→ 결측치가 있는 행을 제거 한 후 행의 개수가 100개에서 72개로 줄어든 것을 확인 할 수 있다.

 

df = df[:int(len(df) * 0.7)]
r1 = df['views'].quantile(.75)
r2 = df['views'].quantile(.25)

print(r1 - r2)

실행 결과 : 
3261.0

→ 70%의 데이터는 df의 전체 길이에 0.7을 곱하여 구한 후 3분위수와 1분위수는 .quantile()을 통해 구한 후 빼주면 3261.0이 나온다.

 

문제2)

  • 주어진 데이터에서 결측치가 30%이상 되는 컬럼을 찾고 해당 컬럼에 결측치가 있는 데이터(행)를 삭제 함.
  • 그리고 30% 미만, 20% 이상인 결측치가 있는 컬럼은 최빈값으로 값을 대체하고
  • 'f3'컬럼의 'gold' 값을 가진 데이터 수를 출력하시오.
import pandas as pd
df = pd.read_csv("members.csv")
print(df.isnull().sum())

실행 결과 : 
id             0
age            0
city           0
f1            31
f2             0
f3            28
f4             0
f5             0
subscribed     0
views          4
dtype: int64
print(len(df) * 0.3)

실행 결과 : 30

→ 결측치의 30% 이상인 컬럼은 f1, 20%이상 30%미만인 컬럼은 f3이다.

→ f1 컬럼에 결측치가 있는 행은 삭제, f3 컬럼은 최빈값으로 대체한다.

 

print(df.shape)
df = df.dropna(subset=['f1'])
print(df.shape)

실행 결과 : 
(100, 10)
(69, 10)

→ f1 컬럼의 결측치가 있는 행을 삭제 후 행의 개수가 100 -> 69개로 줄어들었다.

 

print(df.head())
df['f3'] = df['f3'].fillna(df['f3'].mode()[0])
print(df.head())

실행 결과 : 
id   age city    f1  f2    f3    f4         f5  subscribed    views
1  id02   9.0   서울  70.0   1   NaN  ENFJ  60.339826  2021-05-12   2534.0
2  id03  27.0   서울  61.0   1  gold  ISTJ  17.252986  2021-03-16   7312.0
4  id05  24.0   서울  85.0   2   NaN  ISFJ  29.269869  2021-03-07   1338.0
5  id06  22.0   서울  57.0   0   vip  INTP  20.129444  2021-09-12  21550.0
6  id07  36.3   서울  60.0   1   NaN  ISFJ   9.796378  2021-01-11     61.0

     id   age city    f1  f2    f3    f4         f5  subscribed    views
1  id02   9.0   서울  70.0   1  gold  ENFJ  60.339826  2021-05-12   2534.0
2  id03  27.0   서울  61.0   1  gold  ISTJ  17.252986  2021-03-16   7312.0
4  id05  24.0   서울  85.0   2  gold  ISFJ  29.269869  2021-03-07   1338.0
5  id06  22.0   서울  57.0   0   vip  INTP  20.129444  2021-09-12  21550.0
6  id07  36.3   서울  60.0   1  gold  ISFJ   9.796378  2021-01-11     61.0

→ f3 컬럼의 결측치(NaN)를 최빈값인 gold로 대체한 것을 확인 할 수 있다.

 

print(sum(df['f3'] == 'gold'))

실행 결과 : 
56

→ 마지막으로 f3 컬럼에 gold값을 가진 데이터수는 56개인 것을 확인 할 수 있다.

 

문제3)

  • views 컬럼에 결측치가 있는 데이터(행)을 삭제하고,
  • f3 컬럼의 결측치는 0, silver는 1, gold는 2, vip는 3 으로 변환한 후 총 합을 정수형으로 출력하시오.
import pandas as pd
df = pd.read_csv("members.csv")
# 방법1) replace 
print(df.shape)
df = df.dropna(subset=['views'])
print(df.shape)

실행 결과 :
(100, 10)
(96, 10)

→ 첫번째 방법은 replace를 사용하는 방법이다

→ views 컬럼의 결측치 있는 행을 삭제한다.

 

print(df.head(7))
import numpy as np
df['f3'] = df['f3'].replace(np.nan,0).replace('silver',1).replace('gold',2).replace('vip',3)
print(df.head(7))

실행 결과 : 
     id   age city    f1  f2    f3    f4         f5  subscribed    views
0  id01   2.0   서울   NaN   0  gold  ENFJ  91.297791  2021-07-16   6820.0
1  id02   9.0   서울  70.0   1   NaN  ENFJ  60.339826  2021-05-12   2534.0
2  id03  27.0   서울  61.0   1  gold  ISTJ  17.252986  2021-03-16   7312.0
3  id04  75.0   서울   NaN   2   NaN  INFP  52.667078  2021-07-21    493.0
4  id05  24.0   서울  85.0   2   NaN  ISFJ  29.269869  2021-03-07   1338.0
5  id06  22.0   서울  57.0   0   vip  INTP  20.129444  2021-09-12  21550.0
6  id07  36.3   서울  60.0   1   NaN  ISFJ   9.796378  2021-01-11     61.0

     id   age city    f1  f2  f3    f4         f5  subscribed    views
0  id01   2.0   서울   NaN   0   2  ENFJ  91.297791  2021-07-16   6820.0
1  id02   9.0   서울  70.0   1   0  ENFJ  60.339826  2021-05-12   2534.0
2  id03  27.0   서울  61.0   1   2  ISTJ  17.252986  2021-03-16   7312.0
3  id04  75.0   서울   NaN   2   0  INFP  52.667078  2021-07-21    493.0
4  id05  24.0   서울  85.0   2   0  ISFJ  29.269869  2021-03-07   1338.0
5  id06  22.0   서울  57.0   0   3  INTP  20.129444  2021-09-12  21550.0
6  id07  36.3   서울  60.0   1   0  ISFJ   9.796378  2021-01-11     61.0

→ f3컬럼의 결측치 -> 0, silver -> 1, gold ->2, vip -> 3으로 대체한 것을 확인 할 수 있다.

 

print(df['f3'].sum())

실행 결과 :
133

→ 변환 후 f3 컬럼의 총 합은 133이다.

 

# 방법2) map
import pandas as pd
df = pd.read_csv("members.csv")
df = df.dropna(subset=['views'])

dict_list = {np.nan:0, 'silver':1, 'gold':2, 'vip':3}
df['f3'] = df['f3'].map(dict_list)

print(df['f3'].sum())

실행 결과 : 
133

→ 두번째 방법은 map을 사용해 대체하는 방법이다. 결과는 133으로 같다.

 

# 방법3) 조건
import pandas as pd
df = pd.read_csv("members.csv")
df = df.dropna(subset=['views'])

r1 = sum(df['f3'] == 'silver') * 1
r2 = sum(df['f3'] == 'gold') * 2
r3 = sum(df['f3'] == 'vip') * 3
print(r1 + r2 + r3)

실행 결과 : 
133

→ 세번째 방법은 replace나 map을 모르는경우 단순조건문을 통해 구하는 방법이다. 결과는 133으로 같다.