모의고사 2회차#
광고 한번 눌러주라
캐글 링크
작업 1유형#
Attention
데이터 출처 : https://www.kaggle.com/datasets/fedesoriano/stroke-prediction-dataset (후처리 작업)
데이터 설명 : 뇌졸증 발생여부 예측
dataurl : https://raw.githubusercontent.com/Datamanim/datarepo/main/stroke/train.csv
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/stroke_/train.csv')
df.head()
id | gender | age | hypertension | heart_disease | ever_married | work_type | Residence_type | avg_glucose_level | bmi | smoking_status | stroke | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1192 | Female | 31 | 0 | 0 | No | Govt_job | Rural | 70.66 | 27.2 | never smoked | 0 |
1 | 77 | Female | 13 | 0 | 0 | No | children | Rural | 85.81 | 18.6 | Unknown | 0 |
2 | 59200 | Male | 18 | 0 | 0 | No | Private | Urban | 60.56 | 33.0 | never smoked | 0 |
3 | 24905 | Female | 65 | 0 | 0 | Yes | Private | Urban | 205.77 | 46.0 | formerly smoked | 1 |
4 | 24257 | Male | 4 | 0 | 0 | No | children | Rural | 90.42 | 16.2 | Unknown | 0 |
Question1
성별이 Male인 환자들의 age의 평균값은 ?
Show code cell source
df['age'] = df['age'].str.replace('*','').astype('int')
result = df[df.gender =='Male'].age.mean()
print(result)
44.68623481781376
Question2
bmi컬럼의 결측치를 bmi컬럼의 결측치를 제외한 나머지 값들의 중앙값으로 채웠을 경우 bmi 컬럼의 평균을 소숫점 이하 3자리 까지 구하여라
Show code cell source
fi = df['bmi'].fillna(df['bmi'].median())
result = round(fi.mean(),3)
print(result)
29.166
Question3
bmi컬럼의 각 결측치들을 직전의 행의 bmi값으로 채웠을 경우 bmi 컬럼의 평균을 소숫점 이하 3자리 까지 구하여라
Show code cell source
fi = df['bmi'].fillna(method = 'ffill')
result = round(fi.mean(),3)
print(result)
29.188
Question4
bmi컬럼의 각 결측치들을 결측치를 가진 환자 나이대(10단위)의 평균 bmi 값으로 대체한 후 대체된 bmi 컬럼의 평균을 소숫점 이하 3자리 까지 구하여라
Show code cell source
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/stroke_/train.csv')
# Noise 데이터 int형 변환
df['age'] = df['age'].str.replace('*','').astype('int')
# 결측치 제외 나이대별 평균값 계산 및 dictionary 형태로 변환
mean = df[df.bmi.notnull()].groupby(df.age//10 *10).bmi.mean()
dic = { x:y for x,y in mean.items()}
idx =df.loc[df.bmi.isnull(),['age','bmi']].index
# 결측치 매핑
df.loc[df.bmi.isnull(),'bmi'] =(df[df.bmi.isnull()].age//10*10).map(lambda x : dic[x])
result = df.bmi.mean()
print(result)
29.2627029367386
Question5
avg_glucose_level 컬럼의 값이 200이상인 데이터를 모두 199로 변경하고 stroke값이 1인 데이터의 avg_glucose_level값의 평균을 소수점이하 3자리 까지 구하여라
Show code cell source
df.loc[df.avg_glucose_level >=200,'avg_glucose_level'] =199
result = round(df[df.stroke ==1].avg_glucose_level.mean(),3)
print(result)
125.188
작업 1유형_다른 데이터#
Attention
데이터 출처 : https://www.kaggle.com/abcsds/pokemon (참고, 데이터 수정)
데이터 설명 : 포켓몬 정보
data url = https://raw.githubusercontent.com/Datamanim/datarepo/main/pok/Pokemon.csv
Show code cell source
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/pok/Pokemon.csv')
df.head()
# | Name | Type 1 | Type 2 | Total | HP | Attack | Defense | Sp. Atk | Sp. Def | Speed | Generation | Legendary | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Bulbasaur | Grass | Poison | 318 | 45 | 49 | 49 | 65 | 65 | 45 | 1 | False |
1 | 2 | Ivysaur | Grass | Poison | 405 | 60 | 62 | 63 | 80 | 80 | 60 | 1 | False |
2 | 3 | Venusaur | Grass | Poison | 525 | 80 | 82 | 83 | 100 | 100 | 80 | 1 | False |
3 | 3 | VenusaurMega Venusaur | Grass | Poison | 625 | 80 | 100 | 123 | 122 | 120 | 80 | 1 | False |
4 | 4 | Charmander | Fire | NaN | 309 | 39 | 52 | 43 | 60 | 50 | 65 | 1 | False |
Question6
Attack컬럼의 값을 기준으로 내림차순정렬 했을때 상위 400위까지 포켓몬들과 401~800위까지의 포켓몬들에서 전설포켓몬(Legendary컬럼)의 숫자 차이는?
Show code cell source
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)
57
Question7
Type 1 컬럼의 종류에 따른 Total 컬럼의 평균값을 내림차순 정렬했을때 상위 3번째 Type 1은 무엇인가?
Show code cell source
result = df.groupby(['Type 1']).Total.mean().sort_values(ascending=False).index[2]
print(result)
Flying
Question8
결측치가 존재하는 행을 모두 지운 후 처음부터 순서대로 60% 데이터를 추출하여 Defense컬럼의 1분위수를 구하여라
Show code cell source
result = df.dropna()[:int(len(df.dropna()) *0.6)].Defense.quantile(.25)
print(result)
50.0
Question9
Type 1 컬럼의 속성이 Fire인 포켓몬들의 Attack의 평균이상인 Water속성의 포켓몬 수를 구하여라
Show code cell source
target = df[df.Attack >= df[df['Type 1'] =='Fire'].Attack.mean()]
result = target[target['Type 1']=='Water'].shape[0]
print(result)
37
Question10
각 세대 중(Generation 컬럼)의 Speed와 Defense 컬럼의 차이(절댓값)이 가장 큰 세대는?
Show code cell source
result = abs(df.groupby(['Generation'])[['Speed','Defense']].mean().T.diff().T).sort_values('Defense').index[-1]
print(result)
2
작업 2유형#
Attention
데이터 출처 : https://www.kaggle.com/datasets/fedesoriano/stroke-prediction-dataset (후처리 작업)
데이터 설명 : 뇌졸증 발생여부 예측
train : https://raw.githubusercontent.com/Datamanim/datarepo/main/stroke_/train.csv
test : https://raw.githubusercontent.com/Datamanim/datarepo/main/stroke_/test.csv
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())
id | gender | age | hypertension | heart_disease | ever_married | work_type | Residence_type | avg_glucose_level | bmi | smoking_status | stroke | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1192 | Female | 31 | 0 | 0 | No | Govt_job | Rural | 70.66 | 27.2 | never smoked | 0 |
1 | 77 | Female | 13 | 0 | 0 | No | children | Rural | 85.81 | 18.6 | Unknown | 0 |
2 | 59200 | Male | 18 | 0 | 0 | No | Private | Urban | 60.56 | 33.0 | never smoked | 0 |
3 | 24905 | Female | 65 | 0 | 0 | Yes | Private | Urban | 205.77 | 46.0 | formerly smoked | 1 |
4 | 24257 | Male | 4 | 0 | 0 | No | children | Rural | 90.42 | 16.2 | Unknown | 0 |
id | gender | age | hypertension | heart_disease | ever_married | work_type | Residence_type | avg_glucose_level | bmi | smoking_status | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 47472 | Female | 58 | 0 | 0 | Yes | Private | Urban | 107.26 | 38.6 | formerly smoked |
1 | 36841 | Male | 78 | 1 | 0 | Yes | Self-employed | Rural | 56.11 | 25.5 | formerly smoked |
2 | 3135 | Female | 73 | 0 | 0 | No | Self-employed | Rural | 69.35 | NaN | never smoked |
3 | 65218 | Male | 2 | 0 | 0 | No | children | Rural | 109.10 | 20.0 | Unknown |
4 | 1847 | Female | 20 | 0 | 0 | No | Govt_job | Rural | 79.53 | NaN | never smoked |
Show code cell source
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))] =0
test_preprocessing =test_preprocessing[x_train.columns]
test_pred = rf.predict_proba(test_preprocessing)
# 아래 코드 예측변수와 수험번호를 개인별로 변경하여 활용
# 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)
test roc score : 0.8468479025076165