File size: 12,119 Bytes
1bdf282
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9b18171
1bdf282
9b18171
1bdf282
 
 
 
 
 
 
9b18171
1bdf282
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9b18171
 
1bdf282
 
 
 
 
 
 
 
9b18171
1bdf282
 
 
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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
import streamlit as st
import joblib
import numpy as np
import tensorflow as tf 
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Configuration de la page
st.set_page_config(
    page_title="Heart Disease Prediction App", 
    page_icon="💉",
    layout="wide",
)

# Barre de menu horizontal
def render_navigation():
    cols = st.columns(3)  
    with cols[0]:
        if st.button("Welcome", use_container_width=True):
            st.session_state.page = "Welcome"
    with cols[1]:
        if st.button("Statistiques", use_container_width=True):
            st.session_state.page = "Statistiques"
    with cols[2]:
        if st.button("ML Predictions", use_container_width=True):
            st.session_state.page = "ML Predictions"
   
# Initialisation de l'état de la page
if "page" not in st.session_state:
    st.session_state.page = "Welcome"

# Affichage du titre de l'application
st.title("Heart Disease Prediction App")

# Affichage du menu horizontal
render_navigation()

# Séparation visuelle
st.markdown("---")

# Gestion des pages
if st.session_state.page == "Welcome":
    st.header("Welcome")
   
    # Caroussel d'images et texte défilant
    carousel_html = """
    <style>
        .carousel {
            width: 400px;
            overflow: hidden;
            position: relative;
            margin: auto;
        }
        .carousel-inner {
            display: flex;
            width: fit-content;
            animation: scroll 30s linear infinite;
        }
        .carousel-item {
            width: 100%;
            flex: 0 0 100%;
        }
        .carousel-item img {
            width: 400px;
            height: 220px;
            object-fit: cover;
            flex-shrink: 0;
        }

        @keyframes scroll {
            0% { transform: translateX(0); }
            10%  { transform: translateX(0); }

            14%  { transform: translateX(-400px); }
            24%  { transform: translateX(-400px); }

            28%  { transform: translateX(-800px); }
            38%  { transform: translateX(-800px); }

            42%  { transform: translateX(-1200px); }
            52%  { transform: translateX(-1200px); }

            56%  { transform: translateX(-1600px); }
            66%  { transform: translateX(-1600px); }

            70%  { transform: translateX(-2000px); }
            80%  { transform: translateX(-2000px); }

            84%  { transform: translateX(-2400px); }
            94%  { transform: translateX(-2400px); }
            100% { transform: translateX(-2800px); }
        }
        
        }
        .marquee {
            margin-top: 20px;
            font-size: 1.5em;
            color: #222;
        }
    </style>

    <div class="carousel">
        <div class="carousel-inner">            
            <div class="carousel-item">
                <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQMAkXR48DptHfFdPOxk5wbvruuhNLl47HHsQ&s" alt="Image 1">
            </div>
            <div class="carousel-item">
                <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRSBxQnqOHtwIiO3zu1hzqrJfWNhDd2-rPYfw&s" alt="Image 2">
            </div>
            <div class="carousel-item">
                <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTrM7AsNKFaUmwJNOC64L4qVladBRa9mBeYvHGlVW3irfOFnKaqd-q-fM3xI1LNkDX1N4c&usqp=CAU" alt="Image 3">
            </div>
            <div class="carousel-item">
                <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRnNvnKnN36xZgRVtBhsKjSxfa9oRAxVqUUJA&s" alt="Image 4">
            </div>
            <div class="carousel-item">
                <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRjg9tVTRNDxxidVkTW1D38vUEVTebxIoOi895oOgNAFlRo1OL3E-Nb9u-Cum57MGd7RdY&usqp=CAU" alt="Image 5">
            </div>   
            <div class="carousel-item">
                <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSik6dHOCeNHKDDizBFyY2XBxKkkw0ndF-epC35vvSF-VEYmcH7g8KQ6Fk7gHn9rZ0KHXs&usqp=CAU" alt="Image 6">
            </div>
             <div class="carousel-item">
                <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ6U966dzdZYTWf23U0lj6OiiUE-zyQ7RZoOI-HmDMFT1cy_S-1vVAv9KTUmMW0Gqxld4U&usqp=CAU" alt="Image 7">
            </div>                        
        </div>
    </div>

    <marquee class="marquee">Bienvenue dans l'application de prédiction des maladies cardiaques ! 
        Explorez nos outils pour analyser et prédire les risques cardiaques avec des modèles de 
        Machine Learning et Deep Learning. Utilisez le menu ci-dessus pour naviguer.</marquee>

    <div style='text-align: center;'>TATOU TATOU Josias Nathan @Copy Rights Reserved </div>
    """
    st.markdown(carousel_html, unsafe_allow_html=True)
    

