[PYTHON] Finden Sie die "Mindestpunktzahl" aus der "Durchschnittspunktzahl der Prüflinge", der "Durchschnittspunktzahl der erfolgreichen Bewerber" und der "Vergrößerung" der Aufnahmeprüfung

Zweck

Bei der Lösung früherer Fragen zu Aufnahmeprüfungen für Junior High School, High School, Universität usw. werden "durchschnittliche Punktzahl der Prüflinge", "durchschnittliche Punktzahl der erfolgreichen Bewerber" und "Multiplikator (Anzahl der erfolgreichen Bewerber / Anzahl der Prüflinge)" angegeben, jedoch "Mindestpunktzahl" Kann privat sein. Hier betrachten wir die Vorhersage der Mindestpunktzahl für das Bestehen.

Methode

Ich habe die Daten der Aufnahmeprüfung (2013-2019) der M Junior High School verwendet, die auf der folgenden Website veröffentlicht wurden. Gorogoro Junior High School Prüfung https://www.goro-goro.net/2019-musashi

Für die Daten für jedes Jahr wurden die folgenden Operationen durchgeführt, wobei die durchschnittliche Punktzahl der Prüflinge $ \ mu_a $, die durchschnittliche Punktzahl der erfolgreichen Bewerber $ \ mu_p $ und die Vergrößerung $ r $ betrug. (Jede Operation wird im nächsten Abschnitt ausführlich erläutert.)

  1. Bestimmen Sie den Wert von $ \ sigma $. Angenommen, die Ergebnisse des Testteilnehmers folgen einer Normalverteilung mit einem Durchschnitt von $ \ mu_a $ und einer Standardabweichung von $ \ sigma $.
  2. In der Normalverteilung ist $ b $, so dass der Bereich von $ x> b $ $ \ frac {1} {r} $ ist, die vorläufige Mindestpunktzahl.
  3. Berechnen Sie den Durchschnitt des Teils $ x> b $ der Verteilung und legen Sie ihn als vorläufige Durchschnittsbewertung der erfolgreichen Bewerber $ {\ mu_p} ^ {\ prime} $ fest.
  4. Aktualisieren Sie die Standardabweichung $ \ sigma $ von der Größenbeziehung zwischen $ {\ mu_p} ^ {\ prime} $ und $ \ mu_p $ und kehren Sie zu 1 zurück. Wiederholen Sie dies.
  5. Wenn $ {\ mu_p} ^ {\ prime} = \ mu_p $, wird die zu diesem Zeitpunkt minimale Mindestpunktzahl $ b $ als vorhergesagter Wert verwendet.

Danach wurden der vorhergesagte Wert der niedrigsten Punktzahl und der tatsächliche Wert aufgezeichnet und die Genauigkeit mit dem Fall der einfachen Vorhersage () verglichen. () Vorhersage, dass die Mindestpunktzahl = (durchschnittliche Punktzahl der Prüflinge + durchschnittliche Punktzahl der erfolgreichen Bewerber) / 2

Details der Methode

1. Bestimmen Sie den Wert von $ \ sigma $. Angenommen, die Ergebnisse des Testteilnehmers folgen einer Normalverteilung mit einem Durchschnitt von $ \ mu_a $ und einer Standardabweichung von $ \ sigma $. </ font> </ b>

Diese Annahme wurde als gültig angesehen, wenn die Anzahl der Prüflinge groß genug war und es keine Kandidaten mit Voll- oder Nullpunkten gab. Natürlich ist die wahre Punkteverteilung eine diskrete Verteilung, aber wir betrachten dies als kontinuierliche Verteilung. Das erste $ \ sigma $ kann endlich entschieden werden und wird später aktualisiert, um sich dem optimalen Wert anzunähern. Wenn Sie das obige Diagramm als "Wahrscheinlichkeitsverteilung der Punktzahlen für einen Schüler" betrachten, lautet die $ y $ -Achse "Wahrscheinlichkeitsdichte (die bei Integration zur Wahrscheinlichkeit wird)", und wenn Sie "Punkteverteilung für alle Schüler" betrachten. Die $ y $ -Achse ist "Wahrscheinlichkeitsdichte x Anzahl der Personen (wenn sie integriert ist, wird sie zur Anzahl der Personen)".
2. In einer Normalverteilung ist $ b $, so dass die Fläche von $ x> b $ $ \ frac {1} {r} $ ist, die vorläufige Mindestpunktzahl. .. </ font> </ b>

