データ分析系プログラマーのブログ

主にPythonを使ったデータ分析や機械学習をやっています。

Pythonを使った二項分布の求め方

離散型確率分布のうち、コインを投げた時のような結果が2つしかない場合を二項分布と言います。この記事では、pythonのライブラリを使って二項分布の確率を解析的に求める場合と、数値的に求める場合について紹介しています。

ベルヌーイ試行とは

コインを投げたときに表が出るか裏が出るかというように、何かを行ったときに起こる結果が2つしかない試行のことをベルヌーイ試行といいます。

二項分布とは

ベルヌーイ試行をn回やって、成功する回数Xが従う確率分布を二項分布と言います。


P(X = k) = {}_{n}C_k p^k(1-p)^{n-k}

例えば、コインを8回投げて、表が4回出る確率は以下のようになります。


P(X = 4) = {}_{8}C_4 0.5^4(1-0.5)^{8-4}\\
=\frac{8\times7\times6\times5}{4\times3\times2\times1}\times0.0625\times0.0625 = 0.273

二項分布の期待値と分散

確率変数Xが二項分布に従う時、Xの期待値と分散は以下のようになります。


E(X) = np\\
V(X)=np(1-p)

例えば、コインを8回投げた時の期待値と分散は以下のようになります。


E(X) = 8\times0.5 = 4\\
V(X)=8\times0.5\times(1-0.5) = 2

combを使って解析的に二項分布を求める場合

先ほどの二項分布の確率を求める式を使って求める場合は、scipyのcombを使用して解析的に二項分布の確率を求めることができます。

from scipy.special import comb

n = 8
k = 4
p = 0.5

px = comb(8, 4, exact=True)*p**k*(1 - p)**(n -k)
print("P(X = 4) = ", px)

P(X = 4) = 0.2734375

binomialを使って二項分布を試行し数値的に確率を求める場合

binomialを使用すると、二項分布を実際に試行することができます。以下の例では、8回 コインを投げるのを100セット実行し、表の出る回数を出力しています。そして、実際に100セットを実行したデータを使って二項分布の確率を題しています。100セットの場合より、100000セット実行したデータから求めた確率の方が解析的に求めた確率に近くなっていることがわかります。

import numpy as np
n, p = 8, .5 
s = np.random.binomial(n, p, 100)
print(s)
[5 4 3 4 5 2 5 6 4 3 4 3 5 6 5 5 1 4 4 4 4 4 3 5 6 3 7 3 4 3 4 2 5 6 4 4 2
 6 5 4 5 3 6 2 4 4 5 1 1 4 3 5 3 5 6 3 4 5 2 5 5 2 1 6 4 6 6 4 3 1 2 3 5 6
 5 3 2 3 3 2 5 3 5 3 5 2 7 5 3 4 5 2 6 3 4 2 7 4 4 6]
n, p = 8, .5 
s = sum(np.random.binomial(n, p, 100) == 4)/100
print("P(X = 4) = ", s)

P(X = 4) = 0.29

n, p = 8, .5 
s = sum(np.random.binomial(n, p, 100000) == 4)/100000
print("P(X = 4) = ", s)

P(X = 4) = 0.27408

binomを使って解析的に二項分布を求める場合

scipyのbinomを使用すると引数を指定するだけで二項分布の確率を求めることができます。combでは、式を記述する必要がありましたが、こちらの場合は引数を設定するだけで良いので、二項分布の確率を求める場合は、もっとも簡単にコードを書くことができます。

from scipy.stats import binom

p = 0.5
N = 8
k = 4

print("P(X = 4) = " , binom.pmf(k, N, p)) 

P(X = 4) = 0.27343750000000017

参考

統計学の時間 | 統計WEB

連続型確率変数の期待値と分散について

連続型確率変数においても期待値と分散を計算することができます。期待値とは、1回の試行で得られる値の平均値です。また分散とは、ばらつき具合を示しています。この記事では、Pythonを使った連続型確率変数における期待値と分散の求め方について紹介しています。

確率変数の期待値(連続型確率変数)

連続型確率変数の期待値は、積分をすることによって計算することができます。


E(X) = \int_{- \infty}^{\infty}xf(x)dx

