web-dev-qa-db-fra.com

Comment calculer les statistiques "t-test" avec numpy

Je cherche à générer des statistiques sur un modèle que j'ai créé en python. J'aimerais générer le test t dessus, mais je me demandais s'il y avait un moyen facile de le faire avec numpy/scipy. Y a-t-il de bonnes explications?

Par exemple, j'ai trois ensembles de données connexes qui ressemblent à ceci:

[55.0, 55.0, 47.0, 47.0, 55.0, 55.0, 55.0, 63.0]

Maintenant, je voudrais faire le test t de l'élève sur eux.

25
Mark

Dans un paquet scipy.stats il y a peu de ttest_... les fonctions. Voir l'exemple de ici :

>>> print 't-statistic = %6.3f pvalue = %6.4f' %  stats.ttest_1samp(x, m)
t-statistic =  0.391 pvalue = 0.6955
27
van

la réponse de van en utilisant scipy est exactement correcte et en utilisant le scipy.stats.ttest_* fonctions est très pratique.

Mais je suis venu sur cette page à la recherche d'une solution avec numpy pur , comme indiqué dans le titre, pour éviter la dépendance scipy. À cette fin, permettez-moi de souligner l'exemple donné ici: https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.standard_t.html

Le problème principal est que numpy n'a pas de fonctions de distribution cumulative, donc ma conclusion est que vous devriez vraiment utiliser scipy. Quoi qu'il en soit, utiliser uniquement numpy est possible:

D'après la question initiale, je suppose que vous voulez comparer vos ensembles de données et juger avec un test t s'il y a un écart significatif? De plus, que les échantillons sont appariés? (Voir https://en.wikipedia.org/wiki/Student%27s_t-test#Unpaired_and_paired_two-sample_t-tests ) Dans ce cas, vous pouvez calculer les valeurs t et p comme suit:

import numpy as np
sample1 = np.array([55.0, 55.0, 47.0, 47.0, 55.0, 55.0, 55.0, 63.0])
sample2 = np.array([54.0, 56.0, 48.0, 46.0, 56.0, 56.0, 55.0, 62.0])
# paired sample -> the difference has mean 0
difference = sample1 - sample2
# the t-value is easily computed with numpy
t = (np.mean(difference))/(difference.std(ddof=1)/np.sqrt(len(difference)))
# unfortunately, numpy does not have a build in CDF
# here is a ridiculous work-around integrating by sampling
s = np.random.standard_t(len(difference), size=100000)
p = np.sum(s<t) / float(len(s))
# using a two-sided test
print("There is a {} % probability that the paired samples stem from distributions with the same means.".format(2 * min(p, 1 - p) * 100))

Cela imprimera There is a 73.028 % probability that the paired samples stem from distributions with the same means. Puisque c'est bien au-dessus de tout intervalle de confiance raisonnable (disons 5%), vous ne devriez rien conclure pour le cas concret.

4
Echsecutor