(Dieses Jupyter Notebook ist live unter: http://mybinder.org/repo/christofs/jupyter.)
Dieses Jupyter Notebook erläutert einige Aspekte des Vergleichs von Korpora.
In [ ]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Zunächst laden wir einen Datensatz.
Motivation: Kommt ein Wort häufiger bei Racine vor als bei seinen Zeitgenossen? Trinken die Deutschen mehr Bier als die Polen?
Das folgende Tutorial fokussiert darauf, wie Verteilungen generiert und mit verschiedenen statistischen Tests daraufhin überprüft werden können, wie ähnlich sich die beiden Verteilungen sind.
Anders ausgedrückt prüft man, wie wahrscheinlich es ist, dass die beiden untersuchten Verteilungen tatsächlich aus einer gemeinsamen Verteilung stammen.
Wenn die Unterschiede zwischen zwei Verteilungen allein durch zufällige Schwankungen beim Sampeln der Verteilungen erklärbar sind, dann ist kein statistisch signifikanter Unterschied der Verteilungen zu erkennen.
Zunächst müssen wir die Verteilungen generieren, die es dann zu vergleichen gilt.
Dafür können wir eine Bibliothek einsetzen, die das Generieren von Verteilungen mit gewünschten Eigenschaften erlaubt: scipy.stats.
Dokumentation: http://docs.scipy.org/doc/scipy/reference/stats.html
Wir definieren zunächst die Parameter der Verteilung:
In [ ]:
loc = 10 # = Arithmetisches Mittel
scale = 20 # = Standardabweichung
Wir generieren die Verteilung und viele Einzelwerte. Hierfür müssen wir (spätestens jetzt) die Bibliothek scipy.stats importieren Außerdem schauen wir uns einige Werte der Verteilung an.
In [ ]:
import scipy.stats as sts
Verteilung = sts.norm(loc, scale) # loc=arithmetisches Mittel, scale = Standardabweichung
Werte = Verteilung.rvs(size=5000)
print("Zehn Einzelwerte:", Werte[0:10])
Wir visualisieren die Werte der Verteilung als Histogramm und als Boxplot.
Histogramm: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist Boxplot: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.boxplot
In [ ]:
# Histogramm
plt.hist(Werte, 100)
plt.axis([-200, 200, 0, 200]) # x-min, x-max, y-min, y-max
plt.show()
# Boxplot
plt.boxplot(Werte, vert=False)
plt.show()
Wir extrahieren zur Kontrolle die Eckdaten der Verteilung:
In [ ]:
from math import sqrt
mean, var, skew = Verteilung.stats(moments='mvs')
print("mean:", mean, "\nstdv:", sqrt(var), "\nskew:", skew)
Jetzt wird es möglich, mit unterschiedlichen Parametern unterschiedliche Verteilungen zu generieren. Sie folgen immer einer Normalverteilung, aber eben mit spezifischen Mittelwert und Standardabweichung.
Probieren Sie es aus!
(Hinweis: Falls notwendig, können Sie im Histogramm die Achsenskalen anpassen.)
Für den Vergleich zweier Verteilungen müssen wir zunächst zwei Verteilungen generieren und dann statistische Tests anwenden, die diese beiden Verteilungen auf ihre Unterschiedlichkeit hin überprüfen.
Zunächst generieren wir also nicht eine, sondern gleich zwei Verteilungen. Entsprechend legen wir auch die Parameter für beide getrennt fest.
In [ ]:
# Erste Verteilung
loc = 15 # = Arithmetisches Mittel
scale = 5 # = Standardabweichung
Verteilung = sts.norm(loc, scale) # loc=arithmetisches Mittel, scale = Standardabweichung
Werte1 = Verteilung.rvs(size=500)
# Zweite Verteilung
loc = 25 # = Arithmetisches Mittel
scale = 5 # = Standardabweichung
Verteilung = sts.norm(loc, scale) # loc=arithmetisches Mittel, scale = Standardabweichung
Werte2 = Verteilung.rvs(size=500)
Zunächst visualisieren wir die beiden Verteilungen gemeinsam, um einen ersten Eindruck ihres Verhältnisses zueinander zu bekommen.
In [ ]:
# Zwei Histogramme
plt.hist(Werte1, 10, histtype="stepfilled", color=(1, 1, 0, 0.2))
plt.hist(Werte2, 10, histtype="stepfilled", color=(0, 0, 1, 0.2))
plt.show()
# Zwei Boxplots
Daten = [Werte1, Werte2]
plt.boxplot(Daten, vert=False)
plt.show()
Jetzt können wir statistische Tests anwenden, und zwar gleich mehrere. Dann sehen wir, wie sich die verschiedenen Test unter verschiedenen Bedingungen verhalten.
In [ ]:
MW1 = np.mean(Werte1)
MW2 = np.mean(Werte2)
Verhältnis = MW1/MW2
print("Mittelwert1 :", MW1, "\nMittelwert2 :", MW2, "\n Verhältnis :", Verhältnis)
In [ ]:
Welch = sts.ttest_ind(Werte1, Werte2, equal_var=False)
print("Statistik:", Welch[0], "\n P-Wert:", Welch[1])
In [ ]:
Wilcoxon = sts.wilcoxon(Werte1, Werte2)
print("Statistik:", Wilcoxon[0], "\n P-Wert:", Wilcoxon[1])
Jetzt sollten wir wieder die Werte der Verteilungen variieren.
Verändern Sie einmal die Mittelwerte der beiden Verteilungen, einmal recht start, einmal recht schwach. Was zeigen die Indikatoren?
Stellen Sie außerdem einmal eine unterschiedliche Varianz ("scale") für die beiden Verteilungen ein. Was passiert nun?
Wie interagieren diese beiden Manipulationen? Wie würden Sie den Einfluss der beiden Manipulationen auf das Ergebnis beschreiben?