statistical-analysis

Par mkurman · zorai

Analyse statistique guidée avec sélection de tests et génération de rapports. À utiliser lorsque vous avez besoin d'aide pour choisir les tests appropriés à vos données, vérifier les hypothèses, effectuer une analyse de puissance et obtenir des résultats au format APA. Idéal pour la rédaction de rapports de recherche académique et les conseils sur le choix des tests. Pour implémenter des modèles spécifiques par programmation, utilisez statsmodels.

npx skills add https://github.com/mkurman/zorai --skill statistical-analysis

Arbre de décision du flux de travail

Utilisez cet arbre de décision pour déterminer votre chemin d'analyse :

DÉBUT
│
├─ Besoin de SÉLECTIONNER un test statistique ?
│  └─ OUI → Voir « Test Selection Guide »
│  └─ NON → Continuer
│
├─ Prêt à vérifier les HYPOTHÈSES ?
│  └─ OUI → Voir « Assumption Checking »
│  └─ NON → Continuer
│
├─ Prêt à exécuter l'ANALYSE ?
│  └─ OUI → Voir « Running Statistical Tests »
│  └─ NON → Continuer
│
└─ Besoin de RAPPORTER les résultats ?
   └─ OUI → Voir « Reporting Results »

Test Selection Guide

Référence rapide : Choisir le bon test

Utilisez references/test_selection_guide.md pour des conseils complets. Référence rapide :

Comparaison de deux groupes :

  • Indépendants, continus, normaux → Test t indépendant
  • Indépendants, continus, non-normaux → Test U de Mann-Whitney
  • Appairés, continus, normaux → Test t apparié
  • Appairés, continus, non-normaux → Test des rangs signés de Wilcoxon
  • Résultat binaire → Chi-carré ou test exact de Fisher

Comparaison de 3+ groupes :

  • Indépendants, continus, normaux → ANOVA à un facteur
  • Indépendants, continus, non-normaux → Test de Kruskal-Wallis
  • Appairés, continus, normaux → ANOVA à mesures répétées
  • Appairés, continus, non-normaux → Test de Friedman

Relations :

  • Deux variables continues → Corrélation de Pearson (normal) ou Spearman (non-normal)
  • Résultat continu avec prédicteur(s) → Régression linéaire
  • Résultat binaire avec prédicteur(s) → Régression logistique

Alternatives bayésiennes : Tous les tests ont des versions bayésiennes qui offrent :

  • Des énoncés de probabilité directe sur les hypothèses
  • Des facteurs de Bayes quantifiant les preuves
  • La capacité à soutenir l'hypothèse nulle
  • Voir references/bayesian_statistics.md

Vérification des hypothèses

Vérification systématique des hypothèses

TOUJOURS vérifier les hypothèses avant d'interpréter les résultats des tests.

Utilisez le module scripts/assumption_checks.py fourni pour la vérification automatique :

from scripts.assumption_checks import comprehensive_assumption_check

# Vérification complète avec visualisations
results = comprehensive_assumption_check(
    data=df,
    value_col='score',
    group_col='group',  # Optionnel : pour les comparaisons entre groupes
    alpha=0.05
)

Cela effectue :

  1. Détection des valeurs aberrantes (méthodes IQR et z-score)
  2. Test de normalité (test de Shapiro-Wilk + graphiques Q-Q)
  3. Homogénéité de la variance (test de Levene + diagrammes en boîte)
  4. Interprétation et recommandations

Vérifications individuelles des hypothèses

Pour des vérifications ciblées, utilisez les fonctions individuelles :

from scripts.assumption_checks import (
    check_normality,
    check_normality_per_group,
    check_homogeneity_of_variance,
    check_linearity,
    detect_outliers
)

# Exemple : Vérifier la normalité avec visualisation
result = check_normality(
    data=df['score'],
    name='Test Score',
    alpha=0.05,
    plot=True
)
print(result['interpretation'])
print(result['recommendation'])

Que faire en cas de violation des hypothèses

Normalité violée :

  • Violation légère + n > 30 par groupe → Procéder avec test paramétrique (robuste)
  • Violation modérée → Utiliser l'alternative non-paramétrique
  • Violation sévère → Transformer les données ou utiliser un test non-paramétrique

