Test statistique (test multiple) en Python: scikit_posthocs

** Ce que vous pouvez faire avec cet article **

  1. Sélection de la méthode d'essai en tenant compte de la normalité des données et d'une dispersion égale
  2. Test multiple para-non paramétrique
  3. Résultats illustrés par carte thermique à haute listabilité

introduction

Je me spécialise en biologie à l'école supérieure. Python est très utile pour analyser les données expérimentales dans les graphiques, mais c'était assez gênant car il y a peu de bibliothèques qui effectuent divers tests (en particulier des tests de différences significatives entre les groupes). Comme solution

  1. Faites-le avec R.
  2. Implémentez les fonctions R en Python.

Etc. sont possibles. (Pour 2, j'ai pu le faire en présentant Rpy2)

Cependant, je veux vraiment exécuter des tests non paramétriques en Python! Par conséquent, j'ai décidé de mettre en œuvre un test non paramétrique en utilisant une bibliothèque appelée la troisième méthode ** scilit_posthocs **.

Si vous êtes uniquement intéressé par l'implémentation de scikit_posthocs, j'espère que vous pourrez passer immédiatement au tableau ci-dessous.

Principes de base du test: comment sélectionner une méthode de test.

Tout d'abord, pour démarrer le test Le contenu suivant est basé sur l'article J-stage suivant Pour ceux qui ne comprennent pas le test statistique I, II //www.jstage.jst.go.jp/article/kagakutoseibutsu/51/6/51_408/_pdf), [Ⅲ](https://www.jstage.jst.go.jp/article/kagakutoseibutsu/51/ 7 / 51_483 / _pdf)

J'interprète et décris ces articles à ma manière.

Ça va être un peu long, donc je le mettrai à jour quand j'aurai le temps, mais en bref, je suivrai le flux suivant.

** Données (indépendantes) non prises en charge dans 3 groupes ou plus **     ↓ Test de normalité (test de Shapiro-Wilk ou graphique QQ ..) → Aller à Non-para     ↓ Test de dispersion égale (test de Bartlett) → To Non-para     ↓ Analyse de distribution centralisée (ANOVA) → vers Non-para     ↓ Test Tukey_HSD, test de Scheffe, test de Tukey (n est le même dans chaque groupe), test de Dunnett (comparaison avec le groupe témoin)

Dans l'article dont j'ai parlé,

  1. Lorsque l'hypothèse nulle de normalité et de dispersion égale ne peut être rejetée
  2. S'il n'y a pas de différence significative dans l'ANOVA Recommande des tests non paramétriques.

** Si vous passez à non-para dans l'organigramme ci-dessus **     ↓ Test de dispersion égale (test de Levene, test de Fligner)     ↓ Analyse de distribution unidirectionnelle (test de Kruskal-Wallis)     ↓ Test Steel-Dwass (DSCF), test Conover Pour le moment, ces tests sont également des tests post hoc, alors pourquoi ne pas avoir une différence significative dans l'analyse de dispersion centralisée? ?? Je pense que, mais selon l'article ci-dessus, j'ai écrit qu'il n'est pas nécessaire d'effectuer une analyse distribuée.

Implémentation de scikit-posthocs

scikit_posthocs est une bibliothèque qui couvre de nombreux tests et est très facile à utiliser, ce que scipy et statsmodels ne couvrent pas. Le site officiel est très bien organisé, veuillez donc le consulter. HP officiel Dépôt GitHub

Les packages dépendants sont Numpy, Pandas, scipy, stasmodels, matplotlib, seaborn. scikit_posthocs peut être installé avec pip.

!pip install scikit_posthocs
  1. Test Tukey_HSD
  2. Test de Tukey
  3. Test de Scheffe
  4. Test t par paires (probablement parce que le test t est répété plusieurs fois, il ne se comporte pas bien)
  5. Essai Steel-Dwass
  6. Test de Conover

est. Tout test (autre que HSD) peut être exécuté comme suit.

import scikit_posthoc as sp
import seaborn as sns

#Charger les données Titanic
df = sns.load_dataset("titanic")

#Steel-Test Dwass
#val_col est la colonne de valeur
#group_col est la colonne du groupe que vous souhaitez comparer
sp.posthoc_dscf(df,val_col="fare",group_col="class")

Le résultat sera renvoyé dans la trame de données suivante. Le contenu du tableau est des valeurs p. スクリーンショット 2020-01-31 19.00.15.png

Mise en œuvre de la sélection de la méthode de test à l'illustration

J'ai rassemblé le contenu ci-dessus sur github. rola-bio/stats_test Téléchargez stats_test.py dans votre répertoire de travail et importez-le. Et lorsque vous exécutez stats_test (), Comme le montre le flux ci-dessus, la normalité et la variance égale des données sont testées et l'analyse de variance est automatiquement effectuée. Les données sont ensuite analysées avec un test approprié et les résultats des différences significatives et le graphique à barres des données sont illustrés. Par défaut, l'un des tests Tukey-HSD, Steel-Dwass et Conover est sélectionné.

Maintenant, utilisons cette fonction pour analyser la différence de tarif en fonction du type de passager à partir des données passagers du Titanic, qui est actuellement installé en standard dans seaborn.

titanic.ipynb



import stats_test as st
import seaborn as sns

#Charger les données Titanic
df = sns.load_dataset("titanic")
df.head()
スクリーンショット 2020-01-31 17.42.55.png Ensuite, utilisez stats_test () pour spécifier le bloc de données, la valeur à tester et l'élément à grouper. Cette fois, j'ai essayé de diviser les types de passagers par lieu d'embarquement (embark_town).

titanic.ipynb


st.stats_test(df,val_col="fare",group_col="embark_town")

Oups ~~? ?? J'ai eu une erreur lorsque j'ai exécuté ceci.

TypeError: '<' not supported between instances of 'float' and 'str'

Apparemment, il y a une erreur (nan) dans le tarif ou dans embark_town. Vous pouvez obtenir cette erreur si group_col est mélangé avec une valeur int ou nulle. En cas d'erreur int

df ["nom de la colonne"] = df ["nom de la colonne"] .astype (str)

Vous pouvez y faire face. Cette fois, j'ai enlevé nan avec dropna comme indiqué ci-dessous.

titanic.ipynb


st.stats_test(df.dropna(subset=["embark_town"]),val_col="fare",group_col="embark_town")

résultat

スクリーンショット 2020-01-31 17.43.11.png ** Comment lire l'écran ** La notation sur la face supérieure de l'image montre que le résultat du test était une dispersion non paramétrique et inégale. De plus, les résultats du test de Kruskal-Wallis semblaient significativement différents, le test Conover a donc été automatiquement sélectionné. Le côté gauche de la figure trace les données et le côté droit montre les résultats du test dans une carte thermique.

Apparemment, il existe une différence significative de valeur p <0,001 ou moins entre tous les groupes. Les gens qui sont montés sur Cherbourg sont vraiment fous ...

Divisez davantage le groupe en hommes et en femmes

Oups, moi! J'ai fait une déclaration qui serait un homme jurant.

Les gens qui roulent à Cherbourg sont fortement embourbés

Ces données ne font pas de distinction entre les hommes et les femmes, alors faisons un test de différence significative par sexe ensuite.

titanic.ipynb


for sex in df["sex"].unique():
    print("""
This result is from {} 
""".format(sex))
    df_query = df.query("sex =='{}'".format(sex))
    st.stats_test(df_query.dropna(subset=["embark_town"]),
                  val_col="fare",group_col="embark_town")
スクリーンショット 2020-01-31 18.00.07.png スクリーンショット 2020-01-31 18.00.20.png

Le résultat était quelque chose comme ça. C'est difficile à comprendre car le code couleur du lieu d'embarquement a changé depuis le premier résultat. .. .. Vous pouvez l'ajuster en jouant avec sign_barplot () dans le paquet.

Quoi qu'il en soit, les passagers de Cherbourg semblent être nettement plus riches tant pour les hommes que pour les femmes. (Gununu ,,,) Cependant, la différence de salaire entre Southampton et Cherbourg pour les hommes a atteint une valeur p d'environ 0,01. Est-ce à cause de Maya Yoshida?

C'est tout.

Au fait, si vous passez result = True à stats_test (), le résultat du test au milieu sera également affiché. Vous pouvez spécifier le test vous-même en passant test = "test name". (Ou vous pouvez facilement le changer en jouant avec la fonction de stats_test.py, one_way_ANOVA ())

Au fil du temps, nous pouvons également écrire des implémentations de tests individuels. Pour plus de détails, veuillez vous référer au contenu du code ...

Recommended Posts

Test statistique (test multiple) en Python: scikit_posthocs
Distribution de probabilité de niveau 2 du test statistique apprise en Python ②
Distribution de probabilité de test statistique de niveau 2 apprise en Python
Expression de régression multiple en Python
Algorithme en Python (jugement premier)
Évitez les boucles multiples en Python
Définir le test python dans jenkins
Extraire plusieurs doublons de liste en Python
Ecrire le code de test du sélénium en python
Supprimer plusieurs éléments dans la liste python
[Test statistique 2e année / quasi 1e année] Formation à l'analyse régressive avec Python (2)
[Test statistique 2e année / quasi 1e année] Formation à l'analyse régressive avec Python (1)
Gérez plusieurs versions de python en un seul jupyter
Test de stress avec Locust écrit en Python
Ecrire le test dans la docstring python
Envoyer des e-mails à plusieurs destinataires avec Python (Python3)
Mettre en œuvre collectivement des tests d'hypothèses statistiques en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
SendKeys en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Constante en Python
Test d'intégrité Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Créez un environnement de test Vim + Python en 1 minute
Je veux faire le test de Dunnett en Python