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

スポンサーリンク

「GAMMALN.PRECISE関数って、GAMMALN関数と何が違うの?」

スプレッドシートでガンマ関数の自然対数を調べると、GAMMALN関数とGAMMALN.PRECISE関数の2つが見つかります。名前が似ていて、どちらを使えばいいか迷いますよね。

結論から言うと、GAMMALN.PRECISE関数はGAMMALN関数の「高精度版」です。Excel 2010で精度改善のために導入されました。

この記事では、GAMMALN.PRECISE関数の基本の書き方からGAMMALN関数との違い、実務での活用例まで紹介します。

  1. スプレッドシートのGAMMALN.PRECISE関数とは?
  2. GAMMALN.PRECISE関数の書き方(構文と引数)
    1. 基本構文
    2. 引数の説明
  3. GAMMALN.PRECISE関数の基本的な使い方
    1. 小さな数値で動作を確認する
    2. 大きな数値でオーバーフローを回避する
    3. セル参照を使う
    4. 小数の引数も扱える
  4. GAMMALN関数との違い
    1. Googleスプレッドシートでは差がほぼゼロ
    2. なぜGAMMALN.PRECISEが存在するのか
    3. どちらを使うべきか
  5. GAMMALN.PRECISE関数の実践的な使い方・応用例
    1. 大きな数の組み合わせ(nCr)を安全に計算する
    2. 順列(nPr)も対数で計算する
    3. 対数尤度の計算に使う
    4. ポアソン分布の対数確率質量を計算する
    5. ベータ分布のパラメータ推定に使う
    6. EXP関数と組み合わせて元の値に戻す
    7. 階乗の比を安全に計算する
    8. 多項係数を計算する
    9. Stirlingの近似と組み合わせて検算する
  6. よくあるエラーと対処法
    1. 0以下の値を指定したとき
    2. 文字列を指定したとき
    3. 関数名のスペルミス
    4. 結果が極端に大きい・小さいとき
  7. 似た関数との違い・使い分け
    1. GAMMALN.PRECISEとGAMMAの関係
    2. GAMMALN.PRECISEとLNの組み合わせ
    3. GAMMALN.PRECISEとFACTの関係
    4. GAMMALN.PRECISEとSQRTPIの関係
  8. 数学的背景: ガンマ関数の対数とは
  9. Excelとの違い
  10. よくある質問(FAQ)
    1. Q1. GAMMALN.PRECISEとGAMMALNはどちらを使えばいいですか?
    2. Q2. GAMMALN.PRECISEの結果がマイナスになるのはなぜですか?
    3. Q3. GAMMALN.PRECISEで負の値を計算するにはどうすればいいですか?
    4. Q4. 対数尤度を計算するときGAMMALN.PRECISEのほうがLN(GAMMA())より速いですか?
    5. Q5. GAMMALN.PRECISEを使えば確率分布の確率を直接計算できますか?
    6. Q6. Googleスプレッドシートの関数電卓的に1回だけ計算したいときも使えますか?
    7. Q7. ARRAYFORMULAと組み合わせて一括計算できますか?
  11. まとめ

スプレッドシートのGAMMALN.PRECISE関数とは?

GAMMALN.PRECISE関数(読み方: ガンマ・エルエヌ・プリサイス関数)は、ガンマ関数の自然対数 ln(Gamma(x)) を高精度に返す関数です。

関数名は「GAMMA(ガンマ関数)+ LN(自然対数 Natural Logarithm)+ PRECISE(精密な)」に由来します。名前のとおり、GAMMALN関数の精度を向上させた関数ですね。

なぜ高精度版が必要だったのでしょうか。Excelの旧バージョンのGAMMALN関数には、特定の値で精度が低下する問題がありました。Excel 2010でこの問題を解消するために、GAMMALN.PRECISE関数が新設されたのです。

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

  • ガンマ関数の自然対数 ln(Gamma(x)) を高精度に計算する
  • GAMMA関数がオーバーフローする大きな値でも安全に扱える
  • 大きな数の階乗や組み合わせ計算の中間処理に使う
  • 統計分布のパラメータ推定(最尤推定など)に活用する
  • ポアソン分布ベータ分布の確率密度計算で対数化に使う

