Ich habe einen Artikel als Memorandum über statistisches Lernen geschrieben. Dieses Mal haben wir die t-Verteilung, die Chi-Quadrat-Verteilung und die F-Verteilung zusammengefasst. Wir haben auch die Schätzung des relevanten Konfidenzintervalls und den F-Test zusammengefasst.
Dies ist eine kontinuierliche Wahrscheinlichkeitsverteilung, die anstelle der Standardnormalverteilung verwendet wird, wenn der Populationsmittelwert usw. aus einer kleinen Stichprobe mit einer unbekannten Populationsvarianz geschätzt / getestet wird. Bevor wir die t-Verteilung erläutern, betrachten wir zunächst den z-Wert für den Stichprobenmittelwert $ \ bar x $.
z folgt einer Standardnormalverteilung, kann jedoch nicht berechnet werden, ohne die Populationsvarianz $ \ sigma ^ 2 $ zu kennen. Es gibt nur wenige Fälle, in denen die Bevölkerungsverteilung realistisch klar ist. Daher wird diese Bevölkerungsverteilung $ \ sigma ^ 2 $ durch die unvoreingenommene Verteilung $ {\ hat {\ sigma}} ^ 2 $ ersetzt. Eine unverzerrte Varianz ist eine Statistik, die durch Multiplikation von $ \ frac {n} {n-1} $ angepasst wird, sodass der erwartete Wert der Stichprobenvarianz $ s ^ 2 $ mit der Populationsvarianz übereinstimmt. Multiplizieren Sie mit $ \ frac {n} {n-1} $, denn wenn n nicht groß genug ist, ist die erwartete Stichprobenvarianz geringer als die Populationsvarianz.
Dies ist der t-Wert. Einige Websites usw. werden nicht durch eine unvoreingenommene Verteilung ersetzt, sondern durch eine Stichprobenverteilung (siehe die folgende Formel).
Übrigens wird $ \ frac {s} {\ sqrt {n}} $ als Standardfehler des Stichprobenmittelwerts bezeichnet. Und dieser t-Wert folgt der folgenden Wahrscheinlichkeitsdichtefunktion.
$ \ nu $ ist der Freiheitsgrad ($ n $ -1). $ \ Gamma (\ bull) $ ist eine Gammafunktion, die die Potenz einer komplexen Zahl darstellt. Die Form der t-Verteilung ändert sich abhängig von $ \ nu $.
Nun sehen wir uns die Verteilung an.
from scipy import stats
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
x = np.linspace(-6, 6, 1000)
fig, ax = plt.subplots(1,1, figsize=(10,7))
linestyles = [':', '--', '-.', '-']
deg_of_freedom = [1, 5, 30]
for df, ls in zip(deg_of_freedom, linestyles):
ax.plot(x, stats.t.pdf(x, df), linestyle=ls, label=f'df={df}')
ax.plot(x, stats.norm.pdf(x, 0, 1), linestyle='-', label='Standard Normal Distribution')
plt.xlim(-6, 6)
plt.ylim(0, 0.4)
plt.title('t-distribution')
plt.legend()
plt.savefig('t-distribution.png')
plt.show()
Sie sehen, dass sich die Form der Verteilung je nach Freiheitsgrad ändert. Und wir können sehen, dass je größer die Stichprobe ist, desto näher an der Standardnormalverteilung liegt.
Verwenden wir diese Verteilung, um das Konfidenzintervall zu schätzen, in dem sich das Populationsmittel $ \ mu $ befindet.
Angenommen, Sie erhalten die folgenden Daten.
data = [np.random.randn() for _ in range(10)]
print(data)
# >>> [-0.14917153222917484, 0.7951720064790415, 0.662152983830839, 0.430521357874449, -2.48235088848113, 0.6166315938744059, 1.055076432212844, 0.7400193126962409, 0.90477126838906, -0.10509107744284621]
print(f"Stichprobenmittelwert:{np.mean(data)}")
# >>>Stichprobenmittelwert:0.24677314572037296
print(f"Probendispersion:{np.var(data)}")
# >>>Probendispersion:0.9702146524752354
print(f"Standardabweichung der Probe:{np.sqrt(np.var(data))}")
# >>>Standardabweichung der Probe:0.9849947474353533
Diese Daten werden basierend auf einer Standardnormalverteilung generiert, sodass der wahre Durchschnitt $ \ mu $ 0 ist. Die Schätzung des Konfidenzintervalls mit 9 und 95% Freiheitsgraden kann durch Modifizieren der Formel wie folgt erhalten werden.
Da die Daten diesmal nur 10 betragen, habe ich sie mit dem unverzerrten Dispersionssubstitutionstyp berechnet. Zusätzlich wird die Zahl 2.262 aus der t-Verteilungstabelle am Schnittpunkt mit 9 Freiheitsgraden und 2,5% entnommen. Daher besteht eine Wahrscheinlichkeit von 95%, dass die oben genannten Daten einen Bevölkerungsdurchschnitt haben.
bottom = np.mean(data) - 2.262*(np.sqrt(np.var(data))/(np.sqrt(len(data)-1)))
up = np.mean(data) + 2.262*(np.sqrt(np.var(data))/(np.sqrt(len(data)-1)))
print(f'{bottom} ≤ μ ≤ {up}')
# >>> -0.4959128938458835 ≤ μ ≤ 0.9894591852866295
Mit der Bibliothek
bottom, up = stats.t.interval(alpha=0.95, loc=np.mean(data), scale=np.sqrt(np.var(data)/(len(data)-1)), df=len(data)-1)
print(f'{bottom} ≤ μ ≤ {up}')
# >>> -0.49596449533733994 ≤ μ ≤ 0.9895107867780859
Es kann geschätzt werden, dass
Die Chi-Quadrat-Verteilung ist **, die mehrere Variablen gleichzeitig verarbeiten kann, z. B. die Verteilung der Stichprobenvarianz.
Zunächst wird die Definition des Chi-Quadrat-Werts unten gezeigt.
Der Index $ n $ von $ \ chi ^ 2 $ repräsentiert den Freiheitsgrad und basiert auf dem Bevölkerungsdurchschnitt, also $ Freiheitsgrad = n $. Je größer der Freiheitsgrad ist, desto größer ist der Chi-Quadrat-Wert.
Und die Wahrscheinlichkeitsdichtefunktion der Chi-Quadrat-Verteilung ist wie folgt.
Die Verteilung ist wie folgt.
from scipy import stats
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
x = np.linspace(0, 10, 1000)
fig,ax = plt.subplots(1,1, figsize=(10,7))
linestyles = [':', '--', '-.', '-']
deg_of_freedom = [1, 3, 5, 10]
for df, ls in zip(deg_of_freedom, linestyles):
ax.plot(x, stats.chi2.pdf(x, df), linestyle=ls, label=f'df={df}')
plt.xlim(0, 10)
plt.ylim(0, 1.0)
plt.title('chi 2 distribution')
plt.legend()
plt.savefig('chi2distribution.png')
plt.show()
Die obige Formel war der Bevölkerungsdurchschnitt $ \ mu $. Ersetzen wir ihn also durch den Stichprobenmittelwert $ \ bar x $.
Der Freiheitsgrad ist n-1. Wenn hier mit einer unvoreingenommenen Verteilung $ \ hat \ sigma ^ 2 $ ausgedrückt wird,
Und Sie können sehen, dass der Wert von $ \ chi ^ 2 $ proportional zur unverzerrten Varianz ist. Wenn wir also die Populationsvarianz lösen,
Daher kann das Konfidenzintervall der Populationsvarianz geschätzt werden.
Die für die t-Verteilung verwendeten Daten werden verwendet.
data = [np.random.randn() for _ in range(10)]
print(data)
# >>> [-0.14917153222917484, 0.7951720064790415, 0.662152983830839, 0.430521357874449, -2.48235088848113, 0.6166315938744059, 1.055076432212844, 0.7400193126962409, 0.90477126838906, -0.10509107744284621]
print(f"Stichprobenmittelwert:{np.mean(data)}")
# >>>Stichprobenmittelwert:0.24677314572037296
print(f"Probendispersion:{np.var(data)}")
# >>>Probendispersion:0.9702146524752354
print(f"Standardabweichung der Probe:{np.sqrt(np.var(data))}")
# >>>Standardabweichung der Probe:0.9849947474353533
Wenn der Freiheitsgrad 9 beträgt, kann das Konfidenzintervall wie folgt berechnet werden.
Deshalb,
bottom = ((len(data)-1)*np.var(data, ddof=1))/19.02
up = ((len(data)-1)*np.var(data, ddof=1))/2.7
print(f'{bottom} ≤ σ^2 ≤ {up}')
# >>> 0.5101023409438672 ≤ σ^2 ≤ 3.593387601760131
Eine unverzerrte Dispersion wird erhalten, indem "ddof = 1" von "np.var (Daten, ddof = 1))" gesetzt wird. Sie können die Bibliothek verwenden, um die Werte in der Chi-Quadrat-Verteilungstabelle abzurufen.
chi2_025, chi2_975 = stats.chi2.interval(alpha=0.95, df=len(data)-1)
bottom = ((len(data)-1)*np.var(data, ddof=1))/chi2_975
up = ((len(data)-1)*np.var(data, ddof=1))/chi2_025
print(f'{bottom} ≤ σ^2 ≤ {up}')
# >>> 0.5100281214306344 ≤ σ^2 ≤ 3.5928692971228506
Die F-Verteilung ist a **, gefolgt von Statistiken, die auf zwei Stichproben basieren, die zufällig aus zwei Populationen ** ausgewählt wurden. Diese Eigenschaft wird verwendet, um zu testen, ob die Varianzen der beiden Populationen, aus denen sie extrahiert werden, gleich sind. In Bezug auf den F-Wert ist der F-Wert ** das Verhältnis von zwei $ \ chi ^ 2 $ -Werten, die zufällig aus zwei Populationen ausgewählt wurden, die einer Normalverteilung folgen **. Es ist wichtig, dass es einer Normalverteilung folgt.
Zusätzlich ist die Wahrscheinlichkeitsdichtefunktion wie folgt.
Die Verteilung ist wie folgt.
Der F-Test testet, dass es einen Unterschied in den Varianzen der beiden Gruppen gibt. Wenn die Bevölkerungsverteilungen ($ \ sigma ^ 2_1, \ sigma ^ 2_2 $) der beiden Gruppen gleich sind, ist der F-Wert wie folgt.
Da die Stichproben aus derselben Populationsvarianz stammen, sollte sie sich 1 nähern, wenn kein Unterschied in der Varianz besteht. Wenn umgekehrt der F-Wert größer als 1 ist (normalerweise ist derjenige mit der größeren Dispersion das Molekül), ist die Populationsdispersion wahrscheinlich unterschiedlich.
Ich werde es tatsächlich testen. Versuchen Sie, für die Daten die folgenden Daten zu generieren.
#Stichprobe von 10 japanischen Männern
np.random.seed(1)
Japan = np.round([np.random.normal(64, 9, 10)],1).reshape(10)
jp_var = np.var(Japan, ddof=1)
#Probe 10 amerikanische Männer
np.random.seed(1)
US = np.round([np.random.normal(87, 12, 10)],1).reshape(10)
us_var = np.var(US, ddof=1)
print(f'Unvoreingenommene Verbreitung von Japanisch:{jp_var}')
# >>>Japanische Probendispersion:127.71955555555557
print(f'Unvoreingenommene Zerstreuung der Amerikaner:{us_var}')
# >>>Amerikanische Probendispersion:226.57377777777785
print(f'F-Wert:{us_var/jp_var}')
# >>>F-Wert:1.7739944113665709
F Test ist Nullhypothese: Die Varianzen der beiden Gruppen sind gleich Oppositionshypothese: Es gibt einen Unterschied in der Streuung der beiden Gruppen Wird besorgt. Wenn in der F-Verteilung mit dem Freiheitsgrad (9,9) der gelbe Bereich in der folgenden Grafik dem p-Wert entspricht und der p-Wert 0,05 oder weniger beträgt, wird die Nullhypothese verworfen.
from scipy import stats
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
x = np.linspace(0.000001, 8, 1000)
fig,ax = plt.subplots(1,1, figsize=(10,7))
df = (9,9)
ls = '-'
y = stats.f.pdf(x, df[0], df[1])
ax.plot(x, y, linestyle=ls, label=f'k = {df[0]}, {df[1]}')
plt.xlim(0, 8)
plt.ylim(0, 1.0)
plt.fill_between(x, y, 0, where=x>=us_var/jp_var, facecolor='y',alpha=0.5)
plt.title('F distribution')
plt.legend()
plt.savefig('fdistribution_p.png')
print(f'p-value:{stats.f.sf(us_var/jp_var, len(Japan)-1, len(US)-1)}')
# >>> p-value:0.20301975133837194
plt.show()
Da der p-Wert 0,203 ... ist, was größer als 0,05 ist und die Nullhypothese nicht zurückgewiesen werden kann, scheint es keinen Unterschied in der Varianz der beiden Gruppen zu geben.