J'ai écrit un article comme mémorandum d'apprentissage statistique. Cette fois, nous avons résumé la distribution t, la distribution du chi carré et la distribution F. Nous avons également résumé l'estimation de l'intervalle de confiance pertinent et le test F.
Il s'agit d'une distribution de probabilité de type continu qui est utilisée à la place de la distribution normale standard lors de l'estimation / test de la moyenne de la population, etc. à partir d'un petit échantillon avec une variance de population inconnue. Avant d'expliquer la distribution t, examinons d'abord la valeur z pour la moyenne de l'échantillon $ \ bar x $.
z suit une distribution normale standard, mais ne peut être calculé sans connaître la variance de la population $ \ sigma ^ 2 $. Il y a peu de cas où la dispersion de la population est claire de façon réaliste. Par conséquent, cette distribution de population $ \ sigma ^ 2 $ est remplacée par la distribution non biaisée $ {\ hat {\ sigma}} ^ 2 $. Une variance sans biais est une statistique ajustée en multipliant $ \ frac {n} {n-1} $ de sorte que la valeur attendue de la variance de l'échantillon $ s ^ 2 $ corresponde à la variance de la population. Multipliez par $ \ frac {n} {n-1} $ car si n n'est pas assez grand, la variance attendue de l'échantillon sera inférieure à la variance de la population.
C'est la valeur t. Certains sites, etc., ne remplacent pas par une distribution non biaisée, mais par une distribution d'échantillons (voir la formule ci-dessous).
À propos, $ \ frac {s} {\ sqrt {n}} $ est appelé l'erreur standard de la moyenne de l'échantillon. Et cette valeur t suit la fonction de densité de probabilité suivante.
$ \ nu $ est le degré de liberté ($ n $ -1). $ \ Gamma (\ bullet) $ est une fonction gamma, qui représente la puissance d'un nombre complexe. La forme de la distribution t change en fonction de $ \ nu $.
Voyons maintenant la distribution.
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()
Vous pouvez voir que la forme de la distribution change en fonction du degré de liberté. Et nous pouvons voir que plus la taille de l'échantillon est grande, plus la distribution normale standard est proche.
Utilisons cette distribution pour estimer l'intervalle de confiance dans lequel nous nous attendons à ce que la moyenne de population $ \ mu $ se trouve.
Supposons que vous obteniez les données suivantes.
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"Moyenne de l'échantillon:{np.mean(data)}")
# >>>Moyenne de l'échantillon:0.24677314572037296
print(f"Dispersion des échantillons:{np.var(data)}")
# >>>Dispersion des échantillons:0.9702146524752354
print(f"Écart type d'échantillon:{np.sqrt(np.var(data))}")
# >>>Écart type d'échantillon:0.9849947474353533
Ces données sont générées sur la base d'une distribution normale standard, donc la vraie moyenne $ \ mu $ est de 0. L'estimation de l'intervalle de confiance avec 9 et 95% de degrés de liberté peut être obtenue en modifiant la formule comme suit.
Puisque les données sont aussi petites que 10 cette fois, je les ai calculées en utilisant le type de substitution de dispersion sans biais. De plus, le nombre 2,262 est tiré de la table de distribution t à l'intersection avec 9 degrés de liberté et 2,5%. Par conséquent, il y a 95% de chances que la moyenne de l'échantillon ci-dessus ait une moyenne de population.
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
Avec la bibliothèque
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
On peut estimer que
La distribution du chi carré est ** qui peut gérer plusieurs variables à la fois, comme la distribution de la variance de l'échantillon.
Tout d'abord, la définition de la valeur du chi carré est indiquée ci-dessous.
Le subordonné $ n $ de $ \ chi ^ 2 $ représente le degré de liberté et est basé sur la moyenne de la population, donc $ degré de liberté = n $. Plus le degré de liberté est élevé, plus la valeur du chi carré est élevée.
Et la fonction de densité de probabilité de la distribution du chi carré est la suivante.
La répartition est la suivante.
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()
La formule ci-dessus était la moyenne de la population $ \ mu $, alors remplaçons-la par la moyenne de l'échantillon $ \ bar x $.
Le degré de liberté est n-1. Ici, s'il est exprimé en utilisant une distribution non biaisée $ \ hat \ sigma ^ 2 $,
Et nous pouvons voir que la valeur $ \ chi ^ 2 $ est proportionnelle à la variance sans biais. Ainsi, lorsque nous résolvons la variance de la population,
Par conséquent, l'intervalle de confiance de la variance de la population peut être estimé.
Les données utilisées pour la distribution t sont utilisées.
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"Moyenne de l'échantillon:{np.mean(data)}")
# >>>Moyenne de l'échantillon:0.24677314572037296
print(f"Dispersion des échantillons:{np.var(data)}")
# >>>Dispersion des échantillons:0.9702146524752354
print(f"Écart type d'échantillon:{np.sqrt(np.var(data))}")
# >>>Écart type d'échantillon:0.9849947474353533
Lorsque le degré de liberté est de 9, l'intervalle de confiance peut être calculé comme suit.
Donc,
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
Une dispersion non biaisée est obtenue en définissant «ddof = 1» sur «np.var (data, ddof = 1))». Vous pouvez utiliser la bibliothèque pour obtenir les valeurs dans la table de distribution du chi carré.
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
La distribution F est un ** suivi de statistiques basées sur deux échantillons choisis au hasard parmi deux populations **. Cette propriété est utilisée pour tester si les variances des deux populations dont elles sont extraites sont les mêmes. Maintenant, en ce qui concerne la valeur F, la valeur F est ** le rapport de deux valeurs $ \ chi ^ 2 $ choisies au hasard parmi deux populations qui suivent une distribution normale **. Il est important qu'il suive une distribution normale.
De plus, la fonction de densité de probabilité est la suivante.
La répartition est la suivante.
Le test F teste qu'il existe une différence dans les variances des deux groupes. Si les distributions de population ($ \ sigma ^ 2_1, \ sigma ^ 2_2 $) des deux groupes sont identiques, la valeur F sera la suivante.
Puisque nous échantillonnons à partir de la même variance de population, il devrait s'approcher de 1 s'il n'y a pas de différence de variance. Inversement, si la valeur F est supérieure à 1 (généralement celle avec la plus grande dispersion est la molécule), la dispersion de la population est susceptible d'être différente.
Je vais vraiment le tester. Quant aux données, essayez de générer les données suivantes.
#Échantillon de 10 hommes japonais
np.random.seed(1)
Japan = np.round([np.random.normal(64, 9, 10)],1).reshape(10)
jp_var = np.var(Japan, ddof=1)
#Échantillon de 10 hommes américains
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'Dispersion impartiale du japonais:{jp_var}')
# >>>Dispersion d'échantillons japonais:127.71955555555557
print(f'Dispersion impartiale des Américains:{us_var}')
# >>>Dispersion d'échantillons américains:226.57377777777785
print(f'Valeur F:{us_var/jp_var}')
# >>>Valeur F:1.7739944113665709
Le test F est Hypothèse nulle: les variances des deux groupes sont égales Hypothèse d'opposition: il y a une différence dans la dispersion des deux groupes ça ira. Dans la distribution F avec le degré de liberté (9,9), si la zone jaune du graphique ci-dessous correspond à la valeur p et que la valeur p est inférieure ou égale à 0,05, l'hypothèse nulle est rejetée.
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()
Puisque la valeur p est 0,203 ..., qui est supérieure à 0,05 et que l'hypothèse nulle ne peut être rejetée, il semble qu'il n'y ait pas de différence dans la variance des deux groupes.
Recommended Posts