0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

アクチュアリーのためのPython入門(複合分布)

0
Last updated at Posted at 2026-08-28

アクチュアリーのための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は環境によってできることが異なるので、ここでは解説しません)

compound_distribution2.png

なお、実際の結果には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は抜いています。
compound_distribution.png

まとめ

今日は複合分布のシミュレーションと理論値との比較を行いました。

ExcelVBAなどでは、一様乱数しか使えないので、
指数分布に従う乱数を生成するために逆関数法を使ったり、
ポアソン分布に従う乱数を生成するために棄却法を使ったりと、
いろいろな工夫が必要です。

アクチュアリーのモデリングテキストにはその内容もあるのですが、
Pythonでは確率分布に従う乱数を簡単に生成できるので、
いろいろなパターンのシミュレーションを行うことができます。


📚 ナビゲーション
前の記事
シミュレーション

次の記事
破産確率とVaR

📚 目次
アクチュアリーのためのPython入門

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?