Dies kann als Formel ausgedrückt werden

\int^{b}_{\infty} \frac{1}{\sqrt{2\pi{\sigma}^2}}\exp{\left(-\frac{(x-\mu_a)^2}{2\sigma^2}\right)} \mathrm{d}x = 1-\frac{1}{r}

Entspricht dem Finden von $ b $, das zufriedenstellend ist. Die linke Seite ist die kumulative Verteilungsfunktion dieser Normalverteilung, wobei $ b $ ersetzt wird. Diese Formel ist kann nicht analytisch gelöst werden </ b>, daher habe ich dieses Mal die Programmierung (Python) verwendet (der Code wird später beschrieben). Die gerade Linie $ x = b $ ist ein Bild, das Passanten und Passanten durch die Punkteverteilung trennt.
3. Berechnen Sie den Durchschnitt des $ x> b $ -Teils der Verteilung und legen Sie ihn als vorläufige Durchschnittsbewertung der erfolgreichen Bewerber $ {\ mu_p} ^ {\ prime} $ fest. </ font> </ b>

Dies entspricht dem Ermitteln des Durchschnitts (erwarteten Werts) der Schnittnormalverteilung </ b>.

{\mu_p}^{\prime} = \mu_a + \sigma\frac{\phi\left(\frac{b - \mu_a}{\sigma}\right)}{1-\Phi\left(\frac{b - \mu_a}{\sigma}\right)}

($ \ Phi (\ cdot) $ repräsentiert die Wahrscheinlichkeitsdichtefunktion der Standardnormalverteilung und $ \ Phi (\ cdot) $ repräsentiert ihre kumulative Verteilungsfunktion). Referenz: https://bellcurve.jp/statistics/blog/18075.html
4. Aktualisieren Sie die Standardabweichung $ \ sigma $ von der Größenbeziehung zwischen $ {\ mu_p} ^ {\ prime} $ und $ \ mu_p $ und kehren Sie zu 1 zurück. Wiederholen Sie dies. </ font> </ b>

Wie in der obigen Abbildung gezeigt, gilt: Je größer die ursprünglich ermittelte Standardabweichung $ \ sigma $ ist, desto größer ist $ {\ mu_p} ^ {\ prime} $ (monoton ansteigend). Verwenden Sie daher die Dichotomie . , $ {\ mu_p} ^ {\ prime} = \ mu_p $ Finde $ \ sigma $. Wie in der obigen Abbildung gezeigt, wird der Suchbereich jedes Mal halbiert. Wenn Sie ihn also etwa 100 Mal wiederholen, erreichen Sie den Zielwert mit ausreichender Genauigkeit. (Hinweis) Tatsächlich befinden sich $ \ sigma $ und $ {\ mu_p} ^ {\ prime} $ in einer linearen Funktionsbeziehung, wie in der obigen Abbildung gezeigt. Daher ist es möglich, $ \ sigma $ so zu finden, dass $ {\ mu_p} ^ {\ prime} = \ mu_p $, ohne die Dichotomie tatsächlich zu verwenden. Ich habe dies nach der Analyse bemerkt, aber da die Berechnungsgenauigkeit und die Berechnungszeit fast gleich sind, habe ich die Analyse nach der Dichotomie veröffentlicht.
5. Wenn $ {\ mu_p} ^ {\ prime} = \ mu_p $, wird die zu diesem Zeitpunkt minimale Mindestpunktzahl $ b $ als vorhergesagter Wert verwendet.

