Aller au contenu

SciPy

Objectifs de la section

2-2 Bibliothèques du langage qui permet de manipuler des fonctions statistiques.

Temps requis

10 minutes


La librairie SciPy (pour Scientific Python) est une boîte à outils scientifique très puissante construite sur NumPy. Elle offre des fonctions avancées pour les statistiques, l’optimisation, l’algèbre linéaire, les intégrales, la transformation de Fourier, etc.

SciPy comporte plusieurs modules, dont un dédié aux statistiques qui présente des fonctions liées aux statistiques descriptives, aux tests d’hypothèses, à la corrélation, et à l’analyse de distribution.

Importer SciPy

from scipy import stats

Fonctions de statistiques descriptives de scipy.stats

Voici un aperçu des fonctions fréquemment utilisées pour l’analyse statistique.

Fonction Description Exemple
mode Mode (valeur la plus fréquente) stats.mode(donnees)
variation Coefficient de variation (rapport entre l'écart-type et la moyenne) `stats.variation(donnees)
median Médiane stats.median(donnees)
iqr Écart interquartile (Q3 - Q1) stats.iqr(donnees)
describe Résumé statistique complet d’un ensemble de données stats.describe(donnees)

Philosophie de SciPy

Les développeurs de SciPy évitent de refaire des fonctions qui sont disponibles dans d'autres paquets dont Pandas et NumPy. Par exemple, il n'y a pas de fonction pour calculer la moyenne dans SciPy, car Pandas et NumPy en définissent déjà une. Donc si vous ne trouvez pas une fonction dans SciPy pensez à regarder dans d'autres paquets.

Exemple — Analyse descriptive
1
2
3
4
5
6
7
import pandas as pd
from scipy import stats

donnees = pd.read_csv("exemple.csv")  # imaginons une colonne "temps_attente"
resume = stats.describe(donnees["temps_attente"])

print(resume)

Tests d'hypothèses

On trouve souvent dans une étude de statistiques des tests d'hypothèses servant à mesurer la significativité statistique d'un phénomène : autrement dit la probabilité que les conclusions observées sur l'échantillon soient dues à un échantillonnage particulier et qu'il soit peu vraissemblable d'inférer les conclusions à la population. On appelle cette probabilité (la probabilité que l'observation ait été obtenue en raison d'un échantillonnage particulier) p-value. La plupart des fonctions de tests d'yhypothèse présentent la p-value comme outil de décision.

Test d'hypothèse d'une moyenne et intervalle de confiance

La fonction pour effectuer un test sur une moyenne est ttest_1samp. Ce test utilise toujours la loi de Student (jamais l'approximation par la loi normale), donc il est valide pour n'importe quelle échantillon.

Test d'une moyenne échantillon
1
2
3
4
5
6
7
8
from scipy import stats

echantillon = [4.3, 1.0, 0.9, 8.2, 7.9, 2.3, 6.8, 2.0, 3.2, 3.4, 0.2, 3.8, 7.6, 5.1, 5.7]
resultat_test = stats.ttest_1samp(echantillon, 3)

print(f"La statistique T est : {resultat_test.statistic}.")     # Affiche 2.04
print(f"La p-value est : {resultat_test.pvalue}.")              # Affiche 0.06
print(f"Mesure avec {resultat_test.df} degrés de libertés.")    # Affiche 14

Paramètre Valeur par défaut Symbole statistique Fonctionnement
a Aucune Permet de calculer \(\bar{x}\) Une liste ou une série qui contient les observations de l'échantillon
popmean Aucune \(\mu_0\) La moyenne de la population (\(H_0 : \mu = \mu_0\))
alternative two-sided L'hypothèse alternative (\(H_1\)) two-sided pour \(H_1 : \mu \neq \mu_0\), less pour \(H_1 : \mu < \mu_0\) et greater pour \(H_1 : \mu > \mu_0\)

Intervalle de confiance pour une moyenne

Pour générer l'intervalle de confiance pour la moyenne, il faut appeler la méthode confidence_interval sur le résultat du T-test. Cette méthode accepte un paramètre : le niveau de confiance auquel calculer l'intervalle, qui est de 0.95 par défaut (équivalent à 95%)

Intervalle de confiance
from scipy import stats

echantillon = [4.3, 1.0, 0.9, 8.2, 7.9, 2.3, 6.8, 2.0, 3.2, 3.4, 0.2, 3.8, 7.6, 5.1, 5.7]
resultat_test = stats.ttest_1samp(echantillon, 3)

print(f"L'intervalle de confiance au niveau de confiance de 95% est {resultat_test.confidence_interval(0.95)}.")
# Affiche ... de 95% est ConfidenceInterval(low=2.6915761256081714, high=5.628423874391829)
print(f"L'intervalle de confiance au niveau de confiance de 90% est {resultat_test.confidence_interval(0.90)}.")
# Affiche ... de 90% est ConfidenceInterval(low=2.9541225725845757, high=5.365877427415424)

#On peut extraire la borne inférieure ou supérieure de l'intervalle de confiance avec les attributs low et high

Test d'hypothèse pour deux moyennes

Pour le test de deux moyennes, il existe deux fonctions dans SciPy :

  • ttest_ind pour tester deux échantillons indépendants;
  • ttest_rel pour tester deux échantillons dépendants.

Les deux fonctions ont les même paramètres, c'est simplement la façon dont le calcul est réalisé qui diffère.

Paramètre Valeur par défaut Symbole statistique Fonctionnement
a Aucune Permet de calculer \(\bar{x_1}\) Une liste ou une série qui contient les observations de l'échantillon 1
b Aucune Permet de calculer \(\bar{x_2}\) Une liste ou une série qui contient les observations de l'échantillon 2
alternative two-sided L'hypothèse alternative (\(H_1\)) two-sided pour \(H_1 : \mu_1 \neq \mu_2\), less pour \(H_1 : \mu_1 < \mu_2\) et greater pour \(H_1 : \mu_1 > \mu_2\)

Tout comme pour un échantillon, on peut calculer une intervalle de confiance sur le résultat des fonctions. Cette intervalle est calculée pour la différence entre les échantillons.

Intervalle de confiance
from scipy import stats

echantillon_1 = [4.3, 1.0, 0.9, 8.2, 7.9, 2.3, 6.8, 2.0, 3.2, 3.4, 0.2, 3.8, 7.6, 5.1, 5.7]
echantillon_2 = [3.1, 8.2, 8.9, 3.1, 11.3, 8.2, 5.4, 12.0, 11.2, 3.7, 3.2, 4.3, 8.4, 10.1, 5.0]
# On test que les résultats de l'échantillon 1 sont moins élevés, en moyenne, que ceux de l'échantillon 2
resultat_test = stats.ttest_ind(echantillon_1, echantillon_2, alternative="less")

print(f"La statistique T est : {resultat_test.statistic}.")     # Affiche -2.68
print(f"La p-value est : {resultat_test.pvalue}.")              # Affiche 0.006
print(f"Mesure avec {resultat_test.df} degrés de libertés.")    # Affiche 28

Autres tests d'hypothèses

Plusieurs autres tests (comme ceux pour les variances) sont définis dans SciPy Référez-vous à la documentation pour les utiliser. Ils ont tous un mode de fonctionnement similaire.

Mesures et tests d'association

On peut quantifier l'association entre deux variables de plusieurs façons. On en présente deux ici :

  • Coefficient de corrélation linéaire (Pearson) : utilisé pour quantifier un lien linéaire entre deux variables continues
  • Test du \(\chi^2\) : utilisé pour tester la dépendances entre deux variables discrètes

Coefficient de corrélation linéaire

La corrélation entre deux variables varie de -1 à 1. Une corrélation près -1 ou de 1 indique une association linéaire forte entre les variables, alors qu'une corrélation près de 0 indique une absence d'association (ou une association faible) entre les variables. Une valeur positive indique que les deux échantillons varient proportionnellement (si l'une des valeurs augmentent pour un échantillon, elle augmentera proportionnellement dans l'autre), tandis qu'une valeur négative de corréaltion indique que les échantillons varient inversement (si l'une des valeurs augmentent pour un échantillon, elle diminuera proportionnellement dans l'autre), La fonction pour faire un test de corrélation est stats.pearsonr.

Paramètre Valeur par défaut Symbole statistique Fonctionnement
x Aucune Permet de calculer \(\bar{x_1}\) Une liste ou une série qui contient les observations de l'échantillon 1
y Aucune Permet de calculer \(\bar{x_2}\) Une liste ou une série qui contient les observations de l'échantillon 2
alternative two-sided L'hypothèse alternative (\(H_1\)) two-sided pour \(H_1 : \rho \neq 0\), less pour $H_1 : \rho < 0 et greater pour \(H_1 : \rho > 0\)

L'objet retourné par cette fonction contient deux attributs :

  • statistic : le coefficient de corrélation entre les échantillons
  • pvalue : la p-value du test de corrélation
Exemple de calcul de corrélation
1
2
3
4
5
6
7
8
from scipy import stats

echantillon_1 = [0.3, 4.9, 3.8, 7.3, 3.9, 2.2, 4.3, 7.8, 2.9, 1.4, 7.5, 1.9, 5.0, 3.2, 3.6]
echantillon_2 = [2.2, 5.2, 5.1, 7.5, 4.0, 2.3, 6.1, 9.7, 4.1, 3.6, 9.2, 4.3, 5.3, 4.1, 5.8]

resultat_correlation = stats.pearsonr(echantillon_1, echantillon_2)
print(f"Corrélation de Pearson: r = {resultat_correlation.statistic:.2f}, p-value = {resultat_correlation.pvalue:.4f}")
# Affiche Corrélation de Pearson: r = 0.93, p-value = 0.0000

Test d'association du X2

Le test d'association du \(\chi^2\) permet de calculer l'association entre deux variables discrètes en comparant leur distribution observée à l'hypothèse de distribution indépendante. Pour réaliser ce test, il faut d'abord former un tableau de contingence (appelé crosstable) avec les données. Pour ce faire, la fonction crosstab de Pandas peut être utilisée.

La fonction crosstab

Il existe aussi une fonction nommée crosstab dans SciPy, mais son fonctionnement est différent de celui présenté ici. Nous choisissons d'utiliser celle de Pandas, car sa forme est plus simple à partir d'un DataFrame.

Attention, selon la façon dont l'importation se fait, vous pouvez causer des collisions de noms (deux fonctions qui portent le même nom existent dans le même espace de code... Python n'aime pas cela...)

La fonction crosstab forme un tableau de contigence à partir de deux séries (soit deux colonnes d'un DataFrame). Ensuite la fonction chi2_contingency de SciPy accepte un seul paramètre : le tableau de contingence, et retourne un objet qui comporte les attributs suivants :

  • statistic : la statistique du \(\chi^2\) du test;
  • pvalue : la p-value obtenue pour le test;
  • dof : le nombre de degrés de liberté avec lequel la statistique est évaluée. Correspond à \((\text{nombre de lignes} - 1) \times (\text{nombre de colonnes} - 1)\);
  • expected_freq: un tableau de contigence avec les fréquences théoriques (sous l'hypothèse d'indépendance).
Exemple de test du khi-deux
import pandas as pd
import scipy.stats as stats

# À partir des données de l'exercice sur le Titanic
donnees = pd.read_excel("titanic.xlsx")

# Formation du tableau de contingence entre si une personne a survécu
# et la classe de son billet
tableau_contigence = pd.crosstab(donnees["Survived"], donnees["Pclass"])
print(tableau_contigence)

# Analyse de la relation avec le test du chi deux
resultat = stats.chi2_contingency(tableau_contigence)
print(f"p-value du test : {resultat.pvalue:.4f}.")

# Affiche p-value du test : 0.0000 (significatif - donc les deux variables sont liées)

# Si la classe et les chances de survie sont indépendantes, voici ce à quoi
# aurait du ressembler le tableau de contingence
print("Tableau de contigence théorique")
print(resultat.expected_freq)

# Affiche   Tableau de contigence théorique
#           [[133.09090909 113.37373737 302.53535354]
#            [ 82.90909091  70.62626263 188.46464646]]

Régression linéaire

La régression linéaire permet d'exprimer, sous forme d'une équation affine (\(y = b_1x + b_0\)), le lien entre deux variables. La régression fournit également une équation pour prédire, à partir d'une variable, une autre variable. Il existe deux indicateurs pour évaluer la qualité de la régression :

  • Le coefficient de détermination \(r^2\);
  • Le test d'hypothèse sur la significativité de la pente (\(H_0 : \beta_1 = 0\)).

La fonction linregress calcule la régression à partir de deux séries de données

Paramètre Valeur par défaut Symbole statistique Fonctionnement
x Aucune Permet de calculer \(\bar{x_1}\) Une liste ou une série qui contient les observations de la variable indépendante
y Aucune Permet de calculer \(\bar{x_2}\) Une liste ou une série qui contient les observations de la variable dépendante
alternative two-sided L'hypothèse alternative (\(H_1\)) two-sided pour \(H_1 : \beta_1 \neq 0\), less pour $H_1 : \beta_1 < 0 et greater pour \(H_1 : \beta_1 > 0\)

L'objet retourné par la fonction comporte les attributs suivants :

  • slope : la pente (\(b_1\)) de l'équation de régression.
  • intercept : l'ordonnée à l'origine (\(b_0\)) de l'équation de régression.
  • rvalue : le coefficient de corrélation de Pearson entre les deux variables. L'élever au carré pour avoir le coefficient de détermination.
  • pvalue : la p-value du test de significativité de la pente. Une pente non significative mène à une régression éronnée et qui ne devrait pas être utilisée.
Exemple de régression linéaire
import pandas as pd
import scipy.stats as stats

# À partir des données sur les urgences pour les hôpitaux au MCQ en 2024-2025
donnees = pd.read_excel("urgences-mcq-2425.xlsx")

# Régression linéaire entre le nombre de visites (var indépendante) et le
# temps d'attente plus de 24 h
resultat_regression = stats.linregress(
    donnees["nb_visites_total"],
    donnees["nb_usagers_sur_civiere_plus_24h"])
coefficient_determination = resultat_regression.rvalue**2

# Affichage des résultats
print(f"L'équation de régression est : {resultat_regression.slope:.2f}x +" +
    f"{resultat_regression.intercept:.2f}")
print(f"La corrélation lineaire est {resultat_regression.rvalue:.2f} et le " +
    f"coefficient de détermination est {coefficient_determination:.2f}.")
print(f"La p-value du test de la régression est {resultat_regression.pvalue:.4f}")

# Affiche le contenu suivant
# L'équation de régression est : 0.10x +-1804.76
# La corrélation lineaire est 0.88 et le coefficient de détermination est 0.77.
# La p-value du test de la régression est 0.0041

Pour aller plus loin

La documentation complète de SciPy est disponible en ligne :
https://docs.scipy.org/doc/scipy/