ラベル 統計学 の投稿を表示しています。 すべての投稿を表示
ラベル 統計学 の投稿を表示しています。 すべての投稿を表示

2020年11月15日日曜日

分散や標準偏差のオンライン計算 → Welfordアルゴリズム

データが逐次追加されていく際に、追加されるたびにその時点での「分散」や「標準偏差」を計算したい場合がある。その時点での全てのデータから毎度計算しても良いが、やはり計算量が馬鹿らしい。そこで欲しくなるのが、これらの量をオンライン(ストリーム処理)で計算できるアルゴリズムだ。

安心してください、ありますよ。「Welford アルゴリズム」というものです。

ここではそのWelfordアルゴリズムを紹介したい。

※以下、不偏分散を考えるが、標本分散の場合でも全く同じ考えが出来る。

■分散と標準偏差

データサンプルが\(x_i, \ldots, x_N\)で与えられる場合を考えられる。この時、データの不偏分散\(s^2\)の定義は

\[s^2 = \frac{\sum_{i=1}^N (x_i – \bar{x})^2}{N-1}\]

として与えられる。そして標準偏差\(s\)はその平方根\(s = \sqrt{s^2}\)だ。

ここで\(\bar{x}\)はサンプルの平均、すなわち\(\bar{x} = \frac{1}{N}\sum_{i=1}^N x_i\)である。

この定義通りに分散を計算する場合、以下の2ステップを辿る。

  1. データ全体の平均\(\bar{x}\)を計算。
  2. 各データ\(x_i\)と平均\(\bar{x}\)の差分の二乗を計算。
このような計算は明らかに無駄が多い。まずデータ全体を舐める計算を2回も繰り返す必要がある。また、データ全体に対する計算を行うためにすべてのデータを保持しないといけないので今回の主題であるオンラインの計算をするためにはこのままではダメだ。何か工夫がいる。

■Welfordアルゴリズム

そこでWelfordアルゴリズムでは、サンプルが\(N\)個の時と\(N-1\)個の時の分散の差に着目して以下の計算を行う。

\begin{align} &(N-1)s_N^2 – (N-2)s_{N-1}^2 \\ &= \sum_{i=1}^N (x_i-\bar{x}_N)^2-\sum_{i=1}^{N-1} (x_i-\bar{x}_{N-1})^2 \\ &= (x_N-\bar{x}_N)^2 + \sum_{i=1}^{N-1}\left((x_i-\bar{x}_N)^2-(x_i-\bar{x}_{N-1})^2\right) \\ &= (x_N-\bar{x}_N)^2 + \sum_{i=1}^{N-1}(x_i-\bar{x}_N + x_i-\bar{x}_{N-1})(\bar{x}_{N-1} – \bar{x}_{N}) \\ &= (x_N-\bar{x}_N)^2 + (\bar{x}_N – x_N)(\bar{x}_{N-1} – \bar{x}_{N}) \\ &= (x_N-\bar{x}_N)(x_N-\bar{x}_N – \bar{x}_{N-1} + \bar{x}_{N}) \\ &= (x_N-\bar{x}_N)(x_N – \bar{x}_{N-1}) \\ \end{align}

この結果から、下式のようにデータが\(N\)個の時の分散を\(N-1\)個の時の分散から求められることがわかる。

\[ s_N^2 = \frac{N-2}{N-1} s_{N-1}^2 + \frac{1}{N-1} (x_N-\bar{x}_N)(x_N – \bar{x}_{N-1}) \]

この結果をもとに分散をオンラインで計算するアルゴリズムに落とすと、下の疑似コードのようになる。(forで各データを逐次回している部分がそれだ)

驚くほど簡単なアルゴリズムだ。

■ライブラリ

簡単なので必要に応じて自分で実装すれば良いが、Python用のライブラリを作ってPypiに登録してみたのでよければそれを使ってみてください。改良点があればGithubリポジトリにIssue投げて頂ければ嬉しいです。


■参考

2020年9月26日土曜日

データは寡黙である。

これまで十数年間、いくつかの企業でデータ分析に携わってきた。その間にビッグデータや人工知能、ディープラーニングというようなバズワードが流行り「データ至上主義」ともいえる風潮が流れ始めているふうに感じる。

 確かに画像などの判別技術や購買予測、レコメンデーション技術など、大量データを学習機に食わせて成果を出している分野もある。

