scipy.stats.

quantile_test#

scipy.stats.quantile_test(x, *, q=0, p=0.5, alternative='two-sided')[Quelle]#

Führt einen Quantiltest durch und berechnet ein Konfidenzintervall für das Quantil.

Diese Funktion testet die Nullhypothese, dass q der Wert des Quantils mit der Wahrscheinlichkeit p der zugrunde liegenden Population der Stichprobe x ist. Zum Beispiel wird mit den Standardparametern getestet, dass der Median der zugrunde liegenden Population von x Null ist. Die Funktion gibt ein Objekt zurück, das die Teststatistik, einen p-Wert und eine Methode zur Berechnung des Konfidenzintervalls um das Quantil enthält.

Parameter:
xarray_like

Eine eindimensionale Stichprobe.

qfloat, Standard: 0

Der hypothetische Wert des Quantils.

pfloat, Standard: 0.5

Die Wahrscheinlichkeit, die mit dem Quantil verbunden ist; d.h. der Anteil der Population, der kleiner als q ist, beträgt p. Muss strikt zwischen 0 und 1 liegen.

alternative{‘zweiseitig’, ‘kleiner’, ‘größer’}, optional

Definiert die alternative Hypothese. Die folgenden Optionen sind verfügbar (Standard ist ‚two-sided‘)

  • „two-sided“: Das Quantil, das mit der Wahrscheinlichkeit p verbunden ist, ist nicht q.

  • „less“: Das Quantil, das mit der Wahrscheinlichkeit p verbunden ist, ist kleiner als q.

  • „greater“: Das Quantil, das mit der Wahrscheinlichkeit p verbunden ist, ist größer als q.

Rückgabe:
resultQuantileTestResult

Ein Objekt mit den folgenden Attributen

statisticfloat

Eine von zwei Teststatistiken, die im Quantiltest verwendet werden können. Die erste Teststatistik, T1, ist der Anteil der Stichproben in x, die kleiner oder gleich dem hypothetischen Quantil q sind. Die zweite Teststatistik, T2, ist der Anteil der Stichproben in x, die strikt kleiner als das hypothetische Quantil q sind.

Wenn alternative = 'greater', wird T1 zur Berechnung des p-Werts verwendet und statistic wird auf T1 gesetzt.

Wenn alternative = 'less', wird T2 zur Berechnung des p-Werts verwendet und statistic wird auf T2 gesetzt.

Wenn alternative = 'two-sided', werden sowohl T1 als auch T2 berücksichtigt, und diejenige, die zu dem kleinsten p-Wert führt, wird verwendet.

statistic_typeint

Entweder 1 oder 2, abhängig davon, welche von T1 oder T2 zur Berechnung des p-Werts verwendet wurde.

pvaluefloat

Der p-Wert, der mit der angegebenen Alternative verbunden ist.

Das Objekt hat auch die folgende Methode

confidence_interval(confidence_level=0.95)

Berechnet ein Konfidenzintervall für das Populationsquantil, das mit der Wahrscheinlichkeit p verbunden ist. Das Konfidenzintervall wird in einem namedtuple mit den Feldern low und high zurückgegeben. Werte sind nan, wenn nicht genügend Beobachtungen vorhanden sind, um das Konfidenzintervall bei gewünschtem Konfidenzlevel zu berechnen.

Hinweise

Dieser Test und seine Methode zur Berechnung von Konfidenzintervallen sind nichtparametrisch. Sie sind gültig, wenn und nur wenn die Beobachtungen i.i.d. sind.

Die Implementierung des Tests folgt Conover [1]. Es werden zwei Teststatistiken berücksichtigt.

T1: Die Anzahl der Beobachtungen in x, die kleiner oder gleich q sind.

T1 = (x <= q).sum()

T2: Die Anzahl der Beobachtungen in x, die strikt kleiner als q sind.

T2 = (x < q).sum()

Die Verwendung von zwei Teststatistiken ist notwendig, um die Möglichkeit zu berücksichtigen, dass x aus einer diskreten oder gemischten Verteilung generiert wurde.

Die Nullhypothese für den Test lautet

H0: Das \(p^{\mathrm{th}}\)-Quantil der Population ist q.

und die Nullverteilung für jede Teststatistik ist \(\mathrm{binom}\left(n, p\right)\). Wenn alternative='less', lautet die Alternativhypothese

H1: Das \(p^{\mathrm{th}}\)-Quantil der Population ist kleiner als q.

und der p-Wert ist die Wahrscheinlichkeit, dass die binomiale Zufallsvariable