例えば、確率密度関数f(x) = 1/8において、確率変数Xが0から8までの値をとる時、Xが0以上、8以下の時の期待値は以下のように計算できます。


E(X) = \int_{0}^{8}x\times\frac{1}{8}dx

= [ \frac{x^2}{16} ]_{0}^{8} = \frac{64}{16} = 4

確率変数の分散(連続型確率変数)

Xの期待値をE(X)=mu(ミュー)とした時、連続型確率変数の分散は以下のようになります。


V(X) = \int_{- \infty}^{\infty}(x-\mu)^2f(x)dx

例えば、確率密度関数f(x) = 1/8において、確率変数Xが0から8までの値をとる時、Xが0以上、8以下の時の分散は以下のように計算できます。ただし、期待値E(X)=4であることを用います。


V(X) = \int_{0}^{8}(x-4)^2\frac{1}{8}dx

= [ (x-4)^3\times\frac{1}{24} ]_{0}^{8} = \left\{\left(4\right)^3 -\left(-4\right)^3\right\}\times\frac{1}{24} \\=\left\{64+64\right\}\times\frac{1}{24}= 128\times\frac{1}{24}=\frac{16}{3}

また、分散は、期待値を用いると次のような式でも計算できます。


V(X) = E(X^2) - \{E(X)\}^2

例えば、確率密度関数f(x) = 1/8において、確率変数Xが0から8までの値をとる時、Xが0以上、8以下の時の期待値はE(X)=4、分散はV(X) =16/3と計算されましたが、期待値から分散を計算すると以下のようになります。


E(X^2) = \int_{0}^{8}x^2f(x)dx = \int_{0}^{8}x^2\times\frac{1}{8}dx = \int_{0}^{8}\frac{1}{8}x^2dx

= [ \frac{x^3}{24} ]_{0}^{8} = \frac{512}{24}= \frac{64}{3}

\{E(X)\}^2 = (4)^2 = 16

V(X) = E(X^2) - \{E(X)\}^2 =\frac{64}{3} -  16 =\frac{16}{3}

連続型確率分布の期待値と分散の例その1(sympy)

以下の例では、Pythonのsympyとscipyを使ってそれぞれ期待値と分散を求めています。sympyを使うと、分数のまま積分を行うことができます。

期待値の計算


E(X) = \int_{- \infty}^{\infty}xf(x)dx
from fractions import Fraction
import sympy as sym

x = sym.Symbol('x')
f = Fraction(1, 8)
ex = f*x
sym.integrate(ex, (x, 0, 8))

4

以下の式で分散を求める場合


V(X) = \int_{- \infty}^{\infty}(x-\mu)^2f(x)dx
mu = 4
vx = f*(x - mu)**2
sym.integrate(vx, (x, 0, 8))

16/3

以下の式で分散を求める場合


V(X) = E(X^2) - \{E(X)\}^2
ex21 = f*x**2
ex22 = mu**2
vx = sym.integrate(ex21, (x, 0, 8)) - ex22
print(vx)

16/3

連続型確率分布の期待値と分散の例その2(scipy)

scipyを使った積分では、計算結果が数値のみであり、タプルで結果が返されるので、期待値を使った分散の計算ではfor文で計算する必要があります。

期待値の計算


E(X) = \int_{- \infty}^{\infty}xf(x)dx
import numpy as np
from scipy import integrate

def ex(x):
    return f*x

integrate.quad(ex, 0, 8)

(4.0, 4.440892098500626e-14)

以下の式で分散を求める場合


V(X) = \int_{- \infty}^{\infty}(x-\mu)^2f(x)dx
mu = 4

def vx(x):
    return f*(x - mu)**2

integrate.quad(vx, 0, 8)

(5.333333333333333, 5.921189464667501e-14)

以下の式で分散を求める場合


V(X) = E(X^2) - \{E(X)\}^2
ex22 = mu**2

def ex21(x):
    return f*x**2

ex21_re = integrate.quad(ex21, 0, 8)

for i, j in enumerate(ex21_re):
    vx = j - ex22
    print(vx)
    
    if i == 0:
        break

5.333333333333336

参考

統計学の時間 | 統計WEB

離散型確率変数の期待値と分散について

