File size: 7,699 Bytes
dd0c888
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ec83459
 
dd0c888
ec83459
dd0c888
ec83459
 
dd0c888
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c3d1a95
dd0c888
c3d1a95
dd0c888
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c3d1a95
dd0c888
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
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():

    # Buat Title
    st.title('EDA Dataset Heart Failure')

    # Buat Deskripsi
    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')
    # Rename nama column agar lebih mudah digunakan

    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
    '''

    # Ubah menjadi dataframe terpisah untuk di buat menjadi plot
    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)
    '''

    # Buat Column Level Trombosit / Platelets
    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()