はじめに
この記事は統計学入門1のを読んだことをまとめた振り返り記事です。
問題
ワイブル分布の累積分布関数を求めよ。
解答
ワイブル分布自体はx≥0の範囲で
f(x)=babxb−1exp[−(ax)b]
で、x<0の範囲ではf(x)=0の分布です。
したがって累積分布関数は定義より
F(x)=∫−∞xdtf(t)=∫0xdtbabtb−1exp[−(at)b]=abb∫0xdttb−1exp[−(at)b]=abb∫0x/adya⋅yb−1exp[−yb]=b∫0x/adyyb−1exp[−yb]=∫0(x/a)bdzexp[−z]=1−exp[−(ax)b]
です。途中で適当に変数変換を施しています。
したがって、ワイブル分布の累積分布関数は
F(x)=⎩⎨⎧01−exp[−(ax)b](x<0)(x≥0)
となります。
おまけ
ワイブル分布を可視化しました。aとbを変えてみると以下のように、aは波の高さの位置に対応し、bは分布の形状に依存します。bが大きくなると尖度が大きくなることが感覚的に見て取れるので、実際に計算して、正規分布と比較してみるのも面白いかもしれませんね。
※実行不可
import kotlin.math.exp
import kotlin.math.pow
import kotlin.math.sqrt
import kotlin.math.PI
data class WeibullParam(val a: Double, val b: Double)
fun weibullDistribution(x: Double, a: Double, b: Double): Double {
return if (x < 0.0) 0.0
else b / a * (x / a).pow(b - 1.0) * exp(-(x / a).pow(b))
}
val xList = (0..400).map { it.toDouble() / 100.0 }
val a = 4.0
val bLower = 1
val bUpper = 10
val params = (bLower..bUpper).map { i ->
WeibullParam(
a = a,
b = i.toDouble()
)
}
println(params)
val xCol = mutableListOf<Double>()
val densityCol = mutableListOf<Double>()
val bCol = mutableListOf<Double>()
for (p in params) {
for (x in xList) {
xCol.add(x)
densityCol.add(weibullDistribution(x, p.a, p.b))
bCol.add(p.b)
}
}
val data = mapOf(
"x" to xCol,
"density" to densityCol,
"b" to bCol
)
letsPlot(data) +
geomLine {
x = "x"
y = "density"
color = "b"
group = "b"
} +
scaleColorGradient(
low = "#2c7bb6",
high = "#d7191c",
name = "shape parameter b"
) +
ggtitle("Weibull distributions (a = $a, b = $bLower〜$bUpper)") +
xlab("x") +
ylab("density") +
theme(
panelBackground = elementRect(fill = "white"),
plotBackground = elementRect(fill = "white"),
panelGridMajor = elementLine(color = "#e0e0e0"),
panelGridMinor = elementBlank(),
legendBackground = elementRect(fill = "white"),
legendKey = elementRect(fill = "white"),
text = elementText(color = "black")
)
参考文献
リポジトリ