Excelには NORM.S.DIST(標準正規分布)や
NORM.DIST(一般正規分布)という、確率密度を即座に返す組み込み関数が存在します。実務でグラフを描くだけならこれで十分です。しかし、「その値がなぜそうなるのか」は関数の内部に隠れたまま、答えだけが出力されます。
このページでは、正規分布の確率密度関数(PDF)の数式を、MAP と LAMBDA
を使ってExcel上に直接組み立て、グラフ化することを目標にします。組み込み関数は一切使いません。ブラックボックスを自分の手で再現することで、統計の数理とExcelの動的配列関数、両方の理解を同時に深めることができます。
なお、x軸の等間隔配列の生成には MAKEARRAY または SEQUENCE
を使います。こちらは補助的な役割のため、本稿では簡単に触れる程度にとどめます。
MAP関数の基本 ―― 「配列を丸ごと変換する」という発想
MAP 関数は、配列の各要素に対して同じ処理を適用し、元の配列と同じサイズの配列を返す関数です。「処理の内容」は LAMBDA で定義します。
| 構文 | =MAP( 配列, LAMBDA( 変数, 処理 ) ) |
|---|
たとえば、A2:A11に10個の数値が入っているとき、それぞれを2乗した10個の配列を返すには次のように書きます。
| 例 | =MAP(A2:A11, LAMBDA(x, x^2)) |
|---|
入力が10要素なら出力も10要素。これが MAP の本質です。SCAN や REDUCE
が「集約」や「累積」を担うのに対し、MAP は「1対1の変換」に特化しています。
この「変換」という性質は、ある数式を配列のすべての要素に適用したい場面――たとえば、x座標 of 配列から対応するy値(関数値)を一括計算する場面――で最大の威力を発揮します。正規分布のグラフ描画は、まさにその典型例です。
正規分布の確率密度関数(PDF)とは
正規分布の確率密度関数(PDF: Probability Density Function)は、次の式で定義されます。
| f(x) = ( 1 / (σ × √(2π)) ) × exp( −(x − μ)² / (2σ²) ) |
記号の意味は次のとおりです。
- μ(ミュー): 分布の平均。グラフのピーク位置を決めます。
- σ(シグマ): 分布の標準偏差。グラフの裾野の広がりを決めます。
- π(パイ): 円周率(≒ 3.14159…)。
- exp(…): 自然対数の底 e(≒ 2.71828…)の指数関数。
式の構造は2つのブロックに分解できます。
- 係数部分
1 / (σ × √(2π)): 曲線下の面積が必ず1になるよう調整する「正規化係数」です。μやσによって高さのスケールが変わります。 - 指数部分
exp( −(x − μ)² / (2σ²) ): x が μ から離れるほど急速に小さくなる「ベル型のカーブ」の本体です。(x − μ)² が分子にあるため、μからの距離が大きいほど値が急減します。
NORM.S.DIST(x, FALSE) や NORM.DIST(x, μ, σ, FALSE)
は、この式をExcelが内部で計算して返しているにすぎません。これから行うのは、その計算を自分の数式として明示的に組み立てることです。
実装 ―― 数式をExcelに翻訳する
まず、μとσをセルに入力し、パラメータとして参照できるようにします。ここでは B1セルにμ、B2セルにσ を置くことにします。
| A | B | |
|---|---|---|
| 1 | μ(平均) | 0 |
| 2 | σ(標準偏差) | 1 |
次に、x軸の値(グラフの横軸座標)を等間隔で用意します。SEQUENCE 関数を使い、−4 から +4 まで 0.1
刻みで81点分生成する場合は次のようにします。D2セル に入力すると D2:D82 に縦1列でスピル展開されます。
| D2 | =SEQUENCE(81, 1, -4, 0.1) |
|---|
μやσを変えたときにx軸の範囲も動かしたい場合は MAKEARRAY と組み合わせてパラメータ駆動にすることもできますが、今回は固定範囲のまま進めます。
x軸の配列(D2:D82)が準備できたら、E2セルに以下の数式を入力します。D列の各x値に対してPDFの値を計算し、同じ行数(81行)の配列をスピル出力します。
| E2 | =MAP(D2:D82, LAMBDA(x, (1/(B$2*SQRT(2*PI())))*EXP(-((x-B$1)^2)/(2*B$2^2)))) |
|---|
数式の各要素がPDFの式のどの部分に対応するかを確認しておきます。
1/(B$2*SQRT(2*PI())):係数部分1 / (σ√(2π))に相当します。EXP(-((x-B$1)^2)/(2*B$2^2)):指数部分exp(−(x−μ)² / (2σ²))に相当します。B$1がμ(平均)、B$2がσ(標準偏差)への参照です。行を絶対参照にしているのは、スピル展開中に参照がずれないようにするためです。
MAP の働きにより、D列の81個 of x値それぞれに対してこの計算が実行され、E2:E82 にPDF値がスピル出力されます。数式は
E2の1マスだけに入力すれば完結します。
| D | E | |
|---|---|---|
| 1 | x | f(x) |
| 2 | −4.0 | 0.000134 |
| 3 | −3.9 | 0.000199 |
| 4 | −3.8 | 0.000292 |
| 5 | … | … |
| 42 | 0.0 | 0.398942 |
| 43 | 0.1 | 0.396953 |
| 82 | 4.0 | 0.000134 |
x = 0(μと一致)のとき、f(x) ≒ 0.3989 となっています。NORM.S.DIST(0, FALSE)
の戻り値と一致することを確認しておくと、実装の正しさを検証できます。
グラフ化と確認 ―― μとσを動かしてみる
D列(x値)とE列(f(x)値)を選択し、散布図(平滑線)を挿入します。折れ線グラフではなくxy散布図を選ぶのがポイントです。折れ線グラフはx軸をカテゴリとして扱うため、等間隔なx座標の連続関数として正しく描画できません。
グラフが描画されたら、B1セルのμやB2セルのσの値を変えてみてください。
- μを変えると、ベル曲線のピーク位置が左右にスライドします。
- σを大きくすると、曲線は低く平べったく広がります。ピーク値
1/(σ√(2π))が小さくなるためです。 - σを小さくすると、曲線は高く細くなります。分布が平均周辺に集中していることを意味します。
この挙動は、係数部分と指数部分のそれぞれがσにどう依存しているかを数式から直接読み取れます。組み込み関数を使っているだけでは気づきにくい「σが変わると全体のスケールも変わる」という感覚を、自力実装を通じて確認できるのが本稿の要点です。
実装の正確さを確認するには、F列に NORM.DIST の値を並べて差分を計算するのが確実です。
| F2 | =MAP(D2:D82, LAMBDA(x, NORM.DIST(x, B$1, B$2, FALSE))) |
|---|---|
| G2 | =E2:E82 - F2:F82 |
G列の差分がすべて 0(または浮動小数点誤差レベルの極小値)であれば、自力実装がExcelの組み込み関数と同じ結果を出していることが確認できます。「数式を書く → 検証する」というこのサイクル自体が、統計的な考え方の実践ともなります。
まとめ ―― MAP関数を使いこなすための3箇条
- 「配列 → 配列」の変換にはMAP: 入力と出力のサイズが変わらない変換処理は
MAPの独壇場です。集約が必要ならREDUCE、累積ならばSCANと使い分けてください。 - パラメータはセル参照で分離し、絶対参照で固定する:
LAMBDA内でμやσを直接数値として書き込むと、条件を変えるたびに数式を書き直す必要が生じます。セルに分離しB$1のように行を絶対参照にしておくことで、スピル展開中の参照ずれを防ぎ、パラメータ変更に即座に追従する動的な実装になります。 - 自力実装の後に組み込み関数と照合を:
NORM.DISTとの差分計算による検証は、数式の誤りを発見するだけでなく、「自分が何を実装したのか」への理解を深めます。ブラックボックスを解体して再構築し、元の結果と照合する ―― この地味な一連の作業が、Excelで学ぶ"統計力"を高める実践的な方法となります。