統計学可視化ツールの数学的背景
このドキュメントでは、統計学可視化ツールで実装されている確率分布の数学的背景と実装方法について説明します。
1. 各種確率分布の理論と実装
1.1 正規分布 (Normal Distribution)
正規分布は確率論と統計学において最も重要な連続確率分布の一つです。
理論的背景
正規分布の確率密度関数(PDF)は以下の式で表されます:
ここで: - \(\mu\) は平均値 - \(\sigma\) は標準偏差 - \(\sigma^2\) は分散
実装方法
ツールではボックス=ミュラー法を用いて正規乱数を生成しています:
function generateNormalDistribution(mean, stdDev, sampleSize) {
const samples = [];
for (let i = 0; i < sampleSize; i++) {
let u = 0, v = 0;
while (u === 0) u = Math.random();
while (v === 0) v = Math.random();
const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);
samples.push(mean + z * stdDev);
}
return samples;
}
ボックス=ミュラー法は、一様分布の乱数から正規分布の乱数を生成する変換手法です。この方法では、独立した2つの一様乱数 \(U_1, U_2\) から2つの独立した標準正規乱数 \(Z_1, Z_2\) を以下の式で生成します:
この実装では \(Z_1\) のみを使用し、指定された平均と標準偏差に合わせて調整しています。
1.2 歪んだ分布 (Skewed Distribution)
理論的背景
純粋な正規分布は常に対称で、歪度は0です。歪みを持つ分布を表現するために、このツールでは対数正規分布をベースとした変形を使用しています。
対数正規分布の確率密度関数は以下のように表されます:
対数正規分布は右に歪んだ分布(正の歪度)となりますが、その歪みの度合いは \(\sigma\) パラメータによって制御されます。
実装方法
ツールでは以下のように歪んだ分布を生成しています:
function generateSkewedDistribution(mean, stdDev, skewness, sampleSize) {
// 歪度が0の場合は正規分布を返す
if (skewness === 0) {
return generateNormalDistribution(mean, stdDev, sampleSize);
}
// 歪度の絶対値に基づいてパラメータを調整
const sigma = Math.sqrt(Math.log(1 + Math.abs(skewness) / 2));
const mu = Math.log(mean) - sigma * sigma / 2;
// 対数正規分布のサンプル生成
const samples = [];
for (let i = 0; i < sampleSize; i++) {
let u = 0, v = 0;
while (u === 0) u = Math.random();
while (v === 0) v = Math.random();
const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);
let sample = Math.exp(mu + sigma * z);
// 正規化して平均と標準偏差を調整
sample = (sample - Math.exp(mu + sigma * sigma / 2)) *
(stdDev / (Math.exp(mu + sigma * sigma / 2) *
Math.sqrt(Math.exp(sigma * sigma) - 1))) + mean;
// 負の歪度の場合は反転
if (skewness < 0) {
sample = 2 * mean - sample;
}
samples.push(sample);
}
return samples;
}
このコードでは:
-
歪度の値からパラメータ \(\sigma\) と \(\mu\) を計算します。\(\sigma\) は歪度の絶対値から導出され、\(\mu\) は指定された平均値を維持するように調整されます。
-
ボックス=ミュラー法を使用して標準正規分布のサンプルを生成し、それを対数正規分布に変換します。
-
生成されたサンプルを正規化して、指定された平均と標準偏差に合わせて調整します。
-
負の歪度の場合は、正の歪度で生成したサンプルを平均値を中心に反転させます。これにより左に歪んだ分布が生成されます。
この方法は厳密な統計学的手法ではなく、教育目的のための近似であることに注意が必要です。指定された歪度を持つ分布を正確に生成するためには、ピアソン分布系やジョンソン分布系などのより複雑な方法が必要になります。
1.3 一様分布 (Uniform Distribution)
理論的背景
一様分布は、指定された範囲内のすべての値が等しい確率で出現する分布です。区間 \([a, b]\) での一様分布の確率密度関数は:
(\(a \leq x \leq b\) の場合)
一様分布の期待値と分散はそれぞれ以下のようになります:
- 期待値: \(E[X] = \frac{a+b}{2}\)
- 分散: \(Var[X] = \frac{(b-a)^2}{12}\)
実装方法
ツールでは、一様分布を次のように実装しています:
function generateUniformDistribution(min, max, sampleSize) {
const samples = [];
for (let i = 0; i < sampleSize; i++) {
samples.push(min + Math.random() * (max - min));
}
return samples;
}
このコードは、JavaScript の Math.random() 関数(区間 [0, 1) の一様乱数を生成)を使用して、指定された範囲の一様分布を生成します。
- 平均値 \(\mu\) に基づいて範囲を決定する必要があるため、ツールでは標準偏差 \(\sigma\) との関係式 \(\sigma = \frac{b-a}{\sqrt{12}}\) を用いて、区間 \([a, b]\) を \([mean - \sigma\sqrt{3}, mean + \sigma\sqrt{3}]\) として計算しています。
1.4 指数分布 (Exponential Distribution)
理論的背景
指数分布は、ポアソン過程において連続する事象間の時間間隔を表す確率分布です。パラメータ \(\lambda\) を持つ指数分布の確率密度関数は:
(\(x \geq 0\) の場合)
指数分布の期待値と分散は:
- 期待値: \(E[X] = \frac{1}{\lambda}\)
- 分散: \(Var[X] = \frac{1}{\lambda^2}\)
実装方法
ツールでは指数分布を次のように実装しています:
function generateExponentialDistribution(lambda, sampleSize) {
const samples = [];
for (let i = 0; i < sampleSize; i++) {
const u = Math.random();
samples.push(-Math.log(u) / lambda);
}
return samples;
}
このアルゴリズムは、一様分布の逆関数法(inverse transform sampling)を使用しています。一様分布 \(U\) から指数分布のサンプル \(X\) を生成する変換式は \(X = -\frac{\ln(U)}{\lambda}\) です。
指数分布のパラメータ \(\lambda\) は平均の逆数 \(\lambda = \frac{1}{\mu}\) として指定します。
1.5 二峰性分布 (Bimodal Distribution)
理論的背景
二峰性分布は、二つの異なるピーク(最頻値)を持つ分布です。このツールでは、二つの正規分布の混合分布として実装しています。混合比 \(\pi\) で二つの正規分布 \(N(\mu_1, \sigma_1^2)\) と \(N(\mu_2, \sigma_2^2)\) を混合した分布の確率密度関数は:
ここで \(f_1\) と \(f_2\) はそれぞれの正規分布の確率密度関数です。
この混合分布の期待値は:
実装方法
ツールでは次のように二峰性分布を実装しています:
function generateBimodalDistribution(peak1, peak2, stdDev1, stdDev2, mixRatio, sampleSize) {
const samples = [];
for (let i = 0; i < sampleSize; i++) {
// mixRatioに応じて分布を選択
const useFirstPeak = Math.random() < mixRatio;
let u = 0, v = 0;
while (u === 0) u = Math.random();
while (v === 0) v = Math.random();
const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);
if (useFirstPeak) {
samples.push(peak1 + z * stdDev1);
} else {
samples.push(peak2 + z * stdDev2);
}
}
return samples;
}
このコードでは:
-
各サンプルについて、混合比
mixRatioに基づいて第1ピークまたは第2ピークのどちらの分布から生成するかを決定します。 -
ボックス=ミュラー法で標準正規乱数を生成し、対応するピーク位置と標準偏差に合わせて調整します。
この方法により、二つの正規分布の混合モデルとしての二峰性分布が生成されます。
2. 確率密度関数の可視化
比較タブでは、正規分布と歪んだ分布の確率密度関数(PDF)を直接計算して表示しています。
2.1 正規分布のPDF
function normalPDF(x, mean, stdDev) {
return (1 / (stdDev * Math.sqrt(2 * Math.PI))) *
Math.exp(-0.5 * Math.pow((x - mean) / stdDev, 2));
}
この関数は、正規分布の確率密度関数の公式を直接実装したものです。
2.2 歪んだ分布のPDF(近似)
function skewedPDF(x, mean, stdDev, skewness) {
// 歪度が0に近い場合は正規分布に近似
if (Math.abs(skewness) < 0.1) {
return normalPDF(x, mean, stdDev);
}
// 対数正規分布のパラメータ
const sigma = Math.sqrt(Math.log(1 + Math.abs(skewness) / 2));
const mu = Math.log(mean) - sigma * sigma / 2;
// 歪度の符号に応じて変換
let value = x;
if (skewness < 0) {
value = 2 * mean - x;
}
// 対数正規分布のPDF計算
if (value <= 0) return 0;
const logNormalPDF = (1 / (value * sigma * Math.sqrt(2 * Math.PI))) *
Math.exp(-0.5 * Math.pow((Math.log(value) - mu) / sigma, 2));
// 歪度に応じたスケーリング
const scale = Math.exp(-0.5 * skewness * skewness);
return logNormalPDF * scale;
}
この関数では:
-
歪度が非常に小さい場合は正規分布のPDFを使用します。
-
歪度から対数正規分布のパラメータを計算します。
-
負の歪度の場合は、x座標を平均値を中心に反転させます。
-
対数正規分布のPDFを計算し、歪度に応じたスケーリングを適用します。
この近似は、厳密な統計理論に基づくものではなく、視覚的な教育目的のための実用的な近似であることに注意してください。
3. 統計量の計算
3.1 サンプルの基本統計量
function calculateStatistics(samples) {
const n = samples.length;
// 平均の計算
const mean = samples.reduce((acc, val) => acc + val, 0) / n;
// 標準偏差の計算
const variance = samples.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) / n;
const stdDev = Math.sqrt(variance);
// 中央値の計算
const sortedSamples = [...samples].sort((a, b) => a - b);
let median;
if (n % 2 === 0) {
median = (sortedSamples[n/2 - 1] + sortedSamples[n/2]) / 2;
} else {
median = sortedSamples[Math.floor(n/2)];
}
// 歪度の計算
const skewness = samples.reduce((acc, val) =>
acc + Math.pow((val - mean) / stdDev, 3), 0) / n;
return {
mean,
median,
stdDev,
skewness
};
}
このコードでは:
- 平均値(算術平均) - サンプルの合計をサンプル数で割った値
- 分散 - 各サンプルと平均との差の二乗の平均
(統計学では不偏分散として \(\frac{1}{n-1}\) を使用することが多いですが、このツールでは \(\frac{1}{n}\) を使用しています)
- 標準偏差 - 分散の平方根
- 中央値 - サンプルを昇順に並べた時の中央値
- サンプル数が奇数の場合:中央の値
-
サンプル数が偶数の場合:中央の2つの値の平均
-
歪度 - 分布の非対称性を測る指標
- 歪度が0:分布は対称
- 歪度が正:右に裾が長い分布(正の歪み)
- 歪度が負:左に裾が長い分布(負の歪み)
4. 二峰性分布の理論平均
二峰性分布タブでは、理論平均を以下の式で計算しています:
const theoreticalMean = peak1 * mixRatio + peak2 * (1 - mixRatio);
二つの正規分布の混合モデルの期待値は、各分布の期待値を混合比で重み付けした線形結合となります。
結論
この可視化ツールは、確率分布の統計的特性を視覚的に理解するための教育用ツールです。実装されている手法のいくつかは厳密な統計理論よりも教育目的の視覚化を優先しています。特に歪んだ分布の生成と確率密度関数の近似は簡略化されており、実際の研究用途には適さない場合があることに注意してください。
このツールの主な価値は、パラメータを変更した際の分布の形状の変化と、それに伴う統計量の変化を視覚的に確認できる点にあります。これにより、理論的な概念を直感的に理解する助けとなるでしょう。