Code und Ergebnisse

Die obige "Vorhersage unter Verwendung der Normalverteilung" wurde durchgeführt, und die Genauigkeit wurde mit der "Vorhersage, dass die Mindestpunktzahl für das Bestehen = (durchschnittliche Punktzahl der Prüflinge + durchschnittliche Punktzahl der erfolgreichen Bewerber) / 2" verglichen wurde.

import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score, mean_absolute_error

# 2013-2019 Daten von https://www.goro-goro.net/2019-musashi
jukensya = [433, 556, 519, 590, 577, 541, 569]
goukakusya = [177, 177, 185, 183, 187, 185, 186]
juken_heikin = [138.5, 173.3, 172.9, 167.0, 165.5, 186.9, 170.5]
goukaku_heikin = [166.5, 210.7, 210.3, 202.0, 197.0, 221.5, 205.2]
goukaku_saitei = [146, 192, 188, 184, 180, 201, 185]

goukaku_saitei_pred = []

for i in range(7):  # 2013-Analysieren Sie 2019 sieben Mal
    r = jukensya[i] / goukakusya[i]  #Vergrößerung
    mu_a = juken_heikin[i]  #Durchschnittliche Punktzahl des Kandidaten
    mu_p = goukaku_heikin[i]  #Durchschnittliche Punktzahl erfolgreicher Bewerber
    
    sigma_l = 0.1
    sigma_r = 1000
    sigma = (sigma_l + sigma_r) / 2  #Standardabweichung, 0.Suche im Bereich von 1 bis 1000
    
    for i in range(100):  #Wiederholen Sie die Dichotomie 100 Mal
        b = norm.isf(1 / r, mu_a, sigma)  #Vorläufige Mindestpunktzahl
        mu_p_prime = mu_a + sigma * norm.pdf((b - mu_a) / sigma) \
                     / (1 - norm.cdf((b - mu_a) / sigma))  #Vorläufige durchschnittliche Punktzahl erfolgreicher Bewerber
        if mu_p_prime < mu_p:
            sigma_l = sigma
        else:
            sigma_r = sigma
        sigma = (sigma_l + sigma_r) / 2
    
    goukaku_saitei_pred.append(b)

#Vorhersage, dass der Mittelpunkt zwischen der durchschnittlichen Punktzahl der Prüflinge und der durchschnittlichen Punktzahl der erfolgreichen Bewerber die niedrigste Punktzahl ist
goukaku_saitei_pred_rough = [(goukaku_heikin[i] + juken_heikin[i]) / 2 for i in range(7)]

## R^Bestätigung von 2 und MAE##

print("Pred 1:Ergebnisse der Vorhersage unter Verwendung der Normalverteilung")
print("R^2: {:.4f}".format(r2_score(goukaku_saitei, goukaku_saitei_pred)))
print("MAE: {:.4f}".format(mean_absolute_error(goukaku_saitei, goukaku_saitei_pred)))
print("")
print("Pred 2: (Durchschnittliche Punktzahl des Kandidaten+Durchschnittliche Punktzahl erfolgreicher Bewerber) /Das Ergebnis der Vorhersage, dass es 2 ist")
print("R^2: {:.4f}".format(r2_score(goukaku_saitei, goukaku_saitei_pred_rough)))
print("MAE: {:.4f}".format(mean_absolute_error(goukaku_saitei, goukaku_saitei_pred_rough)))

##Gemessener Wert-Erstellen eines Diagramms mit vorhergesagten Werten##

fig = plt.figure(figsize=(10, 5))
lim = [140, 220]  #Reichweite beider Achsen
s = 17  #Schriftgröße

# Pred 1:Ergebnisse der Vorhersage unter Verwendung der Normalverteilung
ax0 = fig.add_subplot(1,2,1)

ax0.plot(goukaku_saitei, goukaku_saitei_pred, "o", markersize=8)
ax0.plot(lim, lim, "k-")

