|
import streamlit as st |
|
import numpy as np |
|
import pandas as pd |
|
import seaborn as sns |
|
import matplotlib.pyplot as plt |
|
import plotly.express as px |
|
|
|
st.set_page_config(page_title='Heart Failure Dataset Analysis', layout='wide', initial_sidebar_state='expanded') |
|
|
|
def run(): |
|
|
|
|
|
st.title('EDA Dataset Heart Failure') |
|
|
|
|
|
st.subheader('Written by Franciscus Andrew Sunanda, FTDS-RMT-018') |
|
|
|
st.markdown('---') |
|
|
|
|
|
st.write('Dataset : Heart Failure Data Set') |
|
|
|
st.write('Objective : Dapat memprediksi apakah seseorang akan mengalami Heart Failure berdasarkan kondisi kesehatan nya') |
|
|
|
st.write('Evaluasi nya menggunakan Recall dari Classification Report, Accuracy Score, dan False Negative Rate') |
|
|
|
|
|
st.markdown('---') |
|
|
|
st.write('## Dataset') |
|
data=pd.read_csv('h8dsft_P1G3_andrewsunanda.csv') |
|
|
|
|
|
data = data.rename(columns={'anaemia': 'anemia','creatinine_phosphokinase': 'cpk', 'high_blood_pressure': 'hypertension', 'DEATH_EVENT': 'death'}) |
|
|
|
st.dataframe(data) |
|
|
|
''' |
|
Berikut ini adalah list column yang ada dalam dataset ini |
|
|
|
Header | Definition | Keys |
|
---|---|--- |
|
`age` | Age (in years) | |
|
`anaemia` | Decrease of red blood cells | 0 = No, 1 = Yes |
|
`cpk` | Level of the CPK enzyme in the blood (mcg/L) | |
|
`diabetes` | If the patient has diabetes | 0 = No, 1 = Yes |
|
`ejection_fraction` | Percentage of blood leaving the heart at each contraction (percentage) | |
|
`hypertension` | If the patient has hypertension | 0 = No, 1 = Yes |
|
`platelets` | Platelets in the blood (kiloplatelets/mL) | |
|
`serum_creatinine` | Level of serum creatinine in the blood (mg/dL) |
|
`serum_sodium` | Level of serum sodium in the blood (mEq/L) |
|
`sex` | Gender | 0 = Female, 1 = Male |
|
`smoking` | If the patient smokes or not | 0 = No, 1 = Yes |
|
`time` | Follow-up period (in days) | |
|
`death` | If the patient deceased during the follow-up period | 0 = No, 1 = Yes |
|
''' |
|
|
|
st.markdown('---') |
|
|
|
st.write('## Checking Balance / Imbalance') |
|
|
|
kelas = data['death'].value_counts() |
|
|
|
fig = plt.figure() |
|
plt.pie(kelas, autopct='%.0f%%') |
|
plt.title('Perbandingan jumlah target klasifikasi dalam dataset') |
|
plt.legend(labels=['Alive','Dead'], loc='upper left') |
|
st.pyplot(fig) |
|
|
|
""" |
|
Kita lihat dari piechart diatas, dalam data kali ini data termasuk Mild Imbalance, jadi ada baik nya nanti kita lakukan resampling data agar menjadi lebih balance, untuk memastikan model yang kita buat dapat memprediksi dengan lebih akurat |
|
""" |
|
|
|
st.markdown('---') |
|
|
|
st.write('## Each Features Correlation with Heart Failure') |
|
|
|
corr = data.corrwith(data['death']) |
|
fig = plt.figure() |
|
sns.heatmap(corr.to_frame(), cmap='RdYlGn', annot=True, vmin=-1,vmax=1) |
|
st.pyplot(fig) |
|
|
|
''' |
|
- Column Time menonjol kelihatan nya sebagai column nya paling negatively effect Hasil Klasifikasi nya. Asumsi nya berarti semakin lama (tinggi) patient tersebut bertahan setelah menerima bantuan medis, maka kemungkinan lebih besar patient akan hidup |
|
- Sebaliknya, yang paling positively effect kematian patient tampak nya adalah column serum_creatinine. Dapat diasumsikan bahwa semakin tinggi serum creatinine ini (diluar batas normal) makan kemungkinan untuk meninggal semakin besar |
|
- Kita akan cek lagi asumsi yang telah kita buat di bagian berikut nya |
|
''' |
|
st.markdown('---') |
|
|
|
st.write('## Time') |
|
|
|
fig = plt.figure(figsize=(12, 4)) |
|
sns.scatterplot(x='time', y='death', data=data) |
|
plt.title('Perbandingan Kematian dengan Lama Follow-up period') |
|
plt.yticks([0, 1], ['Alive', 'Dead']) |
|
st.pyplot(fig) |
|
|
|
''' |
|
Bisa kita bilang asumsi yang telah kita buat sebelum nya bisa dibilang somewhat betul, karena bagi orang yang menerima bantuan selama di bawah 50 hari, sangat jarang yang bisa bertahan hidup |
|
''' |
|
|
|
st.markdown('---') |
|
|
|
st.write('## Serum Creatinine') |
|
|
|
fig = plt.figure(figsize=(12, 4)) |
|
sns.scatterplot(x='serum_creatinine', y='death', data=data) |
|
plt.title('Perbandingan Kematian dengan Level Serum Creatinine') |
|
plt.yticks([0, 1], ['Alive', 'Dead']) |
|
st.pyplot(fig) |
|
|
|
''' |
|
Asumsi kita mengenai Serum Creatinine ini tidak bisa dibilang sepenuh nya betul karena kalau dilihat di bagian yang Alive, ada juga patient dengan level serum creatinine ini yang sudah sangat tinggi dibandingkan nilai normal orang dewasa, namun masih bisa staying alive setelah menerima bantuan medis |
|
|
|
Referensi : [Level Normal Serum Creatinine](https://www.wikihow.com/images/thumb/e/ea/Bring-Down-High-Creatinine-Levels-Step-3-Version-3.jpg/v4-460px-Bring-Down-High-Creatinine-Levels-Step-3-Version-3.jpg.webp) |
|
''' |
|
|
|
st.markdown('---') |
|
|
|
st.write('## Anemia and Hypertension') |
|
|
|
''' |
|
Setelah melakukan searching di google, saya menemukan suatu [sumber](https://www.alodokter.com/gagal-jantung) dimana disana menyatakan bahwa Gagal Jantung ini dapat disebabkan oleh Anemia dan Hypertensi. Maka saya akan coba cek apakah dalam dataset ini Anemia dan Hypertensi ini sangat mempengaruhi outcome nya |
|
''' |
|
|
|
|
|
test = data.groupby(['hypertension','anemia', 'death']).size().reset_index(name='count') |
|
test['category'] = test['hypertension'].astype(str) + '-' + test['anemia'].astype(str) |
|
|
|
fig = plt.figure() |
|
ax = sns.barplot(x='category', y='count', data=test, hue='death', palette='RdBu') |
|
plt.title('Amount of people that has default and no default payment divided by their age group') |
|
for i in ax.containers: |
|
ax.bar_label(i,) |
|
handles, labels = ax.get_legend_handles_labels() |
|
plt.xticks([0, 1, 2, 3], ['None', 'Anemia', 'Hypertension', 'Both']) |
|
plt.legend(handles=handles, labels=['Alive','Dead'], loc='upper right') |
|
st.pyplot(fig) |
|
|
|
st.markdown('---') |
|
|
|
st.write('## Platelets') |
|
|
|
''' |
|
Platelets atau trombosit memiliki fungsi penting untuk membantu proses pembekuan darah. Range level normal adalah antara 150k - 450k / mL darah. Jika berlebihan trombosit dapat menyebabkan heart attack dan juga stroke, sedangkan kekurangan membuat pendarahan internal maupun eksternal. Mari kita coba kelompok kan colum platelets ini menjadi category Low, Normal, High |
|
|
|
Referensi : [Apa itu Platelets?](https://www.hopkinsmedicine.org/health/conditions-and-diseases/what-are-platelets-and-why-are-they-important) |
|
''' |
|
|
|
|
|
test = data['platelets'] |
|
trombosit = [] |
|
for x in test: |
|
if x < 150000: |
|
trombosit.append('Low') |
|
elif x >= 450000: |
|
trombosit.append('High') |
|
else: |
|
trombosit.append('Normal') |
|
data['trombosit'] = trombosit |
|
|
|
level = data.groupby(['trombosit', 'death']).size().reset_index(name='count') |
|
fig = plt.figure() |
|
ax = sns.barplot(x='trombosit', y='count', data=level, hue='death') |
|
for i in ax.containers: |
|
ax.bar_label(i,) |
|
plt.title('Number of people by their Trombosit Level') |
|
handles, labels = ax.get_legend_handles_labels() |
|
plt.legend(handles=handles, labels=['Alive','Death'], loc='upper right') |
|
st.pyplot(fig) |
|
|
|
st.markdown('---') |
|
|
|
st.write('# Conclusion') |
|
|
|
''' |
|
- Semakin lama trial period (column time) seorang patient, semakin besar kemungkinan dia hidup. |
|
- Kita jauh lebih beresiko untuk gagal jantung apabila kita mengidap both Hipertensi dan juga Anemia. |
|
- Level Trombosit yang terlalu rendah maupun terlalu tinggi sama sama tidak baik dan dapat menyebabkan gagal jantung |
|
''' |
|
|
|
if __name__ == '__main__': |
|
run() |