elif st.session_state.page == "Statistiques":
    st.header("Statistiques")
    
    # Sous-navigation pour Statistiques
    def stats():
        stat_cols = st.columns(2)
        with stat_cols[0]:
            if st.button("About Dataset", use_container_width=True):
                st.session_state.sub_page = "About Dataset"
        with stat_cols[1]:
            if st.button("About heart Diseases", use_container_width=True):
                st.session_state.sub_page = "About heart Diseases"
    
    # Initialisation de l'état de la sous-page
    if "sub_page" not in st.session_state:
        st.session_state.sub_page = "About heart Diseases"
    
    stats()
    st.markdown("---")
    
    # Chargement des données
    try:
        data = pd.read_csv("./heartdisease.csv")  # Remplacez par le chemin de votre fichier
    except Exception as e:
        st.error(f"Erreur lors du chargement des données : {e}")
        st.stop()
    
    # Gestion des sous-pages
    if st.session_state.sub_page == "About Dataset":
        st.header("Dataset Informations")
        
        # Description générale
        st.write("Résumé des données du dataset sur les maladies cardiaques :")
        st.write(data.describe())
        
        # Histogrammes pour les variables numériques
        st.subheader("Distribution des variables numériques")
        numeric_cols = ['age', 'resting bp s', 'cholesterol', 'max heart rate', 'oldpeak']        
        for col in numeric_cols:
            st.write(f"Distribution de {col}")
            fig, ax = plt.subplots(figsize=(4, 2.7))  
            sns.histplot(data[col], kde=True, ax=ax)
            ax.set_title(f"Distribution de {col}")
            st.pyplot(fig)
            plt.close(fig)
        
        # Matrice de corrélation
        st.subheader("Matrice de corrélation")
        fig, ax = plt.subplots(figsize=(10, 7))
        sns.heatmap(data.corr(), annot=True, cmap='coolwarm', ax=ax)
        ax.set_title("Matrice de corrélation des variables")
        st.pyplot(fig)
        plt.close(fig)
        
        # Boîtes à moustaches pour détecter les valeurs aberrantes
        st.subheader("Boîtes à moustaches pour les variables numériques")
        fig, ax = plt.subplots(figsize=(10, 8))
        sns.boxplot(data=data[numeric_cols], ax=ax)
        ax.set_title("Boîtes à moustaches des variables numériques")
        st.pyplot(fig)
        plt.close(fig)
    
    elif st.session_state.sub_page == "About heart Diseases":
        st.header("Heart Diseases Stats")
 
        # Répartition des cas (target)
        fig, ax = plt.subplots(figsize=(4, 2.7))
        sns.countplot(x='target', data=data, palette='Set2', ax=ax)
        ax.set_xticklabels(['Non-Maladie (0)', 'Maladie (1)'])
        ax.set_title("Répartition des cas de maladies cardiaques")
        st.pyplot(fig)
        plt.close(fig)
        
        # Répartition par sexe
        fig, ax = plt.subplots(figsize=(4, 2.7))
        sns.countplot(x='sex', hue='target', data=data, palette='Set1', ax=ax)
        ax.set_xticklabels(['Femme (0)', 'Homme (1)'])
        ax.set_title("Maladies cardiaques par sexe")
        ax.legend(['Non-Maladie', 'Maladie'])
        st.pyplot(fig)
        plt.close(fig)
        
        # Répartition par type de douleur thoracique
        fig, ax = plt.subplots(figsize=(10, 6))
        sns.countplot(x='chest pain type', hue='target', data=data, palette='Set3', ax=ax)
        ax.set_xticklabels(['Typique (0)', 'Atypique (1)', 'Non-angineuse (2)', 'Asymptomatique (3)'])
        ax.set_title("Maladies cardiaques par type de douleur thoracique")
        ax.legend(['Non-Maladie', 'Maladie'])
        st.pyplot(fig)
        plt.close(fig)
        
        # Pie chart for categorical variables
        fig, ax = plt.subplots(figsize=(4, 2))
        data['chest pain type'].value_counts().plot.pie(autopct='%1.1f%%', colors=sns.color_palette('Set2'))
        ax.set_title("Répartition des types de douleur thoracique")
        st.pyplot(fig)
        plt.close(fig)
    

