Transformez des données brutes en insights actionnables
Votre parcours de 4 semaines pour maîtriser la Data Science
Ce programme est unique car il utilise exclusivement des données africaines réelles. Vous travaillerez sur des problématiques locales concrètes : éducation, santé publique, agriculture, économie.
Objectif : Développer des compétences directement applicables dans notre contexte.
| Semaine | Thème Principal | Mini-Projet |
|---|---|---|
| Semaine 1 | NumPy & Pandas — Fondations | Analyse démographique Afrique |
| Semaine 2 | Pandas Avancé — Manipulation | Données éducatives africaines |
| Semaine 3 | Visualisation & EDA | Santé publique (Paludisme) |
| Semaine 4 | Analyse Avancée & Projets | Projet final complet |
# Installation des bibliothèques nécessaires pip install numpy pandas matplotlib seaborn jupyter scikit-learn # Vérification des installations import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns print(f"NumPy version: {np.__version__}") print(f"Pandas version: {pd.__version__}")
Maîtriser les outils essentiels de manipulation de données
NumPy (Numerical Python) est la bibliothèque fondamentale pour le calcul scientifique en Python. Elle fournit des arrays multidimensionnels et des opérations vectorielles ultra-rapides.
Pourquoi NumPy ? 50x à 100x plus rapide que les listes Python natives !
import numpy as np # === CRÉATION D'ARRAYS === # Array 1D (vecteur) — températures en Afrique temperatures = np.array([28, 29, 27, 30, 31, 29, 28]) print("Températures:", temperatures) # Array 2D (matrice) — [température, humidité] donnees_stations = np.array([ [28, 85], # Station 1 [26, 90], # Station 2 [24, 75] # Station 3 ]) # Attributs essentiels print(f"Shape: {temperatures.shape}") # (7,) print(f"Dimensions: {temperatures.ndim}") # 1 print(f"Type: {temperatures.dtype}") # int64 print(f"Taille: {temperatures.size}") # 7 # === GÉNÉRATION D'ARRAYS === zeros = np.zeros(5) # [0. 0. 0. 0. 0.] ones = np.ones((3, 4)) # Matrice 3x4 de 1 arange_arr = np.arange(0, 10, 2) # [0 2 4 6 8] linspace_arr= np.linspace(0, 1, 5) # 5 valeurs entre 0 et 1 np.random.seed(42) random_arr = np.random.rand(5) # 5 flottants aléatoires random_int = np.random.randint(0, 100, 10) # 10 entiers 0-100 # === OPÉRATIONS VECTORIELLES === celsius = np.array([25, 28, 30, 27, 29]) fahrenheit = celsius * 9/5 + 32 # Conversion sans boucle ! print(f"Moyenne: {np.mean(celsius)}°C") print(f"Écart-type: {np.std(celsius):.2f}") # === INDEXATION & SLICING === arr = np.array([10, 20, 30, 40, 50]) print(arr[0]) # 10 print(arr[-1]) # 50 print(arr[1:4]) # [20 30 40] print(arr[::2]) # [10 30 50] # Indexation booléenne (très puissant !) jours_chauds = celsius[celsius > 27] print("Températures > 27°C:", jours_chauds) # === MATRICES === matrice = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(np.sum(matrice, axis=0)) # [12 15 18] — somme colonnes print(np.sum(matrice, axis=1)) # [ 6 15 24] — somme lignes print(matrice.T) # Transposée print(matrice.reshape(9, 1)) # Vecteur colonne 9x1
Contexte : Vous avez collecté les précipitations (en mm) pendant 12 mois dans une ville africaine.
import numpy as np # Précipitations mensuelles (mm) — données africaines precipitations = np.array([200, 180, 220, 150, 80, 20, 10, 15, 50, 160, 240, 210]) mois = ['Jan','Fév','Mar','Avr','Mai','Jun', 'Jul','Aoû','Sep','Oct','Nov','Déc']
Pandas est la bibliothèque de manipulation de données en Python. Un DataFrame est une table bidimensionnelle — pensez à un tableur Excel, mais infiniment plus puissant.
import pandas as pd import numpy as np # === CRÉER UN DATAFRAME === data = { 'Pays' : ['Gabon', 'Cameroun', 'Congo', "Côte d'Ivoire", 'Sénégal'], 'PIB_Mds' : [20.3, 44.1, 14.9, 61.4, 27.6], 'Pop_M' : [2.3, 27.9, 5.8, 26.9, 17.2], 'Scolarisation': [88, 78, 72, 62, 57] } df = pd.DataFrame(data) # === EXPLORER LE DATAFRAME === print(df.head()) # 5 premières lignes print(df.info()) # Types + valeurs non-nulles print(df.describe()) # Statistiques descriptives print(df.shape) # (5, 4) print(df.columns) # Index des colonnes # === SÉLECTIONNER === print(df['Pays']) # Colonne entière print(df[['Pays', 'PIB_Mds']]) # Plusieurs colonnes print(df.loc[0]) # Ligne par label print(df.loc[0, 'Pays']) # Cellule spécifique print(df.iloc[0:3, 0:2]) # Slicing par position # === FILTRER === grands = df[df['PIB_Mds'] > 30] # PIB > 30 Mds scol = df[(df['Scolarisation'] > 70) & (df['Pop_M'] > 5)] # === AJOUTER / MODIFIER === df['PIB_par_habitant'] = df['PIB_Mds'] / df['Pop_M'] * 1000 df['Pays'] = df['Pays'].str.upper() # === TRIER === df_trie = df.sort_values('PIB_par_habitant', ascending=False) print(df_trie)
Contexte : Créez un DataFrame avec les données de 6 pays africains (PIB, population, taux de scolarisation, espérance de vie) et répondez aux questions :
Groupby, merge, pivot, nettoyage — les techniques pro de la Data Science
import pandas as pd # Données scolaires africaines df = pd.DataFrame({ 'Region' : ['Nord', 'Sud', 'Nord', 'Est', 'Sud', 'Est'], 'Matiere' : ['Maths', 'Maths', 'Science', 'Maths', 'Science', 'Science'], 'Score' : [72, 68, 81, 75, 70, 79], 'Nb_eleves': [120, 95, 110, 88, 102, 115] }) # === GROUPBY SIMPLE === moy_region = df.groupby('Region')['Score'].mean() print(moy_region) # === GROUPBY MULTI-COLONNES === stats = df.groupby(['Region', 'Matiere']).agg({ 'Score' : ['mean', 'std', 'count'], 'Nb_eleves': 'sum' }) print(stats) # === PIVOT TABLE === pivot = df.pivot_table( values='Score', index='Region', columns='Matiere', aggfunc='mean' ) print(pivot) # === VALEURS MANQUANTES === print(df.isnull().sum()) # Nb NaN par colonne df_clean = df.dropna() # Supprimer lignes NaN df_filled = df.fillna(df.mean(numeric_only=True)) # Remplir par moyenne
Contexte : Dataset des résultats scolaires de plusieurs pays africains par région et matière.
import pandas as pd # Deux datasets africains à fusionner df_pop = pd.DataFrame({ 'Pays' : ['Gabon', 'Cameroun', 'Congo', 'Mali'], 'Pop_M': [2.3, 27.9, 5.8, 22.4] }) df_eco = pd.DataFrame({ 'Pays' : ['Gabon', 'Cameroun', 'Sénégal', 'Mali'], 'PIB' : [20.3, 44.1, 27.6, 18.1] }) # INNER JOIN — seulement les pays présents dans les 2 inner = pd.merge(df_pop, df_eco, on='Pays', how='inner') # LEFT JOIN — tous les pays de df_pop left = pd.merge(df_pop, df_eco, on='Pays', how='left') # OUTER JOIN — tous les pays outer = pd.merge(df_pop, df_eco, on='Pays', how='outer') # CONCAT — empiler verticalement df_afrique = pd.concat([df_pop, df_eco], ignore_index=True) print("INNER:\n", inner) print("LEFT:\n", left)
Contexte : Vous avez deux fichiers : un avec les données économiques et un avec les indicateurs de santé de pays africains.
Créer des visualisations impactantes et analyser les données en profondeur
import matplotlib.pyplot as plt import numpy as np # Données santé — cas de paludisme en Afrique pays = ['Gabon', 'Cameroun', 'Congo', 'Sénégal', "C. d'Ivoire"] cas = [1250, 890, 650, 720, 580] couleurs = ['#009e60', '#3a75c4', '#fcd116', '#009e60', '#3a75c4'] # === GRAPHIQUE EN BARRES === plt.figure(figsize=(10, 6)) bars = plt.bar(pays, cas, color=couleurs, edgecolor='white') plt.title('Cas de Paludisme — Afrique 2024', fontsize=14, fontweight='bold') plt.xlabel('Pays'); plt.ylabel('Nombre de cas') for bar, val in zip(bars, cas): plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 10, str(val), ha='center', fontweight='bold') plt.tight_layout(); plt.show() # === GRAPHIQUE EN LIGNE === mois = range(1, 13) precip = [200, 180, 220, 150, 80, 20, 10, 15, 50, 160, 240, 210] plt.figure(figsize=(10, 5)) plt.plot(mois, precip, color='#009e60', linewidth=2, marker='o', markersize=6) plt.fill_between(mois, precip, alpha=0.15, color='#009e60') plt.title('Précipitations mensuelles'); plt.grid(alpha=0.3) plt.tight_layout(); plt.show() # === SCATTER PLOT === pib = np.random.uniform(10, 80, 20) scol = 50 + pib * 0.4 + np.random.normal(0, 5, 20) plt.figure(figsize=(8, 6)) plt.scatter(pib, scol, c='#3a75c4', s=80, alpha=0.7) plt.xlabel('PIB (Mds $)'); plt.ylabel('Taux scolarisation (%)') plt.title('Corrélation PIB ↔ Scolarisation') plt.tight_layout(); plt.show()
Contexte : Créez un dashboard complet sur la santé publique en Afrique (paludisme, vaccination, mortalité infantile).
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd sns.set_theme(style='whitegrid', palette='viridis') # Dataset africain simulé df = pd.DataFrame({ 'PIB' : [20, 44, 61, 27, 18, 42, 15, 33], 'Scolarisa.': [88, 78, 62, 57, 52, 72, 48, 68], 'Esperance' : [65, 59, 58, 62, 55, 61, 53, 60], 'Sante_Dep' : [4.2, 3.1, 2.8, 3.5, 2.2, 3.8, 2.0, 3.3] }) # HEATMAP — matrice de corrélations plt.figure(figsize=(8, 6)) sns.heatmap(df.corr(), annot=True, cmap='RdYlGn', fmt='.2f', linewidths=0.5) plt.title('Corrélations — Indicateurs Africains'); plt.tight_layout(); plt.show() # PAIRPLOT — relations entre toutes les variables sns.pairplot(df, corner=True) plt.show() # BOXPLOT — distribution par catégorie plt.figure(figsize=(10, 5)) sns.boxplot(data=df, orient='h', palette='Set2') plt.title('Distribution des indicateurs'); plt.tight_layout(); plt.show() # DÉTECTION D'OUTLIERS — méthode IQR Q1 = df['PIB'].quantile(0.25) Q3 = df['PIB'].quantile(0.75) IQR = Q3 - Q1 outliers = df[(df['PIB'] < Q1 - 1.5*IQR) | (df['PIB'] > Q3 + 1.5*IQR)] print(f"Outliers PIB: {len(outliers)}")
Contexte : Réalisez une EDA complète en 6 étapes sur un dataset éducatif africain (taux de scolarisation, budget, résultats, région).
Combiner toutes les compétences — régression, pipeline complet, présentation
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy import stats # Données : PIB vs Espérance de vie (Afrique) pib = np.array([15, 20, 27, 33, 42, 44, 61, 75]) esperance = np.array([52, 55, 60, 62, 61, 59, 58, 64]) # Régression linéaire slope, intercept, r_value, p_value, std_err = stats.linregress(pib, esperance) print(f"Pente : {slope:.4f}") print(f"Intercept : {intercept:.2f}") print(f"R² : {r_value**2:.3f}") print(f"p-value : {p_value:.4f}") # Prédiction pib_pred = np.linspace(min(pib), max(pib), 100) y_pred = slope * pib_pred + intercept # Visualisation plt.figure(figsize=(9, 6)) plt.scatter(pib, esperance, color='#009e60', s=80, zorder=3, label='Données') plt.plot(pib_pred, y_pred, color='#3a75c4', linewidth=2, label=f'R² = {r_value**2:.3f}') plt.xlabel('PIB (Mds $)'); plt.ylabel('Espérance de vie (ans)') plt.title('Régression : PIB ↔ Espérance de vie — Afrique') plt.legend(); plt.grid(alpha=0.3); plt.tight_layout(); plt.show()
Contexte : Analysez la relation entre les précipitations annuelles et les rendements agricoles dans différentes régions africaines.
Mettez en pratique toutes vos compétences sur des problèmes africains réels
Analysez l'évolution de la population, de l'urbanisation et des indicateurs socio-économiques de plusieurs pays africains de 1960 à aujourd'hui.
Livrables :
Analysez les taux de prévalence du paludisme, la couverture vaccinale et les ressources sanitaires dans 5 pays d'Afrique centrale.
Livrables :
Étudiez les rendements agricoles et la sécurité alimentaire en lien avec les données climatiques (précipitations, températures).
Livrables :