アクチュアリーのためのPython入門(アクチュアリー数学編第5回)
複合分布のシミュレーション
📚 アクチュアリーのためのPython入門
この記事はアクチュアリー数学編の一部です。
▶ 目次はこちら
▶ 逆引きガイドはこちら
はじめに
今回は、損保数理でよく使用される複合分布を
シミュレーションして、理論値と比較してみます。
一様乱数によるシミュレーション自体は前回学習したので、
今回は、ポアソン分布に従う乱数、幾何分布に従う乱数、
指数分布に従う乱数を使って複合分布を再現してみます。
複合ポアソン分布
まずは、オーソドックスな複合ポアソン分布です。
クレーム件数$N$が平均4のポアソン分布に従い、
クレーム額$X_i$が平均10の指数分布に従うと仮定したときの、
クレーム総額$S=X_1+X_2+\cdots+X_N$の確率分布のことです。
これをポアソン分布に従う乱数と指数分布に従う乱数を使って、
シミュレートしてみます。
numpyをインポートした後は、
random.poissonでポアソン分布に従う乱数が生成できます。
lamは平均、sizeは乱数の個数です。
# 複合ポアソン分布
import numpy as np
claim_n = np.random.poisson(lam=4, size=100000)
これでクレーム件数のリストができました。
クレーム件数の回数だけ指数分布の乱数を作成します。
random.exponentialで指数分布の乱数が生成できます。
scaleは平均、sizeは乱数の個数で、ここを先ほどのポアソン分布の乱数の結果にします。
result = []
for n in claim_n:
claim_sum = 0
claim_x = np.random.exponential(scale=10, size=n)
claim_sum = sum(claim_x)
result.append([n, claim_sum])
claim_sum = sum(claim_x)のsum()で、
claim_xをn個加算した結果をclaim_sumに代入します。
次と同じ意味です。
for i in n:
claim_sum += claim_x
resultに結果が入っているので、
このヒストグラムを見てみると次のようになります。
(グラフを作成するplotは環境によってできることが異なるので、ここでは解説しません)
なお、実際の結果には0があるのですが、
グラフにすると見にくくなるので、グラフから除いています。
複合幾何分布
今度は、ポアソン分布ではなく、
幾何分布の複合分布をシミュレーションします。
複合幾何分布をシミュレーションして、
アクチュアリー会の過去問を解いてみます。
2022年の損保数理の問題2(3)(d)です。
(b)はP=0.2の幾何分布になります。
(c)は平均10の指数分布になります。
(b)と(c)の複合分布から、破産確率を計算するという内容です。
random.geometricはアクチュアリー数学でいうところのファーストサクセス分布です。
$P(X=k)=pq^{k-1}$ $(k=1,2,3,\cdots)$
なので、幾何分布に合わせるため、結果を-1しています。
# 2022年2(3)
import numpy as np
np.random.seed(42)
claim_n = np.random.geometric(p=0.2, size=100000)-1
result = []
for n in claim_n:
claim_sum = 0
claim_x = np.random.exponential(scale=10, size=n)
claim_sum = sum(claim_x)
result.append([n, claim_sum])
この結果をもとに、
$P(L>75)$を解いてみると、
# 75を超える確率
import pandas as pd
df = pd.DataFrame(result)
prob = (df["claim_sum"] > 75).mean()
print(prob)
0.17751
と表示されます。理論値は約0.1785です。
ちなみに、理論値とこの結果のヒストグラムを比較すると、
次のグラフとなります。ここも0は抜いています。

まとめ
今日は複合分布のシミュレーションと理論値との比較を行いました。
ExcelVBAなどでは、一様乱数しか使えないので、
指数分布に従う乱数を生成するために逆関数法を使ったり、
ポアソン分布に従う乱数を生成するために棄却法を使ったりと、
いろいろな工夫が必要です。
アクチュアリーのモデリングテキストにはその内容もあるのですが、
Pythonでは確率分布に従う乱数を簡単に生成できるので、
いろいろなパターンのシミュレーションを行うことができます。
📚 ナビゲーション
◀ 前の記事
シミュレーション
▶ 次の記事
破産確率とVaR
📚 目次
アクチュアリーのためのPython入門