グロースハッカー目指してみる

過去の経歴を捨て、グロースハッカーを志す事にしたアラサー男子。果たして明日はあるのか!?

Rこわい

こんにちは。7月も後半に入り、夏本番ですね。 今日からは「Rによるやさしい統計学」を参照して、統計解析ソフトであるRの使い方と、統計学の再学習を進めていきます。 基本的には、演習しながら引っかかった、面白いと思った所だけをピックアップしていきます。

Rによるやさしい統計学

Rによるやさしい統計学

サマリー

  • Rというのは統計処理に重きをおいた数値計算ソフトです。オープンソースで利用は無料!
  • Rは統計学の歴史に則り、不偏分散を「分散」としていますが、ビッグデータ的に全数解析する場合には「標本分散」を分散として使う必要があります
  • Rの文法……これはまさか、関数型!?

Rのインストール

Rの使い方を学ぶのにRのインストールを紹介しないというのもいかが、という事でまずはインストールから。 といっても何も難しい所はなく、以下のURLからpkgファイルをダウンロードして実行。あとは流れで……。

http://cran.md.tsukuba.ac.jp/bin/macosx/

後々細かい設定が必要になる気もしていますが、ひとまずはバニラ運用でいきましょう。

Rの基本的な操作

Rは対話型CLIを基本としている統計計算ソフトです。使い方は簡単で、計算させたい内容を1行づつ入力していくだけです。

f:id:katoma586:20140721173326p:plain

ただ、足し算をやらせるだけなら電卓で良い訳ですし、Rの強みである統計処理をやらせてみましょう。

f:id:katoma586:20140721173425p:plain

この様に、数列に対して最小値、最大値、平均値、中央値などを簡単に出してくれます。 尚、上記のコマンドで使用している様に、Rでは以下のようにして配列、行列を定義できます。

height = c(173,178,170,164)
physical = matrix(c(173,178,170,164,75,80,65,60),4,2)

しかし実務でこんな事はせず、csvファイルなどを読みこませる事になるでしょう。

physical = read.csv("physical.csv")

この場合のcsvの中身はこう書きます。

height,weight
173,75
178,80
180,65
183,60

1行目に、列の見出しを書くのがポイントですね。

標本分散と不偏分散

そんなこんなで統計的な処理を一通り備えたRですが、早速1つ注意点があります。 Rで分散を計算する標準の関数としてvar()が定義されているのですが、これがなかなか気の利いた奴で、不偏分散を出してきます。でも、実はまずい。

不偏分散とは、N個の母集団からn個のサンプルを選んだ時、そのn個のサンプルを用いて推測した母集団の分散の事です。 具体的には、N個の母集団全てを用いて計算する標本分散が

{ \displaystyle
\frac{1}{N}\sum_{i=1}^{N}(X_i - \overline{X}) ^2
}

であるのに対し、そこからn個のサンプルを選んで計算する不偏分散は

{ \displaystyle
\frac{1}{n-1}\sum_{i=1}^{n}(x_i - \overline{x}) ^2
}

となります。

この理由を直感的に説明すると、

  • 本来N個ある母集団からn個のみを取り出した事で、標本のばらつき(=分散が表している指標)が抑えられるので、分母を少し小さくして帳尻を合わせる

という事で、もう少し厳密に説明すると、

  • N個の母集団からn個のサンプルを全組み合わせ取り出し、「全組み合わせの分散の平均」と「N個の母集団の分散」を突き合わせると、nではなく(n-1)で割った値が母集団の分散に一致する という事の様です。

証明はこちらが参考になります。

不偏分散はなぜ-n-1-で割るのか?

なぜ不偏分散はn-1で割るのか

ここらで話を戻して、R標準の分散を求める関数が不偏分散だとなぜまずいか。

理由は不偏分散と標本分散の違いを理解していれば明白で、「ビッグデータ」と呼ばれる大量データを収集・分析する技術のある今、必ずしもサンプリングせずに大量のデータをそのまま統計処理したいからです。

サンプリングし、推定するというのは先人の知恵ではありますが、全数処理できるならそれに越したことは無いのです(もちろん、コスト問題などはついて回りますので、ケースバイケースではありますが)。

そんな訳で、標本分散を計算する独自関数を用意してみましょう。

Rは関数型言語だった……?

そして最後にタイトルのネタになります。

冒頭でRは対話型CLIを基本としている、と書きましたが、実際にはプログラミングの様な事も可能です。さらに、独自に関数を定義し、それを呼び出すことも可能です。一連の処理をまとめて定義しておけば、再利用性も高くなり、自分だけの処理環境が構築できるでしょう。

では、肝心の定義方法と呼び出し方です。

関数定義

varp = function(x){
    var(x) * (length(x) - 1) / length(x)
}

呼び出し

varp(x)

実行例

f:id:katoma586:20140721175634p:plain

関数定義を変数に代入しちゃうこの書き方……まさか関数型言語!? いや、ただ文法が似てるだけですよね。すみません。

以上、今回はここまで。次回は、今回「別にいらないんじゃないか」と言った推定のお話をやる予定です。