NOTE

GAMMALN.PRECISE関数はGoogleスプレッドシートの全バージョンで使えます。Excelでは2010以降で対応しています。Microsoft 365やExcel 2021でも問題なく動作します。

GAMMALN.PRECISE関数の書き方(構文と引数)

基本構文

=GAMMALN.PRECISE(値)

カッコの中に「値(ガンマ関数の自然対数を求めたい正の数値)」を1つだけ入れます。

引数の説明

引数必須/任意説明
必須正の実数を指定する。0以下を指定すると#NUM!エラーになる

引数は1つだけなので、とてもシンプルです。GAMMALN関数とまったく同じ形式ですね。

引数には整数だけでなく小数も指定できます。たとえば =GAMMALN.PRECISE(0.5)=GAMMALN.PRECISE(2.7) も計算可能です。これはガンマ関数が階乗を実数に拡張した関数であるためです。

GAMMALN.PRECISE関数の基本的な使い方

小さな数値で動作を確認する

まずは小さな数値で、GAMMALN.PRECISE関数の動作を確認してみましょう。

=GAMMALN.PRECISE(1)

結果は「0」です。Gamma(1) = 1 なので、ln(1) = 0 になります。

=GAMMALN.PRECISE(5)

結果は約「3.18」です。これは ln(Gamma(5)) = ln(24) = ln(4!) と同じ値です。Gamma(5) は4の階乗(4! = 24)と等しいためですね。

検算してみましょう。=LN(GAMMA(5)) も約「3.18」を返します。一致しますね。

=GAMMALN.PRECISE(0.5)

結果は約「0.57」です。Gamma(0.5) = sqrt(pi)(約1.77)なので、ln(1.77) は約 0.57 です。=LN(SQRT(PI())) の結果と一致します。

大きな数値でオーバーフローを回避する

GAMMALN.PRECISE関数の真価は、大きな値を安全に扱えるところです。

=GAMMA(172)

この数式は#NUM!エラーになります。Gamma(172) は10の308乗を超えるため、スプレッドシートで扱える数値の上限(約1.79e+308)を超えてしまうからです。

=GAMMALN.PRECISE(172)

こちらは約「711.71」を返します。エラーにならず計算できました。対数を取ることで、数値の桁数が劇的に圧縮されるのですね。

さらに大きな値も問題ありません。

=GAMMALN.PRECISE(1000)

結果は約「5905.22」です。Gamma(1000) は10の2567乗を超える数値ですが、対数なら4桁に収まります。

=GAMMALN.PRECISE(10000)

結果は約「82108.93」です。10万の階乗に近い数値の対数も、5桁程度で表現できます。

セル参照を使う

A1に数値が入っているとします。

=GAMMALN.PRECISE(A1)

セル参照を使えば、値を変えるだけで結果が自動更新されます。

A1:A10に連続した値が入っている場合は、配列数式やARRAYFORMULAで一括計算できます。

=ARRAYFORMULA(GAMMALN.PRECISE(A1:A10))

これでA1:A10の各値に対するGAMMALN.PRECISEの結果がB1:B10に展開されます。複数の値を一度に処理したいときに便利ですね。

小数の引数も扱える

GAMMALN.PRECISE関数は整数だけでなく小数も受け付けます。

=GAMMALN.PRECISE(3.5)

結果は約「1.20」です。Gamma(3.5) = 2.5 × 1.5 × 0.5 × sqrt(pi) ≈ 3.32 なので、ln(3.32) ≈ 1.20 と一致します。

=GAMMALN.PRECISE(10.5)

結果は約「12.80」です。整数と整数の間の値も滑らかに補間されるのがガンマ関数の特徴です。階乗を実数に拡張した関数だからこそ実現できる計算ですね。

GAMMALN関数との違い

GAMMALN.PRECISE関数とGAMMALN関数の違いを整理しましょう。

項目GAMMALNGAMMALN.PRECISE
構文=GAMMALN(値)=GAMMALN.PRECISE(値)
戻り値ln(Gamma(x))ln(Gamma(x))
引数の範囲正の実数のみ正の実数のみ
精度標準精度より高い数値精度
Excel対応すべてのバージョンExcel 2010以降
導入の経緯初期から搭載精度改善目的で追加

