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 = """ 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.
TATOU TATOU Josias Nathan @Copy Rights Reserved
""" 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}")