** Ce que vous pouvez faire avec cet article **
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
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.
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é,
** 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.
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
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.
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()
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")
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 ...
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")
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