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 = """
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}")