Homogénéité de la variance violée :

  • Pour test t → Utiliser le test t de Welch
  • Pour ANOVA → Utiliser ANOVA de Welch ou ANOVA de Brown-Forsythe
  • Pour régression → Utiliser erreurs-types robustes ou moindres carrés pondérés

Linéarité violée (régression) :

  • Ajouter des termes polynomiaux
  • Transformer les variables
  • Utiliser des modèles non-linéaires ou GAM

Voir references/assumptions_and_diagnostics.md pour des conseils complets.


Exécution des tests statistiques

Bibliothèques Python

Bibliothèques principales pour l'analyse statistique :

  • scipy.stats : Tests statistiques fondamentaux
  • statsmodels : Régression avancée et diagnostics
  • pingouin : Tests statistiques conviviaux avec tailles d'effet
  • pymc : Modélisation statistique bayésienne
  • arviz : Visualisation et diagnostics bayésiens

Exemples d'analyses

Test t avec rapport complet

import pingouin as pg
import numpy as np

# Exécuter test t indépendant
result = pg.ttest(group_a, group_b, correction='auto')

# Extraire les résultats
t_stat = result['T'].values[0]
df = result['dof'].values[0]
p_value = result['p-val'].values[0]
cohens_d = result['cohen-d'].values[0]
ci_lower = result['CI95%'].values[0][0]
ci_upper = result['CI95%'].values[0][1]

# Rapport
print(f"t({df:.0f}) = {t_stat:.2f}, p = {p_value:.3f}")
print(f"Cohen's d = {cohens_d:.2f}, 95% CI [{ci_lower:.2f}, {ci_upper:.2f}]")

ANOVA avec tests post-hoc

import pingouin as pg

# ANOVA à un facteur
aov = pg.anova(dv='score', between='group', data=df, detailed=True)
print(aov)

# Si significatif, effectuer des tests post-hoc
if aov['p-unc'].values[0] < 0.05:
    posthoc = pg.pairwise_tukey(dv='score', between='group', data=df)
    print(posthoc)

# Taille d'effet
eta_squared = aov['np2'].values[0]  # Eta-carré partiel
print(f"Partial η² = {eta_squared:.3f}")

Régression linéaire avec diagnostics

import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor

# Adapter le modèle
X = sm.add_constant(X_predictors)  # Ajouter l'intercept
model = sm.OLS(y, X).fit()

# Résumé
print(model.summary())

# Vérifier la multicolinéarité (VIF)
vif_data = pd.DataFrame()
vif_data["Variable"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif_data)

# Vérifier les hypothèses
residuals = model.resid
fitted = model.fittedvalues

# Graphiques des résidus
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# Résidus vs ajusté
axes[0, 0].scatter(fitted, residuals, alpha=0.6)
axes[0, 0].axhline(y=0, color='r', linestyle='--')
axes[0, 0].set_xlabel('Fitted values')
axes[0, 0].set_ylabel('Residuals')
axes[0, 0].set_title('Residuals vs Fitted')

# Graphique Q-Q
from scipy import stats
stats.probplot(residuals, dist="norm", plot=axes[0, 1])
axes[0, 1].set_title('Normal Q-Q')

# Échelle-Localisation
axes[1, 0].scatter(fitted, np.sqrt(np.abs(residuals / residuals.std())), alpha=0.6)
axes[1, 0].set_xlabel('Fitted values')
axes[1, 0].set_ylabel('√|Standardized residuals|')
axes[1, 0].set_title('Scale-Location')

# Histogramme des résidus
axes[1, 1].hist(residuals, bins=20, edgecolor='black', alpha=0.7)
axes[1, 1].set_xlabel('Residuals')
axes[1, 1].set_ylabel('Frequency')
axes[1, 1].set_title('Histogram of Residuals')

plt.tight_layout()
plt.show()

Test t bayésien

import pymc as pm
import arviz as az
import numpy as np

with pm.Model() as model:
    # Priors
    mu1 = pm.Normal('mu_group1', mu=0, sigma=10)
    mu2 = pm.Normal('mu_group2', mu=0, sigma=10)
    sigma = pm.HalfNormal('sigma', sigma=10)

    # Likelihood
    y1 = pm.Normal('y1', mu=mu1, sigma=sigma, observed=group_a)
    y2 = pm.Normal('y2', mu=mu2, sigma=sigma, observed=group_b)

    # Quantité dérivée
    diff = pm.Deterministic('difference', mu1 - mu2)

    # Échantillonner
    trace = pm.sample(2000, tune=1000, return_inferencedata=True)

