小寺先生のテキストは手計算による理解を目指しています。
ここではRを併用して学習します。
必要に応じ、ひょっこり統計の看護基礎「記述統計と推測統計」
を参照します。
ヒストグラムの広がりを数値で表したものが分散(var)です。平均との差の2乗の平均で計算されます。
標準偏差(sd)は分散の平方根です。
(データ) =(平均) ± (誤差変動).
誤差変動は 0 を中心として標準偏差の幅で動く確率変数です。
(データ) =(平均) ±
(標準偏差) とイメージしてもよいでしょう.
(実際には、± 3(標準偏差)の幅で変動します)
データは平均を中心に波のように大きくなったり小さくなったりします。
例えば、ある人の血圧が 平均100, 標準偏差5 ということは、
測定血圧=100 ±
5 で変動しうるというイメージです。
分散の計算で、
「なぜ二乗して計算し、あとで平方根をとって標準偏差にするのか」
と思いますが、絶対値関数は微分可能ではなく2次関数は微分可能であるので、2次関数の方が微積分を利用しやすいからだと思います。
データが2個の場合を考えます。たった2個でいいのかと思う人もいるでしょう。
数学では、2個で計算できれば無限回計算が可能であり、2個で成り立つことは無限個でも成り立ちます。
平均 0 を中心として ±1 で変動しています。
\(V=\dfrac{(1-0)^2+(-1-0)^2}{2}=1\).
標準偏差は sd=1 です。
ヒストグラム.
hist(c(1,-1),breaks=c(-1.5,-0.5,0.5,1.5))
参考
Rの関数varは推測統計の関数なので(n-1)=1 で割った値が出力されます。
var(c(1,-1))
## [1] 2
記述統計の分散は nで割るので、2で割るとV=1 に一致します。
(この部分は、今は深入りする必要ありません)
平均0 を中心として ±2 で変動しています。
\(V=\dfrac{(2-0)^2+(-2-0)^2}{2}=4\).
標準偏差は sd=2 です。
データを標準偏差で割ると、
\(\dfrac{x}{2}=1,-1\)
標準偏差1のデータに変換できます。
(平均を0、標準偏差を1にする操作は標準化と呼ばれます).
hist(c(3,7),breaks=c(seq(2.5,7.5,by=1)))
平均5 を中心として ±2 で変動しています。
\(V=\dfrac{(3-5)^2+(7-5)^2}{2}=4\).
標準偏差は sd=2 です。
標準化
\(x-5=-2,2\)
\(\dfrac{x-5}{2}=-1,1\)
こうして、平均0、標準偏差1のデータに変換できます。
尺度の違う2種類のデータを比較するには標準化が必要です。
(テキストp21によれば、標準化するとデータは無名数になります)
(後に出てくる共分散は、標準化した変数で計算すると相関係数になります)
分散を計算しましょう。
平均 \(m=2\) 分散 \(V=\dfrac{1}{2} \left[(1-2)^2+(3-2)^2\right]=1\).
標準偏差 \(SD=\sqrt{1}=1\).
\(x=2\pm 1\) というイメージ.
平均 \(m=4\) 分散 \(V=\dfrac{1}{2} \left[(2-4)^2+(6-4)^2\right]=4\).
標準偏差 \(SD=\sqrt{4}=2\).
\(x=4\pm 2\) というイメージ.
データが、\(X=x_1,x_2,\cdots ,x_n\) であれば、分散V(X)は、平均をmとして
\(V(X)=\dfrac{1}{n} \left[(x_1-m)^2+(x_2-m)^2+\cdots+(x_n-m)^2\right]\)
例えばデータが \(X=3,3,3\)
であれば、平均 \(m=3\) 、散らばっていませんから
\(V(X)=\dfrac{1}{3}
\left[(3-3)^2+(3-3)^2+(3-3)^2\right]=0\)
\(Y=2,3,4\) であれば、平均 \(m=3\)で
\(V(Y)=\dfrac{1}{3}
\left[(2-3)^2+(3-3)^2+(4-3)^2\right]=\dfrac{2}{3}\)
\(Z=6,7,8\) であれば、平均 \(m=7\)ですが、散らばりは同じで
\(V(Z)=\dfrac{1}{3}
\left[(2-3)^2+(3-3)^2+(4-3)^2\right]=\dfrac{2}{3}\)
計算式を簡潔に表すには\(\sum\)
(シグマ)という 記号が必要です。
\(\displaystyle \sum_1^n\)
は、1番目からn番目までたしあわせるという意味です。
この記号を用いれば、
\(\displaystyle V(X)=\dfrac{1}{n}
\sum_1^n(x_i-m)^2\) 簡潔に表現することができます。
分散を計算しましょう。
平均 \(m=3\) 分散 \(V=\dfrac{1}{3}\left[(1-3)^2+(3-3)^2+(5-3)^2\right]=\dfrac{8}{3}\).
標準偏差 \(SD=\sqrt{\dfrac{8}{3}}=1.62\).
\(x=3\pm 1.62\) というイメージ.
平均 \(m=6\) 分散 \(V=\dfrac{1}{3}\left[(2-6)^2+(6-6)^2+(10-6)^2\right]=\dfrac{32}{3}\).
標準偏差 \(SD=\sqrt{\dfrac{32}{3}}=3.2\).
\(x=6\pm 3.2\) というイメージ.
data <- data.frame(x=seq(30,70,by=10),y=c(2,4,14,12,8))
colnames(data) <-c("階級値","度数")
data
階級値 | 度数 |
---|---|
30 | 2 |
40 | 4 |
50 | 14 |
60 | 12 |
70 | 8 |
library(ggplot2)
library(statip)
ggplot(data, aes(x=階級値, y=度数),color = 3) + geom_bar(stat="identity")+theme_gray(base_family = "HiraKakuPro-W3")+ coord_fixed((ratio=2)) +
scale_x_continuous(breaks=seq(25,75,5))+ scale_y_continuous(breaks=seq(0,20,5))+ geom_col(color = "grey85",fill="lightblue")
度数分布表が与えられていますが、元のデータは次のようなデータと解釈します。.
x=seq(30,70,by=10)
X <- rep(x,c(2,4,14,12,8))
X
## [1] 30 30 40 40 40 40 50 50 50 50 50 50 50 50 50 50 50 50 50 50 60 60 60 60 60
## [26] 60 60 60 60 60 60 60 70 70 70 70 70 70 70 70
平均は40個を合計して40で割ります。
同じ値が繰り返されているので掛け算を用いると. \(m=\dfrac{1}{40}\left[30\cdot2+40\cdot4+50\cdot14+60\cdot12+70\cdot8\right]=55\).
分散は平均との差の2乗を合計して40で割ります。
同じ値が繰り返されているので掛け算を用いると. \(V=\dfrac{1}{40}\left[(30-55)^2\cdot2+(40-55)^2\cdot4+(50-55)^2\cdot14+(60-55)^2\cdot12+(70-55)^2\cdot8\right]=115\).
この計算を表を用いて計算しましょう。
下の表を用いて、平均,分散を計算しなさい.
偏差=値ー平均(この問題では、階級値ー平均).
偏差平方はその二乗です.
a=seq(30,70,by=10);b=c(2,4,14,12,8)
dat <- data.frame(a=a,b=b,c=a*b,d=a-55,e=((a-55)^2)*b)
colnames(dat) <-c("階級値","度数","階級値・度数","偏差","偏差平方・度数")
dat
階級値 | 度数 | 階級値・度数 | 偏差 | 偏差平方・度数 |
---|---|---|---|---|
30 | 2 | 60 | -25 | 1250 |
40 | 4 | 160 | -15 | 900 |
50 | 14 | 700 | -5 | 350 |
60 | 12 | 720 | 5 | 300 |
70 | 8 | 560 | 15 | 1800 |
2列、3列、5列の合計をcolSums関数で出力します。
as.data.frame(colSums(dat)[c(2,3,5)])
colSums(dat)[c(2, 3, 5)] | |
---|---|
度数 | 40 |
階級値・度数 | 2200 |
偏差平方・度数 | 4600 |
表に記入した列を合計すると、平均や分散の式の分子が現れます。
40で割れば、上で説明した式になることが分かります。
\(m=2200/40=55~~~~V=4600/40=115\)
偏差合計は必ず0になり、意味をなさないので、偏差平方を考えるわけです。
(このことは、偏差・度数を合計して確かめることができます).
参考までに、平均、中央値、最頻値、分散、標準偏差は次のとおりです.
x=seq(30,70,by=10)
X <- rep(x,c(2,4,14,12,8))
mean(X)
## [1] 55
median(X)
## [1] 55
names(which.max(table(X)))
## [1] "50"
var(X)*39/40
## [1] 115
sd(X)*sqrt(39/40)
## [1] 10.72381
手計算で求めた値と関数を用いた値を比べます。
データを x とします。
x <- c(4,1,13,5,4,2,5,7,5,2,6,6)
x
## [1] 4 1 13 5 4 2 5 7 5 2 6 6
手計算.
sum(x)/12#手計算
## [1] 5
mean(x)#関数
## [1] 5
手計算.
sum((x-5)^2)/12#手計算
## [1] 8.833333
var(x)#関数(不偏分散)
## [1] 9.636364
var(x)*11/12#関数(分散)
## [1] 8.833333
varは不偏分散(推測統計の関数)で、11で割っているので、12で割るように修正すると手計算と一致する。
中央値は、まず昇順にデータを並べます。
sort関数を用います.
sort(x)
## [1] 1 2 2 4 4 5 5 5 6 6 7 13
手計算.
median(x)#関数
## [1] 5
中央値は昇順データを、下半分と上半分に2等分する点でした。
さらに下半分の中央値を\(Q_1\)、上半分の中央値を\(Q_3\)、全体の中央値を\(Q_2\) とすると、
全体は\(Q_1,Q_2,Q_3\)によって4等分されます。(p18の上半分参照).
\(Q_1,Q_2,Q_3\)
をそれぞれ、第1四分位数、第2四分位数、第3四分位数といい、
\(Q_3-Q_1\) を四分位範囲(IQR / Inter-quartile range).
\(\dfrac{Q_3-Q_1}{2}\)を四分位偏差(qd / quartile deviation)
と書きます。
中央値は第2四分位数\(Q_2\) であり、中央値を代表値とする場合は、
平均値を代表値とする場合は、
とイメージしてよいでしょう。
箱ひげ図.
箱ひげ図は、\(Q_1,Q_3\)を両側の縦辺とする箱を作り、\(Q_2\)中央値を太線で描いたものです。点線の延長の右縦線は最大値、左縦線は最小値を表します。
データの分布を簡明に表す方法として用いられています。
boxplot(x,horizontal=T)
白丸のデータは外れ値と呼ばれ、他のデータから大きく離れています。
平均はデータの重心であり、外れ値の影響を受けるので、中央値を代表値として用いることがあります。
図から、\(Q_1=3,Q_2=5,Q_3=6\)
であることが読み取れます。
外れ値の扱いは実際の研究場面では重要ですが、今は目を通すだけで深入りしないでください。
外れ値かどうかを判断するには標準偏差を用いる方法と四分位偏差を用いる方法の2通りがあります。
x <-rnorm(100,mean=0,sd=1)
q <- quantile(x)
q[4]# 第3四分位数
## 75%
## 0.6858105
IQR(x)#四分位範囲
## [1] 1.416783
q[4]+1.5*IQR(x)
## 75%
## 2.810985
belcurve様「外れ値検出のある箱ひげ図」で指摘されているように、
「外れ値が存在すると、データの解釈が難しくなる」.
そのため、外れ値を最大値・最小値として図示せず区別して白丸で表示しています。
そして外れ値でない値の中での最大値を箱ヒゲの先端とするわけです。
大人からはじめる統計vol.16
箱ひげ図に”1.5”IQRを使う理由 の例では、
と説明されています。
困ったことに.
データの要約関数summary()や分位点関数quantile()で四分位点などを出力すると、
quantile(x)
## 0% 25% 50% 75% 100%
## -2.45999267 -0.73097239 0.01557045 0.68581055 3.51348648
summary(x)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -2.459993 -0.730972 0.015570 -0.004063 0.685811 3.513486
第1四分位点 \(Q_1\)
の値が異なっています。
定義や計算法が統一されていないようです。
WAKARA様「四分位数の違いについて」
によると、
「どの定義をとっても、ある程度大きな数のデータを扱う際はほとんど結果に差がでません。そもそも四分位範囲の値は4分割したときの正確な数値が知りたいのではなくて、あくまでデータ全体を把握するために使う指標です。文部科学省が教科書にこのうち1つの定義だけ採用しているのは、単に一番簡単な定義だからです。」
分散は平均との差の平方の平均で、平方しているため値が大きくなりすぎます。
このため、分散の平方根である標準偏差が実際のイメージに合うでしょう。
実際のデータで調べてみると、
平均を中心にして
(平均)±
3(標準偏差) の範囲にヒストグラムの山はおさまります。
<平均が 5 標準偏差が 2 の正規分布>.
\(f\left( x\right) =\dfrac{1}{\sqrt{2\pi }\cdot 2}\exp \left[ -\dfrac{1}{2}\left(\dfrac{x-5}{2}\right)^2\right]\) をグラフで描画すると、
curve(dnorm(x, 5, 2),xlim=c(-6,6),ylim=c(0,0.4))
平均を引くと、平均は0の分布になります。
平均 5 標準偏差 2 の正規分布に従うデータ 1000個を.
正規乱数rnorm(1000, 5,
2)によって出力し、全てのデータから5を引きます。
そのうえでヒストグラムを作成すると、グラフを左に5移動したピンクのヒストグラムになります。
hist(rnorm(1000, 5, 2)-5 ,breaks="sturges",prob=T,col="lightpink",xlim=c(-6,6),ylim=c(0,0.4),xlab="")
curve(dnorm(x, 5, 2),-6,10,add=T)
さらに標準偏差2で割ると、平均0、標準偏差1の分布になります。
5を引いた乱数データを標準偏差2で割った.
\(\dfrac{\rm rnorm(1000, 5,
2)-5}{2}\) を図示するとブルーのヒストグラムになります。
hist(rnorm(1000, 5, 2)-5 ,breaks="sturges",prob=T,col="lightpink",xlim=c(-6,6),ylim=c(0,0.4),xlab="")
hist((rnorm(1000, 5, 2)-5)/2 ,breaks="sturges",prob=T,col="lightblue",add=T)
curve(dnorm(x, 5, 2),-6,10,add=T)
curve(dnorm(x, 0, 1),-6,10,add=T,col="blue")
平均0標準偏差1の標準正規分布のグラフを青線で記入すると、ブルーのヒストグラムにほぼ一致します。
データは、平均を引いて標準偏差で割ることで、標準正規分布に変換されることがわかります。
例題3の数値を変えたものを練習問題としておきます。
平均・分散・標準偏差を計算しましょう。
data <- data.frame(x=seq(30,70,by=10),y=c(5,9,12,9,5))
colnames(data) <-c("階級値","度数")
data
階級値 | 度数 |
---|---|
30 | 5 |
40 | 9 |
50 | 12 |
60 | 9 |
70 | 5 |
library(ggplot2)
library(statip)
ggplot(data, aes(x=階級値, y=度数),color = 3) + geom_bar(stat="identity")+theme_gray(base_family = "HiraKakuPro-W3")+ coord_fixed((ratio=2)) +
scale_x_continuous(breaks=seq(25,75,5))+ scale_y_continuous(breaks=seq(0,20,5))+ geom_col(color = "grey85",fill="lightblue")
表を用いて計算しましょう。
a=seq(30,70,by=10);b=c(5,9,12,9,5)
dat <- data.frame(a=a,b=b,c=a*b,d=a-50,e=((a-50)^2)*b)
colnames(dat) <-c("階級値","度数","階級値・度数","偏差","偏差平方・度数")
dat
階級値 | 度数 | 階級値・度数 | 偏差 | 偏差平方・度数 |
---|---|---|---|---|
30 | 5 | 150 | -20 | 2000 |
40 | 9 | 360 | -10 | 900 |
50 | 12 | 600 | 0 | 0 |
60 | 9 | 540 | 10 | 900 |
70 | 5 | 350 | 20 | 2000 |
2列、3列、5列の合計をcolSums関数で出力します。
as.data.frame(colSums(dat)[c(2,3,5)])
colSums(dat)[c(2, 3, 5)] | |
---|---|
度数 | 40 |
階級値・度数 | 2000 |
偏差平方・度数 | 5800 |
表に記入した列を合計すると、平均や分散の式の分子が現れます。 40で割れば、平均・分散が求まります。
\(m=2000/40=50~~~~V=5800/40=145\) 関数で計算した 平均、分散、標準偏差は次のとおりです.
x=seq(30,70,by=10)
X <- rep(x,c(5,9,12,9,5))
mean(X)
## [1] 50
var(X)*39/40
## [1] 145
sd(X)*sqrt(39/40)
## [1] 12.04159
ヒストグラムの広がりが大きくなると、標準偏差も大きくなっていることが分かります。
分散の定義のところでは、
\(\displaystyle V(X)=\dfrac{1}{n}
\sum_1^n(x_i-m)^2\)
記述統計における分散の定義です。
推測統計の世界では、nの代わりに(n-1)で割って
\(\displaystyle V(X)=\dfrac{1}{n-1}
\sum_1^n(x_i-m)^2\) を分散として用います。
(不偏分散といいます)
理由は、実際のデータ分析では全てのデータを入手することは不可能で分散が小さめに出てしまいます。
そこで、(n-1)で割り分散を大きめに見積もることで、より正確な分散の推定値としています。
下に示したRStudioでの分散計算も、(n-1)で割る不偏分散が用いられています。
A=c(1,2,3)
A
## [1] 1 2 3
分散を計算しなさい。
\(V(X)=\dfrac{1}{3} \left[(1-2)^2+(2-2)^2+(3-2)^2\right]=\dfrac{2}{3}\)
var(A)
## [1] 1
推測統計の関数var()では、2で割っているので、3で割るように修正します。
var(A)*2/3
## [1] 0.6666667
3で割るように修正すると、\(\dfrac{2}{3}=0.6666\cdots\) 手計算の値と一致します。
hist(A,right=FALSE,breaks=seq( 1,4,1 ))