起こりやすさを数にする
確率は、あることがどれくらい起こりやすいかを、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日を分けたものです。
例: 天気と忙しさの日数
| 天気 | 忙しい | 静か | 合計 |
|---|---|---|---|
| 晴れ | 76 | 55 | 131 |
| 曇り | 30 | 84 | 114 |
| 雨 | 25 | 95 | 120 |
| 合計 | 131 | 234 | 365 |
学生が入力するセルは、このプレビューでは空白です。
晴れて忙しい日を数える
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))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
条件付き確率を数える
# 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と比べて、高いでしょうか。高いなら、忙しい日は続きやすいと言えます。