# Résumer
print(az.summary(trace, var_names=['difference']))

# Probabilité que groupe1 > groupe2
prob_greater = np.mean(trace.posterior['difference'].values > 0)
print(f"P(μ₁ > μ₂ | data) = {prob_greater:.3f}")

# Tracer la postérieure
az.plot_posterior(trace, var_names=['difference'], ref_val=0)

Tailles d'effet

Toujours calculer les tailles d'effet

Les tailles d'effet quantifient l'ampleur, tandis que les p-valeurs indiquent uniquement l'existence d'un effet.

Voir references/effect_sizes_and_power.md pour des conseils complets.

Référence rapide : Tailles d'effet courantes

Test Taille d'effet Petit Moyen Grand
Test t Cohen's d 0,20 0,50 0,80
ANOVA η²_p 0,01 0,06 0,14
Corrélation r 0,10 0,30 0,50
Régression 0,02 0,13 0,26
Chi-carré Cramér's V 0,07 0,21 0,35

Important : Les barèmes sont des lignes directrices. Le contexte compte !

Calcul des tailles d'effet

La plupart des tailles d'effet sont calculées automatiquement par pingouin :

# Test t renvoie Cohen's d
result = pg.ttest(x, y)
d = result['cohen-d'].values[0]

# ANOVA renvoie eta-carré partiel
aov = pg.anova(dv='score', between='group', data=df)
eta_p2 = aov['np2'].values[0]

# Corrélation : r est déjà une taille d'effet
corr = pg.corr(x, y)
r = corr['r'].values[0]

Intervalles de confiance pour les tailles d'effet

Toujours rapporter les IC pour montrer la précision :

from pingouin import compute_effsize_from_t

# Pour test t
d, ci = compute_effsize_from_t(
    t_statistic,
    nx=len(group1),
    ny=len(group2),
    eftype='cohen'
)
print(f"d = {d:.2f}, 95% CI [{ci[0]:.2f}, {ci[1]:.2f}]")

Analyse de puissance

Analyse de puissance a priori (planification d'étude)

Déterminer la taille d'échantillon requise avant la collecte de données :

from statsmodels.stats.power import (
    tt_ind_solve_power,
    FTestAnovaPower
)

# Test t : Quel n est nécessaire pour détecter d = 0,5 ?
n_required = tt_ind_solve_power(
    effect_size=0.5,
    alpha=0.05,
    power=0.80,
    ratio=1.0,
    alternative='two-sided'
)
print(f"Required n per group: {n_required:.0f}")

# ANOVA : Quel n est nécessaire pour détecter f = 0,25 ?
anova_power = FTestAnovaPower()
n_per_group = anova_power.solve_power(
    effect_size=0.25,
    ngroups=3,
    alpha=0.05,
    power=0.80
)
print(f"Required n per group: {n_per_group:.0f}")

Analyse de sensibilité (post-étude)

Déterminer quelle taille d'effet vous pourriez détecter :

# Avec n=50 par groupe, quel effet pourrions-nous détecter ?
detectable_d = tt_ind_solve_power(
    effect_size=None,  # Résoudre pour ceci
    nobs1=50,
    alpha=0.05,
    power=0.80,
    ratio=1.0,
    alternative='two-sided'
)
print(f"Study could detect d ≥ {detectable_d:.2f}")

Note : L'analyse de puissance post-hoc (calculer la puissance après l'étude) n'est généralement pas recommandée. Utilisez plutôt l'analyse de sensibilité.

Voir references/effect_sizes_and_power.md pour des conseils détaillés.


Rapport des résultats

Rapport statistique de style APA

Suivez les directives dans references/reporting_standards.md.

Éléments essentiels du rapport

  1. Statistiques descriptives : M, SD, n pour tous les groupes/variables
  2. Statistiques de test : Nom du test, statistique, dl, p-valeur exacte
  3. Tailles d'effet : Avec intervalles de confiance
  4. Vérifications des hypothèses : Quels tests ont été effectués, résultats, actions prises
  5. Toutes les analyses planifiées : Y compris les résultats non-significatifs

Modèles de rapport d'exemple

Test t indépendant

