> Modules non standards > SciPy > Statistiques avec SciPy
Statistiques avec SciPy
Test t de Student :
- scipy.stats.ttest_ind([3, 5, 7], [6, 9, 10, 11]) : test t standard pour comparer les valeurs de 2 échantillons et renvoie une paire (statistique t, p-value), ici (-2.4967511357294372, 0.054707113913075575) (en fait, objet de la classe scipy.stats.stats.Ttest_indResult. Le test fait l'hypothèse d'une variance égale, sinon, rajouter equal_var = False.
- scipy.stats.ttest_rel([3, 5, 7], [6, 9, 10]) : test t apparié (il doit y avoir autant de valeurs dans les 2 vecteurs). Renvoie une paire (statistique t, p-value), ici (-10.0, 0.0098524570233256923).
- Si on veut comparer certaines colonnes d'un dataframe df avec d'autres colonnes faire :
- scipy.stats.ttest_ind(df.loc[:,myCols1].T, df.loc[:,myCols2].T)
- ca renvoie un objet Ttest_indResult (une paire) dont le premier élément est une array test statistiques, et le 2ème une array des p-values.
Test d'un seul échantillon contre une valeur :
- scipy.stats.ttest_1samp([1, 2, 3], 0) : pour tester des valeurs contre une moyenne attendue.
- scipy.stats.ttest_1samp([1, 2, 3], 0, alternative = 'greater') : one-sided.
Test de Wilcoxon rank-sum non apparié (non paramétrique) qui teste pour les rangs :
- res = scipy.stats.ranksums(range(1, 20), range(21, 40))
- renvoie un tuple nommé de 2 valeurs : statistic et pvalue.
- doit être utilisé pour des distributions continues seulement et ne corrige pas pour les valeurs égales.
Test de Wilcoxon Mann-whitney non apparié (non paramétrique) qui teste pour les rangs :
- il prend en compte les valeurs égales et a une correction de continuité.
- res = scipy.stats.mannwhitneyu(range(1, 20), range(21, 40), alternative = 'two-sided')
- renvoie un tuple nommé de 2 valeurs : statistic et pvalue.
- on peut utiliser aussi alternative = 'less' ou alternative = 'greater'
Test de Wilcoxon apparié (non paramétrique) :
- c'est une version non paramétrique du paired t-test.
- res = scipy.stats.wilcoxon(range(1, 20), range(21, 40))
- renvoie un tuple nommé de 2 valeurs : statistic et pvalue.
Test de Fisher exact :
- import scipy.stats; ar = numpy.array([[1, 26], [8, 30]]); oddsRatio, pVal = scipy.stats.fisher_exact(ar) : test sur une matrice de contingence, donc avec les positifs et négatifs, pas les effectifs totaux (test sur une matrice est identique au test sur sa transposée).
- par défaut, le test est two-sided.
- on peut le faire one-sided par : scipy.stats.fisher_exact(ar, alternative = 'less') : l'hypothèse alternative est que la valeur de la 1ère ligne sur la 1ère colonne est plus petite que la valeur de la 1ère ligne sur la 2ème colonne (en valeur relative).
chi2 :
- test du chi2 à une dimension en supposant les effectifs identiques pour chaque classe : result = scipy.stats.chisquare([10, 20, 50]) : result est de la classe Power_divergenceResult et :
- result.statistic : la valeur de la statistique du chi2 sur laquelle la p-value est basée.
- result.pvalue : la p-value
- result = scipy.stats.chisquare([10, 20, 50], [80/3, 80/3, 80/3]) : en donnant les effectifs attendus, ici, identiques pour toutes les classes (attention, il faut donner les effectifs, pas les fréquences, et il faut que la somme des effectifs attendus (2ème argument) soit égale à celle des effectifs observés (1er argument) !)
- result = scipy.stats.chi2_contingency(numpy.array([[134, 162], [325, 724]]) : test du chi2 sur un tableau de contingence. Renvoie un tuple à 4 valeurs :
- la statistique du chi2
- la p-value
- le nombre de degrés de liberté
- l'array attendue si pas de biais (de même dimension que celle donnée).
on peut alors calculer les résidus : (ar - result[3]) / numpy.sqrt(result[3]) où ar est l'array de départ.
Corrélations :
- faire import scipy.stats
- corrélation de Pearson : scipy.stats.pearsonr([2, 4, 6, 2, 9], [3, 5, 9, 4, 7]) : renvoie une tuple avec le coefficient de corrélation de Pearson et la p-value (probabilité sur des données non corrélées d'avoir un coefficient de corrélation au moins aussi bon), ici (0.77685085895124795, 0.12221580875381219).
- corrélation de Spearman : scipy.stats.spearmanr([2, 4, 6, 2, 9], [3, 5, 9, 4, 7]) : renvoie une tuple avec le coefficient de corrélation de Spearman et la p-value (probabilité sur des données non corrélées d'avoir un coefficient de corrélation au moins aussi bon), ici SpearmanrResult(correlation=0.87208159927238094, pvalue=0.053854217727542113).
Test de Kolmogorov-Smirnov : permet de tester si un échantillon suit une distribution donnée ou si 2 échantillons suivant la même distribution (inconnue) :
- pour tester si un échantillon suit la loi normale centrée réduite : values = scipy.stats.norm.rvs(size = 100, loc = 0.5); result = scipy.stats.kstest(values1, scipy.stats.norm.cdf) : renvoie un tuple (statistique, p-value)
- pour faire le test contre une distribution normale autre : result = scipy.stats.kstest(values, lambda x: scipy.stats.norm.cdf(x, loc = 0, scale = 1)) (le second argument doit être une fonction qui renvoie la distribution cumulée).
- on peut aussi utiliser : result = scipy.stats.ks_1samp(values1, scipy.stats.norm.cdf, args = (0.5, 2))
- test avec 2 échantillons pour savoir s'ils suivent la même distribution : result = scipy.stats.kstest(values1, values2)
- on peut aussi utiliser : result = scipy.stats.ks_2samp(values1, values2)
Test d'Anderson-Darling : permet de tester si n échantillons suivent la même distribution :
- result = scipy.stats.anderson_ksamp([values1, values2, values3])
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert