【算術平均・幾何平均・調和平均】Rで算出してみよう

こんにちは、タクロウです!

統計学をいちからRで手を動かしながら学んでいきましょう!まずは記述統計学からデータを表す平均値についてです。

要点
  1. 算術平均は、一般的な平均
  2. 幾何平均は、成長率など時系列データに使われることが多い
  3. 調和平均は、速度など率や比の平均に使われる

算術平均

一般的に使われる平均で、以下の式で計算します。\(x\)は変数、\(n\)はデータ数です。

$$\bar{x}=(x_1+x_2+ \cdots + x_{n-1} + x_n)$$

Rのサンプルデータwomenを使って算出してみます。womenは30-39歳のアメリカ人の女性の平均の身長と体重データ(n=15)です。

#データ読み込み
#単位変換:インチからセンチメートル、ポンドからキログラム
data("women")
women$height <- round(women$height / 0.39370,1)
women$weight <- round(women$weight / 2.2046,1)

#出力
head(women)
mean(women$height)
hist(women$height)
> head(women)
  height weight
1  147.3   52.2
2  149.9   53.1
3  152.4   54.4
4  154.9   55.8
5  157.5   57.2
6  160.0   58.5
> mean(women$height)
[1] 165.1
> hist(women$height)

幾何平均

幾何平均は、成長率や前年比などの時系列データに使われることが多く、以下の式で計算します。

$$\bar{x_{G}}=\sqrt[n]{x_1・x_2・ \cdots ・ x_{n-1} ・ x_n}$$

RのサンプルデータAirPassengersで算出しみます。AirPassengersはクラシックボックス&ジェンキンス航空会社の1949年から1960年の毎月の国際線旅客数 のデータです。

#データ読み込み
#月次データから年次データ変換
#年成長率
data("AirPassengers")
yAirPassengers <- NULL
for (i in 1:12){
  yAirPassengers <- c(yAirPassengers,sum(AirPassengers[i:(i+11)]))
}
yr <- NULL
for (i in 1:(length(yAirPassengers)-1)){
  yr <- c(yr,yAirPassengers[i+1]/yAirPassengers[i])
}

#幾何平均
gmean <- max(cumprod(yr)^(1/length(yr)))
#gmean <- exp(mean(log(abs(yr))))
#算術平均
amean <- mean(yr)

#出力
#初期値から幾何平均で最後の値と一致確認
barplot(yAirPassengers)
yAirPassengers[1]*gmean^11
yAirPassengers[1]*amean^11
yAirPassengers[12]
> yAirPassengers[1]*gmean^11
[1] 1654
> yAirPassengers[1]*amean^11
[1] 1654.165
> yAirPassengers[12]
[1] 1654

調和平均

調和平均は、率や比の平均に使われる平均で、以下の式で計算します。機械学習の精度を評価するF値を出す際に、適合率と再現率の調和平均として使われています。

$$\bar{x_{H}}=\frac{n}{\frac{1}{x_1}+\frac{1}{x_2}+ \cdots +\frac{1}{ x_{n-1}} +\frac{1}{ x_n}}$$

1kmごとに時速4~10kmで移動するサンプルデータを作成して算出してみます。同じ距離を進む場合の速度の平均を算出する場合に調和平均が適切です。

## 調和平均
#データ作成
dist <- rep(1,10)
speed <- round(runif(10,4,10),0)
time <- dist / speed

#調和平均
hmean <- length(speed)/sum(1/speed)
#算術平均
amean <- mean(speed)

#出力
#速度の調和平均が距離/時間に一致することを確認
dist
speed
time
sum(dist) / sum(time)
hmean
amean
> dist
 [1] 1 1 1 1 1 1 1 1 1 1
> speed
 [1] 4 9 4 8 4 9 9 6 5 8
> time
 [1] 0.2500000 0.1111111 0.2500000 0.1250000 0.2500000 0.1111111 0.1111111 0.1666667 0.2000000
[10] 0.1250000
> sum(dist) / sum(time)
[1] 5.882353
> hmean
[1] 5.882353
> amean
[1] 6.6

さいごに

いろいろな平均を紹介し、Rで演習しました。算術平均を使いがちですが、場合に応じて適切な平均値を使う必要があります。

次回はデータのバラツキについて学びましょう!

【分位数・分散・標準偏差・外れ値・変動係数】平均とあわせて確認しよう