しかし、企業でデータ活用として期待されているのはこれらだけでない。それよりも「現在起きている、または予測されることに対してどのようにアクションとるべきか?」をデータから見出すこと(以降、これを「データからインサイトを得る」と表現する)が求められるケースが圧倒的に多い。

注意が必要なのは、「購買予測をする」ことと「より売上を上げるためにとるべきアクションを見出す」ことは全く異なり、またそれに必要な技術も全く別物であることだ。

典型的で有名な例として「アイスクリーム売上と犯罪発生数の関連性」を挙げてみる。下の左のグラフはある町のアイスクリームの売上と犯罪発生数の関連性を示したものだ。グラフから読み取るにアイスクリームの売上が多い時に犯罪発生数が多い関係性が見て取れる。しかしよく言われるように、これは関連性(相関)があるだけで、決して「アイスクリームの売上が増えたから犯罪発生数が増えた」という原因と結果を示しているわけではない。この裏には下右図のように、「気温」というアイスと犯罪の両者の増減に影響を与える共通の要因(交絡因子)が存在し、気温が暑い時にはアイスクリームの売上が増えるのと同時に、イライラして犯罪数も増えることで、直接関係のないアイスと犯罪に関連性が現れているのである(偽相関)。


この例は2つの重要なことを示している。

1つは、「予測する」と「原因と結果の関係性(因果関係)を分析する」は別物であるということである。図から見て取れるようにアイスの売上を説明変数にして犯罪率を予測することは(ある程度の汎化性をもって)可能である。しかし、だからといって犯罪数を減らすためにアイスの売上を減らす(店舗を閉鎖させる)というアクションは全く有効ではないことは自明であろう。

2つめは、ほとんどの場合にデータのみだけでは因果関係はわからないという事実だ。データからわかるのは事象間の関連性(相関)のみであり、原因と結果の関連性を見出すためには、事象の関係に対するその分野での固有の知識(ドメイン知識)が不可欠である。例えば上の例では、「アイスクリームが犯罪の発生に寄与することはないはずだ」、「両者に共通する要因として気温が考えられる」というという事前知識があるが故に本当の因果関係を見出すことができた。

企業でデータ分析の業務を行っていると、データが大量にあればなんでもわかるという誤った神話に苦労することが多い。データは因果分析においては恐ろしいほど寡黙であり、データにドメイン知識を与えて初めてデータが物事を語り始めるということを認識しないといけない。






2014年2月4日火曜日

rpy2をインストールする。

IPython NotebookからRを利用するためには、Rmagicという機能拡張を使えばいいとのことなのだけど、これがrpy2というライブラリを使うため、これをインストールしなくてはならない。
折角なので、今回行ったインストール手順をまとめておく。

■インストール

▼前提

Windows7で、pythonとRはインストールされているものとする。

▼RのPATHを設定しておく。

これをしないと・・・
  • インストールの時に「Error: Tried to guess R's HOME but no R command in the PATH.」と、Rが見つからないよ!と怒られます。
  • pythonでモジュールをimportする際に、「RuntimeError: R_HOME not defined.」とか、「RuntimeError: R_USER not defined.」とか怒られます。
スタート>「コンピューター」を右クリック>プロパティ>左パネルの「システムの詳細設定」>環境変数 を開きます。その画面で次の3つを設定。

  • ユーザー環境変数のPATHを編集し、R.exeのあるbinフォルダをセミコロンで区切って末尾に追記します。つまり「;C:\Program Files\R\R-2.15.3\bin」(←僕の環境の場合)を末尾に追加する。
  • システム環境変数で、以下のPATHを追加。
    • 変数名「R_HOME」、変数値「C:\Program Files\R\R-2.15.3」(←僕の環境の場合)
    • 変数名「R_USER」、変数値「xxxx」(xxxxはWindowsのログイン名)

▼pipでインストール

上記で環境変数を指定した後、コマンドプロンプト(*1)を開き
$pip install rpy2
と打つ。簡単!


▼pipでエラーが出る場合・・・

環境によっては、pipでインストールしようとしたら、
"C:\PROGRA~1\R\R-215~1.3\bin\R" CMD config --ldflags
Invalid substring


みたいなエラーが出る場合がある(*2)。
この場合は、このページの環境に合わせたバイナリ(僕の環境の場合はrpy2 2.3.9.win32 py2.7.exe)をダウンロードし、あとはダブルクリックでインストールすればよい模様(参考)。

