「ExcelのGAMMALN.PRECISEって、GAMMALN関数とどう違うんだろう?」。ガンマ関数の自然対数を調べていると、ExcelにはGAMMALN関数とGAMMALN.PRECISE関数の2つがあることに気づきますよね。
名前が似ていてどちらを使えばいいか迷いますが、結論はシンプルです。GAMMALN.PRECISE関数は、Excel 2010で追加された「高精度版GAMMALN」です。下位互換性を保つために、旧関数を残したまま改良版が新名で用意されたんですよ。
この記事ではExcelのGAMMALN.PRECISE関数の使い方を、GAMMALN関数との違いを軸に解説します。.PRECISEが何を意味するのか、なぜ高精度版が必要だったのか、どちらを選ぶべきかまで判断フロー付きで整理しますよ。
ExcelのGAMMALN.PRECISE関数とは
ExcelのGAMMALN.PRECISE関数(読み方: ガンマ・エルエヌ・プリサイス関数)は、ガンマ関数Γ(x)の自然対数を高精度に返す関数です。
「GAMMA」はギリシャ文字のガンマ(Γ)に由来し、階乗を実数全体に拡張した数学関数を指します。「LN」は自然対数(底がe ≈ 2.718の対数)の略です。「PRECISE」は英語で「精密な」という意味で、GAMMALN関数の精度を向上させた関数であることを示しています。
たとえば=GAMMALN.PRECISE(5)は ln(4!) = ln(24) ≈ 3.178 を返します。GAMMALN関数とまったく同じ値ですね。
ExcelのGAMMALN.PRECISE関数にできることをまとめると、次のとおりです。
- ガンマ関数の自然対数 ln(Γ(x)) を高精度に計算する
- 大きな階乗(171!以上)をオーバーフローさせずに扱える
- 対数尤度(観測データから推定値の確からしさを表す指標)の反復計算で誤差を抑える
- 統計分布のパラメータ推定で精度を担保する
NOTE
GAMMALN.PRECISE関数はExcel 2010以降で利用できます。Excel 2007以前のファイルとの互換性が必要な場合は、GAMMALN関数を使ってくださいね。
なぜ「精密版」が必要だったのか
Excel 2007以前のGAMMALN関数には、特定の値で精度がわずかに低下する問題がありました。Microsoftはこの問題への対応として、興味深いアプローチを採りました。
それが「既存のGAMMALN関数は修正せず、高精度版を別関数として追加する」という方針です。下位互換性を保つための判断ですね。既存のGAMMALN関数の中身を変更すると、過去のワークブックで計算結果が変わるリスクがあるからです。
そこでExcel 2010で、改良版として「GAMMALN.PRECISE」が新設されました。旧ファイルは旧GAMMALN関数で互換性を保ちつつ、新規プロジェクトはPRECISE版で精度向上の恩恵を受けられるようになったんですよ。
GAMMALN.PRECISE関数の基本構文と引数
GAMMALN.PRECISE関数の構文はとてもシンプルです。
=GAMMALN.PRECISE(x)
引数は1つだけ。必須なので省略できません。
| 引数 | 必須/省略 | 説明 |
|---|---|---|
| x | 必須 | ガンマ関数の対数を計算する正の実数 |
基本的な使い方
セルA2に「5」と入力されているとして、=GAMMALN.PRECISE(A2)と書くと、ガンマ関数の自然対数が返ります。
| A列(x) | B列(数式) | 結果 |
|---|---|---|
| 1 | =GAMMALN.PRECISE(A2) | 0 |
| 2 | =GAMMALN.PRECISE(A3) | 0 |
| 2.5 | =GAMMALN.PRECISE(A4) | 約0.285 |
| 3 | =GAMMALN.PRECISE(A5) | 約0.693 |
| 5 | =GAMMALN.PRECISE(A6) | 約3.178 |
| 10 | =GAMMALN.PRECISE(A7) | 約12.802 |
| 100 | =GAMMALN.PRECISE(A8) | 約359.134 |
| 172 | =GAMMALN.PRECISE(A9) | 約711.715 |
GAMMALN.PRECISE(1) = ln(Γ(1)) = ln(1) = 0、GAMMALN.PRECISE(2) = ln(Γ(2)) = ln(1) = 0 となります。整数値を入れると ln((x-1)!) が返ると覚えておくと便利ですよ。
TIP
GAMMALN.PRECISE関数は小数も受け取れます。
=GAMMALN.PRECISE(2.5)は約0.285を返します。連続的なxに対して値を計算できるのが、ガンマ関数の強みですね。
GAMMALN関数との違いと使い分け
GAMMALN.PRECISE関数とGAMMALN関数の違いを、3つの軸で整理しましょう。
| 項目 | GAMMALN | GAMMALN.PRECISE |
|---|---|---|
| 構文 | =GAMMALN(x) | =GAMMALN.PRECISE(x) |
| 戻り値 | ln(Γ(x)) | ln(Γ(x))(高精度) |
| 引数の範囲 | 正の実数のみ | 正の実数のみ |
| 精度 | 標準精度 | より高い数値精度 |
| 対応バージョン | すべてのバージョン | Excel 2010以降 |
| 導入の経緯 | Excel初期から搭載 | Excel 2010で精度改善目的で追加 |
戻り値の数学的な意味は同じですが、内部の計算アルゴリズムが異なります。
数値出力の比較表
実際に同じxに対して、両関数の出力を並べてみましょう。
| x | =GAMMALN(x) | =GAMMALN.PRECISE(x) | 差 |
|---|---|---|---|
| 1 | 0 | 0 | 0 |
| 5 | 約3.178 | 約3.178 | ほぼ0 |
| 10 | 約12.802 | 約12.802 | ほぼ0 |
| 100 | 約359.134 | 約359.134 | ほぼ0 |
| 1000 | 約5905.220 | 約5905.220 | ほぼ0 |
現行のExcelバージョン(Excel 2010以降)では、両関数の結果は実用上ほぼ同じです。小数点以下10桁レベルで比較しても、ほとんど差はありません。
使い分けの判断フロー
実務での選び方はシンプルです。次の3つの軸で判断してください。
Q1. Excel 2007以前のファイルと互換性が必要?
→ YES: GAMMALN関数を使う(PRECISEは非対応)
→ NO: Q2へ
Q2. 論文・厳密な統計分析・誤差が累積する反復計算?
→ YES: GAMMALN.PRECISE関数を推奨
→ NO: Q3へ
Q3. 通常の業務利用
→ どちらでもOK(GAMMALN.PRECISEで統一すると新規プロジェクトに無難)
TIP
新規プロジェクトでExcel 2010以降の環境しか使わないなら、最初からGAMMALN.PRECISEで統一するのが無難です。「精密版を使っている」と命名で明示できるので、共同編集者にも親切ですよ。
「.PRECISE」とは何か:Excel 2010の精度改善関数群
GAMMALN.PRECISEの「.PRECISE」というサフィックスは、Excel 2010で大規模に行われた精度改善関数群の一員であることを示しています。
PRECISE関数ファミリー一覧
Excel 2010では、「旧関数を残しつつ新名で改良版を追加」というアプローチで多数の関数が刷新されました。
| 旧関数名 | 新関数(Excel 2010で追加) | 改善内容 |
|---|---|---|
| GAMMALN | GAMMALN.PRECISE | 浮動小数点精度の向上 |
| FLOOR | FLOOR.PRECISE / FLOOR.MATH | 負の数の切り捨て挙動を明確化 |
| CEILING | CEILING.PRECISE / CEILING.MATH | 負の数の切り上げ挙動を明確化 |
| PERCENTILE | PERCENTILE.INC / PERCENTILE.EXC | 包含/排他の挙動を選べる |
| QUARTILE | QUARTILE.INC / QUARTILE.EXC | 同上 |
| RANK | RANK.AVG / RANK.EQ | 同順位の処理方式を選べる |
| MODE | MODE.SNGL / MODE.MULT | 単一値/配列の選択 |
| VAR | VAR.S / VAR.P | 標本/母集団の選択を明示 |
| STDEV | STDEV.S / STDEV.P | 同上 |
| COVAR | COVARIANCE.S / COVARIANCE.P | 同上 |
サフィックスのパターンは「.PRECISE」「.INC(包含)」「.EXC(排他)」「.S(標本)」「.P(母集団)」などです。それぞれ役割が異なりますが、共通しているのは「下位互換性のために旧関数を残しつつ、新名で意味を明確にした版を追加した」という点ですよ。
なぜ既存関数を改修せず新関数を追加したのか
「最初からGAMMALN関数の精度を上げればよかったのでは?」と思いますよね。Microsoftがこの方針を選ばなかった理由は、過去のワークブックの計算結果を変えないためです。
仮に既存のGAMMALN関数を修正すると、何百万もの既存ファイルで同じ数式が違う結果を返す事態になります。会計帳簿や統計レポートでこれが起きると、検証の手間も信頼性のリスクも甚大ですよね。
そこでMicrosoftは「旧関数は互換性関数として温存」「新関数は明確な命名で追加」という方針を採りました。GAMMALN.PRECISEもこの設計思想の中で生まれた関数なんですよ。
NOTE
Excel 2010以降では、関数の挿入ダイアログで「互換性関数」というカテゴリが新設されました。旧GAMMALN関数もここに分類されています。新規プロジェクトでは新関数(PRECISE版など)を使うのが推奨されていますよ。
GAMMALN.PRECISE関数の実務活用例
GAMMALN.PRECISE関数は単独で使うよりも、統計計算の一部として組み込まれることが多い関数です。代表的な活用パターンを3つ紹介しますね。
活用例1: 大きな組み合わせ(nCr)の対数化
COMBIN関数(組み合わせの数を返す関数)は、大きな数値でオーバーフローすることがあります。GAMMALN.PRECISEを使えば、対数の性質で安全に計算できますね。
組み合わせの公式 nCr = n! / (r! × (n-r)!) を対数に変換すると、次のようになります。
log C(n, r) = GAMMALN.PRECISE(n+1) - GAMMALN.PRECISE(r+1) - GAMMALN.PRECISE(n-r+1)
たとえば log C(200, 100) を計算してみましょう。
=GAMMALN.PRECISE(201) - 2*GAMMALN.PRECISE(101)
結果は約135.75です。200個から100個を選ぶ組み合わせ数の自然対数ですね。元の組み合わせ数に戻すなら、EXP関数(e^xを返す関数)でくるみます。
=EXP(GAMMALN.PRECISE(201) - 2*GAMMALN.PRECISE(101))
結果は約 9.05 × 10^58 です。直接 =COMBIN(200,100) でも計算できますが、n=1000など大きな値では#NUM!エラーになります。GAMMALN.PRECISE関数なら対数のまま扱えるので限界がありませんよ。
活用例2: 対数尤度の反復計算で精度を担保する
最尤推定(観測データから最も尤もらしいパラメータを推定する手法)では、対数尤度を最大化するパラメータを反復計算で探します。この反復計算で誤差が累積する場面こそ、GAMMALN.PRECISE関数の出番ですよ。
ポアソン分布の対数尤度は、次の数式で表されます。
log L(λ) = Σ [k × log(λ) - λ - log(k!)]
ここでlog(k!)の部分をGAMMALN.PRECISE関数で計算します。log(k!) = GAMMALN.PRECISE(k+1)という関係を使うんですね。
A列に観測データ(k=2, 3, 1, 4, 2)が入っていて、λ=2.4と仮定したとします。各データの対数尤度寄与は次のように計算できますよ。
=A2*LN(2.4) - 2.4 - GAMMALN.PRECISE(A2+1)
これを全データにSUM関数で合計すれば、log L(2.4) が求まります。最尤推定では、このlog Lを最大化するλをソルバー機能などで探していきます。反復で何度も計算するので、各ステップの精度差が累積します。GAMMALN.PRECISE版を使うと、誤差累積を抑えられて安心ですよ。
活用例3: ベイズ統計の正規化定数
ベイズ統計の事後分布には、ベータ関数 B(a, b) = Γ(a)Γ(b) / Γ(a+b) が登場します。「正規化定数」とは事後分布を確率密度に正規化するための係数で、対数で扱うのが定番です。
log B(a, b) = GAMMALN.PRECISE(a) + GAMMALN.PRECISE(b) - GAMMALN.PRECISE(a+b)
コイントスのベイズ更新でBeta(10, 5)分布を扱うとき、正規化定数の対数は次のように計算しますよ。
=GAMMALN.PRECISE(10) + GAMMALN.PRECISE(5) - GAMMALN.PRECISE(15)
結果は約-9.21です。確率密度関数の計算では、この対数値を使って指数和を取るパターンが多いですよね。MCMC(マルコフ連鎖モンテカルロ法:確率分布からのサンプリング手法)のような反復計算では、PRECISE版で精度を担保しておくと安心ですよ。
EXP関数で元の値に戻す方法と注意点
GAMMALN.PRECISE関数の結果を「元のガンマ関数の値」に戻したいときは、EXP関数と組み合わせます。
=EXP(GAMMALN.PRECISE(x))
これでGAMMA(x)と同じ値が得られます。たとえば=EXP(GAMMALN.PRECISE(5))は24(=4!)を返しますよ。
大きな階乗を計算する際のオーバーフロー注意
ExcelのFACT関数(階乗を求める関数)には限界があります。Excelが扱える最大数値は約 1.79 × 10^308 で、170!がギリギリの上限です。171!以上は#NUM!エラーになってしまいます。
そこでGAMMALN.PRECISE関数の出番ですが、EXP関数で戻すときも限界があります。
=FACT(171) → #NUM! エラー(直接の階乗は計算不可)
=GAMMALN.PRECISE(172) → 約711.715(log(171!)の値)
=EXP(GAMMALN.PRECISE(172)) → #NUM! エラー(EXP(711)はオーバーフロー)
EXP関数自体が約709を超える値で#NUM!エラーになります。対数値が709超なら元に戻せません。
TIP
大きな階乗の比率(n!/m! のような形)は安全に計算できます。
GAMMALN.PRECISE(n+1) - GAMMALN.PRECISE(m+1)を計算してからEXP関数で戻す方法を使いましょう。差分を取れば値が小さくなるので、指数化してもオーバーフローしにくくなりますよ。
たとえば 100!/50! を計算してみましょう。
=EXP(GAMMALN.PRECISE(101) - GAMMALN.PRECISE(51))
結果は約 3.07 × 10^93 です。差分を取ってからEXPに渡すほうが、安全で簡潔ですね。
よくあるエラーと対処法
GAMMALN.PRECISE関数で遭遇しやすいエラーを整理しますね。
| エラー | 原因 | 対処法 |
|---|---|---|
| #NUM! | xに0以下の値を指定した | xに正の数値を指定する |
| #VALUE! | 引数に文字列が入っている | セル参照先が数値かどうか確認する |
| #NAME? | 関数名のスペルミス、またはExcel 2007以前で使用 | スペル確認、またはGAMMALN関数で代替 |
#NUM! エラー
xに0または負の数を指定すると発生します。ガンマ関数の自然対数は正の実数で定義されているので、0以下の値は受け付けません。
=GAMMALN.PRECISE(0) → #NUM!
=GAMMALN.PRECISE(-2) → #NUM!
xに正の数を指定するのが対処法です。データに負の値が混じる可能性があるなら、IF関数やIFERROR関数で事前にチェックしましょう。
=IF(A2>0, GAMMALN.PRECISE(A2), "xは正の値にしてください")
#VALUE! エラー
xに数値以外(文字列など)を指定すると発生します。セル参照先が空白や文字列になっていないか確認してくださいね。
=GAMMALN.PRECISE("apple") → #VALUE!
#NAME? エラー(Excel 2007以前との互換性)
GAMMALN.PRECISE関数はExcel 2010以降で導入されました。Excel 2007以前で使うと#NAME?エラーになります。
=GAMMALN.PRECISE(5) → #NAME?(Excel 2007以前)
古い環境との互換性が必要なら、互換版のGAMMALN関数を使ってください。
関数名の入力ミスでも#NAME?が出ます。「GAMMALN.PRECISE」は名前が長く、ドット(.)を忘れやすいので注意してくださいね。
=GAMMALNPRECISE(5) → #NAME?(ドット忘れ)
NOTE
Excel 2010以降では、関数の挿入ダイアログで「GAMMALN」と入力するとGAMMALN.PRECISEも候補に表示されます。サジェストから選ぶとスペルミスを防げますよ。
まとめ:GAMMALN.PRECISEで高精度な統計計算を
ExcelのGAMMALN.PRECISE関数は、ガンマ関数Γ(x)の自然対数を高精度に返す関数です。一見地味な関数ですが、統計計算の足回りを支える重要な関数なんですよ。
ポイントを整理しますね。
- 構文は
=GAMMALN.PRECISE(x)の1引数だけ。xは正の実数のみ受け付ける - GAMMALN関数の高精度版として、Excel 2010で追加された
- 「.PRECISE」はExcel 2010の精度改善関数群(FLOOR.PRECISE、CEILING.PRECISE 等)の一員
- Microsoftが下位互換性のために「旧関数は残し新名で改良版を追加」した結果生まれた
- 現行Excel環境では両関数の精度差は実用上ほぼゼロ
- 大きな組み合わせ計算は
=EXP(GAMMALN.PRECISE(n+1) - GAMMALN.PRECISE(r+1) - GAMMALN.PRECISE(n-r+1))で安全に - 対数尤度の反復計算やベイズ正規化定数で精度を担保したいときに選ぶ
- EXP関数で戻すときは対数値が709超なら#NUM!になる点に注意
ガンマ関数の自然対数を使う場面は、対数尤度・組合せ計算・ベイズ統計などさまざまです。Excel 2010以降の環境なら、新規プロジェクトはGAMMALN.PRECISE関数で統一しておくと無難ですよ。
ガンマ分布の確率を直接計算したい場合は、ExcelのGAMMA.DIST関数の使い方を参考にしてください。確率からx値を逆算したい場合は、ExcelのGAMMA.INV関数の使い方が役立ちますよ。
GAMMALN.PRECISE関数を覚えておくと、「精度を担保したい」「大きな数値を安全に扱いたい」と困ったときの強力な武器になります。ぜひ実務でも活用してみてくださいね。