\[Y \sim \mathrm{binom}\left(n, p\right)\]

größer oder gleich dem beobachteten Wert T2 ist.

Wenn alternative='greater', lautet die Alternativhypothese

H1: Das \(p^{\mathrm{th}}\)-Quantil der Population ist größer als q

und der p-Wert ist die Wahrscheinlichkeit, dass die binomiale Zufallsvariable Y kleiner oder gleich dem beobachteten Wert T1 ist.

Wenn alternative='two-sided', lautet die Alternativhypothese

H1: q ist nicht das \(p^{\mathrm{th}}\)-Quantil der Population.

und der p-Wert ist das Doppelte des kleineren der p-Werte für die Fälle 'less' und 'greater'. Beide dieser p-Werte können für dieselben Daten 0,5 überschreiten, daher wird der Wert auf das Intervall \([0, 1]\) gekürzt.

Der Ansatz für Konfidenzintervalle wird Thompson [2] zugeschrieben und später als anwendbar auf beliebige Mengen von i.i.d. Stichproben erwiesen [3]. Die Berechnung basiert auf der Beobachtung, dass die Wahrscheinlichkeit, dass ein Quantil \(q\) größer ist als jede Beobachtung \(x_m (1\leq m \leq N)\), berechnet werden kann als

\[\mathbb{P}(x_m \leq q) = 1 - \sum_{k=0}^{m-1} \binom{N}{k} q^k(1-q)^{N-k}\]

Standardmäßig werden Konfidenzintervalle für ein Konfidenzniveau von 95% berechnet. Eine übliche Interpretation von 95%-Konfidenzintervallen ist, dass, wenn i.i.d. Stichproben wiederholt aus derselben Population gezogen und jedes Mal Konfidenzintervalle gebildet werden, das Konfidenzintervall den wahren Wert des angegebenen Quantils in ungefähr 95% der Versuche enthalten wird.

Eine ähnliche Funktion ist im R-Paket QuantileNPCI verfügbar [4]. Die Grundlage ist dieselbe, aber es berechnet die Grenzen des Konfidenzintervalls durch Interpolation zwischen den Stichprobenwerten, während diese Funktion nur Stichprobenwerte als Grenzen verwendet. Daher gibt quantile_test.confidence_interval konservativere Intervalle zurück (d.h. größere).

Dieselbe Berechnung von Konfidenzintervallen für Quantile ist im Paket confintr enthalten [5].

Zweiseitige Konfidenzintervalle sind nicht garantiert optimal; d.h. es kann ein engeres Intervall geben, das den interessierenden Quantil mit einer Wahrscheinlichkeit größer als das Konfidenzniveau enthält. Ohne weitere Annahmen über die Stichproben (z.B. die Art der zugrunde liegenden Verteilung) sind die einseitigen Intervalle optimal eng.

Referenzen

[1]
    1. Conover. Practical Nonparametric Statistics, 3rd Ed. 1999.

[2]

W. R. Thompson, „On Confidence Ranges for the Median and Other Expectation Distributions for Populations of Unknown Distribution Form,“ The Annals of Mathematical Statistics, vol. 7, no. 3, pp. 122-128, 1936, Accessed: Sep. 18, 2019. [Online]. Available: https://www.jstor.org/stable/2957563.

[3]

H. A. David und H. N. Nagaraja, „Order Statistics in Nonparametric Inference“ in Order Statistics, John Wiley & Sons, Ltd, 2005, pp. 159-170. Available: https://onlinelibrary.wiley.com/doi/10.1002/0471722162.ch7.

[4]

N. Hutson, A. Hutson, L. Yan, „QuantileNPCI: Nonparametric Confidence Intervals for Quantiles,“ R package, https://cran.r-project.org/package=QuantileNPCI

[5]

M. Mayer, „confintr: Confidence Intervals,“ R package, https://cran.r-project.org/package=confintr

Beispiele

Angenommen, wir möchten die Nullhypothese testen, dass der Median einer Population gleich 0,5 ist. Wir wählen ein Konfidenzniveau von 99 %; das heißt, wir verwerfen die Nullhypothese zugunsten der Alternative, wenn der p-Wert kleiner als 0,01 ist.

Beim Testen von Zufallsvariablen aus der Standardgleichverteilung, deren Median 0,5 beträgt, erwarten wir, dass die Daten die meiste Zeit mit der Nullhypothese übereinstimmen.

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> rvs = stats.uniform.rvs(size=100, random_state=rng)
>>> stats.quantile_test(rvs, q=0.5, p=0.5)
QuantileTestResult(statistic=45, statistic_type=1, pvalue=0.36820161732669576)

