ExcelのGAMMALN関数の使い方|ガンマ関数の自然対数を計算する

スポンサーリンク

「Excelで200!(200の階乗)を計算しようとしたら#NUM!エラーになった」。「対数尤度の数式に出てきたGAMMALNって何?」。統計や確率の計算を進めていると、こんな場面に出会いますよね。

そんなときに使えるのが、ExcelのGAMMALN関数です。ガンマ関数Γ(x)の自然対数を返す関数で、数値が大きくなりすぎてオーバーフローする問題を回避できます。統計計算の縁の下の力持ちなんですよ。

この記事ではExcelのGAMMALN関数の使い方を、構文の基本から実務での活用例まで丁寧に解説します。GAMMA関数との違い、GAMMALN.PRECISE関数との使い分け、対数尤度・組合せ計算の実例まで、まるごと整理しますよ。

ExcelのGAMMALN関数とは

ExcelのGAMMALN関数(読み方: ガンマ・エルエヌ関数)は、ガンマ関数Γ(x)の自然対数を返す関数です。

ガンマ関数とは、階乗(n! = n×(n-1)×…×1)を実数全体に拡張した関数のことです。整数nに対してはΓ(n) = (n-1)!となります。「GAMMA」はギリシャ文字のガンマ(Γ)に由来する数学用語ですよ。「LN」は自然対数(Logarithm Natural、底がe ≈ 2.718の対数)の略ですね。

たとえばGAMMALN(5)は ln(4!) = ln(24) ≈ 3.178 を返します。直接GAMMA(5) = 24を計算する代わりに、その対数値を返してくれるイメージですよ。

ExcelのGAMMALN関数にできることをまとめると、次のとおりです。

  • ガンマ関数の自然対数(log値)を直接計算する
  • 大きな階乗(170!以上)をオーバーフローさせずに扱う
  • 対数尤度・組合せ係数・ベイズ統計の正規化定数を計算する
  • 統計分布の確率密度を対数スケールで安定計算する

NOTE

GAMMALN関数はすべての現行Excelバージョンで使えます。Excel 2010以降では、より高精度なGAMMALN.PRECISE関数も追加されていますよ。

なぜ「対数」を取るのか

実はExcelのFACT関数(階乗を求める関数)には限界があります。Excelが扱える最大数値は約1.79×10^308で、170! ≈ 7.26×10^306がギリギリの上限です。171!以上は#NUM!エラーになってしまうんですよね。

そこで登場するのがGAMMALN関数です。対数を取れば、ln(170!) ≈ 706.6、ln(1000!) ≈ 5912となります。極めて大きな階乗でも普通の数値範囲で扱えるんですよ。「大きな数を直接扱うのは無理だから、log値で計算して最後に元に戻す」というのが、統計計算の定番テクニックですね。

GAMMALN関数の基本構文と引数

GAMMALN関数の構文はとてもシンプルです。

=GAMMALN(x)

引数は1つだけ。必須なので省略できませんよ。

引数必須/省略可説明
x必須ガンマ関数の対数を計算する正の数値

基本的な使い方

セルA2に「5」と入力されているとして、=GAMMALN(A2)と書くと、ガンマ関数の自然対数が返ります。

A列(x)B列(数式)結果
1=GAMMALN(A2)0
2=GAMMALN(A3)0
3=GAMMALN(A4)約0.693
5=GAMMALN(A5)約3.178
10=GAMMALN(A6)約12.802
100=GAMMALN(A7)約359.134

GAMMALN(1) = ln(Γ(1)) = ln(0!) = 0、GAMMALN(2) = ln(Γ(2)) = ln(1!) = 0となります。整数値を入れるとln((x-1)!)が返ると覚えておくと便利ですよ。

TIP

GAMMALN関数は小数も受け取れます。たとえば=GAMMALN(2.5)は約0.285を返します。連続的なxに対する値も計算できるのが、ガンマ関数の強みですね。

GAMMALN関数とGAMMA関数の違い

ExcelにはGAMMA関数(Excel 2013以降で利用可能)もあり、こちらはΓ(x)を直接返します。GAMMALN関数とは「対数を取るかどうか」が決定的な違いです。

