Test du khi carré d'indépendance

Vérification d'hypothèses en Python

James Chapman

Curriculum Manager, DataCamp

Revoir le test de proportion

age_by_hobbyist = stack_overflow.groupby("age_cat")['hobbyist'].value_counts()
age_cat      hobbyist
At least 30  Yes          812
             No           238
Under 30     Yes         1021
             No           190
Name: hobbyist, dtype: int64
from statsmodels.stats.proportion import proportions_ztest
n_hobbyists = np.array([812, 1021])
n_rows = np.array([812 + 238, 1021 + 190])
stat, p_value = proportions_ztest(count=n_hobbyists, nobs=n_rows, 
                                  alternative="two-sided")
(-4.223691463320559, 2.403330142685068e-05)
Vérification d'hypothèses en Python

Indépendance des variables

Résultat précédent : des indices que hobbyist et age_cat sont associés

Indépendance statistique : la proportion de réussites de la variable réponse est identique dans toutes les catégories de la variable explicative

Vérification d'hypothèses en Python

Test d'indépendance des variables

import pingouin
expected, observed, stats = pingouin.chi2_independence(data=stack_overflow, x='hobbyist',
                                                       y='age_cat', correction=False)
print(stats)
                 test    lambda       chi2  dof      pval    cramer     power
0             pearson  1.000000  17.839570  1.0  0.000024  0.088826  0.988205
1        cressie-read  0.666667  17.818114  1.0  0.000024  0.088773  0.988126
2      log-likelihood  0.000000  17.802653  1.0  0.000025  0.088734  0.988069
3       freeman-tukey -0.500000  17.815060  1.0  0.000024  0.088765  0.988115
4  mod-log-likelihood -1.000000  17.848099  1.0  0.000024  0.088848  0.988236
5              neyman -2.000000  17.976656  1.0  0.000022  0.089167  0.988694

$\chi^2$ statistique = 17.839570 = $(-4.223691463320559)^2$ = ($z$-score)$^2$

Vérification d'hypothèses en Python

Satisfaction au travail et catégorie d'âge

stack_overflow['age_cat'].value_counts()
Under 30       1211
At least 30    1050
Name: age_cat, dtype: int64
stack_overflow['job_sat'].value_counts()
Very satisfied           879
Slightly satisfied       680
Slightly dissatisfied    342
Neither                  201
Very dissatisfied        159
Name: job_sat, dtype: int64
Vérification d'hypothèses en Python

Formuler les hypothèses

$H_{0}$ : les catégories d'âge sont indépendantes des niveaux de satisfaction au travail

$H_{A}$ : les catégories d'âge ne sont pas indépendantes des niveaux de satisfaction au travail

alpha = 0.1
  • Statistique de test notée $\chi^{2}$
  • En supposant l'indépendance, à quelle distance les résultats observés sont-ils des valeurs attendues ?
Vérification d'hypothèses en Python

Visualisation exploratoire : diagramme à barres empilées proportionnelles

props = stack_overflow.groupby('job_sat')['age_cat'].value_counts(normalize=True)

wide_props = props.unstack()
wide_props.plot(kind="bar", stacked=True)
Vérification d'hypothèses en Python

Visualisation exploratoire : diagramme à barres empilées proportionnelles

Diagramme à barres empilées proportionnelles de la satisfaction au travail, coloré par catégorie d'âge

Vérification d'hypothèses en Python

Test d'indépendance du khi carré

import pingouin
expected, observed, stats = pingouin.chi2_independence(data=stack_overflow, x="job_sat", y="age_cat")
print(stats)    
                 test    lambda      chi2  dof      pval    cramer     power
0             pearson  1.000000  5.552373  4.0  0.235164  0.049555  0.437417
1        cressie-read  0.666667  5.554106  4.0  0.235014  0.049563  0.437545
2      log-likelihood  0.000000  5.558529  4.0  0.234632  0.049583  0.437871
3       freeman-tukey -0.500000  5.562688  4.0  0.234274  0.049601  0.438178
4  mod-log-likelihood -1.000000  5.567570  4.0  0.233854  0.049623  0.438538
5              neyman -2.000000  5.579519  4.0  0.232828  0.049676  0.439419

Degrés de liberté :

$(\text{Nb de catégories de la réponse} - 1) \times (\text{Nb de catégories explicatives} - 1)$

$(2 - 1) * (5 - 1) = 4$

Vérification d'hypothèses en Python

Inverser les variables ?

props = stack_overflow.groupby('age_cat')['job_sat'].value_counts(normalize=True)
wide_props = props.unstack()
wide_props.plot(kind="bar", stacked=True)
Vérification d'hypothèses en Python

Inverser les variables ?

Diagramme à barres empilées proportionnelles de la catégorie d'âge, coloré par satisfaction au travail

Vérification d'hypothèses en Python

Khi carré dans les deux sens

expected, observed, stats = pingouin.chi2_independence(data=stack_overflow, x="age_cat", y="job_sat")
print(stats[stats['test'] == 'pearson'])   
      test  lambda      chi2  dof      pval    cramer     power
0  pearson     1.0  5.552373  4.0  0.235164  0.049555  0.437417

À demander : les variables X et Y sont-elles indépendantes ?

Et non : la variable X est-elle indépendante de la variable Y ?

Vérification d'hypothèses en Python

Et la direction ? Quelle queue ?

  • Les effectifs observés et attendus au carré sont nécessairement positifs
  • Les tests du khi carré sont presque toujours unilatéraux à droite $^{1}$
1 Les tests du khi carré unilatéraux à gauche sont utilisés en criminalistique statistique pour détecter un ajustement anormalement bon indiquant des données fabriquées. Les tests du khi carré de variance peuvent être bilatéraux. Cela reste toutefois marginal.
Vérification d'hypothèses en Python

Passons à la pratique !

Vérification d'hypothèses en Python

Preparing Video For Download...