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 :
- Détection des valeurs aberrantes (méthodes IQR et z-score)
- Test de normalité (test de Shapiro-Wilk + graphiques Q-Q)
- Homogénéité de la variance (test de Levene + diagrammes en boîte)
- 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 | R² | 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
- Statistiques descriptives : M, SD, n pour tous les groupes/variables
- Statistiques de test : Nom du test, statistique, dl, p-valeur exacte
- Tailles d'effet : Avec intervalles de confiance
- Vérifications des hypothèses : Quels tests ont été effectués, résultats, actions prises
- 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
- Interprétation intuitive : « Étant donné les données, il y a 95 % de probabilité que le paramètre soit dans cet intervalle »
- Preuves pour l'hypothèse nulle : Peut quantifier le soutien pour l'absence d'effet
- Flexible : Aucune préoccupation concernant le p-hacking ; peut analyser les données au fur et à mesure
- 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 completcheck_normality(): Test de normalité avec graphiques Q-Qcheck_homogeneity_of_variance(): Test de Levene avec diagrammes en boîtecheck_linearity(): Vérifications de linéarité de la régressiondetect_outliers(): Détection des valeurs aberrantes par IQR et z-score
Meilleures pratiques
- Pré-enregistrer les analyses si possible pour distinguer les confirmations des analyses exploratoires
- Toujours vérifier les hypothèses avant d'interpréter les résultats
- Rapporter les tailles d'effet avec les intervalles de confiance
- Rapporter toutes les analyses planifiées y compris les résultats non-significatifs
- Distinguer la significativité statistique de la significativité pratique
- Visualiser les données avant et après l'analyse
- Vérifier les diagnostics pour la régression/ANOVA (graphiques des résidus, VIF, etc.)
- Conduire des analyses de sensibilité pour évaluer la robustesse
- Partager les données et le code pour la reproductibilité
- Être transparent sur les violations, les transformations et les décisions
Pièges courants à éviter
- P-hacking : Ne testez pas plusieurs façons jusqu'à trouver quelque chose de significatif
- HARKing : Ne présentez pas les résultats exploratoires comme confirmatoires
- Ignorer les hypothèses : Les vérifier et rapporter les violations
- Confondre significativité et importance : p < ,05 ≠ effet significatif
- Ne pas rapporter les tailles d'effet : Essentielles pour l'interprétation
- Sélectionner les résultats : Rapporter toutes les analyses planifiées
- Mal interpréter les p-valeurs : Ce ne sont PAS la probabilité que l'hypothèse soit vraie
- Comparaisons multiples : Corriger pour erreur familiale si approprié
- Ignorer les données manquantes : Comprendre le mécanisme (MCAR, MAR, MNAR)
- 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 :
- APA Style Guide : https://apastyle.apa.org/
- Conseil statistique : Cross Validated (stats.stackexchange.com)