Julia で学ぶ歪度・尖度
あらまし
モーメント母関数の対数を取ったものをキュムラント母関数という.
キュムラント母関数のテイラー展開を用いると,中心極限定理による正規分布への収束の速さが歪度・尖度でほぼ決まることがわかる.
また,Julia の Distibutions.jl パッケージでは確率分布の歪度・尖度の計算も実装されているので,これを使って数値的にもたしかめてみる.
手計算してみる
このパートは主に 竹内啓『数理統計学: データ解析の方法』(東洋経済新報社) を参考にしている(ただしまったく同じではない).
準備
まず用語を確認する.
確率変数
と定義すると,テイラー展開
の
モーメント母関数の対数を取った
キュムラント母関数のテイラー展開
の
キュムラントとモーメントの間には次のような関係がある.
中心極限定理と歪度・尖度
ここでは
独立に同じ分布に従う確率変数
ところで,標準正規分布
そのため,
2行目から3行目の変形で独立同分布の仮定を使った.
と整理できる.右辺の第一項は標準正規分布のキュムラント母関数である.
キュムラント母関数は一意であり,他の項は
歪度が 0 のときは正規分布への収束の速さが
中心極限定理は数理統計学の教科書にはだいたい出ていると思うが,証明はモーメント母関数を使うもの(例えば野田一夫・宮岡悦良『入門演習 数理統計』共立出版)や,特性関数を使うもの(例えば,久保川達也『現代数理統計学の基礎』共立出版)が多い印象がある.
ここで紹介した 竹内啓『数理統計学: データ解析の方法』(東洋経済新報社) のようにキュムラント母関数を使う方針だと,計算の難しさはほぼ同じのまま
ただし特性関数を使うとモーメント母関数が存在しない場合についても示せるというメリットがある.
数値計算してみる
また,Julia の Distibutions.jl パッケージでは確率分布の歪度は skewness
という関数で,尖度は kurtosis
という関数で実装されている.
こんなふうにすると正規分布の歪度・尖度が出る:
using Distributions
using Random
using Statistics
using Plots
N0 = Normal(0,1)
skewness(N0) #0
kurtosis(N0) #0
歪度が 0 の分布には例えば一様分布やロジスティック分布がある.こんな形をしている.
U1 = Uniform(-1,1)
skewness(U1) #0.0
kurtosis(U1) #-1.2
L1 = Logistic(0,1)
skewness(L1) #0.0
kurtosis(L1) #1.2
p = plot(x -> pdf(N0,x), -4, 4, tick_direction=:out, label="Normal", linestyle=:solid)
plot!(p, x -> pdf(U1,x), label="Uniform", linestyle=:dash)
plot!(p, x -> pdf(L1,x), label="Logistic", linestyle=:dot)
次のように標本分布
function simCLT(dist, size, iter)
out = zeros(iter)
rng = Random.default_rng()
for i in 1:iter
X = rand(rng, dist, size)
out[i] = (mean(X) - mean(dist)) * sqrt(size)/std(dist)
end
return out
end
一様分布のときの
col1 = palette(:default)[1:3]
outU1 = simCLT(U1, 10, 10000)
h = histogram(outU1, legend=false, normalize=:pdf, color="lightgray", tick_direction=:out)
plot!(h, x->pdf(Normal(),x), linewidth=2, color=col1[1])
ロジスティック分布のときも同様である.
outL1 = simCLT(L1, 10, 10000)
h = histogram(outL1, legend=false, normalize=:pdf, color="lightgray", tick_direction=:out)
plot!(h, x->pdf(Normal(),x), linewidth=2, color=col1[1])
一方,歪度が 0 より大きい分布の一例として指数分布をみる.
E1 = Exponential(1)
skewness(E1) #2.0
kurtosis(E1) #6.0
p = plot(x -> pdf(N0,x), -4, 4, tick_direction=:out, label="Normal", linestyle=:solid)
plot!(x->pdf(E1,x), 0,4, label="Exponential", linestyle=:dash,tick_direction=:out)
指数分布のときの
outE11 = simCLT(E1, 10, 10000)
h = histogram(outE11, legend=false, normalize=:pdf, color="lightgray")
plot!(h, x->pdf(Normal(),x), color=col1[1])
outE12 = simCLT(E1, 100, 10000)
h = histogram(outE12, legend=false, normalize=:pdf, color="lightgray")
plot!(h, x->pdf(Normal(),x), color=col1[1])
(おしまい)
Discussion