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