離散型確率変数においても期待値と分散を計算することができます。期待値とは、1回の試行で得られる値の平均値です。また分散とは、ばらつき具合を示しています。この記事では、Pythonを使った離散型確率変数における期待値と分散の求め方について紹介しています。

確率変数の期待値(離散型確率変数)

離散型確率変数の期待値は以下のように表せます。


E(X) = \sum_{i=1}^{n}x_i \times p_i

例えば、サイコロを投げた時に出る目を確率変数Xとすると、期待値は次のように計算できます。


E(X) = \sum_{i=1}^{6}x_i \times p_i =  1\times\frac{1}{6}+2\times\frac{1}{6}+3\times\frac{1}{6}+4\times\frac{1}{6}+5\times\frac{1}{6}+6\times\frac{1}{6}\\=\frac{21}{6}=3.5

確率変数の分散(離散型確率変数)

Xの期待値をE(X)=mu(ミュー)とした時、離散型確率変数の分散は以下のようになります。


V(X) = \sum_{i=1}^{n}(x_i - \mu)^2p_i

例えば、サイコロを投げた時に出る目を確率変数Xとするとき、分散は次のように計算できます。ただし、期待値E(X)=3.5であることを用います。


V(X) = \sum_{i=1}^{n}(x_i - \mu)^2p_i = \sum_{i=1}^{n}(x_i - 3.5)^2p_i

= \frac{(1-3.5)^2}{6}+\frac{(2-3.5)^2}{6}+\frac{(3-3.5)^2}{6}+\frac{(4-3.5)^2}{6}+\frac{(5-3.5)^2}{6}+\frac{(6-3.5)^2}{6}

= \frac{1}{6}\{6.25+2.25+0.25+0.25+2.25+6.25\}=\frac{17.5}{6}=\frac{35}{12}

また、分散は以下のようにも求めることができます。


V(X) = E(X^2) - \{E(X)\}^2

E(X^2) = \sum_{i=1}^{6}x_i^2 \times p_i =  1^2\times\frac{1}{6}+2^2\times\frac{1}{6}+3^2\times\frac{1}{6}+4^2\times\frac{1}{6}+5^2\times\frac{1}{6}+6^2\times\frac{1}{6}\\=\frac{91}{6}

\{E(X)\}^2 = (\frac{21}{6})^2 = \frac{49}{4}

V(X) = E(X^2) - \{E(X)\}^2 = \frac{91}{6} - \frac{49}{4} = \frac{35}{12}

離散型確率分布の期待値と分散の例

以下の例では、Pythonのリストを使って期待値と分散を求めています。最初にリストに1から6までのデータを用意して、確率を求めます。次に、期待値をexとして、for文を使って期待値を計算します。分散は、二つの求め方に合わせて、それぞれfor文を使ったりして計算しています。

from fractions import Fraction

data = [1,2,3,4,5,6]
n = len(data)
k1 = [i for i in data if i == 1]
k1 = len(k1)
p = Fraction(k1, n)
print("サイコロを1回投げた時の確率",p)

サイコロを1回投げた時の確率 1/6

期待値の計算


E(X) = \sum_{i=1}^{n}x_i \times p_i
ex = 0
for i in data:
    ex += p*i

print("期待値E(X)の値", ex)

期待値E(X)の値 7/2

以下の式で分散を求める場合


V(X) = \sum_{i=1}^{n}(x_i - \mu)^2p_i
vx = 0
for i in data:
    vx += p*(i - ex)**2

print("分散V(X)の値", vx)

分散V(X)の値 35/12

以下の式で分散を求める場合


V(X) = E(X^2) - \{E(X)\}^2
ex21 = 0
for i in data:
    ex21 += p*i**2
    
ex22 = ex**2

vx2 = ex21 - ex22
print("分散V(X)の値", vx2)

分散V(X)の値 35/12

参考

統計学の時間 | 統計WEB

連続型確率分布と確率密度関数について

確率を求める場合には、サイコロやコインと言ったとびとびの値を取るような離散型変数のものと、重さや温度のように連続した値を取るような連続型変数という2種類の変数があります。この記事では、連続型変数における確率分布とその確率を表す確率密度関数について紹介しています。

連続型確率分布

