[PYTHON] Estimer le score moyen des candidats à l'Université de médecine de Sapporo

Analyse des résultats de l'examen d'entrée à l'Université de médecine de Sapporo

Dans cet article, je voudrais estimer grossièrement le score moyen et l'écart type de tous les candidats sur la base des données du candidat publiées sur le site Web de l'Université médicale de Sapporo.

1. Hypothèse de la distribution des scores

Données publiées par l'université montre les scores moyens, les plus élevés et les plus bas des candidats retenus. Puisque seul le nombre de candidats peut être saisi, j'ai supposé que les scores des candidats suivaient la distribution normale, et j'ai utilisé les données données pour prédire les paramètres $ \ mu, \ sigma $ de la distribution normale. ..

2. Collecte de données

Premièrement, les données utilisées pour la prévision sont résumées dans le tableau. Ici, le classement le plus bas est de 75 chaque année car la capacité de l'examen général d'entrée de l'Université de médecine de Sapporo est de 75 personnes, et même si des passants supplémentaires se produisent, le score du 75e passeur sera annoncé comme le score le plus bas. Faire.

入試結果まとめ.png

3. Méthode d'analyse

La méthode d'analyse est très simple. Résolvez simplement les équations simultanées suivantes.

\left\{
\begin{split}
Pourcentage de candidats retenus&= \int_{Le point le plus bas}^{\infty} \frac{1}{\sqrt{2 \pi} \sigma} \exp (-\frac{(x - \mu)^2}{2 \sigma^2}) dx \\

Note moyenne des candidats retenus&= \frac{\int_{Le point le plus bas}^{\infty} \frac{x}{\sqrt{2 \pi} \sigma} \exp (-\frac{(x - \mu)^2}{2 \sigma^2})}{\int_{Le point le plus bas}^{\infty} \frac{1}{\sqrt{2 \pi} \sigma} \exp (-\frac{(x - \mu)^2}{2 \sigma^2}) dx}
\end{split}
\right.

Permettez-moi de vous donner une petite explication supplémentaire. La première formule est

Pourcentage de candidats retenus= \frac{Rang inférieur}{Nombre de candidats} = \int_{Le point le plus bas}^{\infty}Distribution normale dx

est ce que cela signifie. Si vous intégrez la distribution normale du point le plus bas à l'infini, vous pouvez obtenir le pourcentage de candidats retenus.

La deuxième formule est

Note moyenne des candidats retenus=Valeur attendue du score du candidat retenu= \int_{Le point le plus bas}^{\infty}Constante de normalisation\times x \fois la distribution normale dx= \frac{\int_{Le point le plus bas}^{\infty}x \fois la distribution normale dx}{\int_{Le point le plus bas}^{\infty}Distribution normale dx}

Cela signifie $$. La constante standardisée est la constante $ C $ pour $ C \ times \ int_ {point le plus bas} ^ {\ infty} distribution normale dx = 1 $, c'est-à-dire $ 1 / \ int_ {point le plus bas} ^ {\ infty} normal La distribution dx $.

$$ Maintenant, le problème ici est que le nombre inconnu n'est calculé que parce que deux équations simultanées sont obtenues, mais l'intégration de la première équation est inconnue pour $ \ mu, \ sigma $. Il ne peut pas être calculé tel quel. J'ai donc renoncé à essayer de trouver une solution mathématiquement exacte et j'ai décidé de substituer diverses paires de valeurs $ \ mu, \ sigma $ pour trouver celle qui pourrait être mieux approchée. Cependant, je ne peux pas faire un calcul aussi gênant, donc pyhon est ici.

4. Trouvez une solution approximative en utilisant Pyhon

Tout d'abord, importez les bibliothèques et modules requis.

import numpy as np
import scipy.stats as st
import matplotlib.pyplot as plt
from scipy import integrate
import japanize_matplotlib

Ensuite, créez les données requises pour la prédiction.

mu_I = [950,1000]
sigma_I = [60,90]
year = [2018,2019,2020]
n = [321,267,281]
pass_n = 75
pass_ratio = [pass_n/i for i in n]
pass_average = [1063,1073,1072]
worst = [1023,1029,1022]
mu_points = np.linspace(mu_I[0],mu_I[1],100)            
sigma_points = np.linspace(sigma_I[0],sigma_I[1],60)    
pass_ratio_err = 0.005
pass_average_err = 1

De plus, définissez les fonctions requises pour calculer le score attendu des candidats retenus.

def norm(x,mu, sigma):
    return (x/(np.sqrt(2*np.pi)*sigma))*np.exp(-(x - mu)**2/(2*(sigma**2)))

Ensuite, avec le code suivant, tracez le point $ (\ mu, \ sigma) $

Il a été classé de 3 manières.

ratio_average = []
ratio_only = []
average_only = []
for i in range(len(year)):
    ratio_average.append([[],[]])
    ratio_only.append([[],[]])
    average_only.append([[],[]])
    for mu_point in mu_points:
        for sigma_point in sigma_points:
            mu = mu_point
            sigma = sigma_point
            cdf = st.norm.cdf(worst[i], mu, sigma)
            int_pdf = integrate.quad(norm,worst[i], np.inf, args = (mu, sigma))[0]
            calculate_pass_ratio = 1 - cdf
            calculate_pass_average = int_pdf / calculate_pass_ratio
            if np.abs(calculate_pass_ratio - pass_ratio[i]) < pass_ratio_err:
                if np.abs(calculate_pass_average - pass_average[i]) < pass_average_err:
                    ratio_average[i][0].append(mu)
                    ratio_average[i][1].append(sigma)
                else:
                    ratio_only[i][0].append(mu)
                    ratio_only[i][1].append(sigma)
            elif np.abs(calculate_pass_average - pass_average[i]) < pass_average_err:
                    average_only[i][0].append(mu)
                    average_only[i][1].append(sigma)
            else:
                pass

Enfin, les points classés ont été codés par couleur et tracés sur le graphique.

fig , axes = plt.subplots(1,3,figsize = (18,5))
for i, ax in zip([0,1,2],axes):
    ax.scatter(ratio_only[i][0],ratio_only[i][1],c = 'y', s = 2, label= 'Le pourcentage de candidats retenus{:.3f} $\\pm$ {}%'.format(pass_ratio[i], pass_ratio_err*100))
    ax.scatter(average_only[i][0],average_only[i][1],c = 'b', s = 2,label = 'Le nombre moyen de candidats retenus{} $\\pm$ {}point'.format(pass_average[i], pass_average_err))
    ax.scatter(ratio_average[i][0],ratio_average[i][1],c = 'g', s = 2,  label = 'Remplissez les deux conditions ci-dessus')
    ax.set_xlim(mu_I[0], mu_I[1])
    ax.set_ylim(sigma_I[0], sigma_I[1])
    ax.set_xlabel('$\\mu$')
    ax.set_ylabel('$\\sigma$')
    ax.legend(loc = 'best')
    ax.set_title('{}Année'.format(year[i]))
plt.show()

Le résultat de l'exécution est comme indiqué dans le graphique ci-dessous.

予測結果グラフ.png

Le tableau ci-dessous montre les valeurs approximatives de $ \ mu et \ sigma $ lues dans la zone verte du graphique.

予測結果.png

5. Conclusion

Cette année (exercice 2020), le score moyen des candidats retenus était supérieur à celui de l'exercice 2018, mais le score moyen des candidats était inférieur à celui de l'exercice 2018. De plus, l'écart-type augmente d'année en année et on peut dire que des questions sont posées pour élargir l'écart de points parmi les candidats.

Recommended Posts

Estimer le score moyen des candidats à l'Université de médecine de Sapporo
Trouvez la «note de passage minimale» à partir de la «note moyenne des candidats», de la «note moyenne des candidats retenus» et de «l'agrandissement» de l'examen d'entrée
Criez Bonjour Reiwa! Au début de Reiwa!
Estimer le pic d'infectivité du nouveau virus corona
Cours de base Python (à la fin de 15)