Googleスプレッドシートでは差がほぼゼロ

Googleスプレッドシートでは、両関数の計算精度に実用上の差はほぼありません。

=GAMMALN(100)
=GAMMALN.PRECISE(100)

どちらも約「359.13」を返します。小数点以下10桁以上を比較しても、同じ値です。

=GAMMALN(500)
=GAMMALN.PRECISE(500)

大きな値でも結果は同じです。どちらも約「2605.12」を返します。

差を見つけるためにあえて1から10まで両関数の結果を比較しても、IEEE 754倍精度浮動小数点数の表現範囲内では完全に一致します。Googleスプレッドシートは内部で同じ高精度アルゴリズム(Stirlingの近似やLanczosの公式など)を使っているためですね。

なぜGAMMALN.PRECISEが存在するのか

Excelの旧バージョンのGAMMALN関数には、一部の値で精度が低下する問題がありました。Microsoftはこの問題に対して「既存関数を修正する」のではなく「高精度版を別関数として追加する」というアプローチを取りました。

これは下位互換性を保つための判断です。既存のGAMMALN関数を変更すると、過去のワークブックで計算結果が変わってしまいます。そのリスクを避けるために、GAMMALN.PRECISE関数が新設されました。

Excel 2010以降では他にも同様のリネーム関数が多数追加されています。WEIBULL → WEIBULL.DIST、POISSON → POISSON.DIST、NORMDIST → NORM.DIST など、統計関数の精度改善・命名規則統一が一斉に行われた時期ですね。

Googleスプレッドシートでは両方とも高精度で実装されています。そのため、どちらを使っても結果は変わりません。

どちらを使うべきか

結論としては、以下の基準で選んでください。

  • 通常の用途: GAMMALN関数で問題ありません
  • Excelファイルとの互換性重視: GAMMALN.PRECISE関数を使うと安心です
  • 新規でMicrosoft 365を使う環境: PRECISEが推奨されています
  • 古いExcelファイルとの互換性が必要: GAMMALN関数を使ってください

実務的にはGoogleスプレッドシートだけで完結する案件ならGAMMALN関数が短く書けて便利です。Excelとファイルを行き来する可能性があるならGAMMALN.PRECISEを選んでおくと将来の互換性で困りません。

GAMMALN.PRECISE関数の実践的な使い方・応用例

大きな数の組み合わせ(nCr)を安全に計算する

COMBIN関数は大きな数値でオーバーフローすることがあります。GAMMALN.PRECISEを使えば、対数の性質で安全に計算できます。

組み合わせの公式 nCr = n! / (r! × (n-r)!) を対数に変換すると、次のようになります。

=EXP(GAMMALN.PRECISE(n+1) - GAMMALN.PRECISE(r+1) - GAMMALN.PRECISE(n-r+1))

たとえば 200C100(200個から100個を選ぶ組み合わせ)を計算してみましょう。

=EXP(GAMMALN.PRECISE(201) - GAMMALN.PRECISE(101) - GAMMALN.PRECISE(101))

結果は約 9.05 × 10^58 です。COMBIN関数の結果と一致します。

さらに大きな組み合わせも計算できます。たとえば 1000C500 のような巨大な組み合わせはCOMBIN関数でオーバーフローしますが、GAMMALN.PRECISEなら次のように対数の差で求められます。

=GAMMALN.PRECISE(1001) - GAMMALN.PRECISE(501) - GAMMALN.PRECISE(501)

結果は約「690.31」で、対数のまま扱えば桁あふれの心配がありません。具体的な数値が必要ならEXPで戻せますが、対数値同士の比較や尤度計算では対数のまま使うのが定石です。

TIP

対数の世界では「掛け算が足し算」「割り算が引き算」に変わります。GAMMALN.PRECISE関数はこの性質を活かして、巨大な数値の計算をシンプルにしてくれますよ。

順列(nPr)も対数で計算する

PERMUT関数も大きな値でオーバーフローします。順列 nPr = n! / (n-r)! は対数では次のように表現します。