▼確認

コマンドプロンプトなりでpythonを起動して
import rpy2.robjects as robjects
を打って、エラーとかでないと、とりあえずインストール成功!

■Rmagic

rpy2をインストールしたら、IPython NotebookでRmagicを使ってRのコマンドが使えるようになる。
使い方はココが分かりやすい。


(*1)Windows標準のコマンドプロントでもいいし、scipyスタックのanacondaを使ってる場合、「anaconda command prompt」でもいい。ただしどちらの場合も、環境変数の更新を行った場合には、プロンプトを開きなおさないと環境変数の設定変更が反映されないことに注意!(これでだいぶハマッた)

(*2) 僕の職場のPCへのインストールはこれでハマる (+_+)。

2014年2月2日日曜日

科学計算用のscipyスタック(anaconda)

科学計算用(というより統計や機械学習系)のpython環境をwindowsにつくろうとして、いろいろ調べていると、scipyスタック(*1) として「anaconda」というものが存在することを知った

このanaconda、かなり便利でこれ1つインストールするだけで、主なところで、
  • python 2.7.5
  • theano 0.5.0 L
  • numpy 1.7.1
  • scipy 0.13.0
  • pip 1.4.1
  • matplotlib 1.3.1
  • pandas 0.12.0
とかが一緒にインストールされる。(全パッケージ情報はここ参照)

■インストール方法(Windows)

インストール方法は全くもって簡単で、ここからwindows用インストーラーをダウンロード。ダウンロードしたインストーラーをダブルクリックで起動するだけ。

インストール中は、基本的に画面に従ってデフォルト設定で「次へ」を押していけばいいが、一点だけ注意が必要で、英語で「自分のみにインストールするか?(推奨)、それともシステム全体にインストールするか?」と聞かれる箇所がある。この時デフォルトの設定では「システム全体にインストール」側にチェックが入っているので、推奨の「自分のみにインストール」をしたければ、チェックを付替えてから「次へ」でインストールを進める。

■動作確認

インストールが終わったら、「スタートボタン>全てのプログラム」に「Anaconda」の項目がある。
例えば、「Annaconda Command Prompt」を選択し、コンソールから
$python -V
と入力してバージョン情報が表示されれば、ひとまずインストールは成功。

また、anaconda本体は、「自分のみにインストール」を選択してインストールした場合、
「C:\Users\[XXX]\Anaconda」
以下にインストールされている。(ここで[XXX]はあなたのユーザーネーム)

これだけ簡単にインストールできるとなると、pythonでのデータ分析とかの敷居がどんどん低くなっていくなーと感じる。

■パッケージをアップデート

Anacondaで使われているパッケージは若干古いバージョンのものも含まれるので、使うパッケージは最新版にアップデートしておいた方がよい。Anacondaは独自のパッケージ管理ツール「conda」で管理されるので、例えばpandasを最新版にアップデートしたい場合は、
「Annaconda Command Prompt」を起動し、コンソールから
$conda update pandas
を実行すればOK。依存するパッケージも自動でアップデートしてくれる。
また、condaで管理していないパッケージについては、従来どおりpipでアップデートも可能。

2013年12月1日日曜日

ポアソン分布 まとめ

悲しいくらいに、「超」初心者な話題だけれど、いっつも「ポアソン分布」について忘れてしまうので、メモ代わりに、自分なりにまとめた。(詳細などはこれを参照)

■ポアソン分布とは
  ポアソン分布\(Po(\lambda)\)は、二項分布\(Bi(n,p)\)(※)で\(np\rightarrow\lambda\)となるように\(n\)を大きく、\(p\)pを小さくする極限での確率分布。
  二項分布と同じく特定の事象が起きる回数の分布なので、離散型の確率分布。

■ポアソン分布の確率分布の関数
  ポアソン分布は、たった1つのパラメータ「\(\lambda\)」だけで記述される。
  特定の事象が発生する回数を示す確率変数を\(X\)とするとき、それが\(k\)となる確率分布は
  \[Po(X=k) = \frac{\lambda ^ k e ^ {-\lambda}}{k!}\]
  と定式化される。

■ポアソン分布の性質
  期待値と分散が等しく\(\lambda\)となる。


(※)二項分布\(Bi(n,p)\)は、確率\(p\)で起きる特定の事象が、独立な試行を\(n\)回行った時に、起きる回数の確率分布。