確率変数が連続型の場合の確率分布を連続型確率分布と言います。確率変数とは、ある現象がいろいろな値を取り得るとき、取り得る値全体を指します。確率分布とは、確率変数の値に対して、その確率変数をとる確率の分布を表現するものです。

確率密度関数

確率密度関数は、連続型確率変数Xがある値をとるという事象の確率密度を記述する関数です。


f(x) = f(X = x)

連続型確率変数Xについて、以下のように表現できます。


P(a \leq x \leq b) = \int_a^b f(x)dx

例えば以下のような確率密度関数がある時、Xが0以上、5以下の時の確率は以下の計算できます。


\begin{array}{ll}
f(x) = 4 & (0 \leq X \leq 3)
\end{array}

P(0 \leq X \leq 5) = \int_{0}^{5}f(x)dx = \int_{0}^{3}4dx + \int_{3}^{5}0dx

= 12

連続型確率分布の例

以下の例では、連続型確率変数である確率密度関数Pythonのnumpyを使って計算しています。グラフの水色に塗られた部分がXが0.5より大きい場合の確率密度関数で求めた確率となります。


\begin{array}{ll}
f(x) = \frac{5}{8}(1 - x^4) & (-1 \leq X \leq 1) 
\end{array}

P(-1 \leq X \leq 1) = \int_{-1}^{1}f(x)dx = \int_{-1}^{1}\frac{5}{8}(1 - x^4)dx

= 1

P\bigl( X > \frac{1}{2}\bigr) = \int_{\frac{1}{2}}^{1}\frac{5}{8}(1 - x^4)dx

= \frac{49}{256}
import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(figsize = (12, 8))

x = np.arange(-1, 1.1, 0.01)
y = 5/8*(1 - x**4)

x1 = np.arange(0.5, 1.1, 0.01)
y1 = 5/8*(1 - x1**4)

plt.fill_between( x1, y1, color="lightblue", alpha=0.5)
plt.xlim(-1,1)
plt.ylim(0,1)
plt.title("連続型確率分布", fontsize=16)
plt.xlabel("X", fontsize=16)
plt.ylabel("P(X)", fontsize=16)
plt.plot(x, y)
plt.savefig('continuous_probability_distribution.png', bbox_inches='tight')

f:id:hira03:20200203140942p:plain
continuous_probability_distribution

参考

統計学の時間 | 統計WEB

離散型確率分布と確率質量関数について

確率を求める場合には、サイコロやコインと言ったとびとびの値を取るような離散型変数のものと、重さや温度のように連続した値を取るような連続型変数という2種類の変数があります。この記事では、離散型変数における確率分布とその確率を表す確率質量関数について紹介しています。

離散型確率分布

確率変数が離散型の場合の確率分布を離散型確率分布と言います。確率変数とは、ある現象がいろいろな値を取り得るとき、取り得る値全体を指します。確率分布とは、確率変数の値に対して、その確率変数をとる確率の分布を表現するものです。

確率質量関数

離散型確率変数Xがある値xをとる確率を確率質量関数f(x)と呼び、以下のように表すことができます。


f(x) = P(X = x)

例えば、サイコロを1回投げた場合は、これらの確率の総和は以下のように「1」と計算できます。


\sum_{i=1}^{6}P(X = x_i) \\
= P(X = 1)+P(X = 2)+P(X = 3)+P(X = 4)+P(X = 5)+P(X = 6)\\=\frac{1}{6}+\frac{1}{6}+\frac{1}{6}+\frac{1}{6}+\frac{1}{6}+\frac{1}{6}\\=1

離散型確率分布の例

以下の例では、離散型確率変数であるサイコロの確率をPythonのリストを使って計算しています。そして、サイコロの1から6の目における確率分布のイメージをヒストグラムで描画しています。

data = ["1","2","3","4","5","6"]
n = len(data)
k1 = [i for i in data if i == "1"]
k1 = len(k1)
from fractions import Fraction
print("サイコロを1回投げた時に1が出る確率",Fraction(k1, n))

サイコロを1回投げた時に1が出る確率 1/6

import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(figsize = (12, 8))
plt.ylim(0, 0.5)
plt.title("離散型確率分布", fontsize=16)
plt.xlabel("X", fontsize=16)
plt.ylabel("P(X)", fontsize=16)

