戻る

統計学入門 第6章の問題 6.8 ワイブル分布の累積分布関数

はじめに

この記事は統計学入門1のを読んだことをまとめた振り返り記事です。

問題

ワイブル分布の累積分布関数を求めよ。

解答

ワイブル分布自体はx0x \geq 0の範囲で

f(x)=bxb1abexp[(xa)b] f(x) = b \frac{ x^{b - 1} }{ a^b } \exp\left[ -\left( \frac{x}{a} \right)^b \right]

で、x<0x < 0の範囲ではf(x)=0f(x) = 0の分布です。

したがって累積分布関数は定義より

F(x)=xdtf(t)=0xdtbtb1abexp[(ta)b]=bab0xdttb1exp[(ta)b]=bab0x/adyayb1exp[yb]=b0x/adyyb1exp[yb]=0(x/a)bdzexp[z]=1exp[(xa)b]\begin{align*} F(x) &= \int_{-\infty}^{x} {\rm d}t\, f(t) \\[8pt] &= \int_{0}^{x} {\rm d}t\,b \frac{ t^{b - 1} }{ a^b } \exp\left[ -\left( \frac{t}{a} \right)^b \right] \\[8pt] &= \frac{ b }{ a^b } \int_0^x {\rm d}t\, t^{b - 1} \exp\left[- \left(\frac{t}{a}\right)^b\right] \\[8pt] &= \frac{ b }{ a^b } \int^{x/a}_0 { {\rm d}y \,a\cdot y^{b - 1} \exp\left[- y^b\right] } \\[8pt] &= b \int^{x/a}_0 {\rm d}y\, y^{b - 1} \exp\left[- y^b\right] \\[8pt] &= \int_0^{(x/a)^b} {\rm d}z\, \exp\left[- z\right] \\[8pt] &= 1 - \exp\left[- \left(\frac{x}{a}\right)^b\right] \end{align*}

です。途中で適当に変数変換を施しています。

したがって、ワイブル分布の累積分布関数は

F(x)={0(x<0)1exp[(xa)b](x0) F(x) = \begin{cases} 0 & (x < 0) \\[8pt] 1 - \exp\left[- \left(\frac{x}{a}\right)^b\right] & (x \geq 0) \end{cases}

となります。

おまけ

ワイブル分布を可視化しました。aabbを変えてみると以下のように、aaは波の高さの位置に対応し、bbは分布の形状に依存します。bbが大きくなると尖度が大きくなることが感覚的に見て取れるので、実際に計算して、正規分布と比較してみるのも面白いかもしれませんね。

12
34

※実行不可

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") )

参考文献

リポジトリ

Footnotes

  1. 統計学入門 東京大学教養学部統計学教室編 東京大学出版会

戻る