빅데이터분석기사/모의고사

실기 모의고사 2회차

hyerimir 2022. 8. 17. 13:21

 

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)