=EXP(GAMMALN.PRECISE(n+1) - GAMMALN.PRECISE(n-r+1))

100個から30個を選ぶ順列 100P30 を計算してみます。

=EXP(GAMMALN.PRECISE(101) - GAMMALN.PRECISE(71))

結果は約 7.45 × 10^57 です。PERMUT関数も大きな値で#NUM!エラーになりますが、GAMMALN.PRECISEなら回避できます。

対数尤度の計算に使う

統計学の最尤推定では、尤度関数の対数(対数尤度)を計算する場面があります。ガンマ分布のパラメータ推定がその典型例です。

ガンマ分布の対数尤度関数には ln(Gamma(alpha)) が含まれます。alphaが大きくなるとGamma(alpha)は天文学的な数値です。そのため、GAMMALN.PRECISE関数で直接 ln(Gamma(alpha)) を求めます。

=GAMMALN.PRECISE(A1)

A1に形状パラメータalphaの候補値を入れて、対数尤度を計算します。alphaを変化させて対数尤度が最大になる値を探す流れです。

具体的な対数尤度関数の例として、観測データ x1, x2, …, xn がガンマ分布に従うとき、対数尤度は次のようになります。

=n*A1*LN(B1) + (A1-1)*SUM(LN(C1:Cn)) - B1*SUM(C1:Cn) - n*GAMMALN.PRECISE(A1)

ここで A1=alpha(形状パラメータ)、B1=beta(尺度パラメータ)、C1:Cn=観測データです。最後の項 n*GAMMALN.PRECISE(A1) が対数化された規格化定数の役割を果たします。

ポアソン分布の対数確率質量を計算する

POISSON.DIST関数で確率を計算すると、平均値が大きいときアンダーフロー(極小値が0に丸められる)する場合があります。

ポアソン分布の確率質量関数 P(X=k) = e^(-λ) × λ^k / k! を対数に変換すると、次のように書けます。

=-A1 + B1*LN(A1) - GAMMALN.PRECISE(B1+1)

ここで A1=λ(平均)、B1=k(観測値)です。GAMMALN.PRECISE(B1+1) は ln(k!) を計算しています。

たとえば λ=100、k=150 のときの対数確率を計算してみます。

=-100 + 150*LN(100) - GAMMALN.PRECISE(151)

結果は約「-15.04」です。EXPで戻すと約 2.94 × 10^(-7) で、稀な事象であることがわかります。POISSON.DIST(150, 100, FALSE) でも同じ結果が得られますが、λやkがさらに大きい場合は対数のまま扱うのが安全です。

ベータ分布のパラメータ推定に使う

ベータ分布の確率密度関数にも ln(Gamma) が現れます。ベータ分布の対数尤度の中の規格化定数 ln(Gamma(α+β) / (Gamma(α) × Gamma(β))) は次のように表現できます。

=GAMMALN.PRECISE(A1+B1) - GAMMALN.PRECISE(A1) - GAMMALN.PRECISE(B1)

A1=α、B1=β です。α と β が大きいときベータ関数自体は天文学的な小さい値や大きい値になりますが、対数なら安全に計算できます。

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

GAMMALN.PRECISE関数の結果を元のガンマ関数値に戻したいときは、EXP関数を使います。

=EXP(GAMMALN.PRECISE(10))

結果は「362880」です。これは Gamma(10) = 9! = 362880 と一致します。

ただし、大きな値ではEXP関数自体がオーバーフローします。ln(Gamma(x)) の値が約709を超えると#NUM!エラーです。対数のまま計算を進めて、最後に必要な部分だけEXPで戻しましょう。

階乗の比を安全に計算する

大きな数の階乗の比(例: 100! / 50!)を直接計算すると、オーバーフローします。GAMMALN.PRECISEなら差分で安全に計算できます。

=EXP(GAMMALN.PRECISE(101) - GAMMALN.PRECISE(51))

この数式は 100! / 50! を計算しています。GAMMALN.PRECISE(n+1) = ln(n!) なので、引き算で割り算を表現できます。結果は約 3.07 × 10^73 です。

多項係数を計算する

