[PYTHON] Introduction aux tests d'hypothèses statistiques avec des modèles de statistiques

Avez-vous déjà pensé maîtriser un test statistique et ne savez pas quoi faire si vous décidez de l'utiliser? Les tests statistiques présentent des obstacles plus élevés que vous ne le pensez. C'est en fait la même chose pour ceux qui utilisent toujours les statistiques. Si vous ne l'utilisez pas pendant un certain temps, vous ne le saurez pas immédiatement.

Donc Basic Econometrics by Damodar N. Gujarati J'ai décidé de traduire une partie de. Nous sommes impatients de vous aider. De plus, nous organiserons une session d'étude en ligne gratuite (régression linéaire) le 16 juin 2020 (https://connpass.com/event/177556/edit/). J'espère que vous nous rejoindrez.

Raisonnement statistique: test d'hypothèse

Les estimations et les tests d'hypothèse constituent deux piliers du raisonnement statistique classique. Après avoir examiné le problème d'estimation, examinez brièvement le problème de test d'hypothèse statistique.

Le problème du test d'hypothèse est exprimé comme suit. Supposons que vous ayez un X avec une fonction de densité de probabilité connue f (x; θ). Où θ est un paramètre de distribution. Obtenez $ \ hat {\ theta} $ par estimation ponctuelle à partir d'un échantillon obtenu au hasard avec une taille d'échantillon de n. Le problème se pose parce que le vrai θ est rarement connu. L'estimation $ \ hat {\ theta} $ est "compatible" avec certaines valeurs hypothétiques de θ, telles que θ = θ $ ^ \ * $. Par exemple. $ Θ ^ \ * $ est-il un nombre spécifique pour θ? En d'autres termes, l'échantillon peut-il être obtenu à partir de la fonction de densité de probabilité f (x; θ) = $ θ ^ \ * $?

Dans le langage de test d'hypothèse, $ θ = \ theta ^ \ * $ est appelé l'hypothèse nulle et est généralement représenté par H0. L'hypothèse nulle est testée par rapport à l'hypothèse alternative représentée par H1. Par exemple, cela pourrait être θ $ \ ne θ ^ \ * $. L'hypothèse nulle et l'hypothèse alternative sont soit des hypothèses simples, soit des hypothèses composées. Lorsque vous spécifiez les valeurs des paramètres de la distribution, cela s'appelle une hypothèse simple. Sinon, cela s'appelle une hypothèse composée. Par conséquent, c'est X à N (µ, $ \ sigma ^ 2 $). H0: µ = 15 et σ = 2 Si tel est le cas, c'est une hypothèse simple. D'autre part H0: µ = 15 et σ> 2 Est une hypothèse composée car aucune valeur pour σ n'est spécifiée.

Pour tester l'hypothèse nulle, c'est-à-dire pour tester sa validité, nous utilisons les informations de l'échantillon pour obtenir ce que l'on appelle une statistique de test. Souvent, cette statistique de test est une estimation ponctuelle d'un paramètre inconnu. Ensuite, trouvez un échantillonnage ou une distribution de probabilité des statistiques de test et testez l'hypothèse nulle en utilisant un intervalle de confiance ou un test de différence significative. Ensuite, j'expliquerai la procédure.

Pour comprendre cette idée, revenons à l'exemple 23 de la taille masculine (X) dans la population. Xi〜N(µ、\sigma^2)= N(µ、2.5$^2$) \bar{X}= 67 n = 100 ça ira. H0:µ = µ* = 69 H1:µ \ne 69 Assumons. Le problème est: L'échantillon de la statistique de test $ \ bar {X} $ = 67 peut-il provenir d'une population avec une moyenne de 69? Intuitivement, si $ \ bar {X} $ est "assez proche" de µ *, il ne rejette pas l'hypothèse nulle, sinon il supporte l'hypothèse alternative et rejette l'hypothèse nulle. .. Mais comment déterminer que $ \ bar {X} $ est "assez proche" de µ *? Il existe deux méthodes: (1) intervalle de confiance (2) test de signification. Nous tirons les mêmes conclusions pour les deux questions.

Méthode par intervalle de confiance

Puisque $ X_i \ sim N (\ mu, \ sigma ^ 2 $), la statistique de test $ \ bar {X} $ est $ \ bar {X} $ ~ N (µ, $ \ sigma ^ 2 $ / n) Il est distribué comme ça.

Puisque la distribution de probabilité de $ \ bar {X} $ est connue, par exemple, établissez un intervalle de confiance de 100 (1 - α) de µ basé sur $ \ bar {X} $, et µ = µ dans cet intervalle de confiance. Vous voulez voir s'il contient *?

Si tel est le cas, l'hypothèse nulle ne peut être rejetée. Si ce n'est pas le cas, nous pouvons rejeter l'hypothèse nulle.

Par conséquent, si α = 0,05, il existe un intervalle de confiance à 95%, et si cet intervalle de confiance contient µ *, l'hypothèse nulle peut ne pas être rejetée. Autrement dit, 95 des 100 intervalles établis peuvent contenir µ *.

La méthode actuelle est la suivante. $ \ bar {X} $ ~ N (µ, $ \ sigma $ / n) image.png

Autrement dit, il s'agit d'une variable normale standard.

Ensuite, dans ce cas, puisqu'il s'agit d'un test bilatéral, la valeur z est calculée à partir de la fonction norm.ppf avec 0,05 / 2 = 0,025.

from scipy.stats import norm
norm.ppf(0.975) #Percent point function (inverse of cdf — percentiles).

1.959963984540054

Pr(-1.96≤Z_i≤1.96)= 0.95 Obtenir En d'autres termes Pr(−1.96≤\bar{X}− µσ /√n≤1.96)= 0.95 Si vous le reconstruisez, Pr(\bar{X}− 1.96σ√n≤µ≤\bar{X}+ 1.96σ√n)= 0.95

Il s'agit de l'intervalle de confiance à 95% pour µ. Une fois cet intervalle établi, le test d'hypothèse nulle devient plus facile. Tout ce que nous avons à faire est de vérifier si µ = µ * est dans cet intervalle. Si tel est le cas, l'hypothèse nulle ne peut être rejetée. Sinon, il peut être rejeté.

En regardant cet exemple, un intervalle de confiance de 95% pour µ a déjà été établi. C'est 66,51 ≤ µ ≤ 67,49. Cet intervalle n'inclut clairement pas µ = 69. Par conséquent, il rejette l'hypothèse nulle que vrai µ est 69 avec un facteur de confiance de 95%. Géométriquement, la situation est illustrée à la Figure A.12. En termes de test hypothétique, la région de l'intervalle de confiance établi est appelée zone d'acceptation, et la région en dehors de la zone d'adoption est appelée zone de risque d'hypothèse nulle ou zone de rejet. Les limites inférieure et supérieure de la zone d'acceptation (qui se distingue de la zone de rejet) sont appelées valeurs critiques. Dans ce terme de test d'hypothèse, l'hypothèse nulle ne peut pas être rejetée si la valeur de l'hypothèse est dans la plage adoptée. Sinon, vous pouvez le rejeter.

Deux types d'erreurs peuvent survenir lors de la décision de rejeter H0: (1) Même s'il est en fait H0, H0 peut être rejeté. C'est ce qu'on appelle une erreur de première classe. (Par conséquent, dans l'exemple ci-dessus, $ \ bar {X} $ = 67 peut appartenir à une population avec une moyenne de 69), ou (2) Même si H0 est en fait faux, il ne peut pas être rejeté. C'est ce qu'on appelle un deuxième type d'erreur. Par conséquent, le test d'hypothèse ne détermine pas la vraie valeur de µ. Il fournit uniquement un moyen de déterminer si µ = µ *.

image.png

Idéalement, vous voulez minimiser les erreurs de type 1 et de type 2. Malheureusement, changer la taille de l'échantillon ne minimise pas les deux erreurs en même temps. L'approche classique de ce problème est incarnée dans les travaux de Neyman et Pearson, où les erreurs de première classe sont en fait plus graves que les erreurs de seconde classe.

Par conséquent, essayez de maintenir la probabilité d'erreurs de première classe à des niveaux assez bas tels que 0,01 et 0,05. Deuxièmement, cela minimise la possibilité d'erreurs de seconde classe. Dans la littérature, la probabilité d'erreur de type 1 s'écrit α, qui s'appelle le niveau de signification, et la probabilité d'erreur de type 2 s'écrit β. La probabilité que le deuxième type d'erreur ne se produise pas est appelée puissance de détection. En d'autres termes, la détection est la capacité de rejeter les fausses hypothèses nulles. La méthode classique de test d'hypothèse consiste à fixer α à un niveau tel que 0,01 (ou 1%) ou 0,05 (5%), puis à maximiser la détection. Autrement dit, il minimise β. Il est important que le lecteur comprenne le concept de détection. Ceci sera expliqué à l'aide d'un exemple.

Soit X à N (µ, 100). Autrement dit, X est une distribution normale avec une moyenne µ et une variance de 100. Supposons α = 0,05. Supposons que vous ayez 25 échantillons observés, dont $ \ bar {X} $ donne la moyenne de l'échantillon. Supposons en outre H0: µ = 50. Puisque X suit une distribution normale, la moyenne de l'échantillon suit également une distribution normale de $ \ bar {X} $ à N (µ, 100/25). Par conséquent, sous l'hypothèse nulle que µ = 50, l'intervalle de confiance à 95% pour $ \ bar {X} $ est (µ ± 1,96 (100/25) = µ ± 3,92, ou (46,08 à 53,92). Par conséquent, la zone de rejet comprend toutes les valeurs X inférieures à 46,08 ou supérieures ou égales à 53,92, ce qui signifie que si la moyenne de l'échantillon est inférieure à 46,08 ou supérieure à 53,92, l'hypothèse nulle que la moyenne réelle est de 50 est rejetée. ..

Mais si la vraie valeur µ est différente de 50, quelle est la probabilité que $ \ bar {X} $ se trouve dans la zone de rejet indiquée précédemment? Supposons qu'il existe trois hypothèses alternatives: µ = 48, µ = 52 et µ = 56. Si l'un de ces choix est vrai, ce sera la moyenne réelle de la distribution de $ \ bar {X} $. Puisque $ \ sigma ^ 2 $ est supposé être 100, l'erreur standard des trois alternatives reste la même.

La zone grisée de la Figure A.13 montre la probabilité que $ \ bar {X} $ tombe dans la zone de rejet si chacune des hypothèses alternatives est vraie. Comme vous pouvez le voir, ces probabilités sont de 0,17 (pour µ = 48), 0,05 (pour µ = 50), 0,17 (pour µ = 52) et 0,85 (pour µ = 56). Comme vous pouvez le voir sur cette figure, chaque fois que la valeur vraie de µ est significativement différente de l'hypothèse considérée (ici µ = 50), il y a une forte probabilité de rejeter l'hypothèse, mais la vraie valeur est l'hypothèse nulle. Si elle n'est pas très différente de la valeur donnée ci-dessous, la probabilité de rejet est faible. Intuitivement, cela a du sens lorsque l'hypothèse nulle et l'hypothèse alternative se chevauchent très étroitement.

image.png

print(norm.cdf((46.1-48)/np.sqrt(100/25)))
print(norm.cdf((46.1-50)/np.sqrt(100/25))+1-norm.cdf((53.9-50)/np.sqrt(100/25)))
print(1-norm.cdf((53.9-52)/np.sqrt(100/25)))
print(1-norm.cdf((53.9-56)/np.sqrt(100/25)))
0.171056126308482
0.051176119043277346
0.171056126308482
0.8531409436241042

Cela peut être mieux compris en regardant la Figure A.14. C'est ce qu'on appelle le graphique de la fonction de force de détection, et la courbe qui y est représentée est appelée courbe de force de détection. Le lecteur remarquera maintenant que le facteur de confiance (1 - α) mentionné ci-dessus est simplement 1 moins la probabilité d'une erreur de première classe. Par conséquent, un facteur de confiance de 95% signifie que vous êtes prêt à accepter un maximum de 5% de chance d'une erreur de première classe. C'est à ce moment que vous ne voulez pas rejeter l'hypothèse vraie plus de 5 fois sur 100. image.png

%matplotlib inline
import matplotlib.pyplot as plt
xxx=range(40,61,1)
x=[]
for xx in xxx:
    x.append(norm.cdf((46.1-xx)/np.sqrt(100/25))+1-norm.cdf((53.9-xx)/np.sqrt(100/25)))
plt.plot(xxx,x)

image.png valeur p ou niveau de signification exact

Au lieu de présélectionner α à n'importe quel niveau, tel que 1, 5 ou 10%, calculez le niveau de signification exact de la valeur p (probabilité) ou de la statistique de test. La valeur p est définie comme le niveau de signification le plus bas pouvant rejeter l'hypothèse nulle.

Supposons que vous souhaitiez obtenir une valeur t de 3,552 lorsque vous avez 20 degrés de liberté. Ici, la probabilité exacte d'obtenir une valeur p, ou une valeur t supérieure ou égale à 3,552, peut être considérée comme 0,001 (un côté) ou 0,002 (des deux côtés) à partir du Tableau D.2. La valeur t observée de 3,552 est statistiquement significative au niveau de 0,001 ou 0,002, selon que vous utilisez un test unilatéral ou bilatéral. Certains progiciels statistiques génèrent la valeur p comme statistique de test. Par conséquent, il est recommandé que le lecteur présente la valeur p chaque fois que possible.

Méthode de test de signification

Z_i = \frac{\bar{X}- \mu}{\sigma \sqrt{n}} \sim N(0,1)

Souviens-toi de ça. $ \ bar {X} $ et n adressent (ou peuvent être estimés) un problème connu, mais les réels µ et σ sont inconnus. Cependant, en supposant que σ est spécifié et µ = µ * (sous H0), $ Z_i $ peut être calculé directement, et un rapide coup d'œil à la table de distribution normale montre la valeur Z calculée. Vous obtenez la probabilité d'obtenir. Si cette probabilité est faible, par exemple inférieure à 5% ou 1%, vous pouvez rejeter l'hypothèse nulle. Si l'hypothèse est vraie, il est très probable que vous obteniez une valeur Z particulière. C'est l'idée générale qui sous-tend la méthode de test des différences significatives pour le test d'hypothèse. Une idée importante ici est la statistique de test (ici la statistique Z) et la distribution de probabilité sous la valeur supposée µ = µ $ ^ \ * $. De manière appropriée, ce test est appelé test Z car il utilise la valeur Z (standard normalisé) dans ce cas.

image.png

En regardant la table de distribution normale D.1, nous pouvons voir que la probabilité d'obtenir une telle valeur Z est très faible. (Remarque: la probabilité d'une valeur Z supérieure à 3 ou -3 est d'environ 0,001, donc la probabilité d'un Z supérieur à 8 est encore plus petite.) Par conséquent, l'hypothèse nulle de µ = 69 peut être rejetée. Compte tenu de cette valeur, il est très peu probable que $ \ bar {X} $ soit 67. Par conséquent, il est douteux que l'échantillon provienne d'une population d'une valeur moyenne de 69. La situation est illustrée à la Figure A.15.

image.png

L'important est que vous puissiez généralement rejeter l'hypothèse nulle. Et la statistique de test est considérée comme significative si la probabilité de l'obtenir est inférieure ou égale à la probabilité de faire une erreur de première classe α. Par conséquent, pour α = 0,05, nous pouvons voir que la probabilité d'obtenir une valeur Z de -1,96 ou 1,96 est de 5% (ou 2,5% pour chaque queue de la distribution normale standardisée). Dans cet exemple, Z était -8. Par conséquent, la probabilité d'obtenir une telle valeur Z est bien inférieure à 2,5%, bien en dessous de la probabilité prédéfinie de faire une erreur de première classe. Par conséquent, la valeur calculée de Z = -8 est statistiquement significative. Autrement dit, il rejette l'hypothèse nulle selon laquelle vrai µ * est égal à 69. Bien entendu, la même conclusion a été obtenue en utilisant l'intervalle de confiance dans le test d'hypothèse.

Voici un résumé des étapes du test d'hypothèse statistique.

Étape 1. Déterminez l'hypothèse nulle H0 et l'hypothèse alternative H1 (par exemple, H0: µ = 69 et H1: µ $ \ ne $ 69). Étape 2. Sélectionnez une statistique de test (par exemple, $ \ bar {X} $). Étape 3. Déterminez la distribution de probabilité des statistiques de test (par exemple, $ \ bar {X} $ ~ N (µ, $ \ sigma ^ 2 $ / n). Étape 4. Sélectionnez le niveau d'importance (c'est-à-dire la probabilité d'une erreur de première classe) α. Étape 5. Utilisez la distribution de probabilité des statistiques de test pour trouver l'intervalle de confiance de 100 (1 - α)%. Si la valeur du paramètre sous l'hypothèse nulle (par exemple, µ = µ * = 69) est dans cet intervalle de confiance (plage adoptée), alors l'hypothèse nulle n'est pas rejetée. Cependant, si vous êtes en dehors de cet intervalle (c'est-à-dire dans la zone de rejet), vous pouvez rejeter l'hypothèse nulle. Notez que si vous ne rejetez pas l'hypothèse nulle, il y a α% de chances que votre décision soit erronée.

C'est la fin de la simple traduction de l'économétrie de base.

A propos du rejet de l'hypothèse nulle

Cela signifie que l'hypothèse nulle est rejetée

Dans le test d'hypothèse, soit l'hypothèse nulle, soit l'hypothèse alternative est choisie comme un jugement statistique basé sur l'échantillon. Si l'hypothèse alternative est sélectionnée, la probabilité que cette sélection soit incorrecte est garantie inférieure ou égale à $ \ alpha $. En d'autres termes, l'hypothèse alternative tient fermement.

Cela signifie que l'hypothèse nulle n'est pas rejetée

Il n'y a aucune raison de soutenir activement l'hypothèse nulle selon laquelle elle ne sera pas rejetée. Il n'y avait simplement pas de raison suffisante pour rejeter l'hypothèse nulle.

Erreur de première classe

Le premier type d'erreur est une erreur qui est rejetée lorsque l'hypothèse nulle est correcte. Cette probabilité est appelée $ \ alpha $.

Deuxième type d'erreur

C'est une erreur qui n'est pas rejetée lorsque l'hypothèse nulle est incorrecte. C'est une erreur qui ne rejette pas l'hypothèse nulle lorsque l'hypothèse alternative est correcte. Écrivez cette probabilité sous la forme $ \ beta $. Lorsque l'hypothèse alternative est correcte, la probabilité d'être correcte est $ 1- \ beta $.

Niveau de signification

Idéalement, les erreurs de première et de deuxième classe sont petites à la fois. Cependant, ces deux sont dans une relation de compromis. Par conséquent, en général, nous essayons de réduire l'erreur de type 2 tout en maintenant l'erreur de type 1 en dessous d'un certain niveau de $ \ alpha $. Ce $ \ alpha $ est appelé le niveau de signification et correspond à la probabilité d'une erreur de première classe.

H_0Est correct(H_1Est faux) H_1Est correct(H_0Est faux)
H_0Rejet Erreur de première classe(\alpha) Jugement correct(1-\beta)
H_0Adopté Jugement correct(1-\alpha) Deuxième type d'erreur(\beta)

Puissance de détection

Considérez maintenant une tentative de jeter de l'argent 20 fois. La devise est-elle déformée lorsque le tableau apparaît 15 fois?

L'hypothèse nulle est que cette monnaie n'est pas déformée.

Hypothèse nulle $ H_0 $: $ p = 0,5 $ Hypothèse d'opposition $ H_1 $: $ p \ ne 0,5 $

Alors, tout d'abord, supposons que cette devise n'est pas déformée, et trouvons la probabilité que le tableau apparaisse 15 fois sur 20. $ p[X=k]=\frac{n!}{k!(n-k)!}p^k (1-p)^{(1-k)}=\frac{20!}{15!(20-15)!}0.5^{15}0.5^5 =0.015 $ Il s'agit de la probabilité que le tableau apparaisse 15 fois même s'il n'y a pas de distorsion.

from math import factorial
a=factorial(20)/factorial(15)/factorial(20-15)
b=a*0.5**15*0.5**5
print(a,b)

15504.0 0.0147857666015625

De même, si vous obtenez 15 fois, vous devriez obtenir 16, 17, 18, 19 et 20 fois. $ p[X=k]=\frac{20!}{16!(20-16)!}0.5^{16}0.5^4 =0.005 $ $ p[X=k]=\frac{20!}{17!(20-17)!}0.5^{17}0.5^3 =0.001 $ $ p[X=k]=\frac{20!}{18!(20-18)!}0.5^{18}0.5^2 =0.0001 $ Omis ci-dessous

p=0.5
sump=0
for i in range(6):
    a=factorial(20)/factorial(20-i)/factorial(i)
    b=a*p**(20-i)*(1-p)**i
    sump+=b
    print(i,a,b)
print("total",sump)

0 1.0 9.5367431640625e-07
1 20.0 1.9073486328125e-05
2 190.0 0.0001811981201171875
3 1140.0 0.001087188720703125
4 4845.0 0.004620552062988281
5 15504.0 0.0147857666015625
total 0.020694732666015625

La somme des probabilités d'apparaître plus de 15 fois est désormais de 2%.

Mais cela ne suffit pas. Si le tableau apparaît 15 fois, il peut n'apparaître que 5 fois.

p=0.5
sump=0
for i in range(15,21):
    a=factorial(20)/factorial(20-i)/factorial(i)
    b=a*p**(20-i)*(1-p)**i
    sump+=b
    print(i,a,b)
print("total",sump)

15 15504.0 0.0147857666015625
16 4845.0 0.004620552062988281
17 1140.0 0.001087188720703125
18 190.0 0.0001811981201171875
19 20.0 1.9073486328125e-05
20 1.0 9.5367431640625e-07
total 0.020694732666015625

Par conséquent, le total est de 4%.

Avec un niveau de signification de 5%, cela ne suffit pas pour écarter l'hypothèse nulle selon laquelle l'argent n'est pas faussé. Pour comprendre cela Ensuite, supposons que la probabilité d'apparaître dans le tableau soit de 0,6. $ p[X=k]=\frac{n!}{k!(n-k)!}p^k (1-p)^{(1-k)}=\frac{20!}{15!(20-15)!}0.6^{15}0.4^5 =0.075 $ $ p[X=k]=\frac{20!}{16!(20-16)!}0.6^{16}0.4^4 =0.035 $ $ p[X=k]=\frac{20!}{17!(20-17)!}0.6^{17}0.4^3 =0.012 $ $ p[X=k]=\frac{20!}{18!(20-18)!}0.6^{18}0.4^2 =0.0003 $

Ensuite, la probabilité d'apparaître en 15e manche est de 12,5%. Calculons également l'autre.

p=0.6
sump=0
for i in range(6):
    a=factorial(20)/factorial(20-i)/factorial(i)
    b=a*p**(20-i)*(1-p)**i
    sump+=b
    print(i,a,b)
print("total",sump)
print()
for i in range(15,21):
    a=factorial(20)/factorial(20-i)/factorial(i)
    b=a*p**(20-i)*(1-p)**i
    sump+=b
    print(i,a,b)
print("two tails total",sump)

0 1.0 3.6561584400629733e-05
1 20.0 0.00048748779200839646
2 190.0 0.003087422682719845
3 1140.0 0.01234969073087938
4 4845.0 0.03499079040415825
5 15504.0 0.07464701952887093
total 0.12559897272303744

15 15504.0 0.0012944935222876579
16 4845.0 0.00026968615047659537
17 1140.0 4.230370987868163e-05
18 190.0 4.700412208742404e-06
19 20.0 3.2985348833280036e-07
20 1.0 1.0995116277760013e-08
two tails total 0.12721049736649373

Ce sera. En d'autres termes, il y a 4% de chances qu'un événement tel que 0,1,2,3,4,5,15,16,17,18,19,20 fois dans le tableau se produise. Si vous faites la même chose avec $ p_0 = 0,6 $ et qu'il y a une distorsion, la probabilité est de 12,72%. Tracons les deux côte à côte pour une meilleure compréhension. Si la zone à droite de la ligne verticale bleue de la distribution est plus grande dans la distribution orange que dans la distribution bleue, alors la distribution orange est plus proche de la droite que la distribution bleue, ce qui signifie que les pièces sont susceptibles d'être déformées. Devenir.

%matplotlib inline
import matplotlib.pyplot as plt
p05=[]
p06=[]
ii=range(21)
for i in ii:
    a=factorial(20)/factorial(20-i)/factorial(i)
    p05.append(a*0.5**(20-i)*0.5**i)
    p06.append(a*0.4**(20-i)*0.6**i)
plt.plot(ii,p05,label='p=0.5',linestyle='--')
plt.plot(ii,p06,label='p=0.6')
plt.axvline(x=15)
plt.legend()

image.png

Faisons de même avec une distribution normale.

Hypothèse nulle

H_0: p_0=0.5

Ensuite, la zone de rejet est

|X-np_0|=|X-20 \cdot 0.5|=|X-10|>c

Donné dans. En supposant un niveau de signification de 5%

P(|X-n \cdot p_0|\ge c |p=p_0)=0.05

Ce sera.

Si $ X-n \ cdot p_0> 0 $, alors $ X-n \ cdot p_0> c $, soit $ c <X-n \ cdot p_0 $

Si $ X-n \ cdot p_0 <0 $, alors $ -X + n \ cdot p_0> c $, soit $ X-n \ cdot p_0 <-c $

Ce sera. C'est la zone de rejet.

Si l'hypothèse est correcte, $ X $ suit une distribution normale avec une moyenne de $ n \ cdot p_0 $ et une variance de $ n \ cdot p_0 (1-p_0) . Aussi $ z=\frac{X-p \cdot n}{\sqrt{p(1-p)n}}$$ Suit une distribution normale avec une moyenne de zéro et une variance de 1.

|X-n \cdot p_0|\ge 1.96 \sqrt{n \cdot p_0(1-p_0)}=1.96 \sqrt{20 \cdot 0.5 \cdot 0.5 }=4.4

Ce sera.

Si $ X-n \ cdot p_0> 0 $, alors $ X-n \ cdot p_0> 4,4 $, soit 4,4 $ <X-n \ cdot p_0 $

Si $ X-n \ cdot p_0 <0 $, alors $ -X + n \ cdot p_0> 4,4 $, soit $ X-n \ cdot p_0 <-4,4 $

Donc $ x <5,6 $ et $ 14,4 <X $ sont les zones de rejet.

Si $ p_0 = 0,6 , $ z=\frac{14.4-0.6 \cdot 20}{\sqrt{0.6\cdot0.4\cdot 20}}=1.095$$ $ z=\frac{5.6-0.6 \cdot 20}{\sqrt{0.6\cdot0.4\cdot 20}}=-2.92$ Il vous suffit de trouver la probabilité de.

a=(14.4-0.6*20)/np.sqrt(0.6*0.4*20)
b=(5.6-0.6*20)/np.sqrt(0.6*0.4*20)
print(a,b)
a=1-norm.cdf((14.4-0.6*20)/np.sqrt(0.6*0.4*20))
b=norm.cdf((5.6-0.6*20)/np.sqrt(0.6*0.4*20))
print(a,b,a+b)

1.0954451150103324 -2.921186973360886
0.13666083914614902 0.001743502446070691 0.1384043415922197

La probabilité est maintenant de 13,8%. Par conséquent, la probabilité que l'hypothèse nulle soit rejetée est de 13,8%, ce qui dépasse le niveau de signification de 5%.

Puissance de détection

En exprimant la probabilité de faire un deuxième type d'erreur dans $ \ beta $, la probabilité de déterminer que $ H_1 $ est correct est $ 1- \ beta $. Ce $ 1- \ beta $ est appelé puissance de détection. Ce qui est important ici, c'est que la probabilité d'accepter l'hypothèse nulle lorsqu'elle est correcte est de $ 1- \ alpha $, mais ce n'est pas la même chose que la probabilité de ne pas rejeter l'hypothèse nulle lorsque l'hypothèse alternative est correcte. Pour trouver $ \ beta $, vous devez spécifier $ \ theta_1 $, comme $ H_1: \ theta = \ theta_1 $.

Ensuite, $ H_0 $ doit être rejeté afin de déterminer qu'il est correct lorsque $ H_1 $ est correct. De plus, $ H_1 $ doit être spécifié comme une valeur spécifique au lieu de $ \ ne \ theta_0 $, et s'il s'agit de $ \ theta_1 $, le niveau de signification à ce moment-là sera $ \ beta $.

Dans l'exemple précédent, la puissance de détection est de 13,8%. Mais que faire si vous voulez une puissance de détection plus élevée?

Fonction de puissance de détection

Nombre estimé de données

Comme mentionné ci-dessus, avec 20 données, la puissance de détection n'augmente pas. Dans quelles conditions, par exemple, la puissance de détection peut-elle être augmentée à près de 90%?

En supposant que la probabilité que le recto et le verso de la devise apparaissent est la même, la zone de rejet au niveau de signification de 5% est celle lorsque le nombre de données d'observation est de 20,

|X-np_0|=|X-20 \cdot 0.5|=|X-10|>c

Donné dans. Tout d'abord, remplacez ce nombre d'observations par $ n $. À ce moment-là, le nombre de données devrait augmenter, de sorte que la distribution binomiale est approximée par une distribution normale.

from scipy.stats import norm
norm.ppf(0.025)

-1.9599639845400545

Puis

|X-np_0|=|X-0.5n|\ge 1.96 \cdot 0.5 \sqrt{n}=0.98\sqrt{n}

Ce sera. Premier

P(|X-np_0|=|X-n0.5|> 0.98\sqrt{n})

Penser à. Il s'agit de la probabilité que l'hypothèse nulle soit rejetée.

Ensuite, supposons que l'argent réel soit déformé et que les probabilités d'avant en arrière soient $ p $ et $ 1-p $.

z=\frac{X-p \cdot n}{\sqrt{p(1-p)n}}

Suit une distribution normale avec une moyenne de zéro et une variance de 1.

Quelle est la probabilité que $ X $ soit dans la zone de rejet lorsque $ p = 0,7 $?

P(|X-n0.5|\ge 0.98\sqrt{n}|p=0.7,1-p=0.3)

Je veux que ce soit 90% ou plus.

Divisez $ P (X-0,5n> 0,98 \ sqrt {n}) $ par $ \ sqrt {p (1-p) n} $, déplacez $ 0,5n $ vers la droite et ajoutez -pn des deux côtés. Une fois transformé

P\left(\frac{X-p \cdot n}{\sqrt{p(1-p)n}}>\frac{(0.5-p)\sqrt{n}+0.98}{\sqrt{p(1-p)}}\right)+ P\left(\frac{X-p \cdot n}{\sqrt{p(1-p)n}}<\frac{(0.5-p)\sqrt{n}-0.98}{\sqrt{p(1-p)}}\right)>0.9

Ce sera.

Lorsque $ p = 0,7 $, $ X $ suit une distribution normale avec une moyenne d'environ 0,7 $ n $ et un écart type $ \ sqrt {0,7 \ cdot 0,3 * n} = 0,46 \ sqrt {n} $.

Maintenant, trouvons réellement les paramètres. $ P\left(\frac{X-0.7 \cdot n}{0.46\sqrt{n}}>2.13-0.43\sqrt{n}\right)+P\left(\frac{X-0.7 \cdot n}{0.46\sqrt{n}}<-2.13+0.43\sqrt{n}\right)$

norm.ppf(0.9)

1.2815515655446004

Ensuite, il devient $ -2,13 + 0,43 \ sqrt {n} \ ge1.282 $, et 90% peut être atteint lorsque $ n $ est d'environ 63.

((1.282+2.13)/0.43)**2

62.9623796646836
%matplotlib inline
import matplotlib.pyplot as plt
p05=[]
p06=[]
n=61
ii=range(1,n+1)
for i in ii:
    a=factorial(n)/factorial(n-i)/factorial(i)
    p05.append(a*0.5**(n-i)*0.5**i)
    p06.append(a*0.3**(n-i)*0.7**i)
plt.plot(ii,p05,label='p=0.5',linestyle='--')
plt.plot(ii,p06,label='p=0.7')
plt.axvline(x=39)
plt.legend()

image.png

La zone de distribution orange à droite de la ligne verticale bleue est maintenant de 90%. En d'autres termes, la zone à droite de la distribution orange à partir de la ligne verticale est 1-β et la zone à gauche est β.

Plus généralement

Les tests de niveau de signification $ \ alpha $ sont des statistiques de test $z=\frac{\bar{x}-\mu_0}{\sigma/\sqrt{n}}$ Valeur réalisée de $ z ^ \ prime $

S'il s'agit de $ z ^ \ prime \ ge z_ \ alpha $, $ H_0 $ est rejeté. Si $ z ^ \ prime <z_ \ alpha $, il ne suffit pas de rejeter $ H_0 $.

Ce sera.

H_0:\mu = \mu_0
H_1:\mu \ne \mu_0
Si $ \ mu $ est défini sur $ \ mu = \ mu_1 $ ($ \ mu_1 $ est connu) La statistique de test lorsque $ H_0 $ ou $ H_1 $ est correcte

E(z|H_0)=0
E(z|H_1)=\sqrt{n}\delta
V(z|H_0)=V(z|H_1)=1 Cela devient une distribution normale de. ici $\frac{\mu_1-\mu_0}{\sigma/\sqrt{n}}=\sqrt{n}\frac{\mu_1-\mu_0}{\sigma}=\sqrt{n}\delta$

Conversion en $ z ^ \ star = z- \ sqrt {n} \ delta $ z^\star \sim N(0,1)
Ce sera.

P(z\le z_\alpha|H_1)=P(z^\star\le z_\alpha-\sqrt{n}\delta|z^\star\sim N(0,1))

Détermine si le rendement du stock est nul. La volatilité et les rendements annuels sont connus à 20% et 20%. Combien de données y a-t-il pour rendre la puissance de détection de 90% à un niveau de signification de 5%?

H_0:\mu=\mu_0=0
H_1:\mu \ne \mu_0

Corrigez la volatilité à l'écart-type de la journée.

import numpy as np
0.2/np.sqrt(250)

0.012649110640673518

Si $ \ mu_1 $ est de 5%, le rendement quotidien est

0.20/250

0.0008
norm.ppf(0.05)

1.2815515655446004

z^\star=z_\alpha-\sqrt{n}\delta=1.645-\sqrt{n}0.0008/0.0126

0.0008/0.0126

46.42857142857142
norm.ppf(0.9)

(1.645+1.28)/0.063

\sqrt{n}=\frac{1.645+1.28}{0.0158}=46

46**2

2116

Vous aurez besoin de données pendant près de 10 ans.

Fixons donc la marge bénéficiaire annuelle à 90%.

v=0.2
r=0.9
a=0.05
power=0.9
v1=v/np.sqrt(250)
r1=r/250
x=norm.ppf(1-a)
y=norm.ppf(power)
((x+y)/(r1/v1))**2

105.7265105020738

Cela signifie que nous n'avons besoin que d'environ 100 jours de données.

β

image.png

image.png

La puissance de détection peut être augmentée en augmentant la différence de P ou en augmentant le nombre de données.

L'hypothèse nulle est-elle difficile?

J'ai expliqué Kimukasetsu dans la partie traduction de BASIC ECONOMETRICS, mais il arrive souvent que le rôle d'un test statistique particulier soit connu, mais l'hypothèse nulle n'est pas claire.

jarque-Bera test

C'est l'un des tests d'aptitude à la distribution normale et utilise la netteté de la distorsion. L'hypothèse nulle a une distorsion nulle et une netteté nulle. En d'autres termes, il suit une distribution normale.

Essayons une distribution normale.

import numpy as np
import statsmodels.api as sm
import statsmodels.stats.api as sms
from statsmodels.compat import lzip
nsample=100
name = ['Jarque-Bera', 'Chi^2 two-tail prob.', 'Skew', 'Kurtosis']
e = np.random.normal(size=nsample)
test = sms.jarque_bera(e)
lzip(name, test)

[('Jarque-Bera', 0.12532827370844277),
 ('Chi^2 two-tail prob.', 0.9392588831621588),
 ('Skew', 0.061591593745002705),
 ('Kurtosis', 2.877915242516404)]

L'hypothèse nulle ne suffit pas à rejeter. On ne peut nier que les nombres aléatoires ont une distribution normale. Ensuite, essayons une distribution uniforme.

ee=np.random.rand(nsample)
test = sms.jarque_bera(ee)
lzip(name, test)

[('Jarque-Bera', 6.766980830340755),
 ('Chi^2 two-tail prob.', 0.033928822141024814),
 ('Skew', -0.13374676721016596),
 ('Kurtosis', 1.7539973481869713)]

L'hypothèse nulle a été rejetée. Les nombres aléatoires ne suivent pas une distribution normale.

Dickey–Fuller test

Le test DF ou ADF est une hypothèse composée. L'hypothèse nulle est qu'il existe une racine unitaire dans le modèle AR. Il existe trois types.

  1. Marche aléatoire sans dérive image.png
  2. Marche aléatoire avec dérive image.png
  3. Marche aléatoire avec dérive + tendance temporelle image.png

H_0:\delta=0 H_1: \delta<0 est.

Tendance stable

from statsmodels.tsa.stattools import adfuller
import pandas as pd
index=['ADF Test Statistic','P-Value','# Lags Used','# Observations Used']

nsample = 100
y_true = np.linspace(0, 0.2*nsample/260, nsample)
y = y_true
plt.plot(y)
adfTest = adfuller(y, autolag='AIC')
dfResults = pd.Series(adfTest[0:4], index)
for key,value in adfTest[4].items():
    dfResults['Critical Value (%s)'%key] = value
print('Augmented Dickey-Fuller Test Results:')
print(dfResults)

Augmented Dickey-Fuller Test Results:
ADF Test Statistic       0.689710
P-Value                  0.989630
# Lags Used             11.000000
# Observations Used     88.000000
Critical Value (1%)     -3.506944
Critical Value (5%)     -2.894990
Critical Value (10%)    -2.584615

image.png

L'hypothèse nulle n'a pas été rejetée car la série chronologique générée est stable.

Dans de tels cas, le test DF (ADF) doit être effectué après avoir supprimé la tendance.

Nombre aléatoire normal

nsample = 100
y_true = np.linspace(0, 0.2*nsample/260, nsample)
e = np.random.normal(size=nsample)
y = y_true + e
plt.plot(y)
adfTest = adfuller(y, autolag='AIC')
dfResults = pd.Series(adfTest[0:4], index)
for key,value in adfTest[4].items():
    dfResults['Critical Value (%s)'%key] = value
print('Augmented Dickey-Fuller Test Results:')
print(dfResults)

Augmented Dickey-Fuller Test Results:
ADF Test Statistic     -1.141212e+01
P-Value                 7.207876e-21
# Lags Used             0.000000e+00
# Observations Used     9.900000e+01
Critical Value (1%)    -3.498198e+00
Critical Value (5%)    -2.891208e+00
Critical Value (10%)   -2.582596e+00

image.png

Puisqu'il s'agit d'un nombre aléatoire normal, l'hypothèse nulle a été rejetée.

Marche aléatoire sans dérive

from statsmodels.tsa.stattools import adfuller
import pandas as pd
index=['ADF Test Statistic','P-Value','# Lags Used','# Observations Used']

nsample = 100
e = np.random.normal(size=nsample)
y = np.cumsum(e)
adfTest = adfuller(y, autolag='AIC')
dfResults = pd.Series(adfTest[0:4], index)
for key,value in adfTest[4].items():
    dfResults['Critical Value (%s)'%key] = value
print('Augmented Dickey-Fuller Test Results:')
print(dfResults)

Augmented Dickey-Fuller Test Results:
ADF Test Statistic       0.470182
P-Value                  0.983938
# Lags Used              0.000000
# Observations Used     99.000000
Critical Value (1%)     -3.498198
Critical Value (5%)     -2.891208
Critical Value (10%)    -2.582596
dtype: float64

La série chronologique générée était une marche aléatoire sans dérive, il ne suffisait donc pas de rejeter l'hypothèse nulle.

Marche aléatoire + tendance déterministe

Créez une tendance déterministe avec un rendement annuel de 20% et une marche aléatoire avec une volatilité de 20%. Ajoutons-les ensemble et voyons à quoi ressemblent les résultats en utilisant le test Dicky Fuller.

nsample = 260
y_true = np.linspace(0, 0.2*nsample/260, nsample)
e = np.random.normal(size=nsample)
sigma=0.2/np.sqrt(260)
y = y_true + np.cumsum(e*sigma)
plt.plot(y)
adfTest = adfuller(y,regression='nc', autolag='AIC')
dfResults = pd.Series(adfTest[0:4], index)
for key,value in adfTest[4].items():
    dfResults['Critical Value (%s)'%key] = value
print('Augmented Dickey-Fuller Test Results reg=nc:')
print(dfResults)
adfTest = adfuller(y,regression='c', autolag='AIC')
dfResults = pd.Series(adfTest[0:4], index)
print('Augmented Dickey-Fuller Test Results reg=c:')
print(dfResults)
adfTest = adfuller(y,regression='ct', autolag='AIC')
dfResults = pd.Series(adfTest[0:4], index)
print('Augmented Dickey-Fuller Test Results reg=ct:')
print(dfResults)

Augmented Dickey-Fuller Test Results reg=nc:
ADF Test Statistic       -1.618005
P-Value                   0.099695
# Lags Used               1.000000
# Observations Used     258.000000
Critical Value (1%)      -2.574460
Critical Value (5%)      -1.942090
Critical Value (10%)     -1.615830
dtype: float64
Augmented Dickey-Fuller Test Results reg=c:
ADF Test Statistic       -1.838595
P-Value                   0.361476
# Lags Used               1.000000
# Observations Used     258.000000

Augmented Dickey-Fuller Test Results reg=ct:
ADF Test Statistic       -2.218211
P-Value                   0.479608
# Lags Used               5.000000
# Observations Used     254.000000

image.png

  1. Dans la marche aléatoire sans dérive, l'hypothèse nulle a été rejetée.
  2. Dans la marche aléatoire avec dérive, l'hypothèse nulle n'a pas été rejetée.
  3. Dans la marche aléatoire avec tendance dérive + temps, l'hypothèse nulle n'a pas été rejetée.

Dans le test DF ou ADF, si le modèle de série chronologique n'est pas connu à l'avance, la puissance de détection sera réduite. Par conséquent, il est nécessaire de déterminer à l'avance le modèle de série chronologique.

En outre, les trois types ci-dessus ne suffisent pas à distinguer. Il existe de nombreuses tendances déterministes possibles et le débat est sans fin.

Campbell, J. Y.; Perron, P. (1991). "Pitfalls and Opportunities: What Macroeconomists Should Know about Unit Roots"

Stock J. Unit Roots, Structural Breaks, and Trends. In: Engle R, McFadden D Handbook of Econometrics. Amsterdam: Elsevier ; 1994. pp. 2740-2843.

nsample = 260
parm=nsample/260*0.2
y_true = np.linspace(0, parm, nsample)
e = np.random.normal(size=nsample)
sigma=0.2/np.sqrt(260)
ar=[1]
i=1
a=0.9
for ee in e:
    ar.append(1-a+a*ar[i-1]+ee*sigma)
    i+=1
y = y_true + ar[1:]
plt.plot(y)
adfTest = adfuller(y,regression='nc')
dfResults = pd.Series(adfTest[0:4], index)
for key,value in adfTest[4].items():
    dfResults['Critical Value (%s)'%key] = value
print('Augmented Dickey-Fuller Test Results reg=nc:')
print(dfResults)
adfTest = adfuller(y,regression='c')
dfResults = pd.Series(adfTest[0:4], index)
for key,value in adfTest[4].items():
    dfResults['Critical Value (%s)'%key] = value
print('Augmented Dickey-Fuller Test Results reg=c:')
print(dfResults)
adfTest = adfuller(y,regression='ct')
dfResults = pd.Series(adfTest[0:4], index)
for key,value in adfTest[4].items():
    dfResults['Critical Value (%s)'%key] = value
print('Augmented Dickey-Fuller Test Results reg=ct:')
print(dfResults)

image.png

Direction de la prédiction

Dans l'évaluation de la direction, si la direction du mouvement de prix réel et la direction de la prévision sont identiques, elle est définie sur 1, sinon elle est définie sur 0. Ensuite, la différence est jugée en comparant la valeur moyenne des évaluations à 0,5, c'est-à-dire la situation dans laquelle le nombre de directions correctes et le nombre de directions incorrectes sont identiques. En supposant que l'hypothèse nulle n'a pas de capacité prédictive ($ dL = 0,5 $), les statistiques suivantes sont utilisées dans le test.

\frac{\hat{dL}-0.5}{\sqrt{0.25/n}}

Suit une distribution normale.

Les références

Basic Econometricsby Damodar N. Gujarati Statistiques mathématiques Kei Takeuchi Introduction to Statistics, Département de statistique, Faculté des arts libéraux, Université de Tokyo 7 principes de statistique <IMG SRC="http://www.tradersshop.com/images/prod/9784775941683.jpg "

Recommended Posts

Introduction aux tests d'hypothèses statistiques avec des modèles de statistiques
Introduction aux modèles de retour automatique vectoriel (VAR) avec des modèles de statistiques
Introduction aux modèles de correction d'erreur vectorielle (VECM) avec des modèles de statistiques
Introduction au modèle linéaire généralisé (GLM) par Python
Introduction à RDB avec sqlalchemy Ⅰ
Introduction à RDB avec sqlalchemy II
Introduction à la modélisation statistique pour le modèle linéaire généralisé d'analyse de données (GLM)
Introduction à la modélisation statistique bayésienne avec python ~ Essai de régression linéaire avec MCMC ~
[Introduction à WordCloud] Jouez avec le scraping ♬
Introduction à l'apprentissage automatique: fonctionnement du modèle
Introduction au remplissage d'image Python Remplissage d'image à l'aide d'ImageDataGenerator
Mettre en œuvre collectivement des tests d'hypothèses statistiques en Python
[Introduction à Python] Utilisons foreach avec Python
[Introduction à Pytorch] J'ai joué avec sinGAN ♬
Comment créer des exemples de données CSV avec hypothèse
[Python] Introduction facile à l'apprentissage automatique avec python (SVM)
Introduction à l'intelligence artificielle avec Python 1 «Théorie des algorithmes génétiques»
Markov Chain Artificial Brainless avec Python + Janome (1) Introduction à Janome
Chaîne de Markov artificielle sans cervelle avec Python + Janome (2) Introduction à la chaîne de Markov
Introduction à l'intelligence artificielle avec Python 2 «Pratique de l'algorithme génétique»
[Introduction à StyleGAN2] Apprentissage indépendant avec 10 visages d'anime ♬
Introduction à Tornado (1): Framework Web Python démarré avec Tornado
Introduction à la modélisation statistique pour l'analyse des données
Introduction au vol en formation avec Tello edu (Python)
[Introduction à minimiser] Analyse des données avec le modèle SEIR ♬
Introduction à Python avec Atom (en route)
[Introduction à l'application Udemy Python3 +] 9. Tout d'abord, imprimez avec print
Introduction à MQTT (Introduction)
Introduction à Scrapy (1)
Introduction à Scrapy (3)
Premiers pas avec Supervisor
Introduction à Tkinter 1: Introduction
Introduction à PyQt
Introduction à Scrapy (2)
[Linux] Introduction à Linux
Introduction à Scrapy (4)
Introduction à discord.py (2)
[Introduction à Python] Comment itérer avec la fonction range?
[Introduction à WordCloud] Il est facile à utiliser même avec Jetson-nano ♬
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
Introduction au traitement parallèle distribué Python par Ray
Introduction aux mathématiques à partir du mémo d'étude Python Vol.1
Note de lecture: Introduction à l'analyse de données avec Python
[Chapitre 6] Introduction à scicit-learn avec 100 coups de traitement du langage
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
[Introduction à Pytorch] J'ai essayé de catégoriser Cifar10 avec VGG16 ♬
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
[Introduction à AWS] J'ai essayé de jouer avec la conversion voix-texte ♪
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage