Rで確率を学ぶ

これは、長畑(2009)『Rで学ぶ統計学』共立出版に基づく解説です。

学習項目です

事象と確率

事象に基づいて確率が定義される。事象(仮にAで表す)が起こる確からしさの程度を0から1の間の数値で表したものを事象Aの(起こる)確率 P(A) とし、次の性質を満たすものとする:確率の公理 これから次の性質が導かれる:

演習問題1-1

(頭の準備のための問題) 6面体のサイコロにおいて、インチキでないサイコロでは1の目がでる確率が1/6であることを示しなさい。また、そのサイコロを2回振って最初の出目をx, 二回目の出目をy としたとき、x+y=6となる確率を求めなさい。

演習問題1-2

乱数を用いて、通常の6面体のサイコロにおいて、1の目がでる確率が1/6となるかどうか、確かめてみよう。 サイコロを600回、6000回、60000回、600000回ふったときに1の目がでる回数を乱数を用いてシミュレーションし、それぞれで1の目がでる確率が1/6に近いかどうかを調べてみよう。 [ヒント]
一様乱数を発生させる関数は第1回目の演習で紹介したrunifを使う。 これを使って、次のようにすれば、100回のサイコロ振りをシミュレーションできる。
x <- floor(runif(100,1,7))
この結果、xには1,2,3,4,5,6のいずれかの数、合計100個の数を要素とするベクトルが値になる。そこで、1の目の出現回数は次のようにして求められる:
length(x[x==1])
もしくは、次のようなコードを書いても良いだろう: (nの値は適宜変える)
sim <- function(n=100) {
  x <- floor(runif(n,1,7))
  for(y in 1:6) {
     cat(y,"=>\t",length(x[x==y]),"\t",length(x[x==y])/n, "\n")
       }
}

演習問題1-3

事象AとBに対し、次の式が成り立つことを示せ:
P(B | A) = P(B) P(A|B) / P(A)
[ヒント]
事象AとBの積事象が成り立つ確率について述べた次の式を使う: P(A∩B) = P(A)P(B | A) = P(B) P(A|B)

演習問題1-4

形状も重さも同じである赤球と白玉がそれぞれ50個ずつある箱から目をつぶって一個取り出してそれが赤球である確率はいくらか。 次に、赤球を10個だけ入れた箱を3箱、赤球10個と白球10個を入れた箱を1箱、赤球10個と白球40個を入れた箱を1箱、合計5箱用意したとする。 そして、まず目をつぶって箱を選び、そこから目をつぶって玉を一個取り出し、それが赤球であった場合の確率を求めよ。そして、 先の操作での答と値が違うことを確認せよ。 最初の操作と次の操作では共に赤球と白玉は50個ずつであったが、どうして2回の操作で確率が異なるのか、説明せよ。

ベイズの定理

演習問題2-1

ある病気に罹患しているかどうか検査において、「(ある人が)陽性反応が出る」という事象をAとし、「(その人が)実際に罹患しえいる」という事象をEとする。 そして、確率が次のように与えられているとする: P(A|E)=0.56, P(A|¬E) = 0.04, P(E)=0.035
この時、検査で陽性反応である確率と、陽性反応が出た時に実際に病気を発病する確率をそれぞれ求めよ。
[ヒント]
求める確率は、P(A) と P(E|A) 。全確率の定理から P(A) = P(A|E)P(E) + P(A|¬E)P(¬E)。 またベイズの定理から、P(E|A)= P(A|E) P(E) / P(A) である。
なお、仮定から、P(¬A|E)=0.44,P(¬A|¬E)=0.96, P(¬E)=0.965 である。

演習問題2-2

とある適性検査で、(ある人が)適性と判定される事象をTとし、(その人が)実際に適性があるという事象をEとする。P(E)=0.60, P(T|E)=0.80, P(T|¬E)=0.040のとき、 ある人が適性と判定され、かつ実際に適性である事象の確率を求めよ。
[ヒント]
求めたいのは、「適性と判定される」事象と、「実際に適性である」事象の積事象である。つまりP(T∩E)を求める。

