ANEMIASCOPE / population.py
SerenaTOUM's picture
Create population.py
b5ef1bf verified
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()