모의고사 2회차#

Hits

광고 한번 눌러주라

작업 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의 평균값은 ?

Hide 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자리 까지 구하여라

Hide code cell source
fi = df['bmi'].fillna(df['bmi'].median())
result = round(fi.mean(),3)
print(result)
29.166

Question3

bmi컬럼의 각 결측치들을 직전의 행의 bmi값으로 채웠을 경우 bmi 컬럼의 평균을 소숫점 이하 3자리 까지 구하여라

Hide code cell source
fi = df['bmi'].fillna(method = 'ffill')
result = round(fi.mean(),3)
print(result)
29.188

Question4

bmi컬럼의 각 결측치들을 결측치를 가진 환자 나이대(10단위)의 평균 bmi 값으로 대체한 후 대체된 bmi 컬럼의 평균을 소숫점 이하 3자리 까지 구하여라

Hide 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자리 까지 구하여라

Hide 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

Hide 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컬럼)의 숫자 차이는?

Hide 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은 무엇인가?

Hide code cell source
result = df.groupby(['Type 1']).Total.mean().sort_values(ascending=False).index[2]
print(result)
Flying

Question8

결측치가 존재하는 행을 모두 지운 후 처음부터 순서대로 60% 데이터를 추출하여 Defense컬럼의 1분위수를 구하여라

Hide 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속성의 포켓몬 수를 구하여라

Hide 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 컬럼의 차이(절댓값)이 가장 큰 세대는?

Hide code cell source
result = abs(df.groupby(['Generation'])[['Speed','Defense']].mean().T.diff().T).sort_values('Defense').index[-1]
print(result)
2

작업 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())
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
Hide 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