演習問題2-3

三種類の物体(仮にA,B,C とする) の認識ができるカメラ機構を備えているロボットがある。 ロボットは、Aの物体を認識した場合には赤色のLEDを、Bの物体を認識した場合は緑色のLED を、C の物体を認識したら青のLED を点滅させる。 ただし、ロボットのカメラ機構は故障することがあり、故障した場合もロボットは赤色のLEDを点滅させる。 そして故障する事前確率はp = 0.01 である。
ここで3 種類の物体の中からN 個をランダムに選び、次々にロボットに提示した。すると、すべてロボットは赤色のLED を点滅させた。N = 1の場合、N=2の場合、… N=10の場合、それぞれの場合に対し、ロボットのカメラ機構が壊れている確率を求めよ。
[ヒント]
ロボットのセンサーが壊れているという事象をR, i個目の物体を提示したときに赤色のLEDが点滅する事象をLiとする。 すると、問題文から、(その他に情報がない場合の確率は「事前」確率): P(R)=0.01
これにより、ロボットのセンサーが壊れていない(事前)確率P(¬R)は1-P(R)=0.99となる。
ここで、P(Li|R)の意味を考えると、 「ロボットのセンサーが壊れている」という状況のもとで「i番目の赤色LEDが 点滅するという(事後)確率であり、これは常に1である。また P(Li|¬R)の意味を考えると、 「ロボットのセンサーが壊れていない」という状況のもとで 「i番目の赤色LEDが点滅するという(事後)確率であり、 これは各Liが独立事象なら、その値は1/3である。 これらを前提として問題を解く。
N=1 の場合: このとき赤色のLEDが点滅した(という情報がある)のだから、 P(R|L1)が求めるべき(「赤色のLEDが点滅した」という情報が得られた後の確率なので、「事後」)確率である。
ベイズ則から, P(R|L1)=P(L1| R)P(R)/P(L1)、 また全確率の定理から、 P(L1) = P(L | R)P(R) +P(L1|¬R)P(¬R) である。よって、0.029 (有効数字2桁)となる。
N=2のときは、L1, L2という二つの事象を考えると、 求めるべきものはP(R|L1∩L2)である。 ベイズ則より、 P(R|L1∩L2)=P(L1∩L2|R)P(R)/P(L1∩L2)
ここで、P(L1∩L2)の値は また全確率の定理を用いてP(L1∩L2|R)P(R) + P(L1∩L2|¬R)P(¬R)により求められる。

それ以外の Nの値の場合については、以上の考えを適用してば答えることができる。


確率変数と確率分布

[連続型確率変数の実現値と確率について]
『サイコロを振って出た目』を確率変数とみなすと、サイコロを振って出た目は1,2,3,4,5,6という飛び飛びの『実現値』を取る(例えば、3.5という値にはならない)ので、これは離散型確率変数と言われる。 それに対し、人の体重や身長を確率変数とみなすと、体重の場合0kgから300kgの間の値、身長なら0cmから300cmの間の値(連続した値)をとるので連続型確率変数と言って、離散型確率変数とは別の扱いになる。
ここで、離散型確率変数の場合、確率変数をX、その実現値をxiで表すと、確率関数はp(X=xi)と書ける。ところが、連続型確率変数の場合、確率変数をX、その実現値をxiで表すとしても、確率関数はp(X=xi)とは書けない。このことについて腑に落ちない人のためにここで説明する。

身長を確率変数とみなそう。するとクラスには実現値170cmの者がいるだろう。50人のクラスで10人がそうだとすれば「適当にクラスから人を選んでその身長が170cmである確率は10/50 = 0.20 」と言いたくなるかもしれない。しかしこれは次のような誤解と混同がある。

まず「誰かの身長がちょうど170cm」という値をとる確率はほとんど0である、という事実を指摘しておこう。なぜなら、170cmという値はどこかで『丸め』を行って得られた値だからである。計測器がcm刻みであったか、mm(ミリメートル)刻みであったか、μm(マイクロメートル)刻みか、nn(ナノメートル)刻みか、。。。ということを考えれば、cm刻みなら170cmということはありそうだが、nn刻みの場合、170cmちょうどいう値が得られるのはほとんど可能性がない、ということは容易に理解できよう。

つまり、我々が日常的に使っている「身長が170cmちょうど」というのは実は(例えば)169.5cmから170.5cmの範囲にある」ことの言い換えになっているのである。連続的に値を取る身長に対して確率のようなものを与える関数を確率密度関数(f(x)で表す)といい、連続型の確率変数の場合、ある値の幅の区間で定積分したもの(つまり、確率変数の実現値がある幅の値の範囲に入る可能性)が確率となるのである。ちなみに先の例でいえば、f(x)を区間[169.5, 170.5]の間で定積分した値が0.20 となる。

なお、身長をcm刻みで表示することにすれば、飛び飛びの値を取ることになり、この場合は「離散型確率変数」として扱われる。




分布関数と確率関数(密度関数)をグラフに書くと:
上段: 確率関数、下段:分布関数 上段: 密度関数, 下段: 分布関数

演習問題3-1