2013年8月3日土曜日

Rで「隠れマルコフモデル」の解析

「隠れマルコフモデル」を少し勉強してみたので、まとめてみる。
モデルの考え方について一番参考になったのは、ここ(pdf)と、ここ(pdf)と、ここだ。

▼隠れマルコフモデルの考え方

  隠れマルコフモデルを一言でいうと、
時間的に非定常な観測事象を、「(隠れた)複数の定常状態が、マルコフ性を持つ確率過程で遷移し、それぞれの定常状態の確率分布に従って観測事象が生起される」という考え方で記述しようとするモデル。
といえる。文章で言っても伝わりづらいので、考え方のイメージを下の図に示す。

  観測事象が図上部の折れ線グラフに示されている。ここで観測事象は何でもよい。株価の騰落率の時間変化でも良いし、ある店舗の売り上げの時間変化でも良い。ここで例にあげた図の観測事象は、時間に関して初期・中期・後期のそれぞれで振る舞いが異なるように見える。

  これをモデルに落とし込むため隠れマルコフモデルは「隠れた定常状態(上の例では3つ)が存在し、各定常状態の確率分布(図下部の青・赤・緑で示された確率分布)に従って観測事象が表れ、かつ定常状態間は時間経過と共にマルコフ性を持つ確率過程で遷移する」という考え方をする。

  マルコフ性とは
「状態間の遷移確率は、過去の経緯とか関係なく、「現在がどの状態か?」のみで決定される」
という性質である。例えば現在が定常状態Aであれば(過去にどういう状態遷移をしたに関わらず)状態Aから、Aに自己遷移する確率は何%、Bに遷移する確率は何%、Cに遷移する確率は何%というように決定されるという性質である。

▼隠れマルコフモデルを定式化する。

  上記のような考え方を定式化すると、以下のようになる。
  定常状態(上の例ではA・B・C)が時刻\(t = 1\)~\(n\)に、時間的に連続した系列\( Q:=\{q_1,q_2, \cdot \cdot \cdot, q_n\}\)となる場合に、観測事象が系列\( Y:=\{y_1,y_2, \cdot \cdot \cdot, y_n\}\)となる確率 \(P(Y|Q)\)は
\[P(Y|Q)=\pi_{q_0}\prod_{t=1}^{n} a_{q_t q_{t+1}}b_{q_t}(y_t)\]
ここで、

  • \(b_{q_t}(y_t)\)は、時刻\(t\)の隠れた定常状態\(q_t\)から観測事象\(y_t\)が現れる確率分布。(つまり上図での青や赤や緑で表わされた確率分布)
  • \(a_{q_t q_{t+1}}\)は、時刻が\(t\)から\(t+1\)に進む際に、隠れた定常状態\(q_t\)から\(q_{t+1}\)に遷移する確率。
  • \(\pi_{q_0}\)は、状態\(q_0\)が初期定常情報源となる確率。


▼隠れマルコフモデルで何が推定できるのか?

  隠れマルコフモデルには主に2つのアルゴリズムを用いて以下の推定が可能である。
  1つは、Baum-Welchアルゴリズムを用いて、上記定式化の各パラメータ\(\pi_{q_0}\)、\(a_{q_t q_{t+1}}\)、\(b_{q_t}(y_t)\)を推定すること。
  もう1つは、Viterviアルゴリズムを用いて、観測事象の系列\( Y:=\{y_1,y_2, \cdot \cdot \cdot, y_n\}\)が観測される場合に、尤度関数を最大化する、定常状態系列\( Q:=\{q_1,q_2, \cdot \cdot \cdot, q_n\}\)を求めることだ。

▼解析用のテストデータ作成

では、実際にRで隠れマルコフモデルの解析を行っていく。まずはじめに下図のような解析用のテストデータを作成しておく。
このテストデータは、

  • 定常状態A: 平均10、分散6の正規分布で観測事象が出現する状態
  • 定常状態B: 平均12、分散7の正規分布で観測事象が出現する状態

の2つの定常状態があり、時間1~200と401~600は定常状態A、時間201~400と601~800は定常状態Bとなっているデータだ。

