Statistischer Test (Mehrfachtest) in Python: scikit_posthocs

** Was Sie mit diesem Artikel machen können **

  1. Auswahl der Testmethode unter Berücksichtigung der Datennormalität und der gleichen Streuung
  2. Para-nicht-parametrischer Mehrfachtest
  3. Illustrierte Ergebnisse durch Heatmap mit hoher Listbarkeit

Einführung

Ich studiere Biologie an der Graduiertenschule. Python ist sehr nützlich für die Analyse von experimentellen Daten in Diagrammen, aber es war ziemlich problematisch, da es nur wenige Bibliotheken gibt, die verschiedene Tests durchführen (insbesondere signifikante Unterschiedstests zwischen Gruppen). Als Lösung

  1. Mach es mit R.
  2. Implementieren Sie R-Funktionen in Python.

Usw. sind möglich. (Für 2 konnte ich dies tun, indem ich [Rpy2] einführte (https://qiita.com/MTNakata/items/04a045f4beb0fa9e3a4d))

Ich möchte jedoch wirklich nicht parametrische Tests in Python ausführen! Aus diesem Grund habe ich beschlossen, einen nicht parametrischen Test mit einer Bibliothek namens dritte Methode ** scilit_posthocs ** durchzuführen.

Wenn Sie nur an der Implementierung von scikit_posthocs interessiert sind, können Sie hoffentlich sofort zur folgenden Tabelle springen.

Testgrundlagen: So wählen Sie eine Testmethode aus.

Zunächst einmal, um den Test zu starten Der folgende Inhalt basiert auf dem folgenden J-Stage-Artikel Für diejenigen, die den statistischen Test I nicht verstehen, 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)

Ich interpretiere und beschreibe diese Artikel auf meine eigene Weise.

Es wird ein bisschen lang sein, also werde ich es aktualisieren, wenn ich Zeit habe, aber kurz gesagt, ich werde dem nächsten Fluss folgen.

** Nicht unterstützte (unabhängige) Daten in 3 oder mehr Gruppen **     ↓ Normalitätstest (Shapiro-Wilk-Test oder QQ-Diagramm ..) → Gehen Sie zu Non-Para     ↓ Gleicher Dispersionstest (Bartlett-Test) → Zu Nicht-Abs     ↓ Zentralisierte Verteilungsanalyse (ANOVA) → zu Nicht-Abs     ↓ Tukey_HSD-Test, Scheffe-Test, Tukey-Test (n ist in jeder Gruppe gleich), Dunnett-Test (Vergleich mit der Kontrollgruppe)

In dem Artikel, auf den ich mich bezog,

  1. Wenn die Nullhypothese von Normalität und gleicher Streuung nicht zurückgewiesen werden kann
  2. Wenn es keinen signifikanten Unterschied in der ANOVA gibt Empfiehlt nichtparametrische Tests.

** Wenn Sie im obigen Flussdiagramm zu Nicht-Para gehen **     ↓ Gleicher Dispersionstest (Levene-Test, Fligner-Test)     ↓ Einwegverteilungsanalyse (Kruskal-Wallis-Test)     ↓ Steel-Dwass (dscf) -Test, Conover-Test Derzeit handelt es sich bei diesen Tests auch um Post-hoc-Tests. Warum also nicht einen signifikanten Unterschied in der zentralisierten Dispersionsanalyse aufweisen? ?? Ich denke das, aber gemäß dem obigen Artikel habe ich geschrieben, dass es nicht notwendig ist, eine verteilte Analyse durchzuführen.

Implementierung von Scikit-Posthocs

scikit_posthocs ist eine Bibliothek, die viele Tests abdeckt und sehr einfach zu verwenden ist, die scipy und statsmodels nicht abdecken. Die offizielle Website ist sehr gut organisiert. Offizielle HP GitHub Repository

Abhängige Pakete sind Numpy, Pandas, Scipy, Stasmodels, Matplotlib, Seaborn. scikit_posthocs kann mit pip installiert werden.

!pip install scikit_posthocs
  1. Tukey_HSD-Test
  2. Tukey-Test
  3. Scheffe-Test
  4. Paarweiser t-Test (wahrscheinlich, weil der t-Test mehrmals wiederholt wird, ist er nicht gut erzogen)
  5. Stahl-Dwass-Test
  6. Conover-Test

ist. Jeder Test (außer HSD) kann wie folgt ausgeführt werden.

import scikit_posthoc as sp
import seaborn as sns

#Laden Sie Titanic-Daten
df = sns.load_dataset("titanic")

#Steel-Dwass-Test
#val_col ist die Wertespalte
#group_col ist die Spalte der Gruppe, die Sie vergleichen möchten
sp.posthoc_dscf(df,val_col="fare",group_col="class")

Das Ergebnis wird im folgenden Datenrahmen zurückgegeben. Der Inhalt der Tabelle ist p-Werte. スクリーンショット 2020-01-31 19.00.15.png

Implementiert von der Auswahl der Testmethode bis zur Illustration

Ich habe den obigen Inhalt auf Github zusammengestellt. rola-bio/stats_test Laden Sie stats_test.py in Ihr Arbeitsverzeichnis herunter und importieren Sie es. Und wenn Sie stats_test () ausführen, Wie im obigen Ablauf gezeigt, werden die Normalität und die gleiche Varianz der Daten getestet und die Varianzanalyse wird automatisch durchgeführt. Die Daten werden dann mit einem geeigneten Test analysiert und die Ergebnisse der signifikanten Unterschiede und das Balkendiagramm der Daten werden dargestellt. Standardmäßig ist einer der Tests Tukey-HSD, Steel-Dwass und Conover ausgewählt.

Verwenden wir diese Funktion nun, um den Tarifunterschied in Abhängigkeit vom Passagiertyp anhand der Passagierdaten der Titanic zu analysieren, die bei Seeleuten standardmäßig installiert ist.

titanic.ipynb



import stats_test as st
import seaborn as sns

#Laden Sie Titanic-Daten
df = sns.load_dataset("titanic")
df.head()
スクリーンショット 2020-01-31 17.42.55.png Verwenden Sie als Nächstes stats_test (), um den Datenrahmen, den zu testenden Wert und das zu gruppierende Element anzugeben. Dieses Mal habe ich versucht, die Passagiertypen nach Einstiegsort (embark_town) zu unterteilen.

titanic.ipynb


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

Ups ~~? ?? Ich habe einen Fehler bekommen, als ich das ausgeführt habe.

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

Anscheinend gibt es einen Fehler (nan) in Tarif oder Embark_town. Dieser Fehler kann auftreten, wenn group_col mit dem Wert int oder null gemischt wird. Im Falle eines int-Fehlers

df ["Spaltenname"] = df ["Spaltenname"] .astype (str)

Sie können damit umgehen. Dieses Mal entfernte ich Nan mit Dropna wie unten gezeigt.

titanic.ipynb


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

Ergebnis

スクリーンショット 2020-01-31 17.43.11.png ** Wie man den Bildschirm liest ** Die Notation auf der Oberseite des Bildes zeigt, dass das Testergebnis nicht parametrisch und ungleich verteilt war. Auch die Ergebnisse des Kruskal-Wallis-Tests schienen signifikant unterschiedlich zu sein, sodass der Conover-Test automatisch ausgewählt wurde. Die linke Seite der Abbildung zeigt die Daten und die rechte Seite zeigt die Testergebnisse in einer Wärmekarte.

Anscheinend gibt es zwischen allen Gruppen einen signifikanten Unterschied des p-Werts <0,001 oder weniger. Leute, die nach Cherbourg gekommen sind, sind bedeutend verrückt ...

Teilen Sie die Gruppe weiter in Männer und Frauen auf

Ups, ich! Ich gab eine Erklärung ab, die für einen Mann lächerlich wäre.

Menschen, die in Cherbourg fahren, sind schwer krank

Diese Daten unterscheiden nicht zwischen Männern und Frauen. Lassen Sie uns als Nächstes einen signifikanten Unterschiedstest nach Geschlecht durchführen.

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

Das Ergebnis war so etwas. Es ist schwer zu verstehen, da sich die Farbcodierung der Einstiegsstelle seit dem ersten Ergebnis geändert hat. .. .. Sie können es anpassen, indem Sie mit sign_barplot () im Paket spielen.

Auf jeden Fall scheinen die Passagiere in Cherbourg sowohl für Männer als auch für Frauen bedeutend reicher zu sein. (Gununu ,,,) Der Lohnunterschied zwischen Southampton und Cherbourg für Männer ist jedoch auf einen p-Wert von etwa 0,01 gestiegen. Liegt es an Maya Yoshida?

Das ist es.

Übrigens, wenn Sie result = True an stats_test () übergeben, wird auch das Ergebnis des Tests in der Mitte angezeigt. Sie können den Test selbst angeben, indem Sie test = "Testname" bestehen. (Oder Sie können es einfach ändern, indem Sie mit der Funktion stats_test.py, one_way_ANOVA () spielen.)

Im Laufe der Zeit können wir auch Implementierungen einzelner Tests schreiben. Einzelheiten entnehmen Sie bitte dem Inhalt des Codes ...

Recommended Posts

Statistischer Test (Mehrfachtest) in Python: scikit_posthocs
In Python ② erlernte statistische Wahrscheinlichkeitsverteilung für Testgrad 2
In Python ① erlernte statistische Wahrscheinlichkeitsverteilung für Testgrad 2
Mehrfacher Regressionsausdruck in Python
Algorithmus in Python (Haupturteil)
Vermeiden Sie mehrere Schleifen in Python
Stellen Sie den Python-Test in Jenkins ein
Extrahieren Sie mehrere Listenduplikate in Python
Schreiben Sie Selentestcode in Python
Löschen Sie mehrere Elemente in der Python-Liste
[Statistischer Test 2. Klasse / quasi 1. Klasse] Regressives Analysetraining mit Python (2)
[Statistischer Test 2. Klasse / quasi 1. Klasse] Regressives Analysetraining mit Python (1)
Behandeln Sie mehrere Python-Versionen in einem Jupyter
Stresstest mit Locust in Python geschrieben
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Senden Sie mit Python (Python3) E-Mails an mehrere Empfänger.
Implementieren Sie gemeinsam statistische Hypothesentests in Python
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
SendKeys in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Konstante in Python
Python-Integritätstest
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Erstellen Sie in 1 Minute eine Vim + Python-Testumgebung
Ich möchte Dunnetts Test in Python machen