多項係数 n! / (k1! × k2! × … × km!) も対数で計算できます。たとえばトランプ52枚を13枚ずつ4人に配る場合の数は 52! / (13!)^4 です。

=GAMMALN.PRECISE(53) - 4*GAMMALN.PRECISE(14)

結果は約「62.85」です。EXPで戻すと約 5.36 × 10^27 通りになります。多項係数はCOMBINを繰り返し使っても計算できますが、GAMMALN.PRECISEを使えば1つの式で簡潔に書けます。

Stirlingの近似と組み合わせて検算する

数学的にはGAMMALN(x) ≈ xLN(x) – x + 0.5LN(2PI()x)(Stirlingの近似)です。GAMMALN.PRECISE関数の結果が妥当かどうか、Stirlingの近似で検算できます。

=A1*LN(A1) - A1 + 0.5*LN(2*PI()*A1)

A1=100 のとき、近似値は約「359.13」です。GAMMALN.PRECISE(100) と小数点以下4桁まで一致します。大きな値ほど近似精度が上がる性質を確認できますね。

よくあるエラーと対処法

GAMMALN.PRECISE関数で発生しやすいエラーをまとめました。

エラー原因対処法
#NUM!0以下の値を指定した正の数値(0より大きい値)を指定する
#VALUE!引数に文字列が入っているセル参照先が数値かどうか確認する
#NAME?関数名の入力ミス「GAMMALN.PRECISE」のスペルを確認する
#N/A引数が空セル参照に値が入っているか確認する

0以下の値を指定したとき

GAMMALN.PRECISE関数は正の数値(0より大きい値)しか受け付けません。

=GAMMALN.PRECISE(0)

この数式は#NUM!エラーになります。負の数や0は指定できません。

GAMMA関数は負の小数(-0.5など)も計算できます。しかし、GAMMALN.PRECISE関数は対応していません。ln(Gamma(x)) は正の値のみで定義されるためです。

エラーを避けたい場合はIFERROR関数で前処理しましょう。

=IFERROR(GAMMALN.PRECISE(A1), "正の数値を入力してください")

またはIF関数で条件分岐する方法もあります。

=IF(A1>0, GAMMALN.PRECISE(A1), "正の数値を入力してください")

文字列を指定したとき

引数に文字列が入っていると#VALUE!エラーになります。

=GAMMALN.PRECISE("10")

スプレッドシートが文字列を数値として解釈できる場合もありますが、確実に数値で渡したいときはISNUMBER関数で事前チェックします。

=IF(ISNUMBER(A1), GAMMALN.PRECISE(A1), "数値を入力してください")

関数名のスペルミス

GAMMALN.PRECISE関数は名前が長く、スペルミスが起きやすい関数です。

=GAMMALNPRECISE(5)

ドット(.)を忘れると#NAME?エラーになります。必ず「GAMMALN.PRECISE」とドットを入れてください。

NOTE

Googleスプレッドシートでは関数名の入力中にサジェストが表示されます。「GAMMALN」まで入力すれば、候補にGAMMALN.PRECISEが出てくるので活用してください。

結果が極端に大きい・小さいとき

GAMMALN.PRECISEの結果をEXP関数で戻そうとして#NUM!エラーになることがあります。これは対数を戻した結果がスプレッドシートの数値範囲を超えているためです。

=EXP(GAMMALN.PRECISE(200))

GAMMALN.PRECISE(200) は約「857.93」を返します。EXP(857.93) は約 10^372 で、スプレッドシートの上限(約 1.79 × 10^308)を超えるため#NUM!エラーになります。

対処法は2つあります。

  • 対数のまま計算を進める(推奨)
  • ROUND関数で桁数を制限してから表示する

対数のまま使えるなら、わざわざEXPで戻す必要はありません。確率の比較や尤度の最大化なら対数値で十分です。

似た関数との違い・使い分け

