[PYTHON] Ce à quoi j'ai pensé dans la question de l'examen d'entrée de "Bayes Statistics from the Basics"

Thème "Questions d'examen d'admission"

J'y ai pensé en lisant Bayes Statistics from the Basics. Cité à partir de la page 59

Questions d'examen d'entrée: Lors de l'examen d'entrée d'une entreprise, 7 questions de même difficulté sont posées chaque année. M. x de l'Université X avait 3 bonnes réponses et 4 réponses incorrectes. Soit le taux de réponse correct $ \ theta_x $. M. y de l'Université Y avait 4 bonnes réponses et 3 réponses incorrectes. Soit le taux de réponse correct $ \ theta_y $. Il y a de nombreux candidats de l'Université X et de l'Université Y chaque année. Quand je l'ai recherché, Le taux de réponse correcte des X candidats universitaires est approximé par une distribution bêta avec une moyenne de 0,8 et une variance de 0,04. Il a été constaté que le taux de réponse correcte des candidats de l'Université Y est approximé par une distribution bêta avec une moyenne de 0,4 et une variance de 0,04. Si vous estimez $ \ theta_x $ et $ \ theta_y $ et que vous souhaitez embaucher un seul candidat avec une grande valeur de population, Quel est M. x ou M. y?

** "Si vous évaluez non seulement le résultat du test, mais aussi la capacité du groupe auquel appartient la personne, vous pouvez faire une estimation plus précise." ** Il s'agit d'une considération sur les avantages et les inconvénients de cela.

Ici, au lieu de résoudre ce problème tel quel, nous envisagerons de changer les conditions comme suit.

―― La capacité de chaque élève est définie comme une valeur, et le but est de savoir si celui avec la valeur de capacité la plus élevée peut être sélectionné ou non.

  • Supposons que les capacités des candidats de l'Université X suivent une distribution normale avec une moyenne de 105 et un écart type de 10.
  • Supposons que les capacités des candidats de l'Université Y suivent une distribution normale avec une moyenne de 100 et un écart type de 10. ――Supposons que les valeurs observées, qui sont les résultats de l'examen d'entrée, suivent une distribution normale avec une moyenne de votre propre valeur d'aptitude et un écart type de 10.
  • ** Dans la méthode des résultats de test **, seules les valeurs observées sont évaluées.
  • ** Dans la méthode de combinaison de groupe **, nous évaluerons avec $ valeur de correction \ equiv \ frac {valeur moyenne du groupe + valeur observée} {2} $.

Vérifier avec Python

Calculez chaque valeur. 63,8% ont une valeur de capacité X élevée et 59,9% une valeur observée élevée de X.

python3


import numpy as np, pandas as pd
np.random.seed(1)
n = 1000000 #Nombre d'évaluations
xave, yave, std = 105, 100, 10 #Moyenne X, moyenne Y, écart type
gx = np.random.normal(xave, std, (n)) #Valeur de la capacité du groupe X
gy = np.random.normal(yave, std, (n)) #Valeur de la capacité du groupe Y
ox = np.random.normal(gx, std) #Observations du groupe X
oy = np.random.normal(gy, std) #Observations du groupe Y
ax = (xave + ox) / 2 #Valeur de correction du groupe X
ay = (yave + oy) / 2  #Valeur de correction du groupe X

gf = gx > gy #X a une valeur de capacité élevée
of = ox > oy #X est élevé dans la valeur observée
af = ax > ay #X est élevé dans la valeur de correction

print(gf.sum() / n, of.sum() / n)
>>>
0.638318 0.598666

Méthode des résultats d'examen

Dans l'évaluation par la valeur observée, le taux de réponse correcte est de 75,9%.

python3


print(pd.DataFrame([[(gf&of).sum(), ((~gf)&of).sum()],
                    [(gf&(~of)).sum(), ((~gf)&(~of)).sum()]],
                  columns=['Capacité X', 'Capacité Y'], index=['Observation X', 'Observation Y']) / n)
print('Taux de réponse correct= ', (gf==of).sum() / n)
>>>
Capacité X Capacité Y
Observation X 0.498147  0.100519
Observation Y 0.140171  0.261163
Taux de réponse correct=  0.75931

Méthode de combinaison de groupe

Dans l'évaluation par la valeur de correction, le taux de réponse correcte est de 76,8%.

python3


print(pd.DataFrame([[(gf&af).sum(), ((~gf)&af).sum()],
                    [(gf&(~af)).sum(), ((~gf)&(~af)).sum()]],
                  columns=['Capacité X', 'Capacité Y'], index=['Correction X', 'Correction Y']) / n)
print('Taux de réponse correct= ', (gf==af).sum() / n)
>>>
Capacité X Capacité Y
Correction X 0.549088  0.142374
Correction Y 0.089230  0.219308
Taux de réponse correct=  0.768396

Considération

Certes, en utilisant non seulement mes propres capacités mais aussi les capacités de mon groupe, j'ai pu évaluer avec précision. Mais une telle méthode est-elle vraiment bonne? Par exemple, qu'en est-il du genre au lieu du collège? Il est peut-être problématique de changer de réussite ou d'échouer selon le sexe.