データ作成用のRコードは以下のとおり。
set.seed(1) #乱数シード作成
size <- 200 #データセットの大きさ
mean.a <- 10 #定常状態Aの平均
var.a <- 6 #定常状態Aの分散
mean.b <- 12 #定常状態Bの平均
var.b <- 7 #定常状態Bの分散
x.1 <- rnorm(size, mean.a, sqrt(var.a)) #データ作成
x.2 <- rnorm(size, mean.b, sqrt(var.b)) #データ作成
x.3 <- rnorm(size, mean.a, sqrt(var.a)) #データ作成
x.4 <- rnorm(size, mean.b, sqrt(var.b)) #データ作成
x <- c(x.1, x.2, x.3, x.4) #データ連結
plot(x, xlab = "time", ylab = "observed quantity")

▼Baum-Welchアルゴリズム

実際にBaum-Welchアルゴリズムを用いて、上記定式化の各パラメータ\(\pi_{q_0}\)、\(a_{q_t q_{t+1}}\)、\(b_{q_t}(y_t)\)を推定する。

Rには隠れマルコフ解析用のパッケージ「RHmm」があるので、それを使えば簡単に推定できる(パッケージは前もってインストールしとく必要あり)。実際の解析用のコードは以下のとおり。
> library("RHmm") #隠れマルコフモデルのライブラリ読み込み
> hmm.fitted <- HMMFit(x, nStates = 2) #フィッティング(ステート数は2を設定)
> print(hmm.fitted$HMM) #Baum-Welchアルゴリズムでの推定量を表示
まずRHmmパッケージを読み込み、先のテストデータ「x」、定常状態数は2(今回はAとBの2つだから)を指定してHMMFit関数を実行する。この関数の戻り値はBaum-Welchアルゴリズムの解析結果も含むので、それをプリントする・・・だけ。

実行結果は以下のとおり。
Initial probabilities:
         Pi 1 Pi 2
  3.50879e-35    1

Transition matrix:
            State 1     State 2
State 1 0.997176507 0.002823493
State 2 0.005380641 0.994619359

Conditionnal distribution parameters:

Distribution parameters:
            mean     var
State 1 11.89274 7.75078
State 2  9.99124 6.01621

ここで、結果の内容を見ていく。

まずは、Distribution parametersの項。ここは先の\(b_{q_t}(y_t)\)の推定値、すなわち隠れた定常状態の確率分布について示されている。
・「State 1」がテストデータの定常状態B
・「State 2」がテストデータの定常状態A
を表わしている。
これらの結果に表示された平均と分散は、テストデータを用意した際のパラメータと良く一致している。

次にInitial probabilitiesの項。ここは先の\(\pi_{q_0}\)の推定値を示している。「Pi 2(=State2が初期状態として現れる確率)」がほぼ1であり、定常状態Aが最初に現れているテストデータと合致している。

最後にTransition matrixの項。これは先の\(a_{q_t q_{t+1}}\)の推定値を示している。
  • 定常状態Aの時、定常状態Aに(自己)遷移する確率は0.997程度。定常状態Bに遷移する確率は0.003程度。
  • 定常状態Bの時、定常状態Bに(自己)遷移する確率は0.995程度。定常状態Aに遷移する確率は0.005程度。
と推定されていることを示している。状態A・B共に、テストデータでは200回に199回は自己遷移(確率0.995)。1回はもう一方の状態に遷移(確率0.005)しているので、その状況と合致しているの分かる。

▼Viterviアルゴリズム

次にViterviアルゴリズムを用いて、テストデータのような観測事象が現れたとき、最も尤(もっと)もらしい(尤度関数を最大化する)、定常状態の系列(ここでは状態Aと状態Bの時間系列)を求めてみる。
解析用のRコードは以下のとおり。
> #先ほどのHMMFitの戻り値とテストデータXからViterbiアルゴリズムフィッティング
> vitervi.fitted = viterbi(hmm.fitted,x)
> #Viterviアルゴリズムで求めた、最も尤もらしい状態の系列をプロットする。
> plot(vitervi.fitted$states, xlab = "time", ylab = "Most Likely Status ID")
結果は、次のグラフで、テストデータ作成時に設定した状態遷移の時系列とよく合致している結果が得られている。


以上。

2013年5月26日日曜日

中心極限定理をRでシミュレーション

中心極限定理とは、大まかに言えば、
母集団の確率変数\(X\)がどんな確率分布であっても、その平均と分散が\(\mu\)と\(\sigma^2\)であれば、その標本(サンプル数\(n\))の確率変数\(X\)の和や平均は、それぞれ正規分布 \(N(n\mu, n\sigma^2)\)、 \(N(\mu, \sigma^2/n)\)に従うということである。

