1번
데이터셋(basic1.csv)의 'f5' 컬럼을 기준으로 상위 10개의 데이터를 구하고, 'f5'컬럼 10개 중 최소값으로 데이터를 대체한 후 'age'컬럼에서 80 이상인 데이터의'f5 컬럼 평균값을 구하시오.
import pandas as pd
basic = pd.read_csv('data/basic1.csv')
basic.sort_values('f5', ascending=False, inplace=True)
f5_min = basic['f5'][:10].min()
basic['f5'][:10] = f5_min
result = basic[basic['age'] >= 80]['f5'].mean()
print(result)
62.497747125217394
2번
이상치(소수점 나이)를 찾고 올림, 내림, 버림(절사)했을때 3가지 모두 이상치 'age' 평균을 구한 다음 모두 더하여 출력하시오.
import numpy as np
import pandas as pd
basic = pd.read_csv('data/basic1.csv')
outlier = basic[(basic['age'] * 10) % 10 != 0]
mean_ceil = np.ceil(outlier['age']).mean()
mean_floor = np.floor(outlier['age']).mean()
mean_trunc = np.trunc(outlier['age']).mean()
result = mean_ceil + mean_floor + mean_trunc
print(result)
69.5
3번
주어진 데이터에서 결측치가 80%이상 되는 컬럼은(변수는) 삭제하고, 80% 미만인 결측치가 있는 컬럼은 'city'별 중앙값으로 값을 대체하고 'f1'컬럼의 평균값을 출력하시오.
import pandas as pd
basic = pd.read_csv('data/basic1.csv')
basic.isnull().sum() / basic.shape[0]
basic.drop('f3', axis='columns', inplace=True)
basic['city'].unique() # 서울, 부산, 대구, 경기
s = basic[basic['city'] == '서울']['f1'].median()
b = basic[basic['city'] == '부산']['f1'].median()
d = basic[basic['city'] == '대구']['f1'].median()
k = basic[basic['city'] == '경기']['f1'].median()
basic['f1'] = basic['f1'].fillna(basic['city'].map({'서울':s, '부산':b, '대구':d, '경기':k}))
result = basic['f1'].mean()
print(result)
65.52
❓ 'city'별 중앙값을 구하는 또 다른 방법
k, d, b, s = basic.groupby('city')['f1'].median()
이 방법을 사용하다보니 의문점이 생겼다. k, d, b, s의 순서를 달리 해줄 때마다 결과 값이 변경된다는 점이다. 이유는 간단했다.
basic.groupby('city')['f1'].median()
city
경기 58.0
대구 75.0
부산 62.0
서울 68.0
위 코드를 시행하면 아래와 같은 city 결과가 나타난다. 저 순서 그대로를 의미하는 것이다.
4번
주어진 데이터 중 train.csv에서 'SalePrice'컬럼의 왜도와 첨도를 구한 값과, 'SalePrice'컬럼을 스케일링(log1p)로 변환한 이후 왜도와 첨도를 구해 모두 더한 다음 소수점 2째자리까지 출력하시오.
import pandas as pd
df = pd.read_csv('data/train.csv')
df['SalePrice']
skew_before = df['SalePrice'].skew() # 1.8829
kurt_before = df['SalePrice'].kurt() # 6.5363
df['SalePrice'] = np.log1p(df['SalePrice'])
skew_after = df['SalePrice'].skew() # 0.1235
kurt_after = df['SalePrice'].kurt() # 0.8095
result = round(skew_before + kurt_before + skew_after + kurt_after, 2)
print(result)
9.35
5번
주어진 데이터 중 basic1.csv에서 'f1'컬럼 결측 데이터를 제거하고, 'city'와 'f2'을 기준으로 묶어 합계를 구하고, 'city가 경기이면서 f2가 0'인 조건에 만족하는 f1 값을 구하시오.
basic = pd.read_csv('data/basic1.csv')
basic = basic[~basic['f1'].isnull()]
basic = basic.groupby(['city', 'f2']).sum()
result = basic.iloc[0]['f1']
print(result)
833.0