裏表のあるコイン2枚を投げたときに、表の出る枚数の確率関数と分布関数を求めよ。ただし表か裏のどちらかになるものとする。 [ヒント]
裏表のあるコイン2枚を投げたとき、表が出る枚数を確率変数Xとする。 Xの実現値は0, 1, 2 の3通りであり、離散型の確率変数である。 確率関数 P(X=x)において、x≠0,1,2の場合は P(X=x=0 は明らか。 そこで、P(X=0), P(X=1), P(X=2)の値を求めれば良い。

例えばP(X=0)の値は、二枚とも裏の場合の確率なので、 1/2 * 1/2 = 1/4 = 0.25 と求められる。

分布関数は、P(X < 0)、P(X ≤ 0)、P(X < 1)、 P(X ≤ 1), P(X < 2)、P(X ≤ 2), P (X < ∞) を求めれば良い。明らかに P(X < 0) = 0, P(X < 2) = P(X ≤ 2), P(X < ∞) = 1.0である。

演習問題3-2

関数f(x )を、 0 < x または π < x のときf(x ) = 0
0 ≤ x ≤ π のとき f(x) = (1/2)*sin(x) とする。
問1. f(x )が確率関数の性質(1)と(2)を満たすことを示せ。
問2. f(x )を確率関数としたときの分布関数を表示せよ。
[ヒント]
確率関数の性質(1)とは、0 ≤ f(x )
性質(2)は、区間[-∞ , +∞] におけるf(x )の(定)積分が 1 になることである。 どちらも示すのは容易であろう。
分布関数F(x )は、0 < x のときF(x)=0、 0 ≤ x ≤ π のときは、区間 [0, x] におけるf(x)の定積分と等しく、 π < x のときはF(x)=1である。これを表示すれば良い。

なお、この表示には、ベクトルに関数を適用した結果をベクトルにするsapply関数を使った: (分布関数をF(x)とすると、 x <- seq(-2,4,0.01); y <- sapply(x,F) ; plot(x,y,type="l")

確率変数Xが分布F(x)に従う確率変数であることを、X ~ F(x)と表す

期待値の性質: a, bを定数とすると、 E(aX + b) = aE(X)+b
分散の性質: V(X) = E(X2) - {E(X)}2
V(aX + b) = a2 V(X)

演習問題4-1

期待値の性質の式:
    a, bを定数とすると、 E(aX + b) = aE(X)+b  
が成り立つことを示せ。(ヒント: 積分の式から求める)

演習問題4-2

分散の性質の式
    a, bを定数とすると、  V(X) = E(X2) - {E(X)}2、および V(aX + b) = a2V(X)
が成り立つことを示せ。(ヒント: 積分の式から求める。 また、E(X)が定数であることを用いる)

主要な(1変数の)確率分布

データは連続的な値を取る連続型分布と、とびとびの値をとる離散型確率変数に対応した確率分布の離散型分布とに分類される
確率分布の性質(グラフの形など)は「パラメタ」によって変わる。 そして関数率分布それぞれ、異なるパラメタを取る。 以下ではどのような関数率分布がどのようなパラメタを取るかにも注意してみよう。

連続型分布

正規分布

確率統計においてもっとも重要な確率分布である。一般にかなりの人数を対象とした試験の成績をx軸、その得点の人数をy軸に取ると、この分布に近いグラフが得られる。それだけではなく、ロボットの位置推定(カルマンフィルタなど)にも用いられている(ただし、この場合は多変数の正規分布になる)。また、正規分布に従うとは限らない確率変数でも、その実現値をグループごとの平均をとれば、そのグループの個数が多ければ多いほどその平均値は正規分布する(中心極限定理)。
正規分布の性質: X ~N (μ,σ2) のとき、E(X) = μ, V(X) = σ2 参考: 正規分布の密度関数の描画:
curve(dnorm,-4,4,main="正規分布の分布関数",xlab="",ylab="")
abline(h=0,v=0,lty=1)
segments(2,0,2,0.054, lty=3)
segments(-2,0,-2,0.054, lty=3)
segments(-1,0,-1,0.24, lty=3)
segments(1,0,1,0.24, lty=3)

[多変数の正規分布]
下に示される多変数の正規分布(ガウス分布)も重要である(xμはd次元ベクトル、Σはd×dの行列(共分散行列), dは正整数)。
そして、次のような性質を持つ: その応用としては、例えば、ロボットの位置推定がある。 ロボットに例えば1m移動させようとしても、正確に1m移動することは不可能であり、1m移動した後の位置はその地点を平均とした正規分布に従うと考えられる。このような移動を繰り返していくと、位置はどんどん不確定になるが、そうであっても、ロボットの位置は正規分布で表すことができる。ここでセンサー(例えばGPS)によりロボットの位置についての何らかの情報が得られるとしよう。センサーで得られる情報はやはり誤差を含んだものである(車のナビを使っていて、道路を走っていても、ナビでは道路を外れたところを表示していることがしばしばある)。このセンサー情報も正規分布で表すことができる。カルマンフィルタはロボットの移動の情報とセンサーの情報により、確率に基づいて、ロボットの位置推定を行うための優れた手法の一つである。

演習問題4-3

ここにロボットがある。このロボットは、1.0mの直進前進命令によって移動させると、 元の位置との相対距離はN(1.0, 0.01)に従うことがわかっている。 ここで、そのロボットは初め原点(x=0)におり、そこから1.0mの直進前進命令を2回出した。移動後のロボットの位置の確率分布はどのように表されるか。また、原点から2.0±0.0141 mの範囲にいる確率を求めよ。

演習問題4-4 (やらなくてもよいが、チャレンジした方にはポイント?)

正規分布に基づく乱数発生の関数が1章の演習問題で紹介したrnorm であることを用いて、演習問題4-3の 「原点から2.0±0.0141 mの範囲にいる確率」をシミュレーションにより確かめてみよ。

(連続)一様分布

コンピュータで発生される(一様)乱数の分布がこの例である。また、ルーレットを回して止まったときの、ルーレットがどのくらい回転したかという分布(ただし0から2πまでの範囲とする)も一様分布とみなせる。 参考: 一様分布の密度関数の描画:
ccurve(dunif(x,1,2), xlim=c(0,3), ylim=c(0,2), main="U(1,2)の密度関数")


指数分布

一様乱数で発生させた2つの数の距離は指数分布にしたがう。このように何らかの「事象」の発生間隔は一般に指数分布となる。 参考: 指数分布の密度関数の描画:
x <- seq(0,6,length=500)
u  <-  c(0.5, 1, 3,5)
y <- sapply(u, function(a) { a*exp(-a*x)})
matplot(x,y,type="l", lty=1, col=1:4, ylab="density", 
		main="指数分布のグラフ(λ=0.5, 1, 3, 5)")
legend(4,5,paste("λ=",u,sep=""),col=1:4, lty=1, bty="n")
abline(h=0, v=0, lty=2)


離散型分布

二項分布

n枚のコインを投げてx枚が表になる確率は二項分布に従う。 参考: 二項分布の確率関数の描画:
x=0:10
p<-seq(0.1, 0.9, 0.1)
y <- sapply(p,function(a){dbnom(x,10,a)})
y <- sapply(p,function(a){dbinom(x,10,a)})
matplot(x,y,type="o",lty=1,ylim=c(0,1),pch=1:9,col=1:9,ylab="density",
     main="二項分布")
legend(2,1.1,paste("p=",p,"(n=10)",sep=""),col=1:9,lty=1,bty="n")
abline(h=0,v=0,lty=2,col=2)


ポアソン分布

あるエレベータに乗ろうとする人の1時間あたりの人数や、国道1km辺りのコンビニの数がポアソン分布と関連する確率変数です。 参考: ポアソン分布の確率関数の描画:
x <- 0:15
lam <- c(0.5, 1,2,3,4,5,7)
y <- matrix(0,nrow=16, ncol=7)
for(j in 1:7) { d<-dpois(x,lam[j])
 	y[,j] <- d
}
matplot(x,y,type="o",lty=1,ylim=c(0,0.7),pch=1:7,col=1:7,ylab="density",
     main="ポアソン分布")
legend(6,0.7,paste("λ=",lam,sep=""),col=1:7,lty=1,bty="n")
abline(h=0,v=0,lty=2,col=1)

統計量の分布

カイ二乗(カイ自乗, カイ2乗、χ2)分布

統計的仮説検定でよく用いられる。 参考: カイ二乗分布の密度関数の描画:
x <- seq(0,10,length=500)
n <- c(1,2,3,6)
y <- sapply(n/2, function(a) { dgamma(x,shape=a,scale=2)})
matplot(x,y,type="l",ylim=c(0,1),lty=1,col=1:4,ylab="density",
     main="カイ二乗分布")
legend(5,0.8,paste("自由度=",n,sep=""),col=1:4,lty=1,bty="n")
abline(h=0,v=0,lty=3)


(スチューデントの)t分布

正規分布する母集団の平均と分散が未知で標本サイズが小さい場合に平均を推定したり、2つの群の平均値の差の統計的有意性を示すのに利用される。 参考: t分布の密度関数の描画:
x <- seq(-6,6,length=500)
n <- c(1,3,100)
y <- sapply(n,function(a) { dt(x,a)})
matplot(x,y,type="l",ylim=c(0,0.6),lty=1,col=1:3,ylab="density",
     main="t分布の密度関数")
legend(1,0.6,paste("自由度=",n,sep=""),col=1:3, lty=1,bty="n")
abline(h=0,v=0,lty=3)


F分布

上の2つの分布と並んで、推測統計や不確かさを論じる上で重要な分布です。 参考: F分布の密度関数の描画:
x <- seq(0,6,length=500)
y <- matrix(0, 500,4)
n1 <- c(1,2,6,10)
n2 <- c(1,2,8,10)
for(j in 1:4) {
	d <- df(x,n1[j],n2[j])
	y[,j] <- d
}
matplot(x,y,type="l",ylim=c(0,1.2),lty=1,col=1:4, ylab="density",
     main="F分布の密度関数")
legend(3,1,paste("n1=",n1," n2=",n2,sep=""),col=1:4,lty=1,bty="n")
abline(h=0,v=0,lty=3)

演習5.

ここの解説に従い、いろいろな確率分布の密度関数を描画させてみよ。

Rの解説(4)         トップページに戻る          Rで統計学(1)