Group A (n = 48, M = 75,2, SD = 8,5) a obtenu des résultats significativement
plus élevés que Group B (n = 52, M = 68,3, SD = 9,2), t(98) = 3,82, p < ,001,
d = 0,77, IC 95 % [0,36, 1,18], bilatéral. Les hypothèses de normalité
(Shapiro-Wilk : Group A W = 0,97, p = ,18 ; Group B W = 0,96, p = ,12) et
d'homogénéité de la variance (F de Levene(1, 98) = 1,23, p = ,27) étaient
satisfaites.

ANOVA à un facteur

Une ANOVA à un facteur a révélé un effet principal significatif de la condition
de traitement sur les scores de test, F(2, 147) = 8,45, p < ,001, η²_p = ,10.
Les comparaisons post-hoc utilisant le HSD de Tukey ont indiqué que la Condition A
(M = 78,2, SD = 7,3) a obtenu un score significativement plus élevé que la
Condition B (M = 71,5, SD = 8,1, p = ,002, d = 0,87) et la Condition C
(M = 70,1, SD = 7,9, p < ,001, d = 1,07). Les Conditions B et C n'ont pas
différé significativement (p = ,52, d = 0,18).

Régression multiple

Une régression linéaire multiple a été menée pour prédire les scores aux examens
à partir des heures d'étude, de la GPA antérieure et de l'assiduité. Le modèle
global était significatif, F(3, 146) = 45,2, p < ,001, R² = ,48, R² ajusté = ,47.
Les heures d'étude (B = 1,80, SE = 0,31, β = ,35, t = 5,78, p < ,001,
IC 95 % [1,18, 2,42]) et la GPA antérieure (B = 8,52, SE = 1,95, β = ,28,
t = 4,37, p < ,001, IC 95 % [4,66, 12,38]) étaient des prédicteurs significatifs,
tandis que l'assiduité ne l'était pas (B = 0,15, SE = 0,12, β = ,08, t = 1,25,
p = ,21, IC 95 % [-0,09, 0,39]). La multicolinéarité n'était pas une
préoccupation (tous VIF < 1,5).

Analyse bayésienne

Un test t pour échantillons indépendants bayésien a été mené en utilisant des
priors faiblement informatifs (Normal(0, 1) pour la différence de moyennes). La
distribution postérieure indiquait que Group A a obtenu des scores plus élevés
que Group B (M_diff = 6,8, IC crédible 95 % [3,2, 10,4]). Le facteur de Bayes
BF₁₀ = 45,3 fournissait des preuves très fortes pour une différence entre les
groupes, avec une probabilité postérieure de 99,8 % que la moyenne de Group A
dépasse celle de Group B. Les diagnostics de convergence étaient satisfaisants
(tous R̂ < 1,01, ESS > 1 000).

Statistiques bayésiennes

Quand utiliser les méthodes bayésiennes

Considérez les approches bayésiennes quand :

  • Vous avez des informations antérieures à incorporer
  • Vous voulez des énoncés de probabilité directs sur les hypothèses
  • La taille d'échantillon est petite ou vous planifiez une collecte de données séquentielle
  • Vous avez besoin de quantifier les preuves pour l'hypothèse nulle
  • Le modèle est complexe (hiérarchique, données manquantes)

Voir references/bayesian_statistics.md pour des conseils complets sur :

  • Le théorème de Bayes et l'interprétation
  • Spécification des priors (informatif, faiblement informatif, non-informatif)
  • Test d'hypothèse bayésien avec facteurs de Bayes
  • Intervalles crédibles vs. intervalles de confiance
  • Tests t bayésiens, ANOVA, régression et modèles hiérarchiques
  • Vérification de la convergence des modèles et vérifications prédictives postérieures

Avantages clés

  1. Interprétation intuitive : « Étant donné les données, il y a 95 % de probabilité que le paramètre soit dans cet intervalle »
  2. Preuves pour l'hypothèse nulle : Peut quantifier le soutien pour l'absence d'effet
  3. Flexible : Aucune préoccupation concernant le p-hacking ; peut analyser les données au fur et à mesure
  4. Quantification de l'incertitude : Distribution postérieure complète

Ressources

Cette compétence inclut des matériels de référence complets :