plt.hist(data, bins=np.arange(n+1) - 0.5, rwidth=0.9, normed=True)
plt.show()

f:id:hira03:20200202132526p:plain
discrete_probability_distribution

参考

統計学の時間 | 統計WEB

Pythonを使ったベイズの定理の求め方

統計学において、ベイズの定理を使うと、ある事象が起きた時に、その原因が幾つかあった時に、その原因である確率を求めることができます。この記事では、Pythonを使ったベイズの定理の求め方について、リストとpandasを使った例を紹介しています。

ベイズの定理とは

ベイズの定理は、ある事象が起きた時、その事象が起きた原因がいくつかあった場合、その原因である確率が何パーセントであるかを計算するものです。


P(B_i/A) = \frac{P(A\cap B_i)}{P(A)}

例えば、赤と白の玉が入った袋が三つあったとして、袋1には赤の玉が4つ、白の玉が1つ、袋2には赤の玉が3つ、白の玉が3つ、袋3には赤の玉が2つ、白の玉が4つあったとして、この3つのいずれかの袋から玉を取り出した時に白の玉を引いた時、その玉が袋2である確率を求めると以下のようになります。

このような問いの場合、ベイズの定理は以下のように展開できます。


P(B_2/A) = \frac{P(A/B_2)P(B_2)}{P(A/B_1)P(B_1) + P(A/B_2)P(B_2) + P(A/B_3)P(B_3)}

このうち3つの袋からどの袋が選ばれるかの確率は以下のようになります。


P(B_1) = P(B_2) = P(B_3) = \frac{1}{3}

さらにそれぞれの袋から玉を選んだ時に白の玉である確率はそれぞれ以下のようになります。


P(A/B_1) = \frac{1}{5}

P(A/B_2) = \frac{3}{6} = \frac{1}{2}

P(A/B_3) = \frac{4}{6} = \frac{2}{3}

これらを先ほど展開した式に代入すると以下のようになります。


P(B_2/A) = \frac{\frac{1}{2}\times\frac{1}{3}}{\frac{1}{5}\times\frac{1}{3} + \frac{1}{2}\times\frac{1}{3} + \frac{2}{3}\times\frac{1}{3}}

 =
\frac{\frac{1}{6}}{\frac{1}{15} + \frac{1}{6} + \frac{2}{9}}

=
\frac{\frac{1}{6}}{\frac{41}{90}} = \frac{90}{246} = 0.366

ベイズの定理の求め方その1(リスト)

Pythonを使って先ほどのベイズの定理を求めると以下のようになります。リストで処理をする場合は、以下のようにリストのデータを用意します。次にfor文とif文でwhiteのデータのみを取り出して、そのデータを使用して確率を求めることができます。

from fractions import Fraction

bag = ["bag1","bag2","bag3"]
bag1 = ["red","red","red","red","white"]
bag2 = ["red","red","red","white","white","white"]
bag3 = ["red","red","white","white","white","white"]
p_bag1 = Fraction(1, len(bag))
print("3つの袋のいずれかが選ばれる確率")
print("P(bag1) = ", p_bag1)

3つの袋のいずれかが選ばれる確率
P(bag1) = 1/3

white1 = [i for i in bag1 if i == "white"]
p_white_bag1 = Fraction(len(white1), len(bag1))
print("袋1から白い玉が選ばれる確率")
print("P(white\ bag1) = ", p_white_bag1)

袋1から白い玉が選ばれる確率
P(white\ bag1) = 1/5

white2 = [i for i in bag2 if i == "white"]
p_white_bag2 = Fraction(len(white2), len(bag2))
print("袋2から白い玉が選ばれる確率")
print("P(white\ bag2) = ", p_white_bag2)

袋2から白い玉が選ばれる確率
P(white\ bag2) = 1/2

white3 = [i for i in bag3 if i == "white"]
p_white_bag3 = Fraction(len(white3), len(bag3))
print("袋3から白い玉が選ばれる確率")
print("P(white\ bag3) = ", p_white_bag3)

袋3から白い玉が選ばれる確率
P(white\ bag3) = 2/3

