データ分析の初歩から学んでいく連載(確率分布編)の第11回。ガンマ分布やアーラン分布は、待ち行列の分析などに使われる分布です。ある事象が起こる平均の間隔が分かっているときに、ある期間内にその事象が何回か以上起こる確率が求められます。今回は具体例を基に、その確率を求め、ガンマ分布の確率密度関数や累積分布関数の形を見ていきます。
この連載は、データをさまざまな角度から分析し、その背後にある有益な情報を取り出す方法を学ぶ『社会人1年生から学ぶ、やさしいデータ分析』連載(記述統計と回帰分析編)の続編で、確率分布に焦点を当てています。
この確率分布編では、推測統計の基礎となるさまざまな確率分布の特徴や応用例を説明します。身近に使える表計算ソフト(Microsoft ExcelやGoogleスプレッドシート)を使いながら具体的に事例を見ていきます。
必要に応じて、Pythonのプログラムや統計ソフト「R」などでの作成例にも触れることにします。
数学などの前提知識は特に問いません。中学・高校の教科書レベルの数式が登場するかもしれませんが、必要に応じて説明を付け加えるのでご心配なく。肩の力を抜いてぜひとも気楽に読み進めてください。
筆者紹介: IT系ライターの傍ら、非常勤講師として東大で情報・プログラミング関連の授業を、一橋大でAI関連の授業を担当。趣味の献血は心拍数が基準を超えてしまい99回で中断。心肺機能を高めるために水泳を始めるも、一向に上達せず。また、リターンライダーとして何十年ぶりかに大型バイクにまたがるも、やはり体力不足を痛感。足腰を鍛えるために最近は四股を踏む日々。超安全運転なので、原付やチャリに抜かされることもしばしば(すり抜けキケン、制限速度守ってね!)。
データ分析の初歩から応用まで少しずつステップアップしながら学んでいく連載の確率分布編、第11回です。前回は、待ち行列の分析などに使われる指数分布を取り上げました。今回も同様に待ち行列の分析などに使われるガンマ分布について、その特徴や意味を基本から解き明かし、確率密度関数/累積分布関数の求め方、利用例などを見ていきます。
ガンマ分布は、ある事象(出来事)が起こる平均の間隔βが分かっているときに、ある期間x内にその事象がα回以上起こる確率を表す分布です。ガンマ分布の母数αが正の整数である場合は、特にアーラン分布と呼ばれます。
少し前のことですが、筆者の仕事場の前が野良猫の通り道になっていて、仕事をしているとよく猫が目の前を横切りました。このことを例に、ガンマ分布がどのように適用できるか、具体例を見てみましょう(図1)。
図1に示された問題意識は、10分当たり平均3匹の猫が通ることが分かっている場合に、次の5分間に少なくとも2匹の猫が通る(2匹以上の猫が通る)確率を求めたい、ということです。そんなことをして何の役に立つのか、と思われるかもしれませんが、「猫」を「顧客」や「車」に置き換えると、一定時間内に何人かの顧客が到着する確率や一定時間内に車が何台か以上通る確率を求めるということになり、がぜん、実用性が感じられるようになると思います(車の通行量の例についても、後ほど見ることにします)。
ところで、図1で「猫」を「顧客」に置き換えると、前回見た指数分布とそっくりですね。でも違いがあります。まずは指数分布との違いを確認するところから始めましょう。
指数分布とガンマ分布との違いを具体的かつ端的に言うと、指数分布の累積分布関数は、ある期間内に少なくとも1回の事象が起こる(1回以上起こる)確率を求めるのに使いますが、ガンマ分布の累積分布関数は、ある期間内に少なくともα回の事象が起こる(α回以上起こる)確率を求めるために使われます。
ガンマ分布でα=1の場合、指数分布になります。また、ガンマ分布は、独立した指数分布の和と考えられます。具体的にどういうことなのかは、最後のコラムで解説します。
ガンマ分布の母数はαとβで、指数分布の母数はλです。これらを表にまとめて比較してみます(表1)。いずれも確率変数は目的の期間です。
ガンマ分布 | 指数分布 | ||
---|---|---|---|
母数 | 目的の期間内で事象が何回以上起こるか | α | - |
一定期間内で事象が起こる平均の間隔 | β | - | |
一定期間内で事象が起こる平均の回数 | - | λ | |
確率変数 | 目的の期間 | x | x |
指数分布の母数λは「一定期間内で事象が起こる回数」です。一方、ガンマ分布の母数βは「一定期間内で事象が起こる平均の間隔」なので、λの逆数となります。つまり、β=1/λとなります。例えば、10分間に3匹の猫が通るのであれば、λ=3/10です。この場合、
となります。10分間に3匹の猫が通るということは、平均して10/3分間に1匹の猫が通るということですね。
指数分布と比較しながらガンマ分布の意味が確認できたので、ガンマ分布の確率密度関数と累積分布関数の定義を見た後、図1の確率を計算してみましょう。
以下に示した式がガンマ分布の確率密度関数と累積分布関数の定義です。eは自然対数の底(=2.71828...)です。かなり複雑な式ですが、例によって、これらの式を覚える必要は全くありません。ExcelのGAMMA.DIST関数を使えば、簡単に答えが求められます。
◆ ガンマ分布の確率密度関数
◆ ガンマ分布の累積分布関数
ただし、Γはガンマ関数、γは下側不完全ガンマ関数(第一種不完全ガンマ関数)です。これらの関数の定義は、第7回のコラムで紹介しました(繰り返しになりますが、それらの定義を覚えたりする必要はありません)。
GAMMA.DIST関数の書き方は以下の通りです。
冒頭の図1で紹介した例について、GAMMA.DIST関数を使って確率を求めてみましょう。10分間に平均して3匹の猫が通る=平均して10/3分間に1匹の猫が通ることが分かっている場合に、次の5分以内に2匹以上の猫が通る確率を求めます。この場合、確率変数xの値は5で、α=2,β=10/3となります。
サンプルファイルをこちらからダウンロードし、[ガンマ分布の利用]ワークシートを開いて試してみてください。Googleスプレッドシートのサンプルはこちらから開くことができます。メニューから[ファイル]−[コピーを作成]を選択し、Googleドライブにコピーしてお使いください。
私たちは、無意識のうちに「期間」を分単位や年単位などで考えてしまいます。例えば、10分であれば、期間は10であると考えるのが普通です。しかし、ここでの期間とは一定の間隔のことです。問題に合わせて、例えば、10分を1つの期間と考えたり、100年を1つの期間と考えたりしても構いません。例えば、上の例で10分を1つの期間と考えれば、1つの期間に猫が3匹通ることになります。その場合、λ=3なので、β=1/3となります。目的の間隔は5分なので、1つの期間とした10分の半分、つまり1/2がxの値となります。αについては2のままですね。空いているセルに「=GAMMA.DIST(1/2, 2, 1/3, TRUE)」と入力してみてください。図3の結果と一致します。
続いて、ガンマ分布の確率密度関数と累積分布関数を可視化してみましょう。
上で見たGAMMA.DIST関数の引数として母数α,βに幾つかの値を指定し、xの値を変化させていったグラフを描けば、ガンマ分布の確率密度関数や累積分布関数を可視化できます。ただし、以下の例ではβ=3に固定するものとします。ガンマ分布の台(確率変数が取り得る値の範囲)は0〜∞ですが、α=1, x=0のときにはGAMMA.DIST関数がエラーとなるので、ここではx=1〜30までの値を求めることとします(図4)。
確率密度関数の値を求めるための手順は以下の通りです。サンプルファイルの[ガンマ分布]ワークシートを開いて試してみてください。可視化については単に折れ線グラフを描くだけなので、関数の入力のみに焦点を当てることにします。グラフ作成の手順についてはサンプルファイル内に掲載しておきます。
◆ Excelでの操作方法
◆ Googleスプレッドシートでの操作方法
● グラフの作成方法
続いて、累積分布関数です。こちらは、α=2,β=3の例だけを見ておきます(図5)。[ガンマ分布累積]ワークシートを開いて、図の後の手順で試してみてください。
累積分布関数の値を求めるための手順は以下の通りです。ここでも、関数の入力のみに焦点を当てることとし、グラフ作成の手順についてはサンプルファイル内に掲載しておきます。
◆ Excelでの操作方法
◆ Googleスプレッドシートでの操作方法
● グラフの作成方法
ガンマ分布も指数分布と同様、確率変数を求めるための計算などがなく、また、累積分布関数が直接応用に結び付くので、比較的すんなりと理解できるのではないかと思います。ここからは、少し発展的なお話としてガンマ分布とポアソン分布との関係を見てみます。また、ガンマ分布が指数分布の和であるということをシミュレーションで確認します。実用的には知らなくてもあまり問題がないので、数式が苦手な方や変数の対応関係を細かく確認するのが面倒だと思われる方は、最後の「この記事で取り上げた関数の形式」を確認して、今回はお開きとしてもらっても構いません。
前回、指数分布とポアソン分布の関係をコラムで解説しました。ガンマ分布は指数分布の和である(詳細は次のコラムで見ます)ということなので、ガンマ分布と指数分布、ポアソン分布が互いに関係しているということも想像できると思います。そこで、それらの関係を図で表し、その後、もう一度意味を考えていくことにします。
ガンマ分布の累積分布関数とポアソン分布の累積分布関数の違いを端的に言うなら、以下のようになります。
これらの関係を数式で解き明かすのはかなり難しいので、ここでは、図6や上に示した箇条書きの意味を具体的な例で考えてみましょう。猫の事例よりも実用的な例として、車の通行量で考えることにします(さらに言えば、コールセンターに入る電話の数や機器の故障の数などでも基本的な考え方は同じです)。理屈よりも実際に計算した例を先に見たいという方は、こちらまで読み飛ばしていただいても構いません。
離散型確率分布であるポアソン分布が分かりやすいので、ポアソン分布を中心に見ていくことにしましょう。以下、母数λの表記は省略して、ポアソン分布の確率質量関数をp(k)、累積分布関数をP(k)と簡単に表すことにします。例えば、1分間に平均してλ=3台の車が通ることが分かっている場合、1分間に車が、
で求められます。従って、1分間に車が
となります(全体からk−1台まで通る確率を引けばよい)。
一方、ガンマ分布の累積分布関数では、車が通る平均の間隔をβとするので、β=1/λ=1/3です。
ということは、ガンマ分布でx=1, α=k, β=1/λとしたときの累積分布関数の値F(1; α, β)と、ポアソン分布での(3)の計算、つまり1−P(k−1)の値が同じになるはずです。
また、指数分布の累積分布関数の値は、ガンマ分布でα=1, β=1/λを指定した場合の累積分布関数の値や、ポアソン分布でk=1を指定した場合の1−P(k−1)の値と同じになります。
では、具体的な値を当てはめて確認してみましょう。[分布同士の関係]ワークシートを開いて、以下のように入力すると同じ結果が得られることが分かります。
セルB5に入力されたxの値が1であれば、ポアソン分布の1−P(k−1)の値に当たるセルC8の値と、ガンマ分布のF(x;α,β)の値に当たるセルD8の値が一致します。さらに、セルB4に入力されたk,αの値が1であれば、指数分布の累積分布関数の値とも一致します。セルB3〜B5にいろいろな値を入力して確かめてみてください。
なお、参考として、サンプルファイルの[分布同士の関係 (詳細版)]ワークシートに、条件付き書式を使ってそれぞれの分布の関係を見やすくした例を含めてあります。k,αの値によって、どの値が同じになるかが視覚的に確認できます。ぜひ試してみてください。
「ガンマ分布は、独立した指数分布の和である」というお話が何回か登場しました。それはいったいどういうことでしょうか。これについても、数式で解き明かすのはやや難しいので、Pythonのプログラムを使ってシミュレーションしてみましょう。
サンプルプログラムはこちらから参照できます。リンクをクリックすれば、ブラウザが起動し、Google Colaboratoryの画面が表示されます(Googleアカウントでのログインが必要です)。最初のコードセルをクリックし、[Shift]+[Enter]キーを押してコードを実行してみてください。結果は図8のようになります。コードの詳細については解説しませんが、コメントとリスト1の説明を見れば何をやっているかが大体分かると思います。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import expon, gamma
p = 3/10 # 10分間に平均3匹の猫が通るものとする
# 2つの指数分布からランダムにサンプルを抽出
sample1 = expon.rvs(scale=p, size=10000)
sample2 = expon.rvs(scale=p, size=10000)
# 指数分布の和を求める
sample_sum = sample1 + sample2
# 指数分布の和をヒストグラムにする
plt.hist(sample_sum, bins=100, density=True)
# ガンマ分布の確率密度関数を描く
x = np.linspace(0, 6, 100) # 0〜6を100個に分けた値
gamma_pdf = gamma.pdf(x, a=2, scale=p) # α=2のガンマ分布
plt.plot(x, gamma_pdf)
plt.show()
実行結果は以下の通りです(図8)。独立した指数分布の和がガンマ分布と一致することが分かります。
今回はガンマ分布について、指数分布との違いを見た後、具体的な利用例を基に考え方や、確率密度関数と累積分布関数の求め方などについてお話ししました。また、ポアソン分布との関係についても解説しました。ガンマ分布も指数分布と同様、広く応用できそうだということもご理解いただけたと思います。
次回は、いわゆるA/Bテスト(2つのWebサイトのデザインを作成し、どちらがより購買に結び付くかを分析するなど)やベイズ統計の事前分布としてよく使われたりするベータ分布についてお話しします。次回もお楽しみに!
関数の利用例については、この記事の中で紹介している通りです。ここでは、今回取り上げた関数の基本的な機能と引数の指定方法だけを示しておきます。
GAMMA.DIST(x, α, β, 関数形式)
「やさしい確率分布」
Copyright© Digital Advantage Corp. All Rights Reserved.