「この事象はX回中にY回の確率で発生します。」

# はじめに

さまざまな場面である事象が発生する確率や精度を算出し、それを伝える場面があると思います。（例えば、「この事象が発生する確率は0.7327、73.27%です。」など。）この時、確率を言い換えて、X回にY回ですと言いたくありませんか？もしくは、「つまりは、何回中に何回発生するの？」と尋ねられることがあるかと思います。特に、聞き手は具体的にも聞きたいと思っています。

確率の値のみを見て、本記事のタイトルのような「この事象はX回中にY回の確率で発生します。」と言いたい時に、@daikikatsuragawa は頭がこんがらがってしまったことがありました。それゆえ、確率の値を入力値として、分数に変換し出力し、「この事象はX回中にY回の確率で発生します。」と言うことができるようサポートする関数を作成しました。

# 「この事象はX回中にY回の確率で発生します。」

コードは以下のようになりました。

```python:sample(1)
from decimal import Decimal
from fractions import Fraction


# 確率を分数に変換する関数（Fraction型）
def be_result_fraction(result, max_denominator=100):
    return Fraction(Decimal(str(result))).limit_denominator(max_denominator)

# あらかじめ算出した確率
result = 0.33
# 分母の最大値
max_denominator = 100

result_fraction = be_result_fraction(result, max_denominator)

# 分数に変換した確率
print(result_fraction)

# 活用例（「この事象はX回中にY回の確率で発生します。」）
print("「この事象は{}回中に{}回の確率で発生します。」".format(result_fraction.denominator, result_fraction.numerator))
```

```bash:sample_result(1)
33/100
「この事象は100回中に33回の確率で発生します。」
```

ランダムにいくつか確率を生成し、試してみましょう。また、分母の最大値も変化させていきます。

```python:sample(2)
import random

for i in range(10):
    result = random.random()
    print("確率＝{}の場合".format(result))
    result_fraction=be_result_fraction(result, max_denominator=10)
    print("「この事象は{:4}回中に{:4}回の確率で発生します。」".format(result_fraction.denominator, result_fraction.numerator))
    result_fraction=be_result_fraction(result, max_denominator=100)
    print("「この事象は{:4}回中に{:4}回の確率で発生します。」".format(result_fraction.denominator, result_fraction.numerator))
    result_fraction=be_result_fraction(result, max_denominator=1000)
    print("「この事象は{:4}回中に{:4}回の確率で発生します。」".format(result_fraction.denominator, result_fraction.numerator))
    print("------------------------------------------------------------")
```

```bash:sample_result(2)
確率＝0.09224231812091621の場合
「この事象は  10回中に   1回の確率で発生します。」
「この事象は  65回中に   6回の確率で発生します。」
「この事象は 477回中に  44回の確率で発生します。」
------------------------------------------------------------
確率＝0.051084073961926824の場合
「この事象は  10回中に   1回の確率で発生します。」
「この事象は  98回中に   5回の確率で発生します。」
「この事象は 646回中に  33回の確率で発生します。」
------------------------------------------------------------
確率＝0.7599338943119561の場合
「この事象は   4回中に   3回の確率で発生します。」
「この事象は  25回中に  19回の確率で発生します。」
「この事象は 604回中に 459回の確率で発生します。」
------------------------------------------------------------
確率＝0.031495030898698206の場合
「この事象は   1回中に   0回の確率で発生します。」
「この事象は  95回中に   3回の確率で発生します。」
「この事象は 127回中に   4回の確率で発生します。」
------------------------------------------------------------
確率＝0.8164261278465491の場合
「この事象は   5回中に   4回の確率で発生します。」
「この事象は  49回中に  40回の確率で発生します。」
「この事象は 207回中に 169回の確率で発生します。」
------------------------------------------------------------
確率＝0.5320604454866015の場合
「この事象は   9回中に   5回の確率で発生します。」
「この事象は  47回中に  25回の確率で発生します。」
「この事象は 733回中に 390回の確率で発生します。」
------------------------------------------------------------
確率＝0.49972055635837187の場合
「この事象は   2回中に   1回の確率で発生します。」
「この事象は   2回中に   1回の確率で発生します。」
「この事象は 999回中に 499回の確率で発生します。」
------------------------------------------------------------
確率＝0.05425194009628509の場合
「この事象は  10回中に   1回の確率で発生します。」
「この事象は  92回中に   5回の確率で発生します。」
「この事象は 682回中に  37回の確率で発生します。」
------------------------------------------------------------
確率＝0.1371848170653207の場合
「この事象は   7回中に   1回の確率で発生します。」
「この事象は  51回中に   7回の確率で発生します。」
「この事象は 277回中に  38回の確率で発生します。」
------------------------------------------------------------
確率＝0.5388218822530633の場合
「この事象は   9回中に   5回の確率で発生します。」
「この事象は  13回中に   7回の確率で発生します。」
「この事象は 425回中に 229回の確率で発生します。」
------------------------------------------------------------
```

分子、分母が適切な値になっていますね。これに基づき微調整して他者に伝えることができそうです。

# まとめ

これにより、「この事象はX回中にY回の確率で発生します。」と言いたい放題です。

# 参考

- [fractions --- 有理数 — Python 3.8.2 ドキュメント](https://docs.python.org/ja/3/library/fractions.html)
- [decimal --- 十進固定及び浮動小数点数の算術演算 — Python 3.8.2 ドキュメント](https://docs.python.org/ja/3/library/decimal.html)
- [random --- 擬似乱数を生成する — Python 3.8.2 ドキュメント](https://docs.python.org/ja/3/library/random.html)
- [Pythonで分数を取り扱う話 - Qiita](https://qiita.com/sakabe/items/0333f06cc6064a70cc93)
- [Pythonで小数を取り扱う話 - Qiita](https://qiita.com/sakabe/items/60e5042ec406c02c3d04)