p_bag2_white = Fraction(p_bag1*p_white_bag2, p_bag1*p_white_bag1 + p_bag1*p_white_bag2 + p_bag1*p_white_bag3)
print("いずれかの袋から取り出した玉が白い玉だったときに、それが袋2から取り出された確率")
print("P(bag2\ white) = ", p_bag2_white, "=", round(float(p_bag2_white),3))

いずれかの袋から取り出した玉が白い玉だったときに、それが袋2から取り出された確率
P(bag2\ white) = 15/41 = 0.366

ベイズの定理の求め方その2(pandas)

pandasで処理を行う場合は、以下のようにbagとballというコラムにぞれぞれ、bag1、bag2、bag3に対応したredとwhiteのデータを作ります。pandasでは指定した値のデータを取り出すことができるので、以下のようにベイズの定理を求めることができます。

import pandas as pd

data = {"ball": ["red","red","red","red","white",
                 "red","red","red","white","white","white",
                 "red","red","white","white","white","white"],
          "bag":["bag1","bag1","bag1","bag1","bag1",
                 "bag2","bag2","bag2","bag2","bag2","bag2",
                 "bag3","bag3","bag3","bag3","bag3","bag3"]}
df = pd.DataFrame(data)
df.head()
bag ball
0 bag1 red
1 bag1 red
2 bag1 red
3 bag1 red
4 bag1 white
p_bag1 = Fraction(1, len(df["bag"].unique()))
print("3つの袋のいずれかが選ばれる確率")
print("P(bag1) = ", p_bag1)

3つの袋のいずれかが選ばれる確率
P(bag1) = 1/3

bag1 = len(df["bag"][df["bag"] == "bag1"])
white1 = len(df[(df["bag"] == "bag1") & (df["ball"] == "white")])
p_white_bag1 = Fraction(white1, bag1)
print("袋1から白い玉が選ばれる確率")
print("P(white\ bag1) = ", p_white_bag1)

袋1から白い玉が選ばれる確率
P(white\ bag1) = 1/5

bag2 = len(df["bag"][df["bag"] == "bag2"])
white2 = len(df[(df["bag"] == "bag2") & (df["ball"] == "white")])
p_white_bag2 = Fraction(white2, bag2)
print("袋2から白い玉が選ばれる確率")
print("P(white\ bag2) = ", p_white_bag2)

袋2から白い玉が選ばれる確率
P(white\ bag2) = 1/2

bag3 = len(df["bag"][df["bag"] == "bag3"])
white3 = len(df[(df["bag"] == "bag3") & (df["ball"] == "white")])
p_white_bag3_p = Fraction(white3, bag3)
print("袋3から白い玉が選ばれる確率")
print("P(white\ bag3) = ", p_white_bag3)

袋3から白い玉が選ばれる確率
P(white\ bag3) = 2/3

p_bag2_white = Fraction(p_bag1*p_white_bag2, p_bag1*p_white_bag1 + p_bag1*p_white_bag2 + p_bag1*p_white_bag3)
print("いずれかの袋から取り出した玉が白い玉だったときに、それが袋2から取り出された確率")
print("P(bag2\ white) = ", p_bag2_white, "=", round(float(p_bag2_white),3))

いずれかの袋から取り出した玉が白い玉だったときに、それが袋2から取り出された確率
P(bag2\ white) = 15/41 = 0.366

乗法定理について

条件付き確率を求める場合、乗法定理を用いて式を変形させて確率を求める場合があります。この記事では、Pythonを使った乗法定理の求め方について、リストとpandasを使った例を紹介しています。

乗法定理とは

事象Bが起こるという条件のもとで、事象Aが起こる条件付き確率は以下のように求めることができます。


P(A \backslash B) = \frac{P(A\cap B)}{P(A)}

この条件付き確率の両辺にP(B)を掛けて変形したものが乗法定理となります。


P(A\cap B) = P(B)\times P(A \backslash B)

AとBを入れ替えて次のように書くこともできます。


P(A\cap B) = P(A)\times P(B \backslash A)

例えば、4本の当たりを含んだ10本のくじがあった場合、この中から太郎さんがくじを1本引き、そのくじを戻した後に花子さんがくじを引くとき、太郎さんも花子さんも当たりくじを引く確率は以下のようになります。


P(A\cap B) = P(A)\times P(B) =  \frac{4}{10} \times \frac{4}{10} = \frac{4}{25}

