賢くなりたいトイプードルの日記

データサイエンス系の話をメインにしていきます

平均にも何種類かあることをPythonとRで解説していきます

平均と言うと、要素全ての合計を、要素数で割ることを思い浮かべるかと思います。つまり

$$ \frac{1}{n} \sum_{j=1}^{n} x_j $$

ですね。これはもちろん平均です。が、算術平均(相加平均)という「平均のひとつの種類」です。

ではほかに何があるのかというと、重要なものとして、幾何平均調和平均があります。

幾何平均は、

$$ x_G = \sqrt[n]{x_1 x_2 \dots x_n} $$

です。どんな時に使うかというと、例えば2018年は18%売り上げが伸びて、2019年は9%、2020年は13%伸びたとした時、その平均伸び率は、

$$ \sqrt[3]{1.18 \times 1.09 \times 1.13} $$

で計算できます。

では調和平均。これは、

$$ \frac{1}{x_H} = \frac{1}{n} \sum_{j=1}^{n} \frac{1}{x_j} $$

と表現できます。逆数の平均、のさらに逆数です。

自宅から駅まで車で時速60kmで行き、帰りは40kmで往復したとき、平均時速は、往復の距離$ 2d $を時間$ \frac{d}{60} + \frac{d}{40}$で割れば平均がもとまります。なので、$ \frac{1}{\frac{1}{2} (\frac{1}{60} + \frac{1}{40})}$を計算すれば良いことになります。

これらをPythonとRで実装してみます

算術平均(相加平均)

Python

np.random.seed(seed=0)
nums = np.random.randint(0,100,20)
nums

array([44, 47, 64, 67, 67, 9, 83, 21, 36, 87, 70, 88, 88, 12, 58, 65, 39, 87, 46, 88])

算術平均は$ \frac{1}{n} \sum_{j=1}^{n} x_j $なので

(1 / len(nums)) * np.sum(nums)
58.3

R

set.seed(0)
nums <- sample(1:100, 20)
nums

14 68 39 1 34 87 43 100 82 59 51 85 21 54 74 7 73 79 37 92

sum(nums) / length(nums)

55

幾何平均

Python

np.random.seed(seed=1)
nums = np.random.randint(0,100,4)
nums
array([37, 12, 72,  9])

幾何平均は$ x_G = \sqrt[n]{x_1 x_2 \dots x_n} $なので

np.prod(nums) ** (1/len(nums)) 
# np.prodは総乗、つまり要素を全て乗算する関数です
66.01652478787128

R

set.seed(1)
nums <- sample(1:100, 4)
nums
68 39 1 34
prod(nums) ^ (1/length(nums))

17.3285853275779

調和平均

Python

np.random.seed(seed=2)
nums = np.random.randint(10,100,2)
nums
array([50, 25])

調和平均は$ \frac{1}{x_H} = \frac{1}{n} \sum_{j=1}^{n} \frac{1}{x_j} $なので逆数の平均の逆数に等しいです。なので、以下のようになります。

1/(np.mean(1/nums))
33.333333333333336

R

set.seed(2)
nums <- sample(1:100, 3)
nums
85 79 70
1/mean(1/nums)

77.5020610057708