クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

二項分布と正規分布

このレッスンのあとで: 二項分布と正規分布を使って、ある結果が起こる確率を言うことができる。

55分のレッスンコマンド3件JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

値の集まり方を形で見る

分布は、データの値がどのあたりに多く、どのあたりに少ないかを表した形です。二項分布と正規分布を読めれば、「どれくらい起こりうるか」という多くの問いに答えられます。

貸し自転車の店は、1週間に忙しい日が何日あるか、1日の貸出台数がどのあたりに集まるかを知りたいのです。

このレッスンのゴール

メモ

二項分布と正規分布を使って、ある結果が起こる確率を言うことができる。

キーワード

ことばいみれい
分布値ごとの、起こりやすさの並び
二項分布成功か失敗かの試行をくり返したときの、成功の回数の分布
組み合わせの数n回の中からk回を選ぶ、選び方の数5日から2日で10通り
正規分布平均を中心とした、左右対称の釣り鐘形の分布
経験則平均から標準偏差1つ分以内に約68%、2つ分以内に約95%
z得点平均から標準偏差いくつ分離れているかを表す数

学生が入力するセルは、このプレビューでは空白です。

回数を数えると二項分布になる

毎回、成功か失敗かだけで、成功の確率が同じ試行を、n回くり返します。成功の回数がしたがう分布が二項分布です。

忙しい日の確率を、計算しやすいように0.4とします。3日のうち忙しい日が何日になるかを、場合分けして数えます。

例: 3日のうち忙しい日の数

忙しい日数選び方1通りの確率確率
010.6 × 0.6 × 0.6 = 0.2160.216
130.4 × 0.6 × 0.6 = 0.1440.432
230.4 × 0.4 × 0.6 = 0.0960.288
310.4 × 0.4 × 0.4 = 0.0640.064
合計81

学生が入力するセルは、このプレビューでは空白です。

選び方の数は掛けて割れば出る

n日からk日を選ぶ選び方の数を、組み合わせの数と言います。5日から2日なら、5 × 4 ÷ (2 × 1) で10通りです。

ちょうどk日の確率は、選び方の数に、0.4をk回かけたものと、0.6を残りの回数かけたものをかけて求めます。5日のうち2日なら、10 × 0.16 × 0.216 で0.3456です。

5日の確率を全部出す

コマンド
docker exec jupyter python3 -c "import math; print([round(math.comb(5, k) * 0.4 ** k * 0.6 ** (5 - k), 4) for k in range(6)])"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

二項分布を関数で出す

コード: python
# 5日のうち、ちょうど k 日が忙しい確率です。
def choose(n, k):
    ways = 1
    for i in range(k):
        ways = ways * (n - i) // (i + 1)
    return ways

def exactly(n, k, p):
    return choose(n, k) * p ** k * (1 - p) ** (n - k)

for k in range(6):
    print(k, "日:", round(exactly(5, k, 0.4), 4))
# p を 0.4 から 0.5 に変えて、もう一度実行してください。
# いちばん高い確率はどの日数に動きますか。

釣り鐘形が正規分布

身長やテストの点のように、平均のまわりに多く集まり、左右にほぼ対称に減っていく分布を正規分布と呼びます。形は平均と標準偏差だけで決まります。

平均から標準偏差1つ分以内に約68%、2つ分以内に約95%が入ります。これが経験則です。

経験則の目安

範囲入る割合の目安
平均 ± 標準偏差 1つ分約68%
平均 ± 標準偏差 2つ分約95%
平均 ± 標準偏差 3つ分約99.7%

学生が入力するセルは、このプレビューでは空白です。

貸出の日数が経験則に合うか

コマンド
docker exec jupyter python3 -c "import csv, statistics as s; h = [int(r['hires']) for r in csv.DictReader(open('hires.csv'))]; m = s.mean(h); d = s.pstdev(h); print(sum(1 for x in h if abs(x - m) <= d), sum(1 for x in h if abs(x - m) <= 2 * d), len(h))"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

z得点は標準偏差の個数

平均からの差を、標準偏差の個数で表した数がz得点です。値から平均を引き、標準偏差で割って求めます。

平均を270台、標準偏差を80台とします。350台の日は平均より80台多く、ちょうど標準偏差1つ分なので、z得点は1です。

例: 貸出台数とz得点

貸出台数平均との差z得点
190-80-1
27000
350801
4301602

学生が入力するセルは、このプレビューでは空白です。

週ごとの忙しい日数を数える

コマンド
docker exec jupyter python3 -c "import csv; rows = list(csv.DictReader(open('hires.csv'))); b = [int(r['hires']) >= 300 for r in rows]; weeks = [sum(b[i:i + 7]) for i in range(0, 364, 7)]; print([weeks.count(k) for k in range(8)])"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

週ごとの忙しい日数と予想

忙しい日数実際の週二項分布の予想
0112.3
1129.1
2615.2
3614.2
468.0
532.7
660.5
720.0

学生が入力するセルは、このプレビューでは空白です。

よくある間違い

注意

多くの人は、二項分布がどんな回数にも当てはまると考えます。成功の確率が毎回同じで、毎回が独立のときだけです。寒い週は忙しい日が少なく、暑い週は多いので、表のように実際は両端に偏ります。

さらに挑戦: 週末だけで経験則

ノートブックで、土日の日だけを取り出してください。平均から標準偏差1つ分以内と、2つ分以内に入る日の割合を求めます。

経験則の68%と95%に近いでしょうか。近い、または遠いと言える理由を、一文で書きましょう。

このラボとソースについて: JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。