실기 모의고사 2회차
https://www.datamanim.com/dataset/practice/q2.html
2회차 — DataManim
Toggle in-page Table of Contents
www.datamanim.com
Import
import os
import pandas as pd
import numpy as np
import datetime
from dateutil.relativedelta import relativedelta
!pip install tqdm
import tqdm
import zipfile
import re
from tqdm import tqdm
작업 1유형
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/stroke_/train.csv')
df.head()
데이터 설명 : 뇌졸중 발생 여부 예측
Question1
성별이 Male인 환자들의 age의 평균값은 ?
df['age']
df['age'] = df['age'].str.replace('*','').astype('int')
result = df[df.gender =='Male'].age.mean()
print(result)
Question2
bmi컬럼의 결측치를 bmi컬럼의 결측치를 제외한 나머지 값들의 중앙값으로 채웠을 경우 bmi 컬럼의 평균을 소숫점 이하 3자리 까지 구하여라
fi = df['bmi'].fillna(df['bmi'].median())
result = round(fi.mean(),3)
print(result)
Question3
bmi컬럼의 각 결측치들을 직전의 행의 bmi값으로 채웠을 경우 bmi 컬럼의 평균을 소숫점 이하 3자리 까지 구하여라
fi = df['bmi'].fillna(method = 'ffill')
result = round(fi.mean(),3)
print(result)
Question4
bmi컬럼의 각 결측치들을 결측치를 가진 환자 나이대(10단위)의 평균 bmi 값으로 대체한 후 대체된 bmi 컬럼의 평균을 소숫점 이하 3자리 까지 구하여라
# 결측치 제외 나이대별 평균값 계산 및 dictionary 형태로 변환
mean = df[df.bmi.notnull()].groupby(df.age//10 *10).bmi.mean()
dic = { x:y for x,y in mean.items()}
mean
items()
파이썬 딕셔너리 키, 값 쌍 얻기
dic
idx =df.loc[df.bmi.isnull(),['age','bmi']].index
idx
# 결측치 매핑
df.loc[df.bmi.isnull(),'bmi'] =(df[df.bmi.isnull()].age//10*10).map(lambda x : dic[x])
result = df.bmi.mean()
print(result)
Question5
avg_glucose_level 컬럼의 값이 200이상인 데이터를 모두 199로 변경하고 stroke값이 1인 데이터의 avg_glucose_level값의 평균을 소수점이하 3자리 까지 구하여라
df.loc[df.avg_glucose_level >=200,'avg_glucose_level'] =199
result = round(df[df.stroke ==1].avg_glucose_level.mean(),3)
print(result)
작업 1유형_다른 데이터
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/pok/Pokemon.csv')
df.head()
데이터 설명 : 포켓몬 정보
Question6
Attack컬럼의 값을 기준으로 내림차순정렬 했을때 상위 400위까지 포켓몬들과 401~800위까지의 포켓몬들에서 전설포켓몬(Legendary컬럼)의 숫자 차이는?
up = df.sort_values('Attack',ascending=False).reset_index(drop=True)[:400]
down = df.sort_values('Attack',ascending=False).reset_index(drop=True)[400:]
result = up.Legendary.sum() - down.Legendary.sum()
print(result)
Question7
Type 1 컬럼의 종류에 따른 Total 컬럼의 평균값을 내림차순 정렬했을때 상위 3번째 Type 1은 무엇인가?
df.groupby(['Type 1']).Total.mean().sort_values(ascending=False)
result = df.groupby(['Type 1']).Total.mean().sort_values(ascending=False).index[2]
print(result)
Question8
결측치가 존재하는 행을 모두 지운 후 처음부터 순서대로 60% 데이터를 추출하여 Defense컬럼의 1분위수를 구하여라
result = df.dropna()[:int(len(df.dropna()) *0.6)].Defense.quantile(.25)
print(result)
Question9
Type 1 컬럼의 속성이 Fire인 포켓몬들의 Attack의 평균이상인 Water속성의 포켓몬 수를 구하여라
target = df[df.Attack >= df[df['Type 1'] =='Fire'].Attack.mean()]
result = target[target['Type 1']=='Water'].shape[0]
print(result)
Question10
각 세대 중(Generation 컬럼)의 Speed와 Defense 컬럼의 차이(절댓값)이 가장 큰 세대는?
df.groupby(['Generation'])[['Speed','Defense']].mean()
df.groupby(['Generation'])[['Speed','Defense']].mean().T
df.groupby(['Generation'])[['Speed','Defense']].mean().T.diff().T
result = abs(df.groupby(['Generation'])[['Speed','Defense']].mean().T.diff().T).sort_values('Defense').index[-1]
print(result)
작업 2유형
import pandas as pd
train= pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/stroke_/train.csv')
test= pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/stroke_/test.csv')
display(train.head())
display(test.head())
데이터 설명 : 뇌졸중 발생 여부 예측
간단한 모델링 작업
#import
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score, classification_report
from sklearn.ensemble import RandomForestClassifier
#전처리
train['age'] = train['age'].str.replace('*', '').astype('int')
train['bmi'] = train['bmi'].fillna(train['bmi'].mean())
test['bmi'] = test['bmi'].fillna(test['bmi'].mean())
x = train.drop(columns = ['id', 'stroke'])
xd = pd.get_dummies(x)
y = train['stroke']
#학습
x_train, x_test, y_train, y_test = train_test_split(xd, y, stratify = y, random_state = 1)
rf = RandomForestClassifier()
rf.fit(x_train, y_train)
pred = rf.predict_proba(x_test)
print('test roc score : ', roc_auc_score(y_test, pred[:,1]))
# one-hot encoding시 train셋에만 존재하는 컬럼이 존재
test_preprocessing = pd.get_dummies(test.drop(columns=['id']))
test_preprocessing
list(set(x_train.columns) -set(test_preprocessing))
test_preprocessing[list(set(x_train.columns) -set(test_preprocessing))] =0
test_preprocessing
train에 새로운 column을 추가했으면 test에도 똑같이 추가해준다
test_preprocessing =test_preprocessing[x_train.columns]
test_pred = rf.predict_proba(test_preprocessing)
test_pred
# 아래 코드 예측변수와 수험번호를 개인별로 변경하여 활용
# pd.DataFrame({'id': test.id, 'stroke': pred}).to_csv('003000000.csv', index=False)
#pd.DataFrame({'id': test.id, 'stroke': test_pred[:,1]}).to_csv('003000000.csv', index=False)