四分位数

例として,Rに組み込まれているcars$speedデータを使う(自分で同じことをcars$distでやってみよう).summaryは,第0四分位数(=最小値),第1四分位数,第2四分位数(=中央値),第3四分位数,第4四分位数(=最大値)と平均値を返す.

summary(cars$dist)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00   26.00   36.00   42.98   56.00  120.00

範囲を算出するにはrangeを使うか,maxminを使う.

range(cars$speed)[2]-range(cars$speed)[1]
## [1] 21
max(cars$speed)-min(cars$speed)
## [1] 21

四分位数を返すquantileを使って,四分位範囲を算出する.

q_speed<-quantile(cars$speed)
unname(q_speed[4]-q_speed[2])
## [1] 7

箱ひげ図はboxplotで描ける.

boxplot(cars$speed)

ヒストグラムと経験分布関数

ヒストグラム(赤色縦線が各分位数).

hist(cars$speed,breaks = 15,freq = FALSE, col="skyblue",main = "",axes = FALSE)
abline(v = q_speed,col="red",lty=2,lwd=2)
axis(side = 1, at = q_speed)
axis(side = 2)

経験分布関数(赤色点線が各分位数).

plot(sort(cars$speed),(1:length(cars$speed))/length(cars$speed),type="s",
     xlab="x",ylab="F(x)",axes = FALSE)
segments(0,0.25,q_speed[2],0.25,col="red",lty=2,lwd=2)
segments(q_speed[2],0.25,q_speed[2],0,col="red",lty=2,lwd=2)
segments(0,0.5,q_speed[3],0.5,col="red",lty=2,lwd=2)
segments(q_speed[3],0.5,q_speed[3],0,col="red",lty=2,lwd=2)
segments(0,0.75,q_speed[4],0.75,col="red",lty=2,lwd=2)
segments(q_speed[4],0.75,q_speed[4],0,col="red",lty=2,lwd=2)
segments(0,1,q_speed[5],1,col="red",lty=2,lwd=2)
segments(q_speed[5],1,q_speed[5],0,col="red",lty=2,lwd=2)
axis(side = 1, at = q_speed)
axis(side = 2, at = c(0,0.25,0.5,0.75,1))

分散と標準偏差

Rには分散の関数として,varが用意されている.ただし,varはn-1で割る「不偏標本分散」である.

var(cars$speed)
## [1] 27.95918
mean_speed<-mean(cars$speed)
n<-length(cars$speed)
sum((cars$speed-mean_speed)^2)/(n-1)
## [1] 27.95918
sum((cars$speed-mean_speed)^2)/n
## [1] 27.4
mean(cars$speed^2)-mean(cars$speed)^2
## [1] 27.4

nで割る分散の関数は用意されていないので,自分でvar_pという関数を定義する.

var_p<-function(x, na.rm = TRUE) {
  if (!na.rm && any(is.na(x))) 
    return(NA_real_)
  x<-na.omit(x)
  m<-mean(x)
  n<-length(x)
  sum((x-m)^2)/n
}

var_speed<-var_p(cars$speed)
var_speed
## [1] 27.4

標準偏差も同様に,組み込み関数として用意されているsdはn-1で割る定義である.

sd(cars$speed)
## [1] 5.287644
sqrt(sum((cars$speed-mean_speed)^2)/(n-1))
## [1] 5.287644
sqrt(sum((cars$speed-mean_speed)^2)/n)
## [1] 5.234501

こちらも自分で,nで割る標準偏差の関数を定義する.

sd_p<-function(x, na.rm = TRUE) {
  if (!na.rm && any(is.na(x))) 
    return(NA_real_)
  x<-na.omit(x)
  m<-mean(x)
  n<-length(x)
  sqrt(sum((x-m)^2)/n)
}

sd_speed<-sd_p(cars$speed)
sd_speed
## [1] 5.234501

分散と標準偏差のビジュアライゼーション

データを昇順に並べる(赤色横線は平均).

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

平均からの偏差のグラフ(赤色横線は偏差の平均).

dist_from_mean<-cars$speed-mean_speed
barplot(sort(dist_from_mean), col="skyblue")
abline(h = mean(dist_from_mean),col="red",lty=1,lwd=2)

平均からの偏差平方のグラフ(赤色横線は偏差平方の平均,つまり分散).

distsq_from_mean<-(cars$speed-mean_speed)^2
barplot(distsq_from_mean, col="skyblue")
abline(h = var_speed,col="red",lty=1,lwd=2)

最後にもう一度,cars$speedのヒストグラム(赤色縦線が平均,点線が1σ範囲).

hist(cars$speed,breaks = 15, freq = FALSE, col="skyblue")
abline(v = mean_speed,col="red",lty=1,lwd=2)
abline(v = mean_speed+sd_speed,col="red",lty=2,lwd=2)
abline(v = mean_speed-sd_speed,col="red",lty=2,lwd=2)