Test d’indépendance du khi carré

Tests d'hypothèses en Python

James Chapman

Curriculum Manager, DataCamp

Retour sur 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)
Tests d'hypothèses en Python

Indépendance des variables

Résultat du test précédent : preuve que hobbyist et age_cat sont associés

Indépendance statistique : la proportion de succès dans la variable réponse est la même pour toutes les catégories de la variable explicative

Tests 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

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

Tests 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
Tests d'hypothèses en Python

Formulation des 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 observations sont-elles des valeurs attendues ?
Tests d'hypothèses en Python

Visualisation exploratoire : histogramme empilé proportionnel

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

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

Visualisation exploratoire : histogramme empilé proportionnel

Histogramme empilé proportionnel de la satisfaction au travail rempli par catégorie d’âge

Tests 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 réponse} - 1) \times (\text{Nb. de catégories explicatives} - 1)$

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

Tests 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)
Tests d'hypothèses en Python

Inverser les variables ?

Histogramme empilé proportionnel de la catégorie d’âge rempli par satisfaction au travail

Tests 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

Question : Les variables X et Y sont-elles indépendantes ?

Pas : La variable X est-elle indépendante de la variable Y ?

Tests d'hypothèses en Python

Et la direction, les queues ?

  • Les carrés des effectifs observés et attendus doivent être non négatifs
  • 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 forensique statistique pour détecter un ajustement anormalement bon (données fabriquées). Les tests du khi carré de variance peuvent être bilatéraux. Ces usages restent marginaux.
Tests d'hypothèses en Python

Passons à la pratique !

Tests d'hypothèses en Python

Preparing Video For Download...