DRYな備忘録

Don't Repeat Yourself.

R(とPython)で平均値、中央値、分散、標準偏差を求める

Rやりはじめた。

otiai10.hatenablog.com

勉強

  • 平均値: 全要素の合計を要素数で割ったもの。重心。集合の代表値のひとつ。
    • (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

んんー違うぞ。

なるほど。標本分散を求める式を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な備忘録として

Rによるやさしい統計学

Rによるやさしい統計学

はじめてのR: ごく初歩の操作から統計解析の導入まで

はじめてのR: ごく初歩の操作から統計解析の導入まで

Rによる実証分析 ―回帰分析から因果分析へ―

Rによる実証分析 ―回帰分析から因果分析へ―