NumPy pour les Statistiques et Probabilités
Guide Simple et Pratique
Installation et Import
import numpy as np
Tableaux Masqués (Masked Arrays)
Qu'est-ce que c'est ?
Un tableau masqué permet d'ignorer certaines valeurs (données manquantes, invalides) dans
les calculs.
Création de base
import [Link] as ma
# Créer un tableau masqué simple
donnees = [1, 2, 3, 4, 5]
masque = [False, False, True, False, False] # True = valeur masquée
tableau_masque = ma.masked_array(donnees, mask=masque)
print(tableau_masque) # [1 2 -- 4 5]
# Calcul automatique (ignore les valeurs masquées)
somme = tableau_masque.sum() # = 12 (ignore le 3)
Masquage automatique
# Masquer les valeurs NaN
donnees_nan = [Link]([1, 2, [Link], 4])
tableau_masque = ma.masked_invalid(donnees_nan)
# Masquer selon une condition
tableau_masque = ma.masked_greater([1, 2, 3, 4, 5], 3) # Masque > 3
tableau_masque = ma.masked_equal([1, 2, 3, 4], 2) # Masque = 2
# Remplir les valeurs masquées
tableau_rempli = tableau_masque.filled(0) # Remplace par 0
Génération de Nombres Aléatoires
Distributions de base
# Fixer la graine (pour reproductibilité)
[Link](42)
# Distribution gaussienne (normale)
gauss = [Link](10) # 10 valeurs, moyenne=0, écart-type=1
normale = [Link](5, 2, 5) # moyenne=5, écart-type=2
# Distribution uniforme
uniforme = [Link](0, 10, 5) # valeurs entre 0 et 10
aléatoire = [Link](5) # valeurs entre 0 et 1
# Nombres entiers
entiers = [Link](1, 7, 10) # 10 dés de 1 à 6
Distributions statistiques
# Distribution binomiale (success/échec)
binomiale = [Link](10, 0.3, 5) # 5 expériences de 10 tirages
# Probabilité 0.3 de succès, 10 tirages par expérience
# Distribution de Poisson (événements rares)
poisson = [Link](3, 5) # 5 valeurs, moyenne d'événements = 3
# Autres distributions
chi2 = [Link](2, 5) # Chi-carré, 2 degrés de liberté
student_t = [Link].standard_t(3, 5) # t-Student, 3 degrés de liberté
Choix et permutation
# Choisir des valeurs
choix = [Link]([1, 2, 3, 4, 5]) # 1 valeur aléatoire
choix_multiples = [Link]([1, 2, 3], 5, replace=True) # 5 choix av
choix_sans_remise = [Link]([1, 2, 3], 3, replace=False) # 3 choix
# Permutation
liste = [1, 2, 3, 4, 5]
[Link](liste) # Mélange en place
permutation = [Link](liste) # Retourne une copie mélangée
Statistiques de Base
Données d'exemple
donnees = [Link]([15, 18, 22, 19, 25, 30, 18, 16, 24, 20, 17, 23])
Mesures de tendance centrale
# Moyenne
moyenne = [Link]() # ou [Link](donnees)
moyenne_ponderee = [Link](donnees) # Alternative
# Médiane
mediane = [Link](donnees)
# Mode (plus fréquent) - besoin de scipy
from [Link] import mode
mode_resultat = mode(donnees)
valeur_mode = mode_resultat.mode[0] # Valeur la plus fréquente
Mesures de dispersion
# Écart-type
ecart_type = [Link]() # Écart-type (mathématique)
ecart_type_ech = [Link](ddof=1) # Écart-type échantillon (statistique)
# Variance
variance = [Link]() # Variance (mathématique)
variance_ech = [Link](ddof=1) # Variance échantillon
# Amplitude
amplitude = [Link]() - [Link]()
Quartiles et percentiles
# Quartiles
Q1 = [Link](donnees, 25) # Premier quartile (25%)
Q2 = [Link](donnees, 50) # Deuxième quartile (50% = médiane)
Q3 = [Link](donnees, 75) # Troisième quartile (75%)
# Plusieurs percentiles
quartiles = [Link](donnees, [25, 50, 75])
percentiles = [Link](donnees, [10, 20, 30, 40, 60, 70, 80, 90])
# Range inter-quartile (IQR)
IQR = Q3 - Q1
borne_inf = Q1 - 1.5 * IQR
borne_sup = Q3 + 1.5 * IQR
Histogrammes et Distributions
Création d'histogrammes
# Histogramme simple
frequences, intervalles = [Link](donnees)
print(f"Fréquences: {frequences}")
print(f"Intervalles: {intervalles}")
# Paramètres personnalisés
freq_perso, interv_perso = [Link](donnees, bins=5, range=(15, 30))
# Histogramme de densité (aire = 1)
densite, interv_densite = [Link](donnees, bins=6, density=True)
# Intervalles personnalisés
freq_custom, interv_custom = [Link](donnees, bins=[15, 18, 22, 25, 30]
Comparaison avec des distributions théoriques
# Générer une distribution normale de référence
ref_normale = [Link]([Link](), [Link](), 1000)
freq_ref, interv_ref = [Link](ref_normale, bins=6)
# Calculer les fréquences relatives
freq_relatives = freq_perso / len(donnees)
probabilites_theoriques = freq_ref / len(ref_normale)
Corrélation et Relations
Coefficient de corrélation de Pearson
# Deux variables
x = [Link]([10, 12, 15, 18, 20, 22, 25])
y = [Link]([8, 11, 13, 16, 19, 21, 23])
# Calculer la corrélation
matrice_corr = [Link](x, y)
coefficient_corr = matrice_corr[0, 1] # ≈ 0.99 (forte corrélation positive)
# Multiple variables
donnees_multiples = [Link]([
[10, 12, 15, 18, 20, 22, 25], # Variable 1
[8, 11, 13, 16, 19, 21, 23], # Variable 2
[5, 7, 9, 11, 12, 14, 16] # Variable 3
])
matrice_corr_multiple = [Link](donnees_multiples)
# matrice_corr_multiple[i,j] = corrélation entre variable i et j
Tests Statistiques Simples
Test de normalité (Shapiro-Wilk)
from [Link] import shapiro
statistique, p_valeur = shapiro(donnees)
print(f"Statistique: {statistique:.4f}")
print(f"P-valeur: {p_valeur:.4f}")
if p_valeur > 0.05:
print("Les données suivent probablement une distribution normale")
else:
print("Les données ne suivent pas une distribution normale")
Test t (comparaison de moyennes)
from [Link] import ttest_ind
# Deux échantillons
echantillon1 = [Link]([20, 22, 18, 25, 19, 21])
echantillon2 = [Link]([18, 20, 17, 23, 18, 20])
stat_t, p_t = ttest_ind(echantillon1, echantillon2)
print(f"Statistique t: {stat_t:.4f}")
print(f"P-valeur: {p_t:.4f}")
if p_t > 0.05:
print("Les moyennes sont probablement égales")
else:
print("Les moyennes sont probablement différentes")
Exemple Complet : Analyse de Données
import numpy as np
import [Link] as ma
from [Link] import shapiro
import [Link] as plt
# Simuler des données de températures avec quelques valeurs manquantes
temperatures = [Link]([18.5, [Link], 22.3, 19.7, [Link], 25.1, 23.8, 20.2,
# Créer un tableau masqué
temp_masque = ma.masked_invalid(temperatures)
# Statistiques de base
print("=== ANALYSE DES TEMPÉRATURES ===")
print(f"Nombre de mesures: {len(temp_masque)}")
print(f"Mesures valides: {[Link](temp_masque)}")
print(f"Mesures manquantes: {len(temp_masque) - [Link](temp_masque)}")
print(f"Température moyenne: {temp_masque.mean():.1f}°C")
print(f"Température médiane: {[Link](temp_masque):.1f}°C")
print(f"Écart-type: {temp_masque.std():.1f}°C")
print(f"Min: {temp_masque.min():.1f}°C")
print(f"Max: {temp_masque.max():.1f}°C")
# Quartiles
Q1 = [Link](temp_masque.compressed(), 25)
Q3 = [Link](temp_masque.compressed(), 75)
print(f"Q1 (25%): {Q1:.1f}°C")
print(f"Q3 (75%): {Q3:.1f}°C")
# Détection d'outliers
IQR = Q3 - Q1
borne_outlier_inf = Q1 - 1.5 * IQR
borne_outlier_sup = Q3 + 1.5 * IQR
outliers = ma.masked_outside(temp_masque, borne_outlier_inf, borne_outlier_s
print(f"Outliers détectés: {[Link](outliers) - [Link](temp_masque)}")
# Test de normalité
donnees_valides = temp_masque.compressed()
if len(donnees_valides) >= 3:
stat_shapiro, p_shapiro = shapiro(donnees_valides)
print(f"Test de normalité (Shapiro-Wilk): p = {p_shapiro:.4f}")
# Créer un histogramme
[Link](figsize=(10, 6))
[Link](donnees_valides, bins=8, alpha=0.7, edgecolor='black')
[Link](temp_masque.mean(), color='red', linestyle='--', label=f'Moyenne
[Link]([Link](temp_masque), color='green', linestyle='--', label=f'M
[Link]('Température (°C)')
[Link]('Fréquence')
[Link]('Distribution des Températures')
[Link]()
[Link](True, alpha=0.3)
[Link]()
print("\n=== RÉSUMÉ ===")
print(f"Les températures varient de {temp_masque.min():.1f}°C à {temp_masque
print(f"La température moyenne est de {temp_masque.mean():.1f}°C")
if [Link](outliers) < [Link](temp_masque):
print("Attention: des valeurs extrêmes (outliers) ont été détectées")
Conseils Pratiques
Gestion des données manquantes
# Toujours vérifier les NaN
donnees = [Link]([1, 2, [Link], 4, 5])
if [Link]([Link](donnees)):
print("Attention: des valeurs NaN détectées")
# Utiliser un tableau masqué
donnees_masque = ma.masked_invalid(donnees)
Reproductibilité
# Toujours fixer la graine pour la reproductibilité
[Link](votre_nombre_secret)
# Vos analyses seront alors reproductibles
Visualisation
# Toujours visualiser vos données
import [Link] as plt
[Link](figsize=(12, 4))
# Histogramme
[Link](1, 2, 1)
[Link](donnees, bins=20, alpha=0.7)
[Link]('Distribution')
# Boxplot
[Link](1, 2, 2)
[Link](donnees)
[Link]('Boîte à moustaches')
plt.tight_layout()
[Link]()
Guide créé par Achraf BOUYALLOUL - Focus Statistiques et Probabilités