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

無料レッスン

確率の求め方

このレッスンのあとで: ある出来事が起こる確率を、数えて求めることができる。

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

起こりやすさを数にする

確率は、あることがどれくらい起こりやすいかを、0から1の数で表したものです。確率がわかれば、「明日は忙しくなりそうか」を、勘ではなく数で考えられます。

貸し自転車の店は、365日の記録を持っています。晴れの日と、忙しい日が、どれくらい重なるのかを数えてみます。

このレッスンのゴール

メモ

ある出来事が起こる確率を、数えて求めることができる。

キーワード

ことばいみれい
確率起こりやすさを、0から1で表した数
事象起こるかどうかを知りたい出来事雨の日
余事象その事象が起こらない場合
クロス集計表2つの分類で、日数を並べた表
条件付き確率条件がわかっているときの確率
独立一方が起こっても、他方の確率が変わらないこと

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

確率は数えて割れば求まる

その事象が起こる日数を、全部の日数で割ると、確率になります。確率は、いつも0以上で1以下です。

このレッスンでは、貸出が300台以上の日を「忙しい日」と呼びます。365日のうち、忙しい日は131日です。忙しい確率は、131 ÷ 365 で約0.36です。

忙しい日を数える

コマンド
docker exec jupyter python3 -c "import csv; rows = list(csv.DictReader(open('hires.csv'))); busy = [r for r in rows if int(r['hires']) >= 300]; print(len(busy), len(rows), round(len(busy) / len(rows), 3))"

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

「かつ」と「または」の数え方

「AかつB」は、両方が起こる日を数えます。「AまたはB」は、AとBの日数を足してから、重なりを1度引きます。

重なりを引き忘れると、同じ日を2回数えてしまいます。次の表は、天気と忙しさで365日を分けたものです。

例: 天気と忙しさの日数

天気忙しい静か合計
晴れ7655131
曇り3084114
雨2595120
合計131234365

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

晴れて忙しい日を数える

コマンド
docker exec jupyter python3 -c "import csv; rows = list(csv.DictReader(open('hires.csv'))); print(sum(1 for r in rows if r['weather'] == 'sunny' and int(r['hires']) >= 300), sum(1 for r in rows if r['weather'] == 'sunny'))"

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

よくある間違い

注意

多くの人は、「または」を、2つの確率を足すだけで求めます。両方に当てはまる日が2回数えられて、確率が大きくなりすぎます。重なりを1度引いてください。

条件がわかると確率が変わる

条件付き確率は、ある条件がわかっているときの確率です。表の行を1つ選び、その行の合計で割ります。

晴れとわかっている日に忙しい確率は、76 ÷ 131 で約0.58です。全体の0.36より高くなります。

独立なら確率はかけ算になる

天気が貸出に関係ないなら、晴れの日でも全体でも、忙しい確率は同じはずです。0.58 と 0.36 は違うので、天気と忙しさは独立ではありません。

独立な2つが両方起こる確率は、2つの確率のかけ算です。

天気ごとの忙しい確率

コマンド
docker exec jupyter python3 -c "import csv; rows = list(csv.DictReader(open('hires.csv'))); sunny = [r for r in rows if r['weather'] == 'sunny']; rainy = [r for r in rows if r['weather'] == 'rainy']; print(round(sum(1 for r in sunny if int(r['hires']) >= 300) / len(sunny), 2), round(sum(1 for r in rainy if int(r['hires']) >= 300) / len(rainy), 2))"

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

条件付き確率を数える

コード: python
# 6日分の記録です。天気と、忙しさ。
days = [["sunny", "busy"], ["sunny", "busy"], ["sunny", "quiet"],
        ["rainy", "quiet"], ["rainy", "quiet"], ["rainy", "busy"]]
busy = 0
sunny = 0
sunny_busy = 0
for day in days:
    if day[1] == "busy":
        busy = busy + 1
    if day[0] == "sunny":
        sunny = sunny + 1
        if day[1] == "busy":
            sunny_busy = sunny_busy + 1
print("忙しい確率:", round(busy / len(days), 2))
print("晴れて忙しい確率:", round(sunny_busy / len(days), 2))
print("晴れとわかって忙しい確率:", round(sunny_busy / sunny, 2))
# 最後の行を ["rainy", "quiet"] に変えて、もう一度実行してください。

さらに挑戦: 続けて忙しい確率

ノートブックで、前の日も忙しかった日のうち、その日も忙しかった日の割合を求めてください。ひとつ前の行と比べます。

全体の0.36と比べて、高いでしょうか。高いなら、忙しい日は続きやすいと言えます。

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

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