また、4本の当たりを含んだ10本のくじがあった場合、この中から太郎さんがくじを1本引き、そのくじを戻さずにさらに花子さんがくじを引くとき、太郎さんも花子さんも当たりくじを引く確率は以下のようになります。


P(A\cap B) = P(A)\times P(B \backslash A) = \frac{4}{10} \times \frac{3}{9} = \frac{2}{15}

乗法定理の求め方その1(リスト)

Pythonを使って先ほどの乗法定理を求めると以下のようになります。リストで処理をする場合は、リストに当たり(hit)とハズレ(loss)のデータを用意します。次にfor文とif文で当たりのデータのみを取り出して、そのデータを使用して確率を求めることができます。

from fractions import Fraction

lottery = ["hit","hit","hit","hit","loss","loss","loss","loss","loss","loss"]

n = len(lottery)

hit_A = [i for i in lottery if i == "hit"]
hit_A_k = len(hit_A)

hit_B = [i for i in lottery if i == "hit"]
hit_B_k = len(hit_B)

print("P(A) = ",Fraction(hit_A_k, n))
print("P(B) = ",Fraction(hit_B_k, n))
print("太郎と花子がともに当たりを引く確率は(当たりくじを戻す)",Fraction(hit_A_k, n) * Fraction(hit_B_k, n))

結果
P(A) = 2/5
P(B) = 2/5
太郎と花子がともに当たりを引く確率は(当たりくじを戻す) 4/25

lottery = ["hit","hit","hit","hit","loss","loss","loss","loss","loss","loss"]

n_A = len(lottery)

hit_A = [i for i in lottery if i == "hit"]
hit_A_k = len(hit_A)

n_B = len(lottery) - 1

hit_B = [i for i in lottery if i == "hit"]
hit_B_k = len(hit_B) - 1

print("P(A) = ",Fraction(hit_A_k, n_A))
print("P(B\A) = ",Fraction(hit_B_k, n_B))
print("太郎と花子がともに当たりを引く確率は(当たりくじを戻さない)",Fraction(hit_A_k, n_A) * Fraction(hit_B_k, n_B))

結果
P(A) = 2/5
P(B\A) = 1/3
太郎と花子がともに当たりを引く確率は(当たりくじを戻さない) 2/15

乗法定理の求め方その1(pandas)

pandasで処理を行う場合は、以下のようにlotteryというコラムに当たり(hit)とハズレ(loss)のデータを作ります。pandasでは指定した値のデータを取り出すことができるので、以下のように条件付き確率を求めることができます。

import pandas as pd

data = {"lottery": ["hit","hit","hit","hit","loss","loss","loss","loss","loss","loss"]}
df = pd.DataFrame(data)
df
lottery
0 hit
1 hit
2 hit
3 hit
4 loss
5 loss
6 loss
7 loss
8 loss
9 loss
n = len(df["lottery"])
hit_A = len(df["lottery"][df["lottery"] == "hit"])

n = len(df["lottery"])
hit_B = len(df["lottery"][df["lottery"] == "hit"])

print("P(A) = ",Fraction(hit_A, n))
print("P(B) = ",Fraction(hit_B, n))

print("太郎と花子がともに当たりを引く確率は(当たりくじを戻す)",Fraction(hit_A_k, n) * Fraction(hit_B_k, n))

結果
P(A) = 2/5
P(B) = 2/5
太郎と花子がともに当たりを引く確率は(当たりくじを戻す) 4/25

n_A = len(df["lottery"])
hit_A = len(df["lottery"][df["lottery"] == "hit"])

n_B = len(df["lottery"]) - 1
hit_B = len(df["lottery"][df["lottery"] == "hit"]) -1 

print("P(A) = ",Fraction(hit_A, n_A))
print("P(B\A) = ",Fraction(hit_B, n_B))

print("太郎と花子がともに当たりを引く確率は(当たりくじを戻さない)",Fraction(hit_A, n_A) * Fraction(hit_B, n_B))

結果
P(A) = 2/5
P(B\A) = 1/3
太郎と花子がともに当たりを引く確率は(当たりくじを戻さない) 2/15

参考

統計学の時間 | 統計WEB