スプレッドシートのGAMMALN関数の使い方|ガンマ関数の自然対数

スポンサーリンク

「大きな数値の階乗を計算しようとしたら、#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関数があります。

項目GAMMALNGAMMALN.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関数との違い・使い分け

関数動作対応する値用途
GAMMALNln(Γ(x)) を返す正の実数大きな値のオーバーフロー回避
GAMMAΓ(x) を返す正の実数(負の小数も可)小数の階乗・統計分布の計算
LN自然対数 ln(x) を返す正の実数成長率・対数変換
EXPe^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スプレッドシートで完全に同じ動作です。

項目ExcelGoogleスプレッドシート
構文=GAMMALN(数値)=GAMMALN(値)
動作ln(Γ(x)) を返すln(Γ(x)) を返す
対応バージョンすべてのバージョン全バージョン
エラー時#NUM! / #VALUE!#NUM! / #VALUE!
GAMMALN.PRECISEExcel 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)) と同じ値になるはずです。

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