ax0.set_title('Pred 1', fontsize=s)
ax0.set_xlabel('True', fontsize=s)
ax0.set_ylabel('Predicted', fontsize=s)
ax0.tick_params(labelsize=s)
ax0.set_xlim(lim)
ax0.set_ylim(lim)
ax0.set_aspect('equal')

# Pred 2: (Durchschnittliche Punktzahl des Kandidaten+Durchschnittliche Punktzahl erfolgreicher Bewerber) /Das Ergebnis der Vorhersage, dass es 2 ist
ax1 = fig.add_subplot(1,2,2)

ax1.plot(goukaku_saitei, goukaku_saitei_pred_rough, "o", markersize=8)
ax1.plot(lim, lim, "k-")

ax1.set_title('Pred 2', fontsize=s)
ax1.set_xlabel('True', fontsize=s)
ax1.set_ylabel('Predicted', fontsize=s)
ax1.tick_params(labelsize=s)
ax1.set_xlim(lim)
ax1.set_ylim(lim)
ax1.set_aspect('equal')

#Als PNG speichern
fig.tight_layout()
fig.savefig("plot.png ")

Ausgabe Der R ^ 2 -Wert ist ein Bestimmungskoeffizient, und je näher er an 1 liegt, desto besser ist die Genauigkeit. MAE ist der Durchschnitt der absoluten Werte von Vorhersagefehlern. Je näher er an 0 liegt, desto besser ist die Genauigkeit.

Pred 1:Ergebnisse der Vorhersage unter Verwendung der Normalverteilung
R^2: 0.9892
MAE: 1.4670

Pred 2: (Durchschnittliche Punktzahl des Kandidaten+Durchschnittliche Punktzahl erfolgreicher Bewerber) /Das Ergebnis der Vorhersage, dass es 2 ist
R^2: 0.9583
MAE: 2.5571

plot.png

Erwägung

Es kann gesagt werden, dass Pred 1, bei dem es sich um eine Vorhersage unter Verwendung einer Normalverteilung handelt, genauer </ b> ist als Pred 2, bei dem es sich um eine einfache Vorhersage handelt. Der durchschnittliche Vorhersagefehler beträgt etwa 1,5 Punkte, was als Leitfaden für die tatsächliche Untersuchung ausreichend zu sein scheint. Betrachtet man das Pred 2-Diagramm, so ist der Vorhersagefehler in den Daten nahe 145 Punkten unten links groß. Es wird angenommen, dass dies auf die Tatsache zurückzuführen ist, dass Pred 2 unabhängig von der Prüfungsvergrößerung den "Mittelpunkt zwischen der durchschnittlichen Punktzahl der Prüflinge und der durchschnittlichen Punktzahl erfolgreicher Bewerber" verwendet, sodass es nicht auf Änderungen der Vergrößerung reagieren kann (nur für dieses Jahr). Die Vergrößerung beträgt nur das 2,4-fache, in anderen Jahren das 2,8- bis 3,2-fache. Andererseits wird in Pred 1 der Vorhersagefehler auf das gleiche Niveau wie andere Daten oder weniger unterdrückt, und es kann gesagt werden, dass das Verfahren unter Verwendung der Normalverteilung die Änderung der Vergrößerung bewältigen kann.

In Pred 1 weisen viele Daten eine ähnliche Abweichung auf, dass "der vorhergesagte Wert etwa 1 bis 2 kleiner als der tatsächliche Wert ist". Wenn daher genügend Daten vorhanden sind, ist es möglich, dass die Genauigkeit noch besser ist, indem diesmal die Konstante gefunden wird, die "ungefähr 1 bis 2" entspricht, und die Korrektur zum vorhergesagten Wert hinzugefügt wird.

Referenz

scipy.stats --API für statistische Funktionen von scipy --keisukes Blog http://kaisk.hatenadiary.com/entry/2015/02/17/192955

3-5.Verzerrung und Schärfe|Statistikzeit|Statistik WEB https://bellcurve.jp/statistics/course/17950.html

Recommended Posts