それが本当かどうか確かめたかったので、Rのプログラムを書いて検証してみた。
ここでは、「指数分布に従う確率変数の平均」で検証した。

以下にコードを置いておく。
実際にCONSTANTSの部分をいろいろ変えて
  • 分布が正規分布に従い、その平均と分散が中心極限定理の予言通りか?
  • 標本数が大きくなれば、分散は実際に小さくなっていくのか?
などを確認してみるとよい。


#中心極限定理が成り立つかをシミュレーションするRスクリプト
#ここでは、指数分布の確率分布に従う確率変数Xの平均値について検証。

## CONSTANTS
SAMPLE.NUM <- 10 #1回の試行での標本数。
TEST.NUM <- 50000 #試行回数(この数の試行を繰り返して分布が正規分布になるかをみる。)
EXP.LAMBDA <- 3 # 指数関数パラメータλ
PLOT.MAX.X <- 1 #こ

#各行が指数分布に従う確率変数の一つの標本を表わす行列を生成。
data.matrix <- matrix(rexp(TEST.NUM, rate = EXP.LAMBDA), ncol = SAMPLE.NUM)

#各試行(= 各行)の平均をとる。
means.of.each.test <- apply(data.matrix,MARGIN=1,mean)

#各試行の平均の、相対度数ヒストグラムを描画
hist(means.of.each.test, breaks=seq(0, PLOT.MAX.X, by=0.05), xlim=c(0, PLOT.MAX.X), probability = TRUE)

#中心極限定理が予言する平均と分散を求める。
#ここで母集団分布がλ=EXP.LAMBDAの指数分布であり、
#その平均と分散(母平均&母分散)がそれぞれ、
#母平均=1/λ、母分散=1/λ^2なので・・・
theorem.mean <- 1/EXP.LAMBDA
print(theorem.mean)
theorem.var <- 1/EXP.LAMBDA^2/SAMPLE.NUM
print(theorem.var)

#中心極限定理が予言する正規分布を描画する。
#ヒストグラムと正規分布曲線が一致すれば、中心極限定理は正しい!
x <- seq(0, PLOT.MAX.X, by=0.01)
lines(x, dnorm(x, theorem.mean, sqrt(theorem.var)), col="red")

2013年5月18日土曜日

R言語のcut関数の使い方

R初心者として、cut関数がいまいち分かりにくかったので、ここで少しまとめておく。

■cut関数は何をする関数?
一言でいうと「数値データを、指定した分割基準でカテゴリに変換する関数」だ。
もう少し詳しくいうと、例えば英語の試験を行い各人の試験結果を
> x <- c(90, 55, 79, 80, 100)
とする。80点未満を「不合格」、80点以上を「合格」と分けるとすると、xの変数の内容を「合格、不合格、不合格, 合格、合格」と変換したfactor型のオブジェクトを返すのがcut関数だ。

■実際にcut関数を動かしてみる。
上記の例を実際にR上で行ったのが以下。
> x <- c(90, 55, 79, 80, 100)
> cut(x,breaks=c(0,80,100), labels=c("不合格","合格"), right = FALSE, include.lowest = TRUE)

[1] 合格   不合格 不合格 合格   合格  
Levels: 不合格 合格
点数が先ほどの基準に従ってカテゴリ(合格、不合格)に変換されているのが分かる。

■right = FALSEのオプションは?
先のcut使用例で「right=FALSE」のオプションをしている。この説明をしなければならない。
cutのデフォルト動作は、例えばbreaks=c(0,80,100)と指定した場合、
  • (0,80]の区間を不合格
  • (80,100]の区間を合格
とカテゴリ分けする。
ここで丸括弧は開区間、角括弧は閉区間を示す。でも今回は
80点未満を不合格、80点以上を合格としたいから、
  • [0,80)の区間を不合格
  • [80,100)の区間を合格 (注:ここで100がカテゴリ分けに入らないのは後述)
であるべき。このように区間を分けるためにright = FALSE とする。

■include.lowest = TRUEのオプションは?
先のright=FALSEだけでは「100」がカテゴリ分けに含まれない。そこでカテゴリ分けの末端の開区間を閉区間にし、今回の例では100をカテゴリに含むようにするのが、このオプション。

