はじめに
この記事は NTTテクノクロス Advent Calendar 2019 の15日目の記事です。
こんにちは、NTTテクノクロスで、ウェアラブルデバイスをはじめとした各種センサーのデータや、ソーシャルリスニングサービス(Watchbee *1 )のデータ分析を担当している山田(@Yama0527)です。
- 東にデータを持っている人があれば、行って、データを看てやり
- 西に分析で困ったという人があれば、行って、その分析を担い
- 南にデータ不足の人があれば、行って、怖がらなくてもいいと言い
- 北に分析の解釈で喧嘩があれば、行って、つまらないから止めろという。
学習不足の時は涙を流し、過学習の時はオロオロ歩く… という統計屋さんのお仕事しています。
データ分析関連のプロジェクトで必ず言われる「いくつ、データがあればいいですか?」という問いに、どう備えるかという話。「サンプルサイズ」にスポットを与えてみたいと思います。
データサイエンス領域の、あるあるタスク構造において、サンプルサイズの見積もりが必要なタスクに少しだけ聞くかもしれない話と思いお読みください。 2
「サンプルサイズ」なの?「サンプル数」なの?
これに関しては、多くの人が書いていますが、改めて、説明します。
例えば、 ある会社の部署Aから50人、部署Bから50人の年収の情報を得たとします。
この場合、「サンプルサイズ(標本サイズ)」=100 , 「サンプル数(標本数)」=2 となります。
サイズと数の言い方の違いじゃん! とお思いかもしれませんが、英語で書くと非常にわかりやすく**「sample size」と「number of samples」**になっています。明確に違うものです。機械学習になじみがある方はクラス数や群数が2(サンプル数)、各群に含まれるデータが50個(サンプルサイズ) と思うとわかりやすいかもしれません。
「サンプル数は6です。」といって6個のサンプルサイズで分析していると思われたことがあるので、実務上で間違えている人も多い印象もあり、この機会に啓蒙です。
データサイエンス、データエンジニアリング等、書籍によって揺れている場合もありますが、統計学ではこうした区別の書き方が支配的かと思います。
サンプルサイズを決める3つの方向性
「サンプルサイズは○○件が望ましい」と答える場合の、よくあるスタンスは以下の3パターンくらいが考えられるかと思います。
1. よくある相場を伝える。
2. 可能な限り多く!
3. 検定力や信頼区間に基づく数を伝える。
それぞれのケースを見てみましょう。
1. よくある相場を伝える。
「相場」が伝えられていると、安心感を生む感じがしますね。日本の機械学習領域では有名な 「バーニーおじさんのルール」3 なんかもこの相場に当たります。有名なデータセットがあれば、そのデータセットにおけるサンプルサイズと、各種手法適用時の結果などは広く知られており、「相場」に用いられます。
集合知に基づく値は馬鹿にできません。データが望めばその分だけ与えられるような、状況においては、こうした相場で臨むことが必ずしも間違いとは言えません。
2. 可能な限り多く。戦いは数だよ兄貴!
ドズル・ザビですか?落ち着いてください。ただこれも馬鹿にできず、結果的に十分な量が取得できる環境下であれば、間違いではありません。
しかし、プロジェクト開始前やデータ取得にコストがかかるフェーズの場合、「もっと少なくてもダメか?」などの節約派の意見に返答することは難しいでしょう。
また、 実質的に意味のない差異まで、統計的仮設検定の場で検出される という例に代表されるように、機械学習の場面でも、こうしたノイズを学習してしまったりというデメリットがあります。「過ぎたるは及ばざるがごとし」という場合もあるのでご用心。
3. 検定力、信頼区間に基づく数を基準にする
これは、少し統計的な話になります。機械学習タスクなどで識別する場合、そもそも入力データを用いて識別ができるという仮定に立脚しています。
もちろん、識別面が単純ではないから機械学習手法を選択するというケースが多いと思います。しかし、2群判別を考えた場合に、「入力データで2群に分けられると仮定した場合、その差が明確に検定でわかるのに必要なサンプルサイズ」というのが一つの基準になれば、その基準を参考にサンプルサイズの見積もりができると考えられます。今回は、このサンプルサイズの決め方に、フォーカスしていきたいと思います。
検定力分析に基づくサンプルサイズの指標
検定力とは 統計的仮設検定において、帰無仮説が誤っているときに帰無仮説を棄却できる確率です。 例えば、2群のある特徴量で平均の差を検定する場合、 「平均には差がない」という帰無仮説が誤っているときに、「平均には差がない」という仮説をきちんと棄却できる確率を示します。この確率が一定以上確保できるサンプルサイズがあれば良い。という考えです。
サンプルサイズを決めるために、もう一つの指標を導入しましょう。
**「効果量」**です。
検定力では、あくまで「帰無仮説が棄却できるか否か」しか見ていません。例えば「平均に差があるか」は検定できるため、検定力で測ることができます。一方、「平均にどの程度差があるか」は検定ではわからないため、効果量が必要になります。
効果量は検定の種類によって異なります。
Cohen(1992) では各統計検定における効果量と、効果の大きさを大別した3つの区分が書かれています。4
これと、最後に有意水準が決まれば、サンプルサイズが見えてきます。
され、事前の講釈が長くなりましたので、実データで見ていきましょう。
今回使うデータは Rの標準データセットに含まれる airqualityデータです。
#データ読み込む
data_air <- airquality
# NAが含まれる行を除く
data_air <- data_air[-unique(which(is.na(data_air),arr.ind=T)[,1]),-c(5,6)]
data_air[1:5,]
このデータは、1973年の4か月間にわたる毎日のニューヨークの大気状態のデータで、以下のようになります。
Ozone | Solar.R | Wind | Temp |
---|---|---|---|
41 | 190 | 7.4 | 67 |
36 | 118 | 8.0 | 72 |
12 | 149 | 12.6 | 74 |
18 | 313 | 11.5 | 62 |
... | ... | ... | ... |
さて、このデータでOzone(オゾンの量)を他の3変数(日射量、風力、温度)で予測できないか?というプロジェクトを任された想定です。
まず初めに、データが手元に乏しい状態であなたは、「Ozone」を予測するためにデータを取得することからスタートです。一方で、あなたが仮説に立てた「3変数で予測できそう。」を判断するためにはどのくらいのサンプルサイズが必要でしょう?
この時に使える方法が検定力分析です。
今回「検定」するのは、この3変数でよいか、2変数でも事足りるのではないかという点です。
このためCohenの基準では
f^2 = \frac{R^2}{1-R^2}
ここで$R^2$は偏相関係数の検定におけるk個の変数における重回帰分析の決定係数$R^2_{1...k}$と、kこの変数にさらにいくつか加えたp個($P>k$)の変数を用いた場合の決定係数$R^2_{1...p}$を用いて以下のようにあらわしています。
R^2 = \frac{R^2_{1...p}-R^2_{1...k}}{1-R^2_{1...k}}
元のk個では説明しきれなかった目的変数の分散うち、新しく追加した分で説明できるようになった割合と考えられます。
この効果量の指標$f^2$の値がCohenが与える指標で大:0.35,中:0.15,小:0.02のいずれかの目安で使うとよいということです。4
今回は有意水準0.05の下で、効果量0.15、検定力0.9 になるときのサンプルサイズを考えていきましょう。
Rで使うパッケージはpwrです。このほかに 専用ソフトでG*Power5 なんかも有名です。
# pwrパッケージのインストール(初回のみ)
install.packages("pwr")
# pwrパッケージの読み込み
library("pwr")
#検定力分析
#今回は3変数の重回帰分析なので分子の自由度はu=1
pwr.f2.test(u=1,f2=0.15, power = 0.9)
こうすると結果は以下のように変えるはずです。
> pwr.f2.test(u=1,f2=0.15, power = 0.9)
Multiple regression power calculation
u = 1
v = 70.02551
f2 = 0.15
sig.level = 0.05
power = 0.9
一般に変数の個数をpとすると、上のvは $v = (サンプルサイズ)-p-1$
となる。このため、今回の「Ozone」が3変数で予測できるかな?を確認するならば、サンプルサイズは$70.02551+3+1$つまり、74個くらいで良さそうですね。
さて、74個で重回帰分析してみましょう。
#74個抽出してみる
set.seed(1234)#この1234を変えて遊んでみて
sampling <- sample(c(1:nrow(data_air)),74)
data_air_sub <- data_air[sampling,]
#重回帰分析してみる
air_glm_sub <- lm(Ozone~Solar.R+Wind+Temp,data=data_air_sub)
> summary(air_glm_sub)
Call:
lm(formula = Ozone ~ Solar.R + Wind + Temp, data = data_air_sub)
Residuals:
Min 1Q Median 3Q Max
-33.560 -14.714 -4.193 8.639 90.184
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -84.03677 30.91940 -2.718 0.00827 **
Solar.R 0.09541 0.03060 3.118 0.00265 **
Wind -3.69191 0.80905 -4.563 2.09e-05 ***
Temp 1.87280 0.33487 5.593 4.03e-07 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 22.34 on 70 degrees of freedom
Multiple R-squared: 0.6264, Adjusted R-squared: 0.6103
F-statistic: 39.11 on 3 and 70 DF, p-value: 5.848e-15
お、全ての変数が**か***ですね。3変数から減らす必要はなさそうです。
この際に「もっとサンプルサイズ増やして確認したら、2変数で何とかなるんじゃないの?」みたいな方に検定力分析を武器に、「十分なサンプルサイズで確認したじゃろがい!」と反論できるわけです。
もちろん3変数では足りないぜ!みたいな結果も見えるので、そっち方向は今回の検討では出ません。注意しましょう。
おわりに
いかがでしたでしょうか。地味でしたか?
サンプルサイズはデータ取得の予算に直結する話のため、根拠が必要な議論なのでそのきっかけの一つに役立てば光栄です。
明日は @nuko_yokohamaさんのPostgreSQLについての記事です。 お楽しみに!
-
サンプルサイズは「モデルのパラメータ数の10倍のデータ数が必要」という、G検定くらいしかお目にかからないあれ。 ↩
-
Cohen, Jacob: A power primer. : Psychological Bulletin, Vol 112(1), Jul 1992, 155-159 ↩ ↩2