医科大・医学部入試の男女差をPythonで仮説検定する

2018年8月、東京医科大学が女性受験者を一律で減点していたことが発覚し、大きな議論を呼んでいます。

+ [東京医大、女子受験者を一律減点 入試で不正操作、3割に抑制](https://www.47news.jp/news/2624234.html)

Python で仮説検定をして確かめてみましょう。

## 各医科大の男女別受験者・合格者数

医科大の男女別受験者・合格者数を Twitter の [@hkazeno](https://twitter.com/hkazeno) さんが[一覧にしてくださった](https://togetter.com/li/1252839)ので、それを使わせていただきます。（[@mad_moliz](https://twitter.com/mad_moliz)さん、[@hkazeno](https://twitter.com/hkazeno)さん、感謝申し上げます。私はツイッターアカウントを持っていないため、事前に許可を求めるリプライを送りませんでした。失礼をお詫びします。）

データを抜粋して CSV ファイルにします。すべてのソースを確認してはいませんが、2018年度の受験結果だと思われます。（東京医科大の数値がソース不明だったので、[報道記事](https://www.nikkei.com/article/DGXMZO3370137002082018CC0000/)をもとに2018年度入試結果に書き換えました。）

```data.csv
大学名,男子受験者数,女子受験者数,男子合格者数,女子合格者数
金沢医科大学,2073,1116,60,50
杏林大学医学部,1671,1071,79,66
藤田保健衛生大学,1312,673,169,89
獨協医科大学,1047,555,98,52
北里大学医学部,1406,898,114,70
川崎医科大学,886,523,56,31
関西医科大学,2235,1428,74,43
大阪医科大学,1842,1102,74,38
愛知医科大学,1198,677,148,70
日本医科大学,1960,1166,81,37
久留米大学医学部,1269,602,295,99
東北医科薬科大学,1154,519,173,54
慶応大学医学部,1125,400,145,35
日本大学医学部,2474,1471,146,39
聖マリアンナ医科大学,1748,1347,100,30
東京医科大学（1次）,1596,1018,303,148
東京医科大学（1次+2次）,1596,1018,141,30
東京女子医科大学,0,1333,0,109
京都大学医学部,349,200,117,70
東京医科歯科大学,234,104,71,32
札幌医科大学,302,156,73,38
熊本大学医学部,251,128,80,36
山口大学医学部,323,160,78,32
千葉大学医学部,270,89,101,22
```

## やりたいこと

やりたいことは、入学試験において男女の扱いに差があるかどうかを統計的に確認することです。

## 前提

男性受験者と女性受験者には学力の差がない、つまり男性受験者と女性受験者の学力が同じ分布に従うと仮定します。

また、話を簡単にするため、総受験者の中から女性受験者と女性合格者を取り出す操作を復元抽出とみなすことにします（詳しくは後述）。つまり、女性受験者が100人中合格者が10人という状況を、一人の女性が100回受験したら10回合格する独立な事象と見なします。

## 道具立て

以下の Python ライブラリを使います。

+ numpy - 行列計算を扱う定番のやつ
+ scipy - 各種統計関数とか
+ pandas - CSVファイルをいい感じに扱う

## 簡単な仮説検定の練習

キモになるのは scipy の [stats.binom_test()](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.binom_test.html) 関数です。これは、コイントスのように一定確率で成功する施行を繰り返し行ったとき、成功確率が p であるといえるかどうかを検定する関数です。

たとえば、表が出る確率が 1/2 と言われているコインがあるとして、表が出たら成功とします。そして、50回コインを投げたら15回表が出たとしましょう。これ絶対おかしいでしょ、表の出る確率 1/2 じゃないでしょ、とイカサマを指摘したい。

**帰無仮説：「コインの表が出る確率が 1/2 である」**

有意水準1％で両側検定するとして、p値が 0.01 以下なら帰無仮説が棄却されます。肝心の計算は一行。

```
>>> from scipy import stats
>>> stats.binom_test(15, 50, 0.5)
0.006600447966810915
```

ここで表示されたのがp値で、0.01 以下なので無事に帰無仮説が棄却されました。つまりコインの表がある確率は 1/2 とは言えない、ということです。

## 女性が医学部に合格する確率を検定する

じゃあやってみます。

まず帰無仮説を設定します。

**帰無仮説：「女性が合格する確率は、（総合格者数）／（総受験者数）に等しい」**

で、これが棄却されるかどうかを有意水準1％で検定します。ゴールは、帰無仮説が棄却される大学の大学名を出力することです。

```py
import numpy as np
import pandas as pd
from scipy import stats

data = pd.read_csv("data.csv")

# カラム追加
data["総受験者数"] = data["男子受験者数"] + data["女子受験者数"]
data["総合格者数"] = data["男子合格者数"] + data["女子合格者数"]
data["合格率"] = data["総合格者数"] / data["総受験者数"]

# p値を計算
data["p値"] = np.array([
    stats.binom_test(data["女子合格者数"][i], data["女子受験者数"][i], data["合格率"][i])
    for i in range(0, 24)
])

result = data[data["p値"] < 0.01]["大学名"]
print(result)
```

出てきました。実行結果です。

```
10    久留米大学医学部
13    日本大学医学部
14    聖マリアンナ医科大学
16    東京医科大学（1次+2次）
```

東京医科大学（1次）はありませんでした。2次での絞り込みが特に激しいということでしょうか。それはともかく、あれ、なんか他にも大学がいる…。まあこの記事としてはここまで計算すれば満足なので、解釈は他の方にお任せしますが。

## 復元抽出とみなした理由

さらっと流しましたが、女性の受験を復元抽出とみなした理由を説明します。

ほんとうは、女性受験者を取り出すのは有限母集団からの非復元抽出です。で、これは超幾何分布に従うのですが、

+ 超幾何分布は母集団が大きければ二項分布に近づく
+ 超幾何分布は平均が二項分布と等しく、分散は二項分布より小さい

という性質があるので、二項分布とみなして（つまり復元抽出とみなして）検定すればいっか、と判断した次第。分布の大小関係から、二項分布とみなした検定で帰無仮説が棄却されるならば、超幾何分布で検定しても帰無仮説が棄却されるので。

## つっこみ歓迎

というか、私は統計の素人なので、とりあえず適当な記事を公開しておいて、もっと詳しい方からつっこみをもらって勉強しようというメソッドです。

あやしい点はいくつかあります。受験者内で男女に本当に学力差はないのかとか、学力試験の部分（一般入試1次試験）だけにデータを限定したほうがいいんじゃないかとか。

## 参考リンク

+ [聖マリアンナ医科大学入試結果](https://www.marianna-u.ac.jp/univ/ent_info/ent_data.html)
+ [日本大学2018年度入試結果](http://www.nihon-u.ac.jp/admission_info/uploads/files/20180608134638.pdf)
  + 使用したデータは医学部入試のA方式とN方式・第１期の合計
+ [久留米大学入試結果](https://www.kurume-u.ac.jp/site/nyuushi/info-data-index.html)
  + 使用したデータは医学部一般入試の1次試験