「大きな数値の階乗を計算しようとしたら、#NUM!エラーが出てしまった…」
スプレッドシートで統計処理や確率計算をしていると、こんな場面に出くわすことがあります。GAMMA関数は約172以上でオーバーフローします。FACT関数も170の階乗が限界です。
そんなときに頼りになるのがGAMMALN関数です。ガンマ関数の自然対数を返すことで、桁数を大幅に圧縮してくれます。
この記事では、GAMMALN関数の基本の書き方から実務での活用例、GAMMALN.PRECISEとの違いまで紹介します。
スプレッドシートのGAMMALN関数とは?
GAMMALN関数(読み方: ガンマ・エルエヌ関数)は、ガンマ関数の自然対数 ln(Γ(x)) を返す関数です。
「GAMMA」はガンマ関数、「LN」は自然対数(Natural Logarithm)の略です。GAMMA関数の結果にLN関数をかけた値と同じ意味ですね。
なぜ対数にする必要があるのでしょうか。ガンマ関数は値が急激に大きくなる関数です。たとえばΓ(171) は約 7.26 x 10^306 という天文学的な数値です。スプレッドシートが扱える上限(約1.8 x 10^308)にすぐ到達します。
対数に変換すると、桁数が大幅に圧縮されます。オーバーフローを気にせず計算を進められるのが最大のメリットです。
GAMMALN関数にできることをまとめると、次のとおりです。
- ガンマ関数の自然対数 ln(Γ(x)) を計算する
- GAMMA関数がオーバーフローする大きな値でも安全に扱える
- 大きな数の階乗や組み合わせ計算の中間処理に使う
- 統計分布のパラメータ推定(最尤推定など)に活用する
NOTE
GAMMALN関数はGoogleスプレッドシートの全バージョンで使えます。Excelにも同名の関数があり、動作は同じです。
GAMMALN関数の書き方(構文と引数)
基本構文
=GAMMALN(値)
カッコの中に「値(ガンマ関数の自然対数を求めたい正の数値)」を1つだけ入れます。
引数の説明
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 値 | 必須 | 正の実数を指定する。0以下を指定すると#NUM!エラーになる |
引数は1つだけなので、とてもシンプルです。ただし、0や負の数を指定するとエラーになるので注意してください。
GAMMALN関数の基本的な使い方
小さな数値で動作を確認する
まずは小さな数値で、GAMMALN関数の動作を確認してみましょう。
=GAMMALN(1)
結果は「0」です。Γ(1) = 1 なので、ln(1) = 0 になります。
=GAMMALN(5)
結果は約「3.18」です。これは ln(Γ(5)) = ln(24) = ln(4!) と同じ値です。
検算してみましょう。=LN(GAMMA(5)) も約「3.18」を返します。一致しますね。
=GAMMALN(0.5)
結果は約「0.57」です。Γ(0.5) = √π(約1.77)なので、ln(1.77) ≒ 0.57 です。
大きな数値でオーバーフローを回避する
GAMMALN関数の真価は、大きな値を安全に扱えるところです。
=GAMMA(172)
この数式は#NUM!エラーになります。結果が大きすぎてスプレッドシートでは表現できません。
=GAMMALN(172)
こちらは約「711.71」を返します。エラーにならず計算できました。
さらに大きな値も問題ありません。
=GAMMALN(1000)
結果は約「5905.22」です。Γ(1000) は10の2567乗を超える数値ですが、対数なら4桁に収まります。
セル参照を使う
A1に数値が入っているとします。
=GAMMALN(A1)
セル参照を使えば、値を変えるだけで結果が自動更新されます。
GAMMALN関数の実践的な使い方・応用例
大きな数の組み合わせ(nCr)をGAMMALNで計算する
COMBIN関数は大きな数値でオーバーフローすることがあります。GAMMALNを使えば、対数の性質で安全に計算できます。
組み合わせの公式 nCr = n! / (r! x (n-r)!) を対数に変換すると、次のようになります。
=EXP(GAMMALN(n+1) - GAMMALN(r+1) - GAMMALN(n-r+1))
たとえば 200C100(200個から100個を選ぶ組み合わせ)を計算してみましょう。
=EXP(GAMMALN(201) - GAMMALN(101) - GAMMALN(101))
結果は約 9.05 x 10^58 です。=COMBIN(200,100) でも同じ値が返ります。ただし、さらに大きな数値ではCOMBIN関数がエラーになる場合があります。
TIP
対数の世界では「掛け算→足し算」「割り算→引き算」に変わります。GAMMALN関数はこの性質を活かして、巨大な数値の計算をシンプルにしてくれますよ。
対数尤度の計算に使う
統計学の最尤推定では、尤度関数の対数(対数尤度)を計算する場面があります。ガンマ分布のパラメータ推定がその典型例です。
ガンマ分布の対数尤度関数には ln(Γ(α)) が含まれます。αが大きくなるとΓ(α)は天文学的な数値です。そのため、GAMMALN関数で直接 ln(Γ(α)) を求めるのが定番です。
=GAMMALN(A1)
A1に形状パラメータαの候補値を入れて、対数尤度を計算します。αを変化させて対数尤度が最大になる値を探します。これがパラメータ推定の基本的な流れです。
GAMMALNとEXPの組み合わせで元の値に戻す
GAMMALN関数の結果を元のガンマ関数値に戻したいときは、EXP関数を使います。
=EXP(GAMMALN(10))
結果は「362880」です。これは Γ(10) = 9! = 362880 と一致します。
ただし、大きな値ではEXP関数自体がオーバーフローします。ln(Γ(x)) の値が約709を超えると#NUM!エラーです。対数のまま計算を進めて、最後に必要な部分だけEXPで戻しましょう。
階乗の比を安全に計算する
大きな数の階乗の比(例: 100! / 50!)を直接計算すると、オーバーフローします。GAMMALNなら差分で安全に計算できます。
=EXP(GAMMALN(101) - GAMMALN(51))
この数式は 100! / 50! を計算しています。GAMMALN(n+1) = ln(n!) なので、引き算で割り算を表現できます。結果は約 3.07 x 10^73 です。
よくあるエラーと対処法
GAMMALN関数で発生しやすいエラーをまとめました。
| エラー | 原因 | 対処法 |
|---|---|---|
| #NUM! | 0以下の値を指定した | 正の数値(0より大きい値)を指定する |
| #VALUE! | 引数に文字列が入っている | セル参照先が数値かどうか確認する |
0以下の値を指定したとき
GAMMALN関数は正の数値(0より大きい値)しか受け付けません。
=GAMMALN(0)
この数式は#NUM!エラーになります。負の数や0は指定できません。
GAMMA関数は負の小数(-0.5など)を計算できます。しかし、GAMMALN関数は対応していません。ln(Γ(x)) は正の値のみで定義されるためです。
NOTE
負の値を含む計算が必要なときは、GAMMA関数を直接使うか、GAMMALN.PRECISE関数(後述)を検討してください。GAMMALN.PRECISEも正の値のみ対応ですが、精度が若干異なります。
GAMMALN.PRECISEとの違い
Googleスプレッドシートには、GAMMALN関数とは別にGAMMALN.PRECISE関数があります。
| 項目 | GAMMALN | GAMMALN.PRECISE |
|---|---|---|
| 構文 | =GAMMALN(値) | =GAMMALN.PRECISE(値) |
| 戻り値 | ln(Γ(x)) | ln(Γ(x)) |
| 引数の範囲 | 正の実数のみ | 正の実数のみ |
| 精度 | 標準精度 | より高い数値精度 |
結論から言うと、ほとんどの場面で違いはありません。
GAMMALN.PRECISE関数はExcel 2010で導入されました。旧バージョンのGAMMALN関数との精度差を解消する目的です。Googleスプレッドシートでは両方とも十分な精度を持っています。そのため、実用上の差はほぼゼロです。
=GAMMALN(100)
=GAMMALN.PRECISE(100)
どちらも約「359.13」を返します。
通常はGAMMALN関数を使えば問題ありません。Excel 2010以降との互換性が気になるときだけ、GAMMALN.PRECISEを検討してください。
GAMMA関数・LN関数との違い・使い分け
| 関数 | 動作 | 対応する値 | 用途 |
|---|---|---|---|
| GAMMALN | ln(Γ(x)) を返す | 正の実数 | 大きな値のオーバーフロー回避 |
| GAMMA | Γ(x) を返す | 正の実数(負の小数も可) | 小数の階乗・統計分布の計算 |
| LN | 自然対数 ln(x) を返す | 正の実数 | 成長率・対数変換 |
| EXP | e^x を返す | 任意の実数 | LN/GAMMALNの逆変換 |
GAMMALNとGAMMAの関係
GAMMALN(x) = LN(GAMMA(x)) の関係です。GAMMA関数の結果に自然対数をかけた値を「1ステップで」返してくれます。
小さな値ならGAMMA関数で直接計算するほうがわかりやすいです。約172以上の大きな値ではGAMMA関数がオーバーフローします。そのときはGAMMALN関数に切り替えましょう。
GAMMALNとLNの組み合わせ
GAMMALN(x) と LN(GAMMA(x)) は数学的に同じです。ただし =LN(GAMMA(x)) と書くと、GAMMA(x)の計算段階でオーバーフローする可能性があります。GAMMALN関数なら内部で直接対数を計算するため安全です。
大きな値を扱うときは、必ず =GAMMALN(x) を使ってください。
Excelとの違い
GAMMALN関数はExcelとGoogleスプレッドシートで完全に同じ動作です。
| 項目 | Excel | Googleスプレッドシート |
|---|---|---|
| 構文 | =GAMMALN(数値) | =GAMMALN(値) |
| 動作 | ln(Γ(x)) を返す | ln(Γ(x)) を返す |
| 対応バージョン | すべてのバージョン | 全バージョン |
| エラー時 | #NUM! / #VALUE! | #NUM! / #VALUE! |
| GAMMALN.PRECISE | Excel 2010以降 | 全バージョン |
ExcelではGAMMALN関数は古くからサポートされている関数です。ファイルのやり取りでも互換性の心配はありません。
まとめ
GAMMALN関数は、ガンマ関数の自然対数 ln(Γ(x)) を返す関数です。
ポイントを整理します。
- 構文は
=GAMMALN(値)の1引数。正の実数のみ対応 - GAMMALN(x) = LN(GAMMA(x)) の関係がある
- GAMMA関数が約172以上でオーバーフローする問題を回避できる
- 大きな数の組み合わせ計算には
=EXP(GAMMALN(n+1) - GAMMALN(r+1) - GAMMALN(n-r+1))が便利 - GAMMALN.PRECISEとの実用上の差はほぼゼロ。通常はGAMMALNで問題なし
- 元のガンマ関数値に戻すにはEXP関数を使う
- Excelと完全互換。ファイルのやり取りも安心
まずは =GAMMALN(5) で「約3.18」が返ることを確認してみてください。=LN(GAMMA(5)) と同じ値になるはずです。