Wie erwartet liegt der p-Wert nicht unter unserem Schwellenwert von 0,01, sodass wir die Nullhypothese nicht verwerfen können.

Beim Testen von Daten aus der Standard-*Normalverteilung*, deren Median 0 ist, würden wir erwarten, dass die Nullhypothese verworfen wird.

>>> rvs = stats.norm.rvs(size=100, random_state=rng)
>>> stats.quantile_test(rvs, q=0.5, p=0.5)
QuantileTestResult(statistic=67, statistic_type=2, pvalue=0.0008737198369123724)

Tatsächlich ist der p-Wert niedriger als unser Schwellenwert von 0,01, sodass wir die Nullhypothese zugunsten der Standardalternative „two-sided“ verwerfen: Der Median der Population ist *nicht* gleich 0,5.

Angenommen, wir würden jedoch die Nullhypothese gegen die einseitige Alternative testen, dass der Median der Population *größer* als 0,5 ist. Da der Median der Standardnormalverteilung kleiner als 0,5 ist, würden wir nicht erwarten, dass die Nullhypothese verworfen wird.

>>> stats.quantile_test(rvs, q=0.5, p=0.5, alternative='greater')
QuantileTestResult(statistic=67, statistic_type=1, pvalue=0.9997956114162866)

Wen wundert es, dass wir bei einem p-Wert größer als unserem Schwellenwert die Nullhypothese zugunsten der gewählten Alternative nicht verwerfen würden.

Der Quantiltest kann für jedes Quantil verwendet werden, nicht nur für den Median. Zum Beispiel können wir testen, ob das dritte Quartil der zugrunde liegenden Verteilung der Stichprobe größer als 0,6 ist.

>>> rvs = stats.uniform.rvs(size=100, random_state=rng)
>>> stats.quantile_test(rvs, q=0.6, p=0.75, alternative='greater')
QuantileTestResult(statistic=64, statistic_type=1, pvalue=0.00940696592998271)

Der p-Wert ist niedriger als der Schwellenwert. Wir verwerfen die Nullhypothese zugunsten der Alternative: Das dritte Quartil der zugrunde liegenden Verteilung unserer Stichprobe ist größer als 0,6.

quantile_test kann auch Konfidenzintervalle für jedes Quantil berechnen.

>>> rvs = stats.norm.rvs(size=100, random_state=rng)
>>> res = stats.quantile_test(rvs, q=0.6, p=0.75)
>>> ci = res.confidence_interval(confidence_level=0.95)
>>> ci
ConfidenceInterval(low=0.284491604437432, high=0.8912531024914844)

Beim Testen einer einseitigen Alternative enthält das Konfidenzintervall alle Beobachtungen, sodass, wenn sie als q übergeben werden, der p-Wert des Tests größer als 0,05 wäre und daher die Nullhypothese nicht verworfen würde. Zum Beispiel

>>> rvs.sort()
>>> q, p, alpha = 0.6, 0.75, 0.95
>>> res = stats.quantile_test(rvs, q=q, p=p, alternative='less')
>>> ci = res.confidence_interval(confidence_level=alpha)
>>> for x in rvs[rvs <= ci.high]:
...     res = stats.quantile_test(rvs, q=x, p=p, alternative='less')
...     assert res.pvalue > 1-alpha
>>> for x in rvs[rvs > ci.high]:
...     res = stats.quantile_test(rvs, q=x, p=p, alternative='less')
...     assert res.pvalue < 1-alpha

Auch wenn ein 95%-Konfidenzintervall wiederholt für Zufallsstichproben generiert wird, wird das Konfidenzintervall den wahren Quantilwert in ungefähr 95% der Wiederholungen enthalten.

>>> dist = stats.rayleigh() # our "unknown" distribution
>>> p = 0.2
>>> true_stat = dist.ppf(p) # the true value of the statistic
>>> n_trials = 1000
>>> quantile_ci_contains_true_stat = 0
>>> for i in range(n_trials):
...     data = dist.rvs(size=100, random_state=rng)
...     res = stats.quantile_test(data, p=p)
...     ci = res.confidence_interval(0.95)
...     if ci[0] < true_stat < ci[1]:
...         quantile_ci_contains_true_stat += 1
>>> quantile_ci_contains_true_stat >= 950
True

Dies funktioniert mit jeder Verteilung und jedem Quantil, solange die Stichproben i.i.d. sind.