작업 1유형#
Attention
DataUrl = https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p1_1.csv 종량제 봉투 가격 데이터 : https://www.data.go.kr/data/15025538/standard.do
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p1_1_.csv')
df.head(5)
시도명 | 시군구명 | 종량제봉투종류 | 종량제봉투처리방식 | 종량제봉투용도 | 종량제봉투사용대상 | 1L가격 | 1.5L가격 | 2L가격 | 2.5L가격 | ... | 60L가격 | 75L가격 | 100L가격 | 120L가격 | 125L가격 | 관리부서명 | 관리부서전화번호 | 데이터기준일자 | 제공기관코드 | 제공기관명 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 경기도 | 안양시 | 규격봉투 | 매립용 | 생활쓰레기 | 사업장용 | 0 | 0 | 0 | 0 | ... | 0 | 2100 | 0 | 0 | 0 | 자원순환과 | 031-8045-5448 | 2022-08-12 | 3830000 | 경기도 안양시 |
1 | 경기도 | 안양시 | 규격봉투 | 매립용 | 생활쓰레기 | 기타 | 0 | 0 | 0 | 0 | ... | 0 | 2100 | 0 | 0 | 0 | 자원순환과 | 031-8045-5448 | 2022-08-12 | 3830000 | 경기도 안양시 |
2 | 경기도 | 안양시 | 규격봉투 | 소각용 | 음식물쓰레기 | 가정용 | 0 | 50 | 0 | 80 | ... | 0 | 0 | 0 | 0 | 0 | 자원순환과 | 031-8045-5448 | 2022-08-12 | 3830000 | 경기도 안양시 |
3 | 경기도 | 안양시 | 규격봉투 | 소각용 | 음식물쓰레기 | 사업장용 | 0 | 50 | 0 | 80 | ... | 0 | 0 | 0 | 0 | 0 | 자원순환과 | 031-8045-5448 | 2022-08-12 | 3830000 | 경기도 안양시 |
4 | 경기도 | 안양시 | 규격봉투 | 소각용 | 음식물쓰레기 | 기타 | 0 | 50 | 0 | 80 | ... | 0 | 0 | 0 | 0 | 0 | 자원순환과 | 031-8045-5448 | 2022-08-12 | 3830000 | 경기도 안양시 |
5 rows × 26 columns
1-1
20L가격과 5L가격이 모두 0원이 아닌 데이터만 필터를 한 후, 각 row별로 20L가격과 5L가격의 차이를 ‘차이가격’ 이라 부른다고 하자. 시도명 별 차이가격의 평균가격을 비교할때 그 값이 가장 큰 금액을 반올림하여 소숫점 이하 1자리까지 구하여라
Show code cell source
pd.set_option('display.max_columns',100)
f = df[(df['5L가격'] != 0) & ((df['20L가격'] != 0))].reset_index(drop=True)
f['차이가격'] = f['20L가격'] -f['5L가격']
r = f.groupby(['시도명'])['차이가격'].mean().sort_values().to_frame()
display(r.tail(3))
result = r['차이가격'].max().round(1)
print(result)
차이가격 | |
---|---|
시도명 | |
제주특별자치도 | 580.0 |
부산광역시 | 593.0 |
인천광역시 | 619.0 |
619.0
Attention
DataUrl = https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p1_2.csv 성인 체중 및 키 데이터 : 자체 제작
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p1_2_.csv')
df.head(5)
ID | height(cm) | weight(kg) | |
---|---|---|---|
0 | user_1 | 173.0 | 67.5 |
1 | user_2 | 149.5 | 82.5 |
2 | user_3 | 143.8 | 64.6 |
3 | user_4 | 163.1 | 87.2 |
4 | user_5 | 159.6 | 77.1 |
1-2
BMI는 몸무게(kg) / (키(M) * 키(M)) 로 정의 된다. 초고도 비만은 BMI 25이상 , 고도 비반은 BMI 25미만 - 23이상 , 정상은 23미만 - 18.5이상 저체중은 18.5미만으로 정의 된다. 주어진 데이터에서 초고도비만 인원 + 저체중 인원 의 숫자는?
Show code cell source
def category(x):
if x >=25:
return 'a'
elif x >=23:
return 'b'
elif x >= 18.5:
return 'c'
else:
return 'd'
df['bmi'] = df[df.columns[2]] / (df[df.columns[1]] /100)**2
df['bmi_category'] = df['bmi'].map(category)
result = df[df.bmi_category.isin(['a','d'])].shape[0]
print(result) # 데이터를 잘못 만들었는지 정상이 아닌 사람이 엄청 많네요....
8998
Attention
DataUrl = https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p1_2.csv 년도별 서울 각 구의 초,중,고 전출 전입 인원 : https://data.seoul.go.kr/dataList/10729/S/2/datasetView.do & 후처리
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p1_3.csv')
df.head(5)
지역 | 초등학교_전출_도내 | 초등학교_전출_도외 | 초등학교_전입_도내 | 초등학교_전입_도외 | 중학교_전출_도내 | 중학교_전출_도외 | 중학교_전입_도내 | 중학교_전입_도외 | 고등학교_전출_도내 | 고등학교_전출_도외 | 고등학교_전입_도내 | 고등학교_전입_도외 | 년도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 종로구 | 221 | 132 | 255 | 126 | 63 | 71 | 104 | 73 | 203 | 72 | 166 | 75 | 2012 |
1 | 중구 | 295 | 139 | 203 | 100 | 66 | 43 | 58 | 44 | 156 | 37 | 104 | 39 | 2012 |
2 | 용산구 | 380 | 269 | 302 | 174 | 134 | 78 | 91 | 106 | 102 | 66 | 113 | 48 | 2012 |
3 | 성동구 | 643 | 344 | 376 | 221 | 154 | 103 | 98 | 82 | 179 | 37 | 153 | 41 | 2012 |
4 | 광진구 | 560 | 382 | 595 | 312 | 165 | 158 | 158 | 118 | 115 | 70 | 154 | 66 | 2012 |
1-3
순유입인원은 초중고 도내,도외 전입인원에서 초중고 도내, 도외 전출인원을 뺀값이다. 각년도별로 가장 큰 순유입인원을 가진 지역구의 순유입인원을 구하고 전체 기간의 해당 순유입인원들의 합을 구하여라
Show code cell source
df['순유입인원'] = \
df[[x for x in df.columns if '전입' in x]].sum(axis=1) -\
df[[x for x in df.columns if '전출' in x ]].sum(axis=1)
result = df.groupby('년도')['순유입인원'].max().sum().sum()
print(result)
13853
작업 2유형#
Attention
벤츠 차량 가격 예측 : https://www.kaggle.com/datasets/mysarahmadbhat/mercedes-used-car-listing train = https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p2_train_.csv test = https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p2_test_.csv
예측 변수 price, test.csv에 대해 ID별로 price 값을 예측하여 제출, 제출 데이터 컬럼은 ID와 price 두개만 존재해야함. 평가지표는 rmse
import pandas as pd
train = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p2_train_.csv')
test = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p2_test_.csv')
display(train.head(2))
test.head(2)
ID | model | year | price | transmission | mileage | fuelType | tax | mpg | engineSize | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 10170 | A Class | 2012 | 11940 | Automatic | 46000 | Diesel | 30 | 64.2 | 2.1 |
1 | 9551 | CL Class | 2020 | 38624 | Semi-Auto | 19 | Petrol | 150 | 36.7 | 2.0 |
ID | model | year | transmission | mileage | fuelType | tax | mpg | engineSize | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | SLK | 2005 | Automatic | 63000 | Petrol | 325 | 32.1 | 1.8 |
1 | 2 | SL CLASS | 2016 | Automatic | 6200 | Petrol | 555 | 28.0 | 5.5 |
Show code cell source
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.ensemble import RandomForestRegressor
import numpy as np
y = train['price']
x = train.drop(columns =['price','ID'])
test_x = test.drop(columns =['ID'])
dum_x = pd.get_dummies(x)
# train에는 있고, test에는 없는 데이터 존재 컬럼숫자가 다름 -> reindex해줘야함
dum_test = pd.get_dummies(test_x)
dum_test = dum_test.reindex(columns = dum_x.columns, fill_value=0)
x_train,x_test,y_train,y_test = train_test_split(dum_x,y)
rr = RandomForestRegressor()
rr.fit(x_train,y_train)
pred = rr.predict(x_test)
print('test rmse', np.sqrt(mean_squared_error(y_test,pred)))
pred_test = rr.predict(dum_test)
sumission = pd.DataFrame()
sumission['ID'] = test['ID']
sumission['price'] = pred_test
sumission.head()
# sumission.to_csv('00000000.csv',index=Fasle)
test rmse 2608.739745358064
ID | price | |
---|---|---|
0 | 0 | 4269.100000 |
1 | 2 | 64883.916667 |
2 | 14 | 17303.080000 |
3 | 15 | 14416.230000 |
4 | 18 | 15897.000000 |
작업 3유형#
Attention
어느 학교에서 추출한 55명 학생들의 키 정보이다.
DataUrl = https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p3_1.csv
이 학생들의 키의 95% 신뢰구간을 구하고자 한다.
import pandas as pd
df= pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p3_1.csv')
df.head()
ID | height | |
---|---|---|
0 | user_1 | 164.57 |
1 | user_2 | 174.99 |
2 | user_3 | 171.41 |
3 | user_4 | 162.47 |
4 | user_5 | 167.11 |
3-1-a
55명 학생들의 키에 대한 표본 평균을 구하여라(반올림하여 소숫점 3째자리까지
Show code cell source
import numpy as np
mean = np.round(np.mean(df.height),3)
print(mean)
169.937
3-1-b
t분포 양쪽 꼬리에서의 t 값을 구하여라 (반올림하여 소수4째자리까지)
Show code cell source
import numpy as np
from scipy.stats import t
std = np.std(df.height, ddof=1)
n = len(df.height)
# 신뢰수준, 자유도
confidence_level = 0.95
ddof = n - 1
# t 분포의 양쪽 꼬리에서의 t값
t_value = round(t.ppf((1 + confidence_level) / 2, ddof),4)
print(t_value)
2.0049
3-1-c
95% 신뢰구간을 구하여라(print(lower,upper) 방식으로 출력, 각각의 값은 소숫점 이하 3째자리까지)
Show code cell source
# 신뢰구간 계산
lower = round(mean - t_value * std / np.sqrt(n),3)
upper = round(mean + t_value * std / np.sqrt(n),3)
print(lower,upper)
168.321 171.553
Attention
A,B,C 세 공장에서 생산한 동일한 제품의 길이 데이터 이다. DataUrl = https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p3_2.csv 공장간의 제품 길이 차이가 유의미한지 확인 하려한다.
import pandas as pd
df= pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/krdatacertificate/e5_p3_2.csv')
df.head()
ID | value | |
---|---|---|
0 | A | 84.179434 |
1 | A | 93.971003 |
2 | A | 62.140957 |
3 | A | 72.911723 |
4 | A | 79.252747 |
3-1-a
3 그룹의 데이터에 대해 크루스칼-왈리스 검정을 사용하여 검정 통계량을 반올림하여 소숫점 이하 3자리까지 구하여라
Show code cell source
from scipy.stats import kruskal
a = df[df.ID =='A'].value.values
b = df[df.ID =='B'].value.values
c = df[df.ID =='C'].value.values
s,p = kruskal(a,b,c)
round_s = round(s,3)
print(round_s)
6.521
3-1-b
3 그룹의 데이터에 대해 크루스칼-왈리스 검정을 사용하여 p-value를 반올림하여 소숫점 이하 3자리까지 구하여라. 귀무가설과 대립가설중 0.05 유의수준에서 유의한 가설을 출력하라
Show code cell source
round_p = round(p,3)
print(round_p)
print('대립')
0.038
대립