関数動作用途
GAMMALN.PRECISEln(Gamma(x)) を高精度に返す大きな値のオーバーフロー回避(高精度)
GAMMALNln(Gamma(x)) を返す大きな値のオーバーフロー回避(標準精度)
GAMMAGamma(x) を返す小数の階乗・統計分布の計算
LN自然対数 ln(x) を返す成長率・対数変換
LOG任意の底の対数を返す桁数計算・指数の逆変換
EXPe^x を返すLN/GAMMALNの逆変換
FACTn! を返す整数の階乗(170まで)
COMBINnCr を返す組み合わせ(小〜中規模)
PERMUTnPr を返す順列(小〜中規模)

GAMMALN.PRECISEとGAMMAの関係

GAMMALN.PRECISE(x) = LN(GAMMA(x)) の関係です。GAMMA関数の結果に自然対数をかけた値を「1ステップで」返してくれます。

小さな値ならGAMMA関数で直接計算するほうがわかりやすいです。約172以上の大きな値ではGAMMA関数がオーバーフローします。そのときはGAMMALN.PRECISE関数に切り替えましょう。

GAMMALN.PRECISEとLNの組み合わせ

GAMMALN.PRECISE(x) と LN(GAMMA(x)) は数学的に同じです。ただし =LN(GAMMA(x)) と書くと、GAMMA(x)の計算段階でオーバーフローする可能性があります。GAMMALN.PRECISE関数なら内部で直接対数を計算するため安全です。

大きな値を扱うときは、必ず =GAMMALN.PRECISE(x) を使ってください。

GAMMALN.PRECISEとFACTの関係

FACT関数は整数の階乗(n!)を計算する関数です。GAMMALN.PRECISE(n+1) は ln(n!) と等しいため、両者には次の関係があります。

GAMMALN.PRECISE(n+1) = LN(FACT(n))

FACT関数は170までしか計算できません(171! でオーバーフロー)。171以上の階乗の対数を求めるならGAMMALN.PRECISEが必須です。

=GAMMALN.PRECISE(171)

結果は約「706.57」です。これは ln(170!) を表しています。整数の階乗を超えた範囲も計算できるのがGAMMALN.PRECISEの強みですね。

GAMMALN.PRECISEとSQRTPIの関係

SQRTPI関数は sqrt(pi × n) を返す関数です。一方、GAMMALN.PRECISE(0.5) = LN(SQRT(PI())) ≈ 0.5724 です。Gamma(0.5) = sqrt(pi) という有名な関係から、対数を取った値が GAMMALN.PRECISE(0.5) と一致しますね。

=EXP(GAMMALN.PRECISE(0.5))

結果は約「1.7725」で、SQRT(PI()) の値と一致します。

数学的背景: ガンマ関数の対数とは

ガンマ関数 Γ(x) は階乗を実数に拡張した関数で、次の関係を満たします。

  • Γ(n) = (n-1)! (n が正の整数のとき)
  • Γ(x+1) = x × Γ(x) (漸化式)
  • Γ(0.5) = √π

ガンマ関数の値は x が大きくなると急激に増加します。たとえば Γ(20) は約 1.2 × 10^17、Γ(100) は約 9.3 × 10^155 という巨大な数値です。

対数を取ると ln(Γ(x)) は穏やかに増加するため、計算機で扱いやすくなります。これがGAMMALN.PRECISE関数を使うメリットです。

数値計算の世界では「桁あふれ防止」のために対数空間で計算するのが定番テクニックです。確率計算、機械学習の損失関数、統計推定など、幅広い場面でGAMMALN.PRECISEが活躍しますよ。

Excelとの違い

項目ExcelGoogleスプレッドシート
構文=GAMMALN.PRECISE(数値)=GAMMALN.PRECISE(値)
動作ln(Gamma(x)) を返すln(Gamma(x)) を返す
対応バージョンExcel 2010以降全バージョン
エラー時#NUM! / #VALUE!#NUM! / #VALUE! / #NAME?
GAMMALNとの精度差旧バージョンでは差あり差なし
ARRAYFORMULA対応スピル機能で実現(Microsoft 365)ARRAYFORMULAで明示的に展開

ExcelではGAMMALN.PRECISE関数はExcel 2010で導入されました。Microsoft 365やExcel 2021/2024でも問題なく動作します。

