理系は文系よりも本当にチェックシャツを着ているのか?
データまわりのお仕事をしている内藤と申します。毎日膨大なデータの海の中で素敵なサムシングをよしなに何かできないか企みながら日々生きております。
背景
先日とあるきっかけで知り合った小谷先生にご献本いただきまして、大変楽しく読ませていただきました。
もともと僕は大学院で天文学を専攻していたこともあり、ニヤニヤしながら読んでいたのですがちょっと気になる内容がありました。
たしかにこれはよくネットで見る議論を呼ぶテーマであり、理系出身の自分の経験を思い出してみると当てはまるようなはまらないような、、、思い返してみると学会でチェックシャツ多いなぁと思った気もしなくはない。
小谷先生の独自の調査結果からは文系、理系で有意な差はなかったと結論されているのですが、データを生業にしている性なのかなんとなく魂にひっかかるものがあり、本当にその結論があっているのかを検証してみることにしたらいろいろ学びがあった、という話です。
こういったことにもビジネスに使えるいろいろな学びが含まれているので自分の備忘録も兼ねて試行過程をインターネットに残した次第です。
※検証方法とか興味なくて結論だけを知りたい方は一番下の方まで飛ばしてくださいませ!
まずはデータを整理しよう
まず焦る気持ちを抑えてまずは冷静にわかっているデータを整理しましょう。
理系においては2個所の天文学系の国際学会と青山学院大学理工学部で小谷先生独自に観測が行われ、合わせてサンプルサイズが290人中、30人がチェックシャツを着用していたようです。そして文系は立教大学文系学部において同様に調査され、サンプルサイズが189人、チェック着用数は明記されておらず、そのかわりチェックシャツ率 = (5±3)%と与えられています。
誤差の部分はポアソン分布を仮定しているようですが、記事を読み解く限り、±の誤差項前の部分は文系における単純な平均、つまり「チェックシャツ着用人数/189」で推定されていそうです。つまり189人の5%、9.45人がおそらく観測されたと思われます。9人か10人かちょっと迷いますが、一旦今回は9人だったと考えましょう。
※実際小谷先生にX(旧Twitter)で確認させていただいたところ推測が正しく文系のチェックシャツ人数は9人だったと教えていただきました。
こうしておそらく以下のデータによって今回の論点が検証されたと考えられます。
たったこれだけのデータですが、いろいろやってみましょう。
そもそも何を明らかにしたいの?
データが整ったらあとは料理するだけです。
しかしながら意外にデータ分析のお仕事をしていると目の当たりにするのが、大量のデータに惑わされて何を明らかにしたいのかが当事者もわかっていないケースが結構あったりします。なのでデータの海で溺れないように当たり前かもしれませんが、ちゃんと明文化しておきましょう。
今回は得られたデータにおいて、以下の論点を白黒はっきりさせたい!ということです。
検証方法を検討する
さてさて、ここから検証方法を考えていきます。
めちゃくちゃ単純に比較するのであれば、以下のようにチェックシャツ割合を計算すればいいでしょう。
文系よりも理系のほうが約2倍も高いと結論できます。このような単純な平均比較はビジネスの世界でもよく行われていますね。
しかしながら、本当にそれでいいのでしょうか?
データに関わる人間であれば常に結果を疑って見る意識はとても大事です。例えば以下のように10分の1程度のサンプルしか集まっていなかったらどうでしょうか?計算されるチェックシャツ着用率は全く同じです。
先程と同じ値ですが多くの人がこのデータをもって理系のほうがチェックシャツ着用率が高いと結論を出すには直感的に躊躇すると思います。つまり単純な平均の比較ではこのようなどれくらいサンプルを取得して算出した結果なのか、という「誤差」の情報が消えてしまうため誤った判断になってしまう可能性もあるのです。
そこで人類は限られたデータから誤差も考慮して本当に有意な差があったのかどうかをよしなに検証できるようになんとかかんとか数式をゴリゴリいじってきたわけですね。それが統計なわけです。人類すごいですね。
というわけで、小谷先生の観測データを使って世間を二分する難問に挑んで行きたいと思います。
いろいろな方法で検証してみる
今回は書籍に載っていた以外の方法も合わせて検証したいと思います。
検証方法①:理論式からざっくり幅を推定してみる
記事の改めてのおさらいです。
書籍及び記事に乗っている方法は、要は理論式を使ってざっくり見積もる方法と言ってもいいと思います。
今回はチェックシャツを着用するかどうかをそこそこレアな事象とみなし、ポアソン分布に従ったN回の独立施行の結果と解釈していると思われます。そしてそれなりのサンプルサイズがあることから中心極限定理によって正規分布に近似しているわけです。
細かい説明は省きますが、90%信頼区間というやつを以下のように算出することができます。
この式の何がすごいのかというとそこそこレアな現象をカウントした値だけから誤差を見積もることができるのです!これは意外に普段の生活やビジネスでも使える場面がある便利な見積もり式なので覚えておくと便利です。
上記の式を使ってチェックシャツ割合はサンプルサイズで割り算し、以下のように求めることができます。
解釈しやすいように値の幅(x 〜 y)で表現しましたが、これを見るとたしかに信頼区間が理系と文系若干ではありますが重なっています。おおよそ理系の方が高いようにみえますが、理系が下限の7.3%、文系が上限の7.4%となる可能性もありえるということを示しているため、理系のほうが完全にチェックシャツ率が高いとは言えないとも解釈できます。
検証方法②:独立性の検定をしてみる
今回のデータは理系 or 文系、チェックを着用している or していない、という2軸×2パターンの非常にシンプルなデータです。このような2×2のデータはビジネスの世界でもよく出てきますね。例えば典型的なのはABテストです。
このようなデータがあるときに統計的に有意な違いがあったのかを検証するには独立性の検定(カイ二乗検定)を使えばいいですね。
※他にも様々な手法があるので以下など参考になると思います。
https://blog.recruit.co.jp/rco/ab-test-logic/
from scipy.stats import chi2_contingency
import numpy as np
# 理系と文系のチェックシャツ着用者数と非着用者数を配列に格納
data = np.array([[30, 290 - 30], # 理系:着用者、非着用者
[9, 189 - 9]]) # 文系:着用者、非着用者
# カイ二乗検定を実行
chi2, p, dof, expected = chi2_contingency(data)
print(p)
# 0.044133384278055604
ということで、p値は5%未満なので、文系と理系のチェックシャツ着用率には有意な違いがあると統計的には言えそうです。
検証方法③:ベイズ推定もやってみる
さて、昨今ベイズ推定もやりやすくなったのでサクッとやってみましょう。
尤度関数をどうするとか含めていろいろやり方はあると思いますが、今回はベイズABテストなどと同じような設定でやってしまいましょう。
import pymc as pm
import arviz as az
import matplotlib.pyplot as plt
import seaborn as sns
# ============================
# データの定義
# ============================
# 理系学生のデータ
n_check_sci = 30
n_sample_sci = 290
# 文系学生のデータ
n_check_art = 9
n_sample_art = 189
# ============================
# モデリング
# ============================
with pm.Model() as model:
# 理系のチェック着用率に対する事前分布
check_rate_sci = pm.Beta('理系チェック着用率', alpha=1, beta=1)
# 文系のチェック着用率に対する事前分布
check_rate_art = pm.Beta('文系チェック着用率', alpha=1, beta=1)
# チェック着用率の理系と文系の差分
rate_diff = pm.Deterministic('文理着用率差分', check_rate_sci - check_rate_art)
# 観測データに基づく尤度関数
sci_obs = pm.Binomial('理系チェック着用人数', n=n_sample_sci, p=check_rate_sci, observed=n_check_sci)
art_obs = pm.Binomial('文系チェック着用人数', n=n_sample_art, p=check_rate_art, observed=n_check_art)
# サンプリング
trace = pm.sample(4000, tune=2000, target_accept=0.95)
# 事後分布のサマリー
summary = pm.summary(trace)
summary
# ============================
# 事後分布の差の分布を可視化
# ============================
# 理系と文系のチェックシャツ着用率の事後サンプルを抽出
check_rate_sci_samples = trace.posterior['理系チェック着用率'].values.flatten()
check_rate_art_samples = trace.posterior['文系チェック着用率'].values.flatten()
# 事後分布のプロット
plt.figure(figsize=(10, 6))
sns.kdeplot(check_rate_sci_samples, color="#0071BC", label="理系")
sns.kdeplot(check_rate_art_samples, color="#FF5151", label="文系")
plt.title("チェック着用率事後分布")
plt.xlabel("チェック着用率")
plt.legend()
plt.show()
# 事後分布の差の可視化
az.plot_posterior(trace.posterior['文理着用率差分'])
# 理系>文系となっている確率
win_rate = (trace.posterior['文理着用率差分'].values > 0).mean()
print(f'理系>文系となっている確率 : {win_rate:.2%}')
# -> 98.61%
推定された文系・理系のチェック着用率の分布は以下のようになります。
明らかに文系<理系となっていそうですね。さらにわかりやすいように確率の差分値の分布もプロットした結果が以下になります。
この分布を目に見ても明らかですが、プラスになっている確率(面積)を計算すると98.61%となり、ほぼ間違いなく観測データから考えると理系のほうが文系よりもチェック着用率が高いと言えそうです。
(補足)ベイズ推定の結果とどれくらい差があるのか?
上記のポアソン分布を仮定し、中心極限定理を適用して見積もった方法は以下のような値になりました。
この結果はベイズ推定による結果とどれくらい一致しているのでしょうか?
HDIの設定を90%にしてもう一度事後分布を可視化してみます。
これよりチェックシャツ率はそれぞれ以下の範囲になると推定されます。
最大0.5%程度のズレはあるものの、おおよそその見積もりは一致していると言えるのではないでしょうか?理論式から導かれたものなのでまぁ当たり前ではあるのですが、ちゃんとベイズ推定の結果と一致していることにちょっと感動しました。
ベイズ推定はスモールデータであっても事後分布から様々な考察ができるため非常に便利な手法ではあるのですが、このようにサクッと近似して見積もるという物理学者の方々がよくやっているような方法もかなり使える精度であることをみると、ちゃんと理論背景を理解し、数式をサクッと適用できるようにしておくことは極めて重要だなと改めて痛感した次第です。
そもそもなぜ理系はチェックシャツを好むのかという根本的な問い
さて、どうやら有意な差がありそうという結論にはなったものの、それではなぜ同じ人間という生き物であるにも関わらずそのような行動の差異が生まれるのかという根本的な疑問が湧いてきます。
小谷先生の分析では以下のような考察がありました。
なるほど、確かに日本人特有の美的感覚というようなものがあるように、数式の美しさや自然法則の美しさ、理論体系の美しさに感動するような理系特有の美的感覚というものは存在するような気がしなくもないです。
もう少し深堀りするべく、こういう明確な答えがないものは人間に聞くよりも人類の英知に総合的にアクセスできるChatGPT(ver4.0)に聞いてみました。
なんかそれっぽいですね。さらにネットをあさってみたところ以下ような説明もあり、これもなるどな感じがあります。
なぜ工学部の男子学生はチェック柄の服を着るのですか?
これらについては有力な仮説候補だと思われますが、どれもおそらく検証されていません。この行動特性を大規模に研究している方、理系生態学専門家がいたら是非ご意見いただきたいです。
今回のまとめ
今回のデータからは文系よりも理系のほうがほぼ有意にチェックシャツ着用率が高いと言えそう
おおよそ文系に対して理系は2倍程度のチェックシャツ着用率
文系理系でなぜこのような差が生まれるのかは未だに解明されていないが、理系特有の文化や行動特性にあるような気がしなくもない
理論式による見積もりをサクッとできるとおしゃれ
おしゃれは文系、理系関係なく自由
どんなことにも深く考えると学びがありますねー ではまた。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?