「right = FALSE」「include.lowest = TRUE」を指定することで、今回我々が望む
  • [0,80)の区間を不合格
  • [80,100]の区間を合格
というカテゴリ分けが実現できる。





2013年4月25日木曜日

相加平均と相乗平均の使い分け

統計学の中で「平均」というときに「相加平均」、「相乗平均」、「調和平均」という3種類がある。
この中で、「相加平均」と「相乗平均」について、その使い分けも含めて整理したいと思って、この記事をポストする(※1)。

まずは、それぞれの定義について整理し、そのあと2つの使い分けについて書く。

■相加平均とは
いわゆる小学校の時にならうもので、算術平均ともいう。
\(x_1\)から\(x_n\)までの\(n\)個のデータがあった場合、相加平均\(\bar{x}\)の求め方は
\[ \bar{x} = \frac{ x_1+ \cdots + x_n}{n}=\frac{1}{n} \sum^n_{i=1} x_i\]
となる。

■相乗平均とは
相乗平均は、幾何平均ともいう。

\(x_1\)から\(x_n\)までの\(n\)個のデータがあった場合、相乗平均\(x_G\)の求め方は
\[ x_G = \sqrt[n]{x_1\times \cdots \times x_n}= \sqrt[n]{\prod^n_{i=1}x_i}\]
となる。

余談だが、\(x_G\)の対数をとると、
\[\log x_G = \log \sqrt[n]{x_1\times \cdots \times x_n} = \frac{1}{n} (\log x_1 + \cdots \log x_n)\] 
となり、相乗平均の対数は各データの対数の相加平均になっていることが分かって面白い。

■相加平均と相乗平均の使い分け
本題の使い分けだが、
平均値が必要な場合、「基本的には相加平均を使う」で構わない。ただし、データがある基準の比のデータである場合に、その比の平均をとる場合は相乗平均を使う必要がある。
いう考え方で問題ない。相乗平均を用いる必要がある場合の例を示す。

■相乗平均を使う場合の具体例
ある会社の2年目の売り上げは初年度の4倍、3年目の売り上げは2年目の3倍でした。売り上げの伸び率の平均は?
この時、単純に算術平均で求めると平均は3.5となる。しかし上記例では、3年目は初年度に比べて4×3=12倍に延びているのに対して、上記の算術平均を用いると、3.5×3.5=12.25伸びることとなり矛盾が生じる。

そこで、相乗平均の出番である。
3年目は初年度に比べて4×3=12倍に伸びているなら、12の平方根(つまり相乗平均!)を求めて、

  • 1年目に、\(\sqrt {12}\)伸びる。
  • 2年目に、\(\sqrt {12}\)伸びる。
のように、それぞれの年で均等な伸び率で伸びると考えるほうが、実情にあう。
そのため、ここでは、相加平均より相乗平均を使うべき例になる。

■相乗平均を使った方が「いいかもしれない」例
上記例以外にも、相乗平均を使った方がいい場合がある例を1つ示す。
それは「平均をとる対象が大きく変動するような場合は、相乗平均で平均をとった方が実感覚と合致する。」というものだ。
例えば、数値群(10,1,1000,1,10)の平均をとる場合を考える。
相乗平均をとると204.4となり、一つの外れ値の1000に大きく引っ張られているのが分かる。
一方、相乗平均をとると10となる。こちらの方が相加平均の204.4より、生データの1や10が大半を占める状況の実感覚に合っているように感じられる。



(※1)調和平均については、必要があれば追記することとする。
(参考) ここと、以下の書籍を参考にした。

2013年4月11日木曜日

標本分布(←大事!)

統計には大きく2つある。記述統計と推測統計だ。

記述統計は、調査対象集団の性質のデータを、有意な形に要約して記述することが目的の統計。ここでは調査者が調査対象集団についての必要な情報を全て手に入れられることが前提になっている。例えば、あるクラスの数学の試験の平均を求めたい場合などだ。クラス全員の学力の傾向を調べたいために、クラス全員の学力の平均や偏差値を計算するわけだ。

一方、推測統計は、調査者が調査対象集団についての必要な情報の全ては手に入らないが、何らかの調査をしてその結果から対象集団の性質を推測することを目的とするものだ。日本の中学3年生の学力傾向を調べたい時に、本当に日本の中学3年生全員を対象に調査を行うと非常に多くのお金と労力が必要になる。それを避けるため、全国から無作為に中学生を抽出して学力試験を行い、その結果を基に日本全体の中学3年生の学力傾向を推測しようと考える。これが推測統計だ。

