平均を計算してみよう

例として,Rに組み込まれているcarsデータを使ってみよう.

head(cars)
##   speed dist
## 1     4    2
## 2     4   10
## 3     7    4
## 4     7   22
## 5     8   16
## 6     9   10

2つの変数のうちspeed変数を使ってみる.

cars$speed
##  [1]  4  4  7  7  8  9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14
## [24] 15 15 15 16 16 17 17 17 18 18 18 18 19 19 19 20 20 20 20 20 22 23 24
## [47] 24 24 24 25

平均は以下のように定義される. \[\bar{x}=\frac{\sum_{i=1}^nx_i}{n}=\frac{x_1+x_2+\cdots +x_n}{n}\] では,計算してみよう.

mean_speed<-mean(cars$speed)
mean_speed
## [1] 15.4
sum(cars$speed)/length(cars$speed)
## [1] 15.4

ヒストグラム上の平均は赤色縦線.

hist(cars$speed,breaks = 10, col="skyblue")
abline(v = mean_speed,col="red",lty=1,lwd=2)

偏差からみた平均値

データを昇順に並べてプロットしてみる.赤色横線が平均である

barplot(sort(cars$speed), col="skyblue", ylim = c(0,max(cars$speed)))
abline(h = mean_speed,col="red",lty=1,lwd=2)

平均からの偏差\(d_i=x_i-\bar{x}\)を計算してみる.

dist_from_mean<-cars$speed-mean_speed
barplot(sort(dist_from_mean), col="skyblue")

偏差の+部分とマイナス部分の合計の絶対値は等しくなる.つまり,偏差和\(\sum_i d_i = \sum_i(x_i-\bar{x})\)はゼロになる.

sum(dist_from_mean[dist_from_mean>0]) ## プラス部分の合計
## [1] 108.4
sum(dist_from_mean[dist_from_mean<0]) ## マイナス部分の合計
## [1] -108.4
round(sum(dist_from_mean),digit=6)    ## 偏差和
## [1] 0

このことは常に成立する.

\[\begin{align} \sum_i d_i = \sum_i(x_i-\bar{x}) &= \sum_ix_i-n \bar{x} \\ &= n \bar{x} - n \bar{x} =0 \end{align}\]

つまり,平均は,平均より大きい部分の棒グラフをけずって,平均より小さい部分に埋めてやることで,グラフを「平らに均す」働きをする.

under_mean<-sort(cars$speed)
under_mean[under_mean>mean_speed]<-mean_speed  ## 平均より大きい部分をけずる

comp_by_mean<-(-dist_from_mean)
comp_by_mean[comp_by_mean<0]<-0  ## 平均より小さい部分を埋める

barplot(rbind(under_mean, comp_by_mean), col=c("skyblue","red"),ylim = c(0,max(cars$speed)))
abline(h = mean_speed,col="red",lty=1,lwd=2)

偏差平方和の最小化としての平均

平均値は以下で定義される偏差平方和を最小化する指数である. \[\begin{align} g(a) &= \sum_i(x_i-a)^2 \\ &= \sum_ix_i^2-2a\sum_i x_i + na^2 \end{align}\]

cars$speedについて\(g(a)\)のグラフを書く.

g<-function(a) sum((cars$speed-a)^2)
xx<-seq(5,25,0.1)
yy<-apply(as.matrix(xx),1,g)
plot(xx,yy,type="l",xlab = "a", ylab = "g(a)")

optimize関数でこれを最小化.

optimize(g,c(5,25))$minimum
## [1] 15.4
一般的に最小化問題をとく. \[\begin{align} \frac{dg}{da}&=-2\sum_ix_i+2na = 0 \Longleftrightarrow a=\frac{\sum_ix_i}{n}=\bar{x} \\ \frac{d^2g}{da^2}&=2n >0 \end{align}\]

平均からの偏差和\(\sum_i d_i\)は,定義上ゼロになるが,偏差を2乗した偏差平方和\(\sum_i d_i^2\)は,平均から各データのばらつきを示すのに都合がよいかもしれない.実際,偏差平方の平均\(\sum_i d_i^2/n\)が分散である.

ちなみに,絶対偏差和\(g(a)=\sum_i |x_i - a|\)を最小化する指数は中央値である(「中央値を実感する」 参照).