前回の記事で記述統計と推測統計について述べました.記述統計は「実際に観察している統計データの分析」をする分野ですが,分析をするのに「データの特性を表す指標」(記述的指標)が必要ですよね?これから数回に分けてこれらの指標を紹介していきたいと思います!
今回から実際にPythonを使って,データから指標を計算するやり方を紹介するので,ハンズオン的にやっていきたい人はこちらの記事を参考に環境構築を整えておいてください.
(追記)全16時間の統計学動画講座を公開しました!☆4.8の超高評価をいただいている講座です.こちらの記事に講座の内容とクーポン情報を書いていますので是非チェックしてください.
目次
データを代表する「代表値」
なんだか小難しい名前が付いてますが,要はデータを説明するのに使う値です.
例えばスーパーでりんごを5個買ったとしましょう.どれくらいの重さのりんごかと聞かれたら,普通はりんご5個の重さの平均を答えますよね?
ここで使った「平均値」はまさに購入したりんごの重さを代表する代表値になります.ただ1つの数字で代表させて,全体的な性質を判断するのに使ってます.
普段の生活でも無意識にこの「代表値」を使って,今日買ったりんごが全体的に大きかったのかどうかを判断してますよね?
今回はこの「平均」について少し詳しく見ていきます.
一番オーソドックスな算術平均
実は平均には色々種類があります.みなさんが「平均」と聞いてイメージするのが算術平均(arithmetic mean)ですね.いわゆる普通の「平均」です.
例えば5個のりんごの重さがそれぞれ,295g, 300g, 300g, 310g, 311gだったとしましょう.
当然このりんごの平均の重さは
$$ (295g + 300g + 300g + 310g + 311g)/5 = 303.2g$$
これは説明するまでもないですよね.以前「データサイエンスのためのPython講座」でも何度か平均を出していると思いますが,例えばNumPyのnp.mean()を使って
1 2 3 |
import numpy as np apple_weights = [295, 300, 300, 310, 311] np.mean(apple_weights) |
1 |
303.2 |
これも算術平均です.データの合計をデータ数で割った値ですね!これを数式で書くと以下のようになります.(\(x_i\)がデータの値です.今回の例ならりんごの重さですね)
$$\bar{x} = \frac{x_1+x_2+\cdots+x_n}{n}$$
算術平均はよく\(\bar{x}\)と書かれるので覚えておきましょう.今後も本講座でも算術平均は\(\bar{x}\)で表していきます.\(x_1+x_2+\cdots+x_n\)は\(\sum_{}\)(シグマ)の記号を使って\(\sum_{i=1}^{n}{x_i}\)のように書くことができます.この場合は,\(i=1\)から\(i=n\)まで,\(x_i\)を足していくという意味です.なにも難しいことではないので慣れてください!(ただの足し算です)
なので算術平均は\(\bar{x} = \frac{1}{n}\sum_{i=1}^{n}{x_i}\)と定義することができます.
「数式キライ〜〜」っていう人,わかります.いきなり数式から入るとやめたくなりますよね.でも,数式で表すことによって定義を完結に説明できるようになるので,慣れると学習も楽になります.なるべく易しく解説していくので,慣れましょう!笑 よく日本語を数式に入れている本とかありますけど,慣れたら絶対普通の数式のほうがみやすいので
他にも色々な種類の平均があるのですが,今回はこの「算術平均」の他に「幾何平均」と「調和平均」を紹介します.どちらも時々使うことがあるので是非押さえておきましょう!
データが「比率」の場合に使う「幾何平均」
例えばあなたは働き者で,上司からも好かれていて,社内政治もうまくやり(?),入社してから3年間で順調に昇給したとしましょう.
入社1年後に前年比5%
2年後に前年比10%
3年後に前年比30%(!?)
という具合に昇給したとします.
入社時の年収が500万円だったとすると,今のあなたの年収は
$$500(1+0.05)(1+0.1)(1+0.3)=750.75$$
なので,750.75万円ですね.
ある時同期の友人に「毎年平均何%昇給してるの?」と聞かれたとしましょう.(やっぱ気になりますよね,同期の昇給率)
そしたらあなたは,なんて答えますか?5%, 10%, 30%と昇給してるから,算術平均を用いて\(\frac{(5+10+30)}{3}=15\)%でしょうか?
まぁ飲み会の場だったらこれでいいかもしれませんが,統計学的にいうとこれは違います.
仮に毎年の平均の昇給率を\(g\)とすると,以下を満たしますよね?
$$500(1+g)(1+g)(1+g)=500(1+g)^3=750.75$$
\(750.75=500(1+0.05)(1+0.1)(1+0.3)\)なので
\((1+g)\)を\(m_g\)とし,\(i\)年の対前年比を\(x_i\)と書くと(つまり,\(x_1\)は\((1+0.05)\), \(x_2\)は\((1+0.1)\)…),上の式は
\(m_g^3=x_1x_2x_3\)となり,\(m_g=\sqrt[3]{x_1x_2x_3}\)であることがわかります.
このように計算される平均を幾何平均(geometric mean)と言います.データが比率の場合に使う平均です.
簡単にいうと,算術平均だと\(\frac{x_1+x_2+x_3}{3}\)になるところ,幾何平均だと\(\sqrt[3]{x_1x_2x_3}\)になるということです.
これをもう少し一般的な書き方をすると,
$$m_g=\sqrt[n]{x_1x_2x_3\cdots x_n}$$
これが幾何平均です.算術平均との対比もわかりやすいのではないかと思います.
では,Pythonを使って計算してみましょう!幾何平均などのちょっとマニアックな?統計の関数はSciPyのstatsモジュールに色々入っています.scipy.stats.gmean()を使って計算することができます.
1 2 3 4 |
from scipy import stats salary_growth = [1.05, 1.1, 1.3] salary_growth_mean = stats.gmean(salary_growth) print(salary_growth_mean) |
1 |
1.1450956868476592 |
もし今後合コンなどで毎年の平均昇給率を聞かれたら是非幾何平均で答えてみてください!
調和平均
もう1つだけ,紹介させてください.調和平均(harmonic mean)という平均があります.あまり出てこないと思うんですが,機械学習のモデルの評価指標なんかにも時々使うので紹介しておきます.
調和平均は,「逆数の平均の逆数」なんですが,これだけだと意味不明なので以下の例で説明します.
例えば行きに速さ\(x_1\)km/h 帰りに速さ\(x_2\)km/hで往復したとしましょう.
平均の速さは?と聞かれたら普通算術平均で\(\frac{(x_1+x_2)}{2}\)km/hとは答えないですよね?
速さは道のり÷時間なので,平均の速さは当然,往復した道のり÷往復した時間で求められるはずです.
仮に往復した道のりを\(2d\)kmとすると,往復した時間は\(\left(\frac{d}{x_1}+\frac{d}{x_2}\right)\)時間なので,往復した平均の速さは
$$\frac{2d}{\frac{d}{x_1}+\frac{d}{x_2}}=\frac{1}{\frac{1}{2}(\frac{1}{x_1}+\frac{1}{x_2})}km/h$$
になります.これってよく見ると,逆数の算術平均の逆数の形をとってますよね(…??).
例えば行きに20km/h, 帰りに60km/hで往復したとすると,平均の速度は算術平均の\((20+60)/2=40\)km/hではなく,逆数の算術平均\((1/20+1/60)/2=1/30\) の逆数で30km/hとなるわけですね!
一般化すると,n個のデータ\(x_1, x_2, \cdots, x_n\)の調和平均\(m_h\)は
$$m_h=\frac{1}{\frac{1}{n}(\frac{1}{x_1}+\frac{1}{x_2}+\cdots+\frac{1}{x_n})}=\frac{1}{\frac{1}{n}\sum_{i=1}^{n}(\frac{1}{x_n})}$$
と定義できます.分母が逆数の算術平均になっているのがわかると思います.
Pythonで調和平均を求めるには,scipy.stats.hmean()を使えばOKです.
1 2 3 |
velocities = [20, 60] velocities_mean = stats.hmean(velocities) print(velocities_mean) |
1 |
30.0 |
簡単ですね.
代表値として使う場面は正直多くないと思うんですが,機械学習の理論を学ぶ時にまた何度かでてくるので,今回合わせて紹介しました!
算術平均の重要な性質
算術平均にはいくつか性質があるんですが,ここでは重要な性質を2つ紹介しておきます.
まず1つは,「算術平均からの差の合計は常に0になる」こということです.
どういうことかというと,5つのりんごの重さ 295g, 300g, 300g, 310g, 311gの平均は303.2gなので,それぞれのりんごの重さから303.2gを引いた値の合計は0になるということ.
1 2 3 4 |
apple_weights = np.array([295, 300, 300, 310, 311]) apple_w_mean = np.mean(apple_weights) deviations = apple_weights - apple_w_mean print(deviations.sum()) |
1 2 |
[-8.2 -3.2 -3.2 6.8 7.8] 5.684341886080802e-14 |
(e-14は10の-14乗なので限りなく0に近い値)
つまり,平均値というのは全データの真ん中に位置しているので,それぞれの差はプラス・マイナスが打ち消しあって0になるってことです.
この「平均からの差」のことを偏差(deviation)と呼ぶので覚えておきましょう.今後めちゃくちゃよく出てきますので!
もう1つの重要な性質は,「算術平均は,各値からの差の2乗の合計(平方和)を最小にする値」であるということです.
各値\(x_i\)からある値\(X\)の差の2乗は\((x_i-X)^2\)ですよね?その合計ということは\(\sum_{i=1}^{n}{(x_i-X)^2}\)ですね.(これを平方和と言います.)
この式を最小にする値こそが,算術平均というわけです.これもイメージしやすいと思います.
これは\(S(X)=\sum_{}^{}{(x_i-X)^2}\)としたときに\(S(X)\)を\(X\)で微分したときに\(X=\bar{x}\)で0になることからも簡単に証明することができます.
$$\frac{dS(X)}{dX}=-2\sum_{}^{}{(x_i-X)}=0$$
(式がよくわからない人は,今はわからなくてもいいと思います.これは証明するまでもなく感覚的にわかると思うので...)
で,なんでこの一見当たり前のような性質が重要かというと,,,今後の統計学の理論を説明するのにこの性質を使うからです笑.今は「へぇ~」くらいに思っておけばOK!
まとめ
今回はデータをわかりやすい指標で説明すべく,そのデータを説明するのに使われる代表値の,特に一番使われる平均について紹介しました.
普通特に断りがなければ,平均は算術平均を指します.本ブログでも「平均」と言ったら算術平均を指します.
- 代表値はデータを代表する値.ただ1つの値でデータ全体の性質を判断するのに使う.
- 平均は代表値として最もよく使われる指標の1つ
- データの値が「比率」の場合は幾何平均を使うので注意
- scipy.stats.gmean() で幾何平均, scipy.stats.hmean() で調和平均を求めることができる.
- 算術平均からの差の合計は常に0になる
- 算術平均は,各値からの差の平方和の合計を最小にする値である
ちょっと計算と文字ばかりになってしまいましたが,どれも難しい計算は一切していなので,頑張って読んでみて欲しいです.
次回は他の代表値について紹介します.
それでは!
(追記)次回の記事書きました!