R(とPython)で平均値、中央値、分散、標準偏差を求める
Rやりはじめた。
勉強
- 平均値: 全要素の合計を要素数で割ったもの。重心。集合の代表値のひとつ。
(1/n) * Σx(k)
- 中央値: 全要素を小さい順にならべて真ん中の値そのもの。集合の代表値のひとつ。
x([n/2])
- 分散: 各要素の平均値との差分を自乗したものの和を要素数で割ったもの。集合全体のばらつき度合いを表す。
(1/n) * Σ((x(k) - av(k))^2)
- 標準偏差: 分散の正の平方根。便宜的に、分散の値を、各要素の次元に合わせたもの。
√ ((1/n) * Σ((x(k) - av(k))^2))
なるほど。
サンプルデータ
サンプルデータを以下のように定義する。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
167.857 | 172.364 | 173.964 | 125.874 | 124.698 | 170.048 | 134.241 | 126.285 |
> n <- c(167.857,172.364,173.964,125.874,124.698,170.048,134.241,126.285)
平均値
> mean(n) [1] 149.4164
中央値
> median(n) [1] 151.049 > # 151.049 なんて要素無いが? > s <- sort(n) > mean(c(s[4], s[5])) [1] 151.049 > # 要素数が偶数なので、中央の2値の算術平均ということでした
※ Rは1-origin(インデックスが1から始まる)を知らず体感10分ぐらいハマった
分散
> var(n) [1] 546.4991
ほんまかいな。ってことで、Pythonで確認。
>>> n = [167.857,172.364,173.964,125.874,124.698,170.048,134.241,126.285] >>> ave = 149.4164 >>> reduce(lambda x, y: x + (ave - y)**2, [0] + n) / len(n) 478.18674823500004
んんー違うぞ。
- http://cse.naro.affrc.go.jp/takezawa/r-tips/r/59.html
データの不偏分散を求める関数 var() は不偏分散を求める関数であって,標本分散を求める関数ではないことに注意
- 18-4. 標本分散と不偏分散 | 統計学の時間 | 統計WEB
なるほど。標本分散を求める式をRでつくってみる。
> # 平均値を各要素に持つ要素数を一致させたベクトルをつくる > rep(mean(n), length(n)) [1] 149.4164 149.4164 149.4164 149.4164 149.4164 149.4164 149.4164 149.4164 > # これと標本集団との差分を取る > n - rep(mean(n), length(n)) [1] 18.44063 22.94763 24.54763 -23.54237 -24.71837 20.63163 -15.17537 [8] -23.13137 > # この各要素を自乗する > (n - rep(mean(n), length(n))) ** 2 [1] 340.0567 526.5935 602.5859 554.2434 610.9981 425.6640 230.2920 535.0605 > # この自乗した各要素を合計する > sum((n - rep(mean(n), length(n))) ** 2) [1] 3825.494 > # 要素数で割る > sum((n - rep(mean(n), length(n))) ** 2) / length(n) [1] 478.1867
Pythonでシコった値と一致した。
標準偏差
> sd(n) [1] 23.37732
Pythonで確認
>>> import math >>> math.sqrt(478.18674823500004) 21.86748152474354 # Rのsdの値と一致しないのは、 # Rのsdは不偏分散varの√を取ったものであろう # と予想。 >>> reduce(lambda x, y: x + (ave - y)**2, [0] + n) / (len(n) - 1) 546.49914084 # これが不偏分散。 # この√を取ると、 >>> math.sqrt(reduce(lambda x, y: x + (ave - y)**2, [0] + n) / (len(n) - 1)) 23.377321079199813 # Rのsdの値と一致した。
雑感
- 用語の定義を理解していないので、いちいちPythonで確認しており、非効率を感じる
- けど、たのしい
- 標準で用意されている関数が多くて、最初はわりと覚えの問題な気がした
DRYな備忘録として
- 作者: 山田剛史,杉澤武俊,村井潤一郎
- 出版社/メーカー: オーム社
- 発売日: 2008/01/25
- メディア: 単行本
- 購入: 64人 クリック: 782回
- この商品を含むブログ (68件) を見る
- 作者: 村井潤一郎
- 出版社/メーカー: 北大路書房
- 発売日: 2013/10/03
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 作者: 星野匡郎,田中久稔
- 出版社/メーカー: オーム社
- 発売日: 2016/10/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る