Méthode de proposition 1

Par conséquent, nous proposons une nouvelle méthode. La méthode est la suivante.

――Vous passerez un test séparé à l'avance. Le résultat est utilisé comme valeur pré-observée. ――Si vous n'aimez pas les résultats du test (si la valeur pré-observée est inférieure à la valeur de votre capacité), ne faites rien. ――Si vous l'aimez, vous vous enregistrerez vous-même. Si elles sont enregistrées, les valeurs observées et pré-observées doivent être utilisées lors de l'examen d'entrée. (Si elle n'est pas enregistrée, seule la valeur observée est suffisante.) «Nous avons adopté un système d'enregistrement en tenant compte de la possibilité que tout le monde ne puisse pas passer le test séparément.

python3


bx = np.random.normal(gx, std) #Valeurs pré-observées du groupe X
by = np.random.normal(gy, std) #Valeurs pré-observées du groupe Y
#Si la valeur pré-observée est inférieure ou égale à la valeur de votre capacité, utilisez la valeur observée d'origine.
px = ox*(bx < gx) + (ox+bx)/2*(bx >= gx) #Valeur suggérée pour le groupe X 1
py = oy*(by < gy) + (oy+by)/2*(by >= gy) #Valeur suggérée pour le groupe Y 1

pf = px > py #La valeur proposée 1 et X est élevée

print(pd.DataFrame([[(gf&pf).sum(), ((~gf)&pf).sum()],
                    [(gf&(~pf)).sum(), ((~gf)&(~pf)).sum()]],
                  columns=['Proposition 1X', 'Proposition 1Y'], index=['Observation X', 'Observation Y']) / n)
print('Taux de réponse correct= ', (gf==pf).sum() / n)
>>>
Proposition 1X Proposition 1Y
Observation X 0.518089  0.088829
Observation Y 0.120229  0.272853
Taux de réponse correct=  0.790942

Le taux de réponse correcte est de 79,1% et la précision s'est améliorée. Cependant, passer un test séparé coûte de l'argent.

Méthode de proposition 2

Considérez une méthode qui ne teste pas séparément.

  • Si les résultats des tests sont supérieurs à la moyenne de votre groupe: demandez-leur d'utiliser les valeurs observées.
  • Si le score du test est inférieur à la moyenne de votre groupe: demandez-leur d'utiliser la valeur de correction.

python3


qx = ox*(ox >= xave) + ax*(ox < xave) #Valeur suggérée 2 pour le groupe X
qy = oy*(oy >= yave) + ay*(oy < yave) #Valeur suggérée 2 pour le groupe Y

qf = qx > qy #La valeur proposée 2 et X est élevée

print(pd.DataFrame([[(gf&qf).sum(), ((~gf)&qf).sum()],
                    [(gf&(~qf)).sum(), ((~gf)&(~qf)).sum()]],
                  columns=['Proposition 2X', 'Proposition 2Y'], index=['Observation X', 'Observation Y']) / n)
print('Taux de réponse correct= ', (gf==qf).sum() / n)
>>>
Proposition 2X Proposition 2Y
Observation X 0.521504  0.119074
Observation Y 0.116814  0.242608
Taux de réponse correct=  0.764112

C'est un peu mieux que juste les observations.

Méthode de proposition 3

Même avec la méthode de proposition 2, les capacités supérieures du groupe auquel ils appartiennent peuvent être insatisfaites. Et la méthode suivante?

--Chaque utilisateur décide s'il doit s'inscrire par lui-même au moment du test.

  • Si la valeur de la capacité est supérieure à la moyenne du groupe auquel vous appartenez: ne vous inscrivez pas. → Demandez-leur d'utiliser les valeurs observées.
  • Si la valeur de la capacité est inférieure à la moyenne du groupe auquel vous appartenez: Inscrivez-vous. → Demandez-leur d'utiliser la valeur de correction.

python3


rx = ox*(gx >= xave) + ax*(gx < xave) #Valeur suggérée pour le groupe X 3
ry = oy*(gy >= yave) + ay*(gy < yave) #Valeur proposée du groupe Y 3

rf = rx > ry #La valeur proposée 3 et X est élevée

print(pd.DataFrame([[(gf&rf).sum(), ((~gf)&rf).sum()],
                    [(gf&(~rf)).sum(), ((~gf)&(~rf)).sum()]],
                  columns=['Proposition 3X', 'Proposition 3Y'], index=['Observation X', 'Observation Y']) / n)
print('Taux de réponse correct= ', (gf==rf).sum() / n)
>>>
Proposition 3X Proposition 3Y
Observation X 0.518967  0.119357
Observation Y 0.119351  0.242325
Taux de réponse correct=  0.761292

――C'est un peu mieux que l'estimation de la valeur observée seule. «Parce que les candidats sont activement impliqués, ils ne sont pas victimes de discrimination.

  • Il n'y a presque aucun coût.

La proposition 3 (ou un hybride de la proposition 1 et de la proposition 3) semble bonne.

c'est tout

Recommended Posts