Mis a jour le 2025-04-14, 12:10

t-test et test de Fisher

Faire : import statsmodels.stats.weightstats
t-test :
  • Construire un objet CompareMeans :
    x1 = numpy.array([2, 4, 5, 6, 8])
    x2 = numpy.array([10, 9, 5, 8, 11])	
    dStat1 = statsmodels.stats.weightstats.DescrStatsW(x1)
    dStat2 = statsmodels.stats.weightstats.DescrStatsW(x2)
    comp = statsmodels.stats.weightstats.CompareMeans(dStat1, dStat2)
        
  • puis, (t, p, df) = comp.ttest_ind()) : renvoie la statistique t, la p-value et le nombre de degrés de liberté.
  • si on veut juste faire le test, on peut aussi faire directement statsmodels.stats.weightstats.ttest_ind(x1, x2)
  • paramètres de ttest_ind :
    • usevar = 'pooled' : suppose que les variances des 2 samples sont les mêmes (défaut), usevar = 'unequal' : suppose les variances différentes.
    • alternative = 'two-sided' : test dans les sens (défaut), alternative = 'smaller' ou alternative = 'larger' : test d'un seul côté (quand c'est larger, on teste l'hypothèse que la différence entre le premier vecteur et le second est plus petite que la valeur donnée (qui vaut 0 par défaut), et donc H1 est que le premier vecteur - le second vecteur est plus grand que la valeur donnée.
    • value = 2 : teste H0 avec par exemple v1 - v2 = 2 (si two-sided ici).
  • on peut avoir un intervalle de confiance : (lower, upper) = comp.tconfint_diff(alpha = 0.02, usevar = 'unequal'). Paramètres :
    • uservar = 'pooled' : suppose que les variances des 2 samples sont les mêmes (défaut), uservar = 'unequal' : suppose les variances différentes.
    • alpha = 0.01 : niveau de confiance (défaut est 0.05)
    • alternative = 'two-sided' (défaut), 'larger', 'smaller' (si larger ou smaller, l'intervalle est infini d'un côté)
  • comp.summary(alpha = 0.02, usevar = 'unequal') : renvoie une SimpleTable.
  • si df1 et df2 sont des dataframes avec le même nombre de colonnes : statsmodels.stats.weightstats.CompareMeans.from_data(df1, df2) compare colonne par colonne la moyenne de df1 et la moyenne de df2. Alors (t, p, df) = comp.ttest_ind()) renvoie un triplet où t et p sont des séries, avec un élément par colonne comparée.
paired t-test :
  • Contruire simplement un objet DescrStatsW avec la différence des valeurs des 2 conditions :
    x1 = numpy.array([2, 4, 5, 6, 8])
    x2 = numpy.array([10, 9, 5, 8, 11])	
    dStat = statsmodels.stats.weightstats.DescrStatsW(x1 - x2)
        
  • (t, p, df) = dStat.ttest_mean()) : renvoie la statistique t, la p-value et le nombre de degrés de liberté.
  • paramètres de ttest_mean :
    • alternative = 'two-sided' : test dans les sens (défaut), alternative = 'smaller' ou alternative = 'larger' : test d'un seul côté (quand c'est larger, on teste l'hypothèse que la moyenne est plus grande que la valeur donnée (qui vaut 0 par défaut).
    • value = 2 : teste H0 que la moyenne est égale à 2 (plutôt que 0 par défaut).
  • intervalle de confiance basé sur Student : dStat.tconfint_mean(alpha=0.05, alternative='two-sided')
  • si on fait l'hypothèse que les données suivent une loi normale, intervalle de confiance est alors dStat.zconfint_mean(alpha=0.05, alternative='two-sided')
TOST (two on-sided test) :
  • le principe est le même que le t-test (ce sont en fait deux t-test one-sided) :
    x1 = numpy.array([2, 4, 5, 6, 8])
    x2 = numpy.array([10, 9, 5, 8, 11])	
    dStat1 = statsmodels.stats.weightstats.DescrStatsW(x1)
    dStat2 = statsmodels.stats.weightstats.DescrStatsW(x2)
    comp = statsmodels.stats.weightstats.CompareMeans(dStat1, dStat2)
        
  • puis (p, (t1, p1), (t2, p2)) = comp.ttost_ind(-7, 0) en donnant la valeur minimale et maximale.
  • renvoie la p-value globale, une paire avec les résultats du test sur la valeur minmimale et une paire avec les résultats du test sur la valeur maximale.
  • la p-value est la valeur maximale des p-values des 2 tests.
  • on peut aussi faire directement statsmodels.stats.weightstats.ttost_ind(x1, x2, -7, 0)
Puissance d'un t-test :
  • connaissant la déviation standard d'une mesure, on peut trouver la puissance statistique donnée pour une différence de moyennes données et un effectif donné.
  • import statsmodels.stats.power; power = statsmodels.stats.power.TTestIndPower(); power.power(effectSize, n1, alpha = 0.05, ratio = 1) : renvoie la puissance statistique (probabilité de ne pas faire une erreur de type II)
  • effectSize : c'est la différence des moyennes divisée par la déviation standard.
  • n1 : nombre d'observation pour l'échantillon 1
  • alpha : niveau de signification (probabilité d'une erreur de type I)
  • ratio : pour l'échantillon 2, on a ratio * n1 observations.
  • on peut aussi donner alternative = "two-sided", "larger" ou "smaller" (défaut est "two-sided")
Recherche d'un paramètre quelconque :
  • power.solve_power(effectSize = None, nobs1 = None, alpha = None, power = None, ratio = 1, alternative = "two-sided") : un seul des paramètres doit être à None et tous les autres renseignés. Renvoie le paramètre à None (non renseigné).
Test pour savoir si 2 comptes suivent la même loi de Poisson :
  • Test si des comptes de 40 et 50 pendant le même intervalle de temps peuvent venir de la même distribution :
    import statsmodels.stats.rates	
    result = statsmodels.stats.rates.test_poisson_2indep(40, 1, 50, 1)
    result.pvalue
        
  • result = statsmodels.stats.rates.test_poisson_2indep(40, 1, 50, 2) : idem, mais les 50 ont été obtenus pendant 2 fois plus longtemps.
  • seul le rapport entre la 2ème et 4ème valeur est important, pas les valeurs individuelles.
  • result = statsmodels.stats.rates.test_poisson_2indep(10, 1, 50, 1, alternative = 'smaller') : test unilatéral (ici, significatif). alternative peut valoir : 'two-sided' (défaut), 'smaller', 'larger'
Test sur les proportions : teste si les 2 proportions données peuvent dériver de la même distribution :
  • test si 5 positifs sur 14 est équivalent à 6 positifs sur 60 :
    import statsmodels.stats.proportion	
    result = statsmodels.stats.proportion.test_proportions_2indep(5, 14, 6, 60)
    result.pvalue
        
  • on peut utiliser alternative = 'larger' ou 'smaller' plutôt que le défaut 'two-sided'

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert