주제 : 데이터 분석으로 심부전증을 예방할 수 있을까?¶
데이터 소개¶
- 이번 주제는 Heart Failure Prediction 데이터셋을 사용합니다.
- 다음 1개의 csv 파일을 사용합니다.
heart_failure_clinical_records_dataset.csv
- 각 파일의 컬럼은 아래와 같습니다.
age: 환자의 나이
anaemia: 환자의 빈혈증 여부 (0: 정상, 1: 빈혈)
creatinine_phosphokinase: 크레아틴키나제 검사 결과
diabetes: 당뇨병 여부 (0: 정상, 1: 당뇨)
ejection_fraction: 박출계수 (%)
high_blood_pressure: 고혈압 여부 (0: 정상, 1: 고혈압)
platelets: 혈소판 수 (kiloplatelets/mL)
serum_creatinine: 혈중 크레아틴 레벨 (mg/dL)
serum_sodium: 혈중 나트륨 레벨 (mEq/L)
sex: 성별 (0: 여성, 1: 남성)
smoking: 흡연 여부 (0: 비흡연, 1: 흡연)
time: 관찰 기간 (일)
DEATH_EVENT: 사망 여부 (0: 생존, 1: 사망)
최종 목표¶
- 의료 데이터와 그 분석에 대한 이해
- Colab 및 Pandas 라이브러리 사용법 이해
- 데이터 시각화를 통한 인사이트 습득 방법의 이해
- Scikit-learn 기반의 모델 학습 방법 습득
- Classification 모델의 학습과 평가 방법 이해
Step 0. 의료 데이터셋에 대하여¶
의료 데이터의 수집¶
2020년 1월에 데이터 3법이 통과 -핵심은 가명정보를 쓸 수 있게 되었음 (데이터 3법때매 배포환경이 좋아져 바이오 데이터가 뜨고있음)
의료 데이터 분석의 현재¶
Accuracy, Precision, 그리고 Recall¶
In [ ]:
정확도(accuracy) ->
`정밀도 -> TP/TP+FP -> 트루라고 예측한것중 실제 트루인 것
병에 걸렸어 했는데 실제 병에걸린사람
재현율 -> TP/TP+FN -> 실제 True중 얼마나 맞추었냐
실제 병결린 사람중 얼만큼 찾아 냈냐 - > recall이 precision 보다 중요
초반엔 recall이 좋아야 좋은 것이라
리콜을 0.95 이상유지하면서 precision을 떨어뜨리지 않는게 좋은 모델
Step 1. 데이터셋 준비하기¶
In [4]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
문제 1. Colab Notebook에 Kaggle API 세팅하기¶
In [3]:
import os
import glob
In [90]:
# os.environ을 이용하여 Kaggle API Username, Key 세팅하기
os.environ['KAGGLE_USERNAME'] = 'robin0309'
os.environ['KAGGLE_KEY'] = "77716f559f9964d9459b7863add36a65"
문제 3. Pandas 라이브러리로 csv파일 읽어들이기¶
In [5]:
# pd.read_csv()로 csv파일 읽어들이기
df = pd.read_csv('heart_failure_clinical_records_dataset.csv')
Step 2. EDA 및 데이터 기초 통계 분석¶
In [ ]:
문제 4. 데이터프레임의 각 컬럼 분석하기¶
In [6]:
# DataFrame에서 제공하는 메소드를 이용하여 컬럼 분석하기 (head(), info(), describe())
df.head()
Out[6]:
In [7]:
df.info()
creatinine 의 max가 7861을 보면 outlier를 찾을 수 있음¶
In [12]:
round(df.describe(),2)
Out[12]:
사망자 수¶
In [13]:
df['DEATH_EVENT'].value_counts()
Out[13]:
In [14]:
df.shape
Out[14]:
In [15]:
df[(df['age']>10) & (df['age']<20)]
Out[15]:
문제 5. 수치형 데이터의 히스토그램 그리기¶
In [16]:
sns.histplot(x='age',hue='DEATH_EVENT',data=df,kde=True)
Out[16]:
creatine 이 3000 아래인 것만 보고 싶을 때¶
In [18]:
plt.rcParams['figure.figsize'] = [10, 5]
sns.histplot(data=df.loc[df['creatinine_phosphokinase']<3000,'creatinine_phosphokinase'])
Out[18]:
In [19]:
sns.histplot(x='platelets',data=df,hue='DEATH_EVENT')
Out[19]:
In [9]:
plt.subplot(221)
sns.histplot(x='age',hue='DEATH_EVENT',data=df,kde=True)
plt.subplot(222)
sns.histplot(x='creatinine_phosphokinase',hue='DEATH_EVENT',data=df,kde=True)
plt.subplot(223)
sns.histplot(x='anaemia',hue='DEATH_EVENT',data=df,kde=True)
plt.subplot(224)
sns.histplot(x='diabetes',hue='DEATH_EVENT',data=df,kde=True)
plt.tight_layout()
plt.rcParams["figure.figsize"] = (15, 15)
plt.show()
2컬럼의 조인트 스캐러플럿을 보여줌
뭉쳐서 판단힘들면 알파값주면 투명함으로 보여줌
In [21]:
sns.jointplot(x='platelets',y='creatinine_phosphokinase',hue='DEATH_EVENT',alpha=0.3,data=df)
Out[21]:
In [18]:
df.info()
문제 6. Boxplot 계열을 이용하여 범주별 통계 확인하기¶
In [19]:
# seaborn의 Boxplot 계열(boxplot(), violinplot(), swarmplot())을 사용
# Hint) hue 키워드를 사용하여 범주 세분화 가능
plt.subplot(221)
sns.boxplot(x='DEATH_EVENT',y='ejection_fraction',data=df)
plt.subplot(222)
sns.boxplot(x='DEATH_EVENT',y='creatinine_phosphokinase',data=df)
plt.subplot(223)
sns.boxplot(x='DEATH_EVENT',y='platelets',data=df)
plt.subplot(224)
sns.boxplot(x='DEATH_EVENT',y='serum_sodium',data=df)
plt.tight_layout()
plt.rcParams["figure.figsize"] = (10, 10)
plt.show()
Step 3. 모델 학습을 위한 데이터 전처리¶
문제 7. StandardScaler를 이용하여 데이터 전처리하기¶
In [20]:
from sklearn.preprocessing import StandardScaler
In [21]:
df.columns
Out[21]:
In [22]:
# 수치형 입력 데이터, 범주형 입력 데이터, 출력 데이터로 구분하기
X_num = df[['age', 'creatinine_phosphokinase','ejection_fraction', 'platelets','serum_creatinine', 'serum_sodium']]
X_cat = df[['anaemia', 'diabetes', 'high_blood_pressure', 'sex', 'smoking']]
y = df['DEATH_EVENT']
scaler를 거치면 numpy로 바뀌어서 보통 DataFrame으로 다시바꿔줌¶
In [23]:
# 수치형 입력 데이터를 전처리하고 입력 데이터 통합하기
scaler = StandardScaler()
scaler.fit(X_num)
X_scaled = scaler.transform(X_num)
X_scaled = pd.DataFrame(data=X_scaled, index=X_num.index, columns=X_num.columns)
X = pd.concat([X_scaled, X_cat], axis=1)
In [24]:
scaler.fit(X_num)
X_scaled=scaler.transform(X_num)
In [25]:
X_scaled
Out[25]:
In [26]:
X_scaled=pd.DataFrame(data=X_scaled,index=X_num.index,columns=X_num.columns)
In [27]:
X=pd.concat([X_scaled,X_cat],axis=1)
In [28]:
X
Out[28]:
문제 8. 학습데이터와 테스트데이터 분리하기¶
In [43]:
from sklearn.model_selection import train_test_split
In [44]:
# train_test_split() 함수로 학습 데이터와 테스트 데이터 분리하기
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=1)
Step 4. Classification 모델 학습하기¶
문제 9. Logistic Regression 모델 생성/학습하기¶
In [31]:
from sklearn.linear_model import LogisticRegression
In [32]:
# LogisticRegression 모델 생성/학습
model_lr = LogisticRegression(max_iter=1000)
In [33]:
model_lr.fit(X_train,y_train)
Out[33]:
문제 10. 모델 학습 결과 평가하기¶
In [34]:
from sklearn.metrics import classification_report
In [35]:
# Predict를 수행하고 classification_report() 결과 출력하기
pred = model_lr.predict(X_test)
print(classification_report(y_test, pred))
문제 11. XGBoost 모델 생성/학습하기¶
In [41]:
from sklearn.ensemble import GradientBoostingClassifier
In [45]:
# XGBClassifier 모델 생성/학습
model_GB=GradientBoostingClassifier()
model_GB.fit(X_train,y_train)
Out[45]:
In [48]:
pred=model_GB.predict(X_test)
문제 12. 모델 학습 결과 평가하기¶
In [49]:
# Predict를 수행하고 classification_report() 결과 출력하기
print(classification_report(y_test, pred))
문제 13. 특징의 중요도 확인하기¶
In [56]:
# XGBClassifier 모델의 feature_importances_를 이용하여 중요도 plot
plt.bar(X.columns,model_GB.feature_importances_)
plt.xticks(rotation=90)
plt.figure(figsize=(10,10))
plt.show()
In [65]:
from xgboost import XGBClassifier
In [66]:
model_xgb=XGBClassifier()
In [67]:
model_xgb.fit(X_train,y_train)
Out[67]:
In [71]:
pred=model_xgb.predict(X_test)
In [72]:
print(classification_report(y_test,pred))
feature importance¶
In [75]:
plt.bar(X.columns,model_xgb.feature_importances_)
plt.xticks(rotation=90)
plt.figure(figsize=(10,10))
plt.show()
Step5 모델 학습 결과 심화 분석하기¶
문제 14. Precision-Recall 커브 확인하기¶
In [76]:
from sklearn.metrics import plot_precision_recall_curve
In [88]:
# 두 모델의 Precision-Recall 커브를 한번에 그리기 (힌트: fig.gca()로 ax를 반환받아 사용)
fig = plt.figure()
ax = fig.gca()
plot_precision_recall_curve(model_lr, X_test, y_test, ax=ax)
plot_precision_recall_curve(model_xgb, X_test, y_test, ax=ax)
plot_precision_recall_curve(model_GB, X_test, y_test, ax=ax)
Out[88]:
문제 15. ROC 커브 확인하기¶
In [85]:
from sklearn.metrics import plot_roc_curve
In [87]:
# 두 모델의 ROC 커브를 한번에 그리기 (힌트: fig.gca()로 ax를 반환받아 사용)
fig = plt.figure()
ax = fig.gca()
plot_roc_curve(model_lr, X_test, y_test, ax=ax)
plot_roc_curve(model_xgb, X_test, y_test, ax=ax)
plot_roc_curve(model_GB, X_test, y_test, ax=ax)
Out[87]:
In [ ]:
반응형
'Project & Kaggle' 카테고리의 다른 글
데이터로 알아보는 리그 오브 레전드의 승리 예측 및 인사이트 (0) | 2021.02.09 |
---|---|
학생들의 수업 시간 행동 분석을 통한 성적 예측 (0) | 2021.02.02 |
Dog and cat Classification with CNN (0) | 2020.12.15 |
주택 가격 예측 with Deep Neural network (0) | 2020.12.11 |
Deep learning( CNN을 활용한 Mnist classification kernel) (0) | 2020.11.30 |