import streamlit as st import pandas as pd import matplotlib.pyplot as plt import geopandas as gpd # Configuration des paramètres du dashboard st.set_page_config(layout="wide") def show(): # CSS pour le style global st.markdown( """ """, unsafe_allow_html=True ) # Titre centré et stylisé st.markdown('
Dashboard d’Analyse Multi-Facteurs de l’Anémie
', unsafe_allow_html=True) #st.title("Dashboard d'Analyse des Données d'Anémie") # Charger les données finaldata = pd.read_excel("final_data.xlsx") # Dictionnaires de mappage pour les labels niveau_vie_labels = {1: 'Bas', 2: 'Moyen', 3: 'Élevé'} zones_labels = {1: 'Urbaines', 2: 'Rurales'} niveaux_etude_labels = {1: 'Sans Niveau', 2: 'Niveau Primaire', 3: 'Niveau Secondaire'} regions_labels = {1: 'Adamaoua', 2: 'Est', 3: 'Extrême-Nord', 4: 'Nord'} # Créer des filtres st.sidebar.header("Filtres") # Filtre pour la région regions = st.sidebar.multiselect("Sélectionner les Régions", options=list(regions_labels.values()), default=list(regions_labels.values())) # Autres filtres age_range = st.sidebar.slider("Tranche d'âge", min_value=int(finaldata['Age'].min()), max_value=int(finaldata['Age'].max()), value=(10, 19)) niveau_vie = st.sidebar.multiselect("Niveau de Vie", options=list(niveau_vie_labels.values()), default=list(niveau_vie_labels.values())) niveau_etude = st.sidebar.multiselect("Niveau d'Étude", options=list(niveaux_etude_labels.values()), default=list(niveaux_etude_labels.values())) zone = st.sidebar.multiselect("Zone d'Appartenance", options=list(zones_labels.values()), default=list(zones_labels.values())) # Convertir les labels sélectionnés en indexes selected_regions = [k for k, v in regions_labels.items() if v in regions] selected_niveau_vie = [k for k, v in niveau_vie_labels.items() if v in niveau_vie] selected_niveau_etude = [k for k, v in niveaux_etude_labels.items() if v in niveau_etude] selected_zone = [k for k, v in zones_labels.items() if v in zone] # Filtrer les données filtered_data = finaldata[ (finaldata['Region'].isin(selected_regions)) & (finaldata['Age'] >= age_range[0]) & (finaldata['Age'] <= age_range[1]) & (finaldata['Niveau_Vie'].isin(selected_niveau_vie)) & (finaldata['Niveau_etude'].isin(selected_niveau_etude)) & (finaldata['Zone'].isin(selected_zone)) ] # Création des colonnes pour un layout en deux colonnes col1, col2 = st.columns(2) with col1: # Graphique 6: Prévalence de l'anémie par Niveau d'Étude st.subheader("Prévalence de l'Anémie par Niveau d'Étude") prevalence_ado = filtered_data.groupby('Niveau_etude')['anemie'].mean() * 100 prevalence_ado.index = prevalence_ado.index.map(niveaux_etude_labels) prevalence_ado = prevalence_ado.sort_values(ascending=True) plt.figure(figsize=(8, 4)) prevalence_ado.plot(kind='bar', color='#66B2FF') plt.title("Prévalence de l'anémie par Niveau d'Étude") plt.xlabel("Niveau d'Étude") plt.ylabel("Prévalence de l'anémie (%)") plt.xticks(rotation=45) plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() st.pyplot(plt) # Graphique 2: Répartition des Cas d'Anémie st.subheader("Répartition des Cas d'Anémie") cas_anemie = filtered_data['anemie'].value_counts() labels = ['Non anémique', 'Anémique'] colors = ['#66B2FF', '#CC0000'] plt.figure(figsize=(8, 4)) plt.pie(cas_anemie, labels=labels, autopct='%1.1f%%', colors=colors, startangle=140, wedgeprops=dict(width=0.4)) plt.title('Répartition des Cas d\'Anémie') plt.axis('equal') st.pyplot(plt) # Graphique 3: Prévalence de l'anémie par Zone d'Appartenance st.subheader("Prévalence de l'Anémie par Zone d'Appartenance") prevalence_ado = filtered_data.groupby('Zone')['anemie'].mean() * 100 prevalence_ado.index = prevalence_ado.index.map(zones_labels) prevalence_ado = prevalence_ado.sort_values(ascending=True) plt.figure(figsize=(8, 4)) prevalence_ado.plot(kind='bar', color='#66B2FF') plt.title("Prévalence de l'anémie par Zone d'Appartenance") plt.xlabel('Zone') plt.ylabel('Prévalence de l\'Anémie (%)') plt.xticks(rotation=45) plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() st.pyplot(plt) with col2: # Graphique 4: Carte de la prévalence de l'anémie st.subheader("Carte de la Prévalence de l'Anémie") cameroon_departments = gpd.read_file("gadm41_CMR_2.shp") cameroon_regions = gpd.read_file("gadm41_CMR_1.shp") datadp = { 'Département': ['Bénoué', 'Djerem', 'Faro et Déo', 'Diamaré', 'Boumba et Ngoko', 'Faro', 'Haut Nyong', 'Kadey', 'Logone et Chari', 'Mayo Banyo', 'Mayo Danay', 'Mayo Kani', 'Mayo Louti', 'Mayo Rey', 'Mayo Sava', 'Mayo Tsanaga', 'Mbéré', 'Vina', 'Lom et Djerem'], 'Prevalence': [58.57, 38.71, 29.89, 33.33, 77.36, 53.33, 56.11, 58.48, 32.62, 49.38, 35.56, 58.97, 59.63, 58.48, 59.52, 43.72, 26.23, 34.93, 50.39] } prevalence_df = pd.DataFrame(datadp) merged_departments = cameroon_departments.set_index('NAME_2').join(prevalence_df.set_index('Département')) regions_cibles = [regions_labels[i] for i in selected_regions] departments_cibles = merged_departments[merged_departments['NAME_1'].isin(regions_cibles)] regions_concerned = cameroon_regions[cameroon_regions['NAME_1'].isin(regions_cibles)] plt.figure(figsize=(10, 6)) ax = plt.gca() departments_cibles.plot(column='Prevalence', cmap='OrRd', linewidth=0.5, ax=ax, edgecolor='black', legend=True, legend_kwds={'label': "Prévalence d'anémie (%)", 'orientation': "vertical"}) regions_concerned.boundary.plot(ax=ax, linewidth=1.5, edgecolor='black') for idx, row in departments_cibles.iterrows(): ax.annotate(text=idx, xy=(row.geometry.centroid.x, row.geometry.centroid.y), ha='center', fontsize=8, color='black', weight='bold') ax.axis('off') ax.set_title("Prévalence de l'anémie par Département", fontsize=15) ax.annotate('Source: Par nos soins', xy=(0.1, .08), xycoords='figure fraction', horizontalalignment='left', verticalalignment='top', fontsize=8, color='#555555') st.pyplot(plt) # Graphique 5: Prévalence de l'anémie par Niveau de Vie st.subheader("Prévalence de l'Anémie par Niveau de Vie") prevalence_ado = filtered_data.groupby('Niveau_Vie')['anemie'].mean() * 100 prevalence_ado.index = prevalence_ado.index.map(niveau_vie_labels) prevalence_ado = prevalence_ado.sort_values(ascending=True) plt.figure(figsize=(8, 4)) prevalence_ado.plot(kind='bar', color='#66B2FF') plt.title("Prévalence de l'anémie par Niveau de Vie") plt.xlabel("Niveau de Vie") plt.ylabel("Prévalence de l'anémie (%)") plt.xticks(rotation=45) plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() st.pyplot(plt) # Graphique 1: Moyenne des taux d'hémoglobine pour chaque âge individuel (10-19 ans) st.subheader("Moyenne des Taux d'Hémoglobine par Âge") finaldata_filtered = filtered_data[(filtered_data['Age'] >= 10) & (filtered_data['Age'] <= 19)] moyenne_hemoglobine_par_age = finaldata_filtered.groupby('Age')['taux_hemoglobine'].mean() couleurs = ['blue' if moyenne >= 12 else 'red' for moyenne in moyenne_hemoglobine_par_age] plt.figure(figsize=(8, 4)) plt.plot(moyenne_hemoglobine_par_age.index, moyenne_hemoglobine_par_age.values, color='black', marker='o', linestyle='-') for i, (age, moyenne) in enumerate(moyenne_hemoglobine_par_age.items()): plt.text(age, moyenne, f'{moyenne:.2f}', ha='right' if i < len(moyenne_hemoglobine_par_age) // 2 else 'left', va='center', color=couleurs[i]) plt.title("Moyenne des taux d'hémoglobine par âge") plt.xlabel('Âge') plt.ylabel("Moyenne du taux d'hémoglobine") plt.axhline(y=12, color='gray', linestyle='--', linewidth=1) plt.tight_layout() st.pyplot(plt) if __name__ == "__main__": show()