関数返す値例(x=5)
GAMMA(x)Γ(x) の値そのもの24
GAMMALN(x)ln(Γ(x)) の対数値約3.178

両関数の関係式は次のようになります。

GAMMALN(x) = LN(GAMMA(x))
GAMMA(x) = EXP(GAMMALN(x))

使い分けの基準

xが小さいとき(おおむねx ≤ 170)はどちらを使ってもOKです。問題はxが大きい場合ですよ。

  • xが小さい(x ≤ 170程度): 直感的なGAMMA関数で十分
  • xが大きい(x > 170): GAMMALN関数でないとオーバーフローする
  • 対数尤度・対数確率を計算する: 最初からGAMMALN関数を使うほうが速い

統計計算では「最終的に対数を取りたい」場面が多いですよね。最初からGAMMALN関数を使うほうが効率的です。GAMMA関数で計算してからLN関数で対数を取ると、計算誤差も増えやすいんですよ。

GAMMALN.PRECISE関数との違い

Excel 2010以降では、GAMMALN関数の精度向上版としてGAMMALN.PRECISE関数が追加されました。両者の機能は同じですが、内部の計算アルゴリズムが異なります。

関数利用可能バージョン特徴
GAMMALNすべて互換性重視、通常用途では十分な精度
GAMMALN.PRECISEExcel 2010以降浮動小数点誤差をより抑えた高精度版

実務での使い分けはシンプルですよ。

  • 業務での通常利用: GAMMALNで十分
  • 論文・厳密な統計分析: GAMMALN.PRECISEを推奨
  • 古いExcel環境との互換性が必要: GAMMALNを使う

NOTE

多くのケースでは両関数の結果はほぼ同じです。「精度の違いが結果に響く」のは、極端に大きいxや、誤差が累積する反復計算の場面ですよ。

GAMMALN関数の実務活用例

GAMMALN関数は単独で使うよりも、統計計算の一部として組み込まれることが多い関数です。代表的な活用パターンを3つ紹介しますね。

活用例1: 対数尤度の計算(最尤推定)

ポアソン分布の対数尤度は、次のような数式で表されます。

log L(λ) = Σ [k × log(λ) - λ - log(k!)]

ここでlog(k!)の部分をGAMMALN関数で計算します。log(k!) = GAMMALN(k+1)という関係を使うわけですね。

たとえばA列に観測データ(k=2, 3, 1, 4, 2)が入っていて、λ=2.4と仮定したとします。各データの対数尤度寄与は次のように計算できますよ。

=A2*LN(2.4) - 2.4 - GAMMALN(A2+1)

これを全データに対してSUM関数(合計を求める関数)で合計すれば、log L(2.4)が求まります。最尤推定では、このlog Lを最大化するλを探すことになりますよ。

活用例2: 組合せ係数(二項係数)の対数

二項係数 C(n, k) = n! / (k!(n-k)!) は、nが大きいと階乗だけでオーバーフローしてしまいます。GAMMALN関数を使えば、対数スケールで安定計算できますね。

log C(n, k) = GAMMALN(n+1) - GAMMALN(k+1) - GAMMALN(n-k+1)

例として、log C(200, 100)を計算してみましょう。

=GAMMALN(201) - 2*GAMMALN(101)

結果は約135.75。これは200から100個を選ぶ組合せ数の自然対数です。直接 =COMBIN(200,100) でも計算できますが、もっと大きなn(n=1000など)では#NUM!エラーになります。GAMMALN関数なら対数のまま扱えるので限界がありませんよ。

活用例3: ベイズ統計の正規化定数

ベイズ統計の事後分布の正規化定数(ベータ関数)は、次のように計算できます。

ベータ関数: B(a, b) = Γ(a)Γ(b) / Γ(a+b)
log B(a, b) = GAMMALN(a) + GAMMALN(b) - GAMMALN(a+b)

たとえばコイントスのベイズ更新でBeta(10, 5)分布を扱うとき、正規化定数の対数は次のように計算しますよ。