elif st.session_state.page == "ML Predictions":
    st.header("ML Predictions")
    st.write("Section pour les prédictions avec le modèle de Machine Learning.")
    # Chargement du modèle ML
    # Chargement du modèle DL
    try:
        model = tf.keras.models.load_model("DpL_model.h5")
    except Exception as e:
        st.error(f"Erreur lors du chargement du modèle : {e}")
        st.stop()

    st.subheader("Saisir les caractéristiques du patient")
    
    # Formulaire pour les variables d'entrée
    with st.form(key="dpl_prediction_form"):
        col1, col2 = st.columns(2)  # Deux colonnes pour organiser les champs
        
        with col1:
            age = st.number_input("Âge", min_value=1, max_value=120, value=50)
            max_heart_rate = st.number_input("Max heart rate", min_value=60, max_value=220, value=150)
            resting_bp_s = st.number_input("Resting bp s (mm Hg)", min_value=50, max_value=200, value=120)
            cholesterol = st.number_input("Cholesterol (mg/dl)", min_value=100, max_value=600, value=200)
            oldpeak = st.number_input("Oldpeak", min_value=0.0, max_value=10.0, value=0.0, step=0.1)
        
        with col2:
            sex = st.selectbox("Sexe", options=[("Homme", 1), ("Femme", 0)], format_func=lambda x: x[0])
            chest_pain_type = st.selectbox("Chest pain type", 
                                          options=[("Typique", 0), ("Atypique", 1), ("Non-angineuse", 2), ("Asymptomatique", 3)],
                                          format_func=lambda x: x[0])
            resting_ecg = st.selectbox("Resting ecg",
                                      options=[("Normal", 0), ("Anomalie ST-T", 1), ("Hypertrophie", 2)],
                                      format_func=lambda x: x[0])
            
            exercise_angina = st.selectbox("Exercise angina",
                                          options=[("Non", 0), ("Oui", 1)],
                                          format_func=lambda x: x[0])            
            st_slope = st.selectbox("ST slope",
                                   options=[("Ascendante", 0), ("Plate", 1), ("Descendante", 2)],
                                   format_func=lambda x: x[0])
        
        submit_button = st.form_submit_button(label="Prédire")
    
    # Prédiction
    if submit_button:
        # Créer le vecteur d'entrée
        input_data = np.array([[age, sex[1], chest_pain_type[1], resting_bp_s, cholesterol, 
                               resting_ecg[1], max_heart_rate, exercise_angina[1], oldpeak, st_slope[1]]])
        
        # Faire la prédiction
        try:
            prediction_proba = model.predict(input_data)[0][0]
            prediction = 1 if prediction_proba > 0.5 else 0
            
            # Afficher le résultat
            st.subheader("Résultat de la prédiction")
            if prediction == 1:
                st.error("Risque de maladie cardiaque détecté.")
            else:
                st.success("Aucun risque de maladie cardiaque détecté.")
            
            st.write(f"Probabilité de risque : {prediction_proba:.2%}")
        except Exception as e:
            st.error(f"Erreur lors de la prédiction : {e}")