Googleスプレッドシートでは全バージョンで対応しています。ExcelファイルをGoogleスプレッドシートにインポートした場合も、そのまま動作します。Excel側でGAMMALN.PRECISEを使った数式があっても、Googleスプレッドシート側で同じ結果を再現できます。

よくある質問(FAQ)

Q1. GAMMALN.PRECISEとGAMMALNはどちらを使えばいいですか?

Googleスプレッドシートでは両者の精度差はほぼないため、どちらを使っても問題ありません。Excelとの互換性が必要ならGAMMALN.PRECISEを推奨します。新規で書くなら短いGAMMALN関数で十分です。

Q2. GAMMALN.PRECISEの結果がマイナスになるのはなぜですか?

引数が1未満(0 < x < 1)のとき、Gamma(x) は1より大きくなるため対数は正になります。逆に x が2に近いとき Gamma(x) は1に近いため、対数は0付近になります。たとえば =GAMMALN.PRECISE(2) は0、=GAMMALN.PRECISE(1.5) は約「-0.12」とマイナスになる場合があります。これは正常な動作です。

Q3. GAMMALN.PRECISEで負の値を計算するにはどうすればいいですか?

GAMMALN.PRECISEは正の実数しか受け付けません。負の値のガンマ関数を計算したい場合は、GAMMA関数を使い、結果にLN関数を組み合わせてください。ただし負の整数 (0, -1, -2, …) でGAMMA関数は#NUM!エラーになる点に注意してください。

Q4. 対数尤度を計算するときGAMMALN.PRECISEのほうがLN(GAMMA())より速いですか?

実行速度は同等ですが、=LN(GAMMA(x)) は x が大きいとGAMMA(x)でオーバーフローして計算自体ができません。GAMMALN.PRECISEは内部で直接対数を計算するため、大きな値でもエラーになりません。実務では x ≥ 172 のときはGAMMALN.PRECISE一択です。

Q5. GAMMALN.PRECISEを使えば確率分布の確率を直接計算できますか?

直接の確率は計算できませんが、確率密度関数や確率質量関数の「対数化された形」で計算できます。たとえばポアソン分布なら -λ + k*LN(λ) - GAMMALN.PRECISE(k+1) で対数確率を計算できます。最終的に確率値が必要ならEXP関数で戻します。確率が小さすぎてアンダーフローしそうなときに有効なテクニックです。

Q6. Googleスプレッドシートの関数電卓的に1回だけ計算したいときも使えますか?

はい。任意のセルで =GAMMALN.PRECISE(5) のように入力すれば、その場で結果が表示されます。引数の値を変えれば結果も即座に更新されます。電卓代わりに使うときは、別タブやサブシートを「計算用」として用意しておくと便利ですよ。

Q7. ARRAYFORMULAと組み合わせて一括計算できますか?

はい。=ARRAYFORMULA(GAMMALN.PRECISE(A1:A100)) のように書けば、A1:A100の各値に対するGAMMALN.PRECISEの結果がB1:B100に展開されます。大量のデータで対数尤度や対数階乗を計算するときに重宝します。

まとめ

GAMMALN.PRECISE関数は、ガンマ関数の自然対数 ln(Gamma(x)) を高精度に返す関数です。

ポイントを整理します。

  • 構文は =GAMMALN.PRECISE(値) の1引数。正の実数のみ対応
  • GAMMALN関数の高精度版として、Excel 2010で導入された
  • Googleスプレッドシートでは両関数の精度差はほぼゼロ
  • 大きな数の組み合わせ計算には =EXP(GAMMALN.PRECISE(n+1) - GAMMALN.PRECISE(r+1) - GAMMALN.PRECISE(n-r+1)) が便利
  • GAMMA関数が約172以上でオーバーフローする問題を回避できる
  • ポアソン分布ベータ分布ガンマ分布の対数尤度計算に使える
  • 元のガンマ関数値に戻すにはEXP関数を使う
  • Excelとの互換性を重視するならGAMMALN.PRECISEを選ぶと安心

まずは =GAMMALN.PRECISE(5) で「約3.18」が返ることを確認してみてください。=GAMMALN(5) と同じ値になるはずです。

その後、対数尤度計算や巨大な組み合わせ計算など、実務シーンで活用してみてくださいね。

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