=GAMMALN(10) + GAMMALN(5) - GAMMALN(15)

結果は約-9.21。確率密度関数の計算では、この対数値を使って指数和を取るパターンが多いですよね。

EXP関数と組み合わせて元の値に戻す

GAMMALN関数の結果を「元のガンマ関数の値」に戻したいときは、EXP関数(自然対数の指数関数、e^xを返す関数)と組み合わせます。

=EXP(GAMMALN(x))

これでGAMMA(x)と同じ値が得られます。たとえば=EXP(GAMMALN(5)) は24(=4!)を返しますよ。

大きな階乗を計算する

FACT関数では計算できない171!以上の階乗を計算したい場合、GAMMALN関数のままでとどめるのが鉄則です。

=FACT(171)        → #NUM! エラー
=GAMMALN(172)     → 約711.7(log(171!)の値)
=EXP(GAMMALN(172))→ #NUM! エラー(exp(711)はオーバーフロー)

つまり「対数のまま計算を続ける」のがGAMMALN関数の正しい使い方です。最後に値を比較するときも、対数同士で大小比較すれば問題なく扱えますよ。

TIP

大きな階乗の比率(n!/m!のような形)は、GAMMALN(n+1) – GAMMALN(m+1)を計算してからEXP関数で戻す方法が安全です。差分を取れば値が小さくなるので、最後の指数化でもオーバーフローしません。

よくあるエラーと対処法

GAMMALN関数を使っていて遭遇しやすいエラーを整理しますね。

#NUM! エラー

xに 0 または負の数を指定すると発生します。ガンマ関数は正の実数で定義されているので、0以下の値は受け付けません。

=GAMMALN(0)   → #NUM!
=GAMMALN(-2)  → #NUM!

対処法はシンプルで、xに正の数を指定することです。データに負の値が混じる可能性があるなら、IFERROR関数(エラー時の代替値を返す関数)やIF関数で事前にチェックしましょう。

=IF(A2>0, GAMMALN(A2), "xは正の値にしてください")

#VALUE! エラー

xに数値以外(文字列など)を指定すると発生します。セル参照先が空白や文字列になっていないか確認してくださいね。

=GAMMALN("apple")  → #VALUE!

#NAME? エラー

GAMMALN.PRECISE関数をExcel 2007以前で使うと発生します。対処法は、互換版のGAMMALN関数を使うか、Excelをアップデートすることですよ。

結果がオーバーフローする(EXP適用時)

=EXP(GAMMALN(x)) でxが大きい場合、対数値が約709を超えるとEXP関数側でオーバーフローします。これはGAMMALN関数の問題ではなく、EXP関数の限界なんですよね。

対処法は「対数のまま計算を続ける」こと。元の値に戻す必要がない計算(対数尤度・対数確率など)なら、EXP関数を使わずそのまま使い続けるのが鉄則ですよ。

まとめ:GAMMALN関数で対数スケールの統計計算を安定させよう

ExcelのGAMMALN関数は、ガンマ関数Γ(x)の自然対数を返す関数です。一見地味ですが、統計計算の足回りを支える重要な関数なんですよ。

  • 構文は=GAMMALN(x)の1引数だけ
  • xは正の数値のみ受け付ける(0以下は#NUM!エラー)
  • 大きな階乗(171!以上)をオーバーフローさせずに扱える
  • GAMMA関数の値は=EXP(GAMMALN(x))で復元できる
  • 高精度版のGAMMALN.PRECISE関数(Excel 2010以降)もある
  • 対数尤度・組合せ係数・ベイズ統計の正規化定数で活躍する

ガンマ分布の確率を直接計算したい場合は、姉妹記事のExcelのGAMMA.DIST関数の使い方を参考にしてください。確率からx値を逆算したい場合は、ExcelのGAMMA.INV関数の使い方が役立ちますよ。

GAMMALN関数を覚えておくと、統計計算で「数値が大きすぎる」「オーバーフローする」と困ったときの強力な武器になります。ぜひ実務でも活用してみてくださいね。

タイトルとURLをコピーしました