Rこわい
こんにちは。7月も後半に入り、夏本番ですね。 今日からは「Rによるやさしい統計学」を参照して、統計解析ソフトであるRの使い方と、統計学の再学習を進めていきます。 基本的には、演習しながら引っかかった、面白いと思った所だけをピックアップしていきます。
- 作者: 山田剛史,杉澤武俊,村井潤一郎
- 出版社/メーカー: オーム社
- 発売日: 2008/01/25
- メディア: 単行本
- 購入: 64人 クリック: 782回
- この商品を含むブログ (68件) を見る
サマリー
- Rというのは統計処理に重きをおいた数値計算ソフトです。オープンソースで利用は無料!
- Rは統計学の歴史に則り、不偏分散を「分散」としていますが、ビッグデータ的に全数解析する場合には「標本分散」を分散として使う必要があります
- Rの文法……これはまさか、関数型!?
Rのインストール
Rの使い方を学ぶのにRのインストールを紹介しないというのもいかが、という事でまずはインストールから。 といっても何も難しい所はなく、以下のURLからpkgファイルをダウンロードして実行。あとは流れで……。
http://cran.md.tsukuba.ac.jp/bin/macosx/
後々細かい設定が必要になる気もしていますが、ひとまずはバニラ運用でいきましょう。
Rの基本的な操作
Rは対話型CLIを基本としている統計計算ソフトです。使い方は簡単で、計算させたい内容を1行づつ入力していくだけです。
ただ、足し算をやらせるだけなら電卓で良い訳ですし、Rの強みである統計処理をやらせてみましょう。
この様に、数列に対して最小値、最大値、平均値、中央値などを簡単に出してくれます。 尚、上記のコマンドで使用している様に、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個の母集団全てを用いて計算する標本分散が
であるのに対し、そこからn個のサンプルを選んで計算する不偏分散は
となります。
この理由を直感的に説明すると、
- 本来N個ある母集団からn個のみを取り出した事で、標本のばらつき(=分散が表している指標)が抑えられるので、分母を少し小さくして帳尻を合わせる
という事で、もう少し厳密に説明すると、
- N個の母集団からn個のサンプルを全組み合わせ取り出し、「全組み合わせの分散の平均」と「N個の母集団の分散」を突き合わせると、nではなく(n-1)で割った値が母集団の分散に一致する という事の様です。
証明はこちらが参考になります。
ここらで話を戻して、R標準の分散を求める関数が不偏分散だとなぜまずいか。
理由は不偏分散と標本分散の違いを理解していれば明白で、「ビッグデータ」と呼ばれる大量データを収集・分析する技術のある今、必ずしもサンプリングせずに大量のデータをそのまま統計処理したいからです。
サンプリングし、推定するというのは先人の知恵ではありますが、全数処理できるならそれに越したことは無いのです(もちろん、コスト問題などはついて回りますので、ケースバイケースではありますが)。
そんな訳で、標本分散を計算する独自関数を用意してみましょう。
Rは関数型言語だった……?
そして最後にタイトルのネタになります。
冒頭でRは対話型CLIを基本としている、と書きましたが、実際にはプログラミングの様な事も可能です。さらに、独自に関数を定義し、それを呼び出すことも可能です。一連の処理をまとめて定義しておけば、再利用性も高くなり、自分だけの処理環境が構築できるでしょう。
では、肝心の定義方法と呼び出し方です。
関数定義
varp = function(x){ var(x) * (length(x) - 1) / length(x) }
呼び出し
varp(x)
実行例
関数定義を変数に代入しちゃうこの書き方……まさか関数型言語!? いや、ただ文法が似てるだけですよね。すみません。
以上、今回はここまで。次回は、今回「別にいらないんじゃないか」と言った推定のお話をやる予定です。