Spaces:
Sleeping
Sleeping
| 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( | |
| """ | |
| <style> | |
| .title { | |
| text-align: center; | |
| font-size: 36px; | |
| color: #FF4C4C; | |
| font-weight: bold; | |
| text-transform: uppercase; | |
| } | |
| .footer { | |
| font-style: italic; | |
| margin-top: 30px; | |
| margin-bottom: 20px; | |
| font-size: 16px; | |
| text-align: center; | |
| } | |
| .button-container { | |
| display: flex; | |
| justify-content: space-between; | |
| margin-top: 20px; | |
| } | |
| </style> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| # Titre centré et stylisé | |
| st.markdown('<div class="title">Dashboard d’Analyse Multi-Facteurs de l’Anémie</div>', 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() | |