推測統計を行う場合、上記に書いたとおり対象(上の例だと日本の全中学3年生)から「無作為」に標本(サンプル)を抽出し、その性質を調査するのが原則だ。

「無作為」に標本を抜き出すため、標本統計量(標本から計算される統計量:標本平均や標本分散など)は、標本の抜き出し方によって「偶然決まる量」であり、すなわち確率変数だ。

標本から母数(母集団の各統計量)を推定する際には、この確率変数である標本統計量の確率分布(=標本分布)がどのような性質があるのかを知っていないといけないし、調査に説得力が生まれない。

以下に一例を示す。

■算術平均
統計量が算術平均の場合、以下の性質がある。
  • 母集団の分布がどのような分布でも、
    • 母平均=標本平均となる。(つまり不偏性がある。)
    • 標本平均の標準誤差=標準偏差は\(\sigma/\sqrt{\mathstrut n}\)となる。(ここで\(\sigma\)は母標準偏差、\(n\)はサンプル数)
  • 母集団分布が正規分布であれば標本平均の標本分布も正規分布となる。
  • 母集団分布が正規分布でない場合は、標本平均の標本分布は正規分布とはならないが、サンプル数が多い場合の標本平均の標本分布は、正規分布に近づく。(中心極限定理)

■分散
統計量が分散の場合、以下の性質がある。
  • 母分散=不偏分散(※)の算術平均(つまり不偏性がある。不偏分散という名前もここからきている。)
  • 上記のとおり不偏分散の算術平均は母分散と一致するが、不偏分散の確率分布のピーク(最頻値)は母分散とは一致しない。

(※)以下で定義される分散。ここでn-1で割るかわりにnで割る量を標本分散と呼ぶ。
\[\sigma^2 = \frac{\sum_{i} (x_i - \bar{x})^2}{n-1}\]

2013年4月10日水曜日

共分散と相関係数

2つの変数(ここでは\(x\)と\(y\)とする)の統計値があり、その2つの統計値がどれほど密接に関連しているかを検査するには、相関係数を見ればよい。

その前に、「共分散」という量について考える。
共分散は以下の量で定義する。
\[s_{xy} = \frac{\sum_{i} (x_i - \bar{x})(y_i - \bar{y})}{n}\]
この量は、xが平均より大きい値をとるときにyも平均よりも大きい値をとる傾向にある場合(つまりは正の相関がある場合)に正の値をとる。一方、負の相関が有る場合は、負の値をとる。

でも、共分散の「大きさ」にはあまり意味がない。相関が強いからといって、大きい値になったりするとは限らない。

その理由の一つが、この共分散という量はxとyの単位の積の次元を持つから。例えば変数xが長さに関する量で、その単位を[m]にするか[cm]にするかで、共分散の大きさが変わる。

2つ目の理由が、各変数の値のバラツキ度合いで共分散の大きさも変わること。例えば変数xのばらつきが大きければ\((x_i - \bar{x})\)が大きくなるから、共分散の値も大きくなってしまう。

これらの難点を克服するために、共分散を変数xとyの標準偏差で割ってやろうという発想が生まれる。それが「相関係数 \(r_{xy}\)」だ。つまり、
\[r_{xy}=\frac{s_{xy}}{s_x s_y}\]

ここで、\(s_x\)、\(s_y\)はxとyの標準偏差。

xとyの標準偏差で割ることにより・・・
  • 相関係数は無次元量になり、変数の単位によらず一定の値をとるようになる。
  • 変数x、yの取る値のばらつきの標準偏差を1に正規化することによって、各変数のばらつきに依存しない量になる。
ということで、相関係数が、純粋に変数x、yの相関に依存する量となる。

すばらしい。

(補足1)
相関係数は変数が量的変数の場合に計算できるのだけれど、質的変数である場合は計算できない。この場合、相関度合はクロス集計表を作って相関度合を調べたり、ファイ係数(質に数値を割り当てて無理矢理に相関係数を計算する・・・ようなもの)を計算して調べたりする。

(補足2)
厳密には、上記で定義した相関係数は「ピアソンの積率相関係数」と呼ぶ。他にも相関係数の定義があって、例えば「スピアマンの順位相関係数」や「ケンドールの順位相関係数」などがあるらしい。