確率分布:どの値が、どれくらいの確率で出るか
確率変数の「それぞれの値が出る確率」をまとめたものを、確率分布 と呼びます。前のレッスンのサイコロの表(1〜6がどれも 61)も、確率分布の1つです。
世の中の偶然には、よく出てくる「型」があります。型ごとに名前が付いていて、機械学習でもよく使います。
ベルヌーイ分布:1回だけの「当たりか、はずれか」
硬貨を1回投げて、表なら1、裏なら0とします。表の確率を p とすると、次のようになります。
結果が「1か0か」の2通りしかない確率分布を、ベルヌーイ分布 と呼びます。期待値は 1×p+0×(1−p)=p です。
第5章のロジスティック回帰は、「このメールが迷惑メールである確率は0.8」のように、ベルヌーイ分布の p を予測するモデル だと見ることができます。
ベルヌーイ分布を、結果が3通り以上ある場合(サイコロの目、手書き数字の0〜9など)に広げたものを、カテゴリ分布(マルチヌーイ分布)と呼びます。第7章のCNNがソフトマックス関数で出した「10クラスそれぞれの確率」は、カテゴリ分布を予測していたことになります。
二項分布:当たりか、はずれかを n 回繰り返したときの、当たりの回数
表の確率が0.5の硬貨を10回投げて、表が何回出るかを数えます。表が k 回出る確率は、次の式で計算できます。
P(X=k)=10Ck×0.5k×0.510−k
10Ck は、「10回のうち、表になる k 回を選ぶ選び方の数」です。例えば、10回中5回が表になる並び方は252通りあり、1つの並び方が起こる確率はどれも 0.510=10241 なので、P(X=5)=1024252≈0.246 です。
硬貨を10回投げたときの、表の回数ごとの確率(式で計算)。5回が0.246で最も高く、4回と6回が0.205、3回と7回が0.117と、5回から離れるほど低くなる。0回と10回は0.001
Pythonで「硬貨を10回投げる」を1万回繰り返し、式と比べました。
式とシミュレーションが、ほぼ一致しました。1回の当たりの確率が p で、n 回繰り返したときの当たりの回数の分布を 二項分布 と呼びます。期待値は np(この例では 10×0.5=5)、分散は np(1−p)(この例では2.5)です。実験では、平均4.998、分散2.509でした。
正規分布と、中心極限定理
正規分布:平均の近くが多く、離れるほど少ない、つりがね型
身長のように、細かい値をとる数では、「ちょうど170.000…cmになる確率」を考えても意味がありません。代わりに、「どのあたりの値が出やすいか」を曲線で表します。曲線が高いところほど、その近くの値が出やすいことを表し、曲線の下の面積が、その範囲の値が出る確率になります(全体の面積は1)。
平均の近くが一番出やすく、左右対称に、離れるほど出にくくなる、つりがね型の分布を 正規分布 と呼びます(ガウス分布とも呼びます)。正規分布の形は、平均 と 標準偏差 の2つの数だけで決まります。
平均170の正規分布を2つ重ねた図。標準偏差6の曲線は、152〜188cmあたりまで広がる、なだらかなつりがね型。標準偏差3の曲線は、161〜179cmあたりに集まった、幅が半分で高さが2倍の、とがったつりがね型。どちらも170cmで一番高い
標準偏差が小さいほど、値が平均の近くに集まり、曲線は細く高くなります(面積はどちらも1)。
「平均 ± 標準偏差の何倍」に入る割合は、いつも同じ
平均170、標準偏差6の正規分布に従う数を、Pythonで1万個作って数えました。
正規分布なら、平均と標準偏差がどんな値でも、この割合は約68%・95%・99.7%になります。「平均から標準偏差の3倍以上離れた値」はめったに出ないので、データの中の異常な値を見つける目安にも使われます。
中心極限定理:平均をとると、正規分布に近づく
サイコロの目は1〜6が同じ確率で出るので、つりがね型ではありません。ところが、サイコロを何個か振って、その目の平均をとる と、その平均の分布は正規分布に近づいていきます。Pythonで1万回ずつ試し、平均のばらつき(標準偏差)を測りました。
平均をとる数を増やすほど、平均は3.5の近くに集まり(ばらつきは 個数1 倍に小さくなる)、分布の形はつりがね型に近づきます。これを 中心極限定理 と呼びます。
多くの小さな偶然が足し合わさってできる数(身長、測定の誤差など)が正規分布に近くなるのは、このためです。第4章の線形回帰で「誤差」と呼んだものも、多くの場合、正規分布だと考えます(レッスン4で使います)。
共分散と相関、Pythonで確かめる、振り返り
共分散:2つの数が、一緒に増えるか
身長と体重のように、2つの数の関係を調べたいことがあります。身長が平均より高い人は、体重も平均より重いことが多いでしょう。これを数で表すのが 共分散 です。
1人ずつ「身長 − 身長の平均」と「体重 − 体重の平均」を掛け、その平均をとります。
- 両方とも平均より大きい(プラス × プラス)、または両方とも小さい(マイナス × マイナス)人が多いと、プラス になる
- 片方が大きいともう片方が小さい人が多いと、マイナス になる
- 関係がなければ、プラスとマイナスが打ち消し合って 0に近く なる
Pythonで作った身長と体重のデータ(200人)では、共分散は38.5でした。一方、身長と、身長とは別々に作った靴のサイズの共分散は0.49で、0に近い値でした。
相関係数:単位に左右されない「関係の強さ」
共分散には、単位によって値が変わる弱点があります(身長をcmからmに変えると、共分散は100分の1になります)。そこで、共分散を、2つの数の標準偏差で割ったものを使います。これを 相関係数 と呼び、必ず −1 から 1 の間になります。
- 1に近い: 一方が増えると、もう一方もほぼ直線的に増える
- −1 に近い: 一方が増えると、もう一方はほぼ直線的に減る
- 0に近い: 直線的な関係はない
身長と体重の相関係数は0.746でした。第3章の散布図でいえば、点が右上がりの帯のように並んでいる状態です。
ただし、相関があっても、一方が他方の原因とは限りません(第9章の、アイスの売り上げと水難事故の例)。
Pythonで確かめる
import numpy as np
from math import comb
rng = np.random.default_rng(0)
heads = rng.binomial(10, 0.5, 10000) # 表の確率0.5の硬貨を10回投げる、を1万回
print((heads == 5).mean()) # → 0.2453(表が5回だった割合)
print(comb(10, 5) * 0.5 ** 10) # → 0.24609…(式で計算した確率)
x = rng.normal(170, 6, 10000) # 平均170、標準偏差6の正規分布から1万個
print(x.mean(), x.std()) # → 約170と約6
# height, weight: 身長と体重の配列(200人分)
print(np.cov(height, weight, ddof=0)) # 共分散の表(右上・左下が共分散)
print(np.corrcoef(height, weight)[0, 1]) # 相関係数
comb(10, 5) は、10個から5個を選ぶ選び方の数(252)です。np.cov は、「身長どうし(分散)・身長と体重(共分散)・体重どうし(分散)」をまとめた2行2列の表を返します。ddof=0 は、第3章と同じく、人数で割ることを指定します。
よくある誤解
- 「データは、いつも正規分布になる」: 年収のように、少数の人がとても大きな値をとるデータは、左右対称になりません。分布の形は、値の範囲ごとに個数を数えた棒グラフ(ヒストグラム、Matplotlib の
plt.hist)を描いて確かめます
- 「共分散が大きいほど、関係が強い」: 共分散は単位で値が変わります。関係の強さは、相関係数で比べます
- 「相関係数が0なら、2つの数は無関係」: 相関係数が表すのは直線的な関係だけです。放物線のような関係があっても、0に近くなることがあります
振り返り
- ベルヌーイ分布は1回の「当たりか、はずれか」、二項分布は n 回繰り返したときの当たりの回数の分布
- 正規分布は、平均と標準偏差で決まるつりがね型。平均 ± 標準偏差の1・2・3倍に、約68%・95%・99.7%が入る
- 中心極限定理: 多くの偶然の平均は、正規分布に近づく
- 共分散と相関係数は、2つの数が一緒に増えるかを表す。相関は、原因を意味しない