平均にも何種類かあることを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