Répertoire des références

  • test_selection_guide.md : Arbre de décision pour choisir les tests statistiques appropriés
  • assumptions_and_diagnostics.md : Conseils détaillés sur la vérification et la gestion des violations d'hypothèses
  • effect_sizes_and_power.md : Calcul, interprétation et rapportage des tailles d'effet ; conduite des analyses de puissance
  • bayesian_statistics.md : Guide complet des méthodes d'analyse bayésienne
  • reporting_standards.md : Directives de rapportage de style APA avec exemples

Répertoire des scripts

  • assumption_checks.py : Vérification automatique des hypothèses avec visualisations
    • comprehensive_assumption_check() : Flux de travail complet
    • check_normality() : Test de normalité avec graphiques Q-Q
    • check_homogeneity_of_variance() : Test de Levene avec diagrammes en boîte
    • check_linearity() : Vérifications de linéarité de la régression
    • detect_outliers() : Détection des valeurs aberrantes par IQR et z-score

Meilleures pratiques

  1. Pré-enregistrer les analyses si possible pour distinguer les confirmations des analyses exploratoires
  2. Toujours vérifier les hypothèses avant d'interpréter les résultats
  3. Rapporter les tailles d'effet avec les intervalles de confiance
  4. Rapporter toutes les analyses planifiées y compris les résultats non-significatifs
  5. Distinguer la significativité statistique de la significativité pratique
  6. Visualiser les données avant et après l'analyse
  7. Vérifier les diagnostics pour la régression/ANOVA (graphiques des résidus, VIF, etc.)
  8. Conduire des analyses de sensibilité pour évaluer la robustesse
  9. Partager les données et le code pour la reproductibilité
  10. Être transparent sur les violations, les transformations et les décisions

Pièges courants à éviter

  1. P-hacking : Ne testez pas plusieurs façons jusqu'à trouver quelque chose de significatif
  2. HARKing : Ne présentez pas les résultats exploratoires comme confirmatoires
  3. Ignorer les hypothèses : Les vérifier et rapporter les violations
  4. Confondre significativité et importance : p < ,05 ≠ effet significatif
  5. Ne pas rapporter les tailles d'effet : Essentielles pour l'interprétation
  6. Sélectionner les résultats : Rapporter toutes les analyses planifiées
  7. Mal interpréter les p-valeurs : Ce ne sont PAS la probabilité que l'hypothèse soit vraie
  8. Comparaisons multiples : Corriger pour erreur familiale si approprié
  9. Ignorer les données manquantes : Comprendre le mécanisme (MCAR, MAR, MNAR)
  10. Surinterprréter les résultats non-significatifs : L'absence de preuves ≠ preuves d'absence

Liste de contrôle pour commencer

Lorsque vous commencez une analyse statistique :

  • [ ] Définir la question de recherche et les hypothèses
  • [ ] Déterminer le test statistique approprié (utiliser test_selection_guide.md)
  • [ ] Conduire une analyse de puissance pour déterminer la taille d'échantillon
  • [ ] Charger et inspecter les données
  • [ ] Vérifier les données manquantes et les valeurs aberrantes
  • [ ] Vérifier les hypothèses en utilisant assumption_checks.py
  • [ ] Exécuter l'analyse principale
  • [ ] Calculer les tailles d'effet avec intervalles de confiance
  • [ ] Conduire les tests post-hoc si nécessaire (avec corrections)
  • [ ] Créer des visualisations
  • [ ] Rédiger les résultats en suivant reporting_standards.md
  • [ ] Conduire des analyses de sensibilité
  • [ ] Partager les données et le code

Support et lectures complémentaires

Pour des questions sur :

  • Sélection du test : Voir references/test_selection_guide.md
  • Hypothèses : Voir references/assumptions_and_diagnostics.md
  • Tailles d'effet : Voir references/effect_sizes_and_power.md
  • Méthodes bayésiennes : Voir references/bayesian_statistics.md
  • Rapportage : Voir references/reporting_standards.md

Manuels clés :

  • Cohen, J. (1988). Statistical Power Analysis for the Behavioral Sciences
  • Field, A. (2013). Discovering Statistics Using IBM SPSS Statistics
  • Gelman, A., & Hill, J. (2006). Data Analysis Using Regression and Multilevel/Hierarchical Models
  • Kruschke, J. K. (2014). Doing Bayesian Data Analysis

Ressources en ligne :

Skills similaires