2018年4月30日 (月)
マーケティング・リサーチにおいては、この製品・サービスの価格がこうだったら売上はこうなるでしょうというようなことを調べることがあるんだけど、その際の手法のひとつにBPTO (Brand Price Trade-off)というのがある。
ううむ、懐かしいなあ。前の勤務先に拾ってもらった際、トシを食ってはいるものの業界の常識を全く持たない私に、上司様が懇切丁寧に教えて下さったのであった。さぞや面倒だっただろう。いま私があの立場になったとして、あのように親切には振る舞えそうにない。
要するに、(1)調査対象者にいくつかの製品を提示しひとつ選ばせる、(2)選ばれた製品の値段をちょっぴり上げ、再び製品をひとつ選ばせる、(3)これを繰り返す... というのが基本アイデアである。値段と選択率の関係がわかります、すなわち価格-需要関数が手に入ります、という理屈ですね。わっかりやすい。
BPTOというのはかなり古めかしい手法であって、おそらく現在ではあまり使われていないだろうと思うんだけど、その細部についてはたまに議論になる。一度きちんと調べてみたいと思った次第である。
書籍
BPTOについて解説している書籍はないだろうか。
Google Booksのお力により、少なくとも以下の書籍で言及されていることがわかった。
- Bradley(ed.) (1987) "Applied Marketing and Social Research"
- Thomas (ed.)(1995) "Gower Handbook of Marketing"
- Frain(1999) "Introduction to Marketing"
- Chakrapani(ed) (2000) "Marketing Research"
- Pati (2002) "Marketing Research"
- Roe (2004) "Market Research in Action"
- ESOMAR Market Research Handbook 5th ed. (2007). これは手元にあるんだけど、BPTOの解説は短くていまいちピンとこない。
- Poynter (2010) "The Handbook of Online and Social Media Research. この本はGMOリサーチの方々の翻訳による日本語版が出ている。
- Leeflang, et al. (2014) "Modelng Markets". あ、この本は結構良さそう...
- Charan (2015) "Marketing Analytics"
論文
論文における言及を探すのはなかなか難しい。BPTOというのは地を這うリサーチャーののためのごくごく実務的な手法であって、マーケティングの学術誌で扱われるようなかっこよい話題ではないのである。
90年代以降、以下の論文で言及されているのをみつけたのだが、すべて未入手。
- Calderon, Cervera, & Molla (1997, J.ProductBrandMgmt)
- Lunn, Westwook, & Beazley (1997 Int.J.MarketRes.). これは論文というより特集号の巻頭言らしい。
- Comley(1997, Admap). 論文というより雑誌記事であろう。価格調査について解説しており、BPTOについて紹介しているらしい。
- Morgan (1999, Int.J.MarketRes.). 後述する理由により、これはぜひ読んでみたいんだけど、このIJMRっていう雑誌、入手がかなり困難なのである。いやまあ、PayPerViewで払えって話なんでしょうけど。
- Levis & Papageorgiou (2009, SupplyChainPlanning)
- Maringe et al.(2009 Int.J.Edu.Mgmt)
カンファレンス・ペーパー
この種の聴取・分析手法を扱うカンファレンスのなかで最も有名なのは、AMA(American Marketing Association)のART Forumだと思うのだけど、残念ながらProceedingsを入手する方法がわからない。あれ、ほんとに納得いかないんですよね。いったいどうなっているんだろうか。
コンジョイント分析のソフトウェアを発売しているSawtooth Softwareという会社は昔からユーザ・カンファレンスを開いており、Proceedingsを公開している。検索してみたところ、BPTOに言及している発表が少なくとも5件みつかった。いずれも調査実務家による発表である。
- Poynter, R. (1997) "An alternative approach to brand price trade-off." 著者はリサーチ業界の有名人レイ・ポインターさん。この時点での御所属はDeuxとなっている。内容はBPTOの改訂版の提案で、初回提示価格を現実的にしました、選ばれた製品の価格を上げるだけではなく他の製品の価格をみな下げるようにしました、など。
- Huisman, D. (1997) "Creating end-user value with multi-media interviewing systems." 著者の所属はSKIM Groupとなっている(調査会社, 現存する)。ACA(適応型コンジョイント)で提示をマルチメディアにしたらどうなるかというような内容らしい。BPTOは説明の途中で引き合いに出されているだけ。
- Buros, K. (2000) "Brand/Price Trade-off via CBC and Ci3." 著者所属はThe Analytic Helpline, Inc.となっている(現存しない模様)。
- Poynter, R. (2000) "Creating test data to objectively assess conjoint and choice algorithms." ポインターさんの今度の所属はMillward Brown IntelliQuest。
- Weiner, J.L. (2001) "Applied Pricing Research." 所属はIpsos North America.
Web
Webを検索すると、BPTOについて解説しているものがたくさんみつかる。BPTOという名前を挙げているだけならもっとたくさんみつかる(日本だとインテージさんとか)。マーケティング・リサーチにおいては一般的な手法名であることがわかる。
検索上位に出現するページを片っ端から眺めてみたのだが、当然ながら解説の中身は玉石混淆である。
- 簡にして要領を得ているなと思ったのは、Pricing Solutionsという会社による解説。BPTOの評価は低く、「なにもやらないほうがまし」だそうである。笑ってしまったが、こういう云いにくいことをはっきり云うというのは素敵ですね。
- 日本語だと、楽天リサーチが提供しているマーケティングリサーチ概論のなかに解説がある。著者は三木康夫さん、残念ながら私はお目にかかったことないですけど、日本の市場調査業界においてきわめて著名な方である。
- ドイツのIfaDという会社はWeb調査での調査画面例をみせてくれている。BPTOというのは要するに聴取手法なので、実際に回答してみるのが一番わかりやすいですね。
歴史
何人かの人が、BPTOは1970年代末に開発されたと述べている。正確に言うと、誰がいつ開発したのだろうか。
上に挙げた書籍やWebページを手掛かりに、古い文献を探していくと...
- Johnson (1972) "A New Procedure for Studying Pric-Demand Relationships". Sawtooth社創業者にしてマーケティング・リサーチのリジェンド Rich Johnsonさんが、調査会社Market Facts在籍時に書いたWhite Paperである。BPTOの最初期の文献として何人かの人が挙げている。さすがに入手はむずかしそうだ。
- Jones(1975, J.Mktg.). 掲載誌がトップジャーナル J. Marketingだからびびりましたけど、実はたった3頁の実務家向けコラムみたいなもの。昔はこういうのも載ったんですね。BPTOのもとになっている「選択された選択肢の値段をちょっと高くする」というアイデアが含まれているものの、価格調査についてのごくごく素朴な記事で、BPTOという手法名は出てこない。なお書き手のFrank JonesさんもMarket Factsの方。
- Blamires(1981, J.Market Res. Soc.). アメリカ生まれのBPTOを欧州に紹介した論文らしい。未入手。
- Mahayan, Green, & Goldberg(1982, JMR). コンジョイントモデルについての論文。未入手だが、JStorの無料枠の画像に目を凝らすと(字が小さいのだ)、前振りのところでJones(1975)を引用し、「選択された選択肢の値段をちょっと高くする」方法について説明している。
- Balmires(1987, J.Market Res. Soc.). BPTOの手続きについて説明しているらしい。未入手。
- Morgan(1987, J.Market Res. Soc.). 未入手。後述する。
- Birn, Hague, & Vangelder(1990) "A Handbook of Market Research Techniques" にBPTOについての言及があるらしい。
- Johnson & Olberts(1991, AMA ART Forum). 未入手だが、発表題名は次項の文献の題名と同じである。
- Johnson & Olberts(1996) "Using Conjoint Analysis in Pricing Studies: Is One Price Variable Enough?". Sawtooth Softwareのテクニカル・ペーパーなんだけど、Rich Johnsonさんの回顧談が載っている。いわく、「1972年、Market Factsがある論文(paper)を発表した。その著者は本論文の著者のひとりであり[Johnsonさんのこと]、調査対象者の価格感受性を測定する方法について述べたものだった」。以下、BPTOに相当する手法についての説明が続く。私がこの手法を開発しましたとは云っていない点にご注目。なお、BPTOについての著者らの評価は次の通り。「この手法は回答しやすく、低コストで実査が簡単だった。しかし残念ながら、結果は人を失望させるものであった」「回答者の中には、これを知能テストとみなして常に最低価格の製品を選ぶ人もいれば、自らのブランド・ロイヤルティへの挑戦とうけとめ、ありえないほどの高価格になっても好きなブランドを選び続ける人もいた。」はっはっは。
- 上述の Frain (1999) はBPTOについてこう説明している。"Research International have developed the conjoint approach, with their Brand/Price Trade-off (BPTO) model." えっ、BPTOってResearch Internationalが付けた名前なの?
- 半信半疑だったのだが、どうやらほんとらしい。Thomas (ed.)(1995)で価格調査について解説しているRory Morganという人は、BPTOについて"developed by my company in the late 1970s (Morgan, 1987b)"と述べている。残念ながらこの1987bというのがなんなのかは突き止めていないのだけれど(運悪く、引用文献リストのページがGoogle Booksで非表示なのである)、推測するに上述のMorgan(1987)であろう。Linkedinで探したところ、Rory Morganさんという方がいらっしゃいまして、果たしてResearch Internationalにお勤めである。おおお!
というわけで、おそらくこういうことなんじゃないかと思う。
- 製品セットからひとつ選択させ、選ばれた製品の値段をちょっと上げてまた選択させる、という手続きの歴史は古い。誰が考えたのかわからないが、少なくとも1972年のMarkets Factsはこのやり方を知っていた。
- 70年代末、Research Internationalがこの手法を体系化し、BPTOという名前を付けた。
なお、Research InternationalとはかのUnileverに源流を持つ由緒正しき調査会社で、現在はWPP傘下のKantor Group。Rich Johnsonが辞めたあとのMarket FactsはSynovateとなり、その極東オフィスは、トシばっか食ってて使えない男、その親切な上司、などの多様な人材を抱えていた。2011年にIpsosに買収された。
BPTOの手続き
実をいうと、このメモを取り始めた理由は、人々がBPTOと呼んでいる手法の具体的な手続きが、実は人によってかなりずれているのではないか、一度きちんと比較して異同を整理しておいたほうがと良いのではないか... と思ったからである。しかし、あれこれ調べているうちに、だんだんどうでもいいような気がしてきた。
誰かがBPTOを「貧乏人向けコンジョイント分析」と呼んでいたけど、正しい批評である。ある製品の価格だけが目の前でどんどん値上げされていくというのはずいぶん奇妙な課題であって、それよか選択型コンジョイント分析をやったほうがはるかに気が利いている。いまさらBPTOの正確な手続きだなんて、いンだよこまけぇことは! という気分になってきた。すいません、疲れているんです。
というわけで、続きはまた気の向いた時に...
雑記 - 覚え書き:BPTO(Brand Price Trade-off)とはどんな手法か (途中で投げ出しましたけど)
勤務先の優秀なインターン青年に「機械学習で分類課題やるとき、クラスの事前確率が極端にちがう場合はclass imbalance問題といわれていて、いっぱい議論があるのよ。腕の見せ所だよ、頑張ってねー」などと、お茶をすすりながら偉そうなことを抜かしたのはいいが、良く考えてみたら、そもそもclass imbalance問題とはなんだろう。正面切って問われたら全然答えられない。
こういう話、人々はいったいどうやって勉強してんですかね?
Japkowicz, N., Stephen, S. (2002) The class imbalance problem: A systematic study. Intelligent Data Analysis, 6, 429-449.
class imbalance 問題 (以下CIと略記)についての論文。google様的には引用度数1600件強。
本論文の概要
本研究では次の3つの問いについて調べる。
- CI問題の本質はなにか。つまり、C5.0のような標準的分類器の正解率がCIのせいで低くなってしまうのはどんな領域か?
- CI問題に対処するためのさまざまなアプローチはどう異なるか?
- C5.0以外の分類器でも、正解率はCIのせいで低くなるか?
Q1. CIの問題の本質
実験やります。
架空のdomainをつくる。それぞれのdomainは[0,1]の一次元の入力を持つ。[0,1]を$2^c$等分して($c=1,\ldots,5$)、それぞれの区間にクラス(0,1)を交互に割り当てる。ここから$(5000/32)*2^s$個の事例を一様に抽出する($s=1, \ldots, 5$)。で、クラス0の各区間から得た事例は$1/(32/2^i)$番目まで残し($i=1,\ldots,5$)、あとは捨てる。これを訓練データとする[nagativeが少ないわけだ]。テストデータは各区間あたり50事例。
というわけで、要因は複雑性、訓練データのサイズ、CIの3つ。たとえば$c=1, s=1, i=2$だったら、訓練データは$[0,0.5)$がクラス1で157件、$(0.5,1]$がクラス0で79件となる。
これをC5.0で学習する。4種類の結果を報告する。
- 修正済の結果。すなわちテストデータのエラー率そのもの。訓練データにimbalanceがあるにも関わらず、誤分類のコストがクラス間で同じである場合である。
- 未修正の結果。すなわち、テストデータの結果におけるfalse positive率とfalse negative率の比が、訓練データにおけるpositive率とnegative率の比になるように修正したときのエラー率。誤分類の相対的コストがimbalanceに応じて変わっている場合である。["修正済"と"未修正"が直感と逆で、混乱する...]
- false positiveエラー率。
- false negativeエラー率。
結果。
- 線形分離可能であれば($c=1$)、imbalanceは影響しない。複雑になると、imbalanceがあるときにエラー率が上がる。修正済でも未修正でも大差ない。
- 当然ながらエラーはnegativeテスト事例で大きい(false positive率が大きい)。
- 訓練データのサイズが大きいと、imbalanceの影響は小さくなる。
この実験にはいろいろ不備がある。たとえば訓練データの実際のサイズがimbalance要因のせいで変わっちゃうとか。そこで改めて実験すると...[細かくて面倒くさい話なので詳細は省略, 結果のみメモする]
- imbalance問題の本質は、imbalanceそのものにあるのではなくて、imbalanceのために訓練データにおいて片方のクラスの下位クラスタの事例数が小さくなっちゃうという点にある。これは一種の小標本問題なのだ。だからすごく大きなdomainならimbalanceは問題にならない。
- C5.0では過学習を防ぐためにpruningする。それが良くないんだという説があるけど、pruningをやめてもimbalanceの影響は消えない。
Q2. 手法の比較
さっきと同じ実験をやるんだけど、今度は次の対処法を試す。
- random oversampling. 小さい方のクラスをoversamplingする。
- focused sampling. 小さい方のクラスの、区間の境界に近い事例をoversamplingする。[えええ?下位クラスタの境界を学習者が知っているという前提な訳?]
- random undersampling. 大きい方のクラスをundersamplingする。
- focused undersampling. 大きい方のクラスの、区間の境界から遠い事例をundersamplingする。
- cost-modifying. たとえば、class impalanceがposi:nega=1:9だったら、positive事例の誤分類のコストを9倍にする。
結果。どの方法にもそれなりの効果があるが、undersamplingの効率が悪い(randomでもfocusedでも)。概して一番良いのはcost modifying。
今度は実事例の場合をみてみよう...[面倒くさいのでパス]
Q3. 他の分類器はCIに敏感か?
同じような実験を、多層パーセプトロン(MLP)とサポート・ベクター・マシン(SVM)でやる。それぞれパラメータがいろいろあるので、試した中で最良の結果をみます。
結果。
MLPは[...大幅中略...]C5.0ほどにはCIの影響を受けない。
SVMは[...中略...] CIの影響を全然受けない。[←へぇー]
結論
CI問題は相対的な問題で、以下の要因の影響を受ける。(1)CIの程度, (2)概念の複雑さ、(3)訓練セットのサイズ、(4)分類器。ポイントは下位クラスタのサイズが十分かどうか。
分類器はC5.0, MLP, SVMの順にCIの影響を受ける。
CIの影響をうける分類器の場合はリサンプリングやcost-modifyingに効果がある。cost-modifyingが一番良い。
云々。
。。。いやー、読みにくい論文であった。チャートが小さいんだもん。
クラス不均衡問題っていうけど不均衡自体が問題なのではない、結局は(クラスじゃなくて)下位クラスタの小標本問題なのだ、というところが面白かった。そういうもんなんすかね。
SMOTEとかなんだとか、かっこいいリサンプリング法があるが、ああいうのはどうなんだろう。この論文では今後の課題として言及されていた。
論文:データ解析(2018-) - 読了:Japkowicz & Stepeh (2002) 機械学習におけるクラス不均衡問題について実験しました
Montero, P., Vilar, J.A. (2014) TSclust: An R Package for Time Series Clustering. Journal of Statistical Software, 62(1).
時系列クラスタリングのRパッケージTSclustのビニエット. 仕事の都合で読んだ。
イントロダクション
時系列間の類似性をどうやって調べるか。いろんなアプローチがある。
- 時系列を一対一に対応させ、ユークリッド距離なりなんなりを求める。
- それぞれの時系列からなんらかの特徴を抽出し(自己相関とか)、それを比べる。結局は次元縮約していることになる。
- それぞれの時系列の背後になんらかのモデルをあてはめ(ARIMAモデルとか)、モデルを比べる。
- 時系列の複雑性を比べる。たいていはコルモゴロフ複雑性に基づく指標を用いる。
とかとか。類似性さえ決まってしまえば、あとは一般的な分類手法(k-meansとか)などを用いて分析することが多い。
というわけで、ご紹介しましょう、TSclustパッケージです。時系列間のさまざまな類似性指標をご提供します。ついでにクラスタリングアルゴリズムもご提供します。
TSclustが提供する類似性指標
$X_T = (X_1, \ldots, X_T)^T, Y_T = (Y_1, \ldots, Y_T)^T$とします。
第1グループ, モデル・フリーなアプローチ。
まずはローデータに基づくタイプから。
- Minkowski距離:
$d_{L_q}(X_T, Y_T) = \left( \sum_t(X_t - Y_t)^q\right)^{1/q}$。
$q$は正の整数で、1ならマンハッタン距離、2ならユークリッド距離になる。時間のシフトやスケーリングにきわめて敏感。時点は独立とみなされ、時点のpermutationに対して不変。 - Frechet距離。時系列から「順序を変えないm時点」$r$を次のように抜き出す。
$r = ((X_{a_1}, Y_{b_1}), \ldots, (X_{a_m}, Y_{b_m}))$
ここで$a_1 = b_1 = 1, a_m = b_m = T$。$a_{i+1}$は$a_i$と$a_{i+1}$のどちらか。$b_{i+1}$も同様。[いまいち腑に落ちない。それってすごくたくさん作れない?]
さて、こうして抜き出しうる$r$のすべての集合を$M$として、
$d_F(X_T, Y_T) = min_{r \in M} \left( max_{i = 1, \ldots, m} |X_{a_i} - Y_{b_i}|\right)$
要するに、時系列を扱うというより、順番だけを気にするわけだ。シフトやスケーリングに影響されない。$X$と$Y$の長さが違っていてもOK。 - Dynamic time warping距離 (DTW)。$M$をつくるところまでFrechet距離と同じで、
$d_{DTW}(X_T, Y_T) = min_{r \in M} \left( \sum_{i = 1, \ldots, m} |X_{a_i} - Y_{b_i}|\right)$ - 値における近接性と、その値の周りでの動的挙動における近接性の両方をカバーする適応的非類似性。まず、動的挙動のほうは一次の時間相関係数で捉える。
$CORT(X_T, Y_T) = \frac{\sum_t(X_{t+1}-X_t)(Y_{t+1}-Y_T)}{\sqrt{\sum_t(X_{t+1}-X_t)^2}\sqrt{\sum_t(Y_{t+1}-Y_{t})^2}}$
煩雑になるから省略したけど、どのサメーションも$t=1$から$T-1$まで回る。で、
$d_{CORT}(X_T, Y_T) = \phi_k[CORT(X_T, Y_T)] \times d(X_T, Y_t)$
とする。$d$は上記の$d_{L_q}$で$d_F$でも$d_DTW$でもよい。$\phi_k[\cdots]$は適応的なチューニング関数で、たとえば$k$を0以上の値として
$\phi_k(u) = 2 / (1+\exp(ku))$
とする、とか。
次に、時系列のなんらかの特徴に基づくタイプとしては
- 相関ベースの距離。まずPearson相関 $COR(X_T, Y_T)$という手がある。これをちょっと変形する提案もある。[省略するが、相関が負のときに非類似度がぐっと大きくなるようにするらしい。どういう動機があるんだろうか]
- 自己相関ベースの距離。$1$時から$L$次までの自己相関のベクトルを$\hat{\rho}_{X_T}, \hat{\rho}_{Y_T}$として、
$d_{ACF}(X_T, Y_T) = \sqrt{(\hat{\rho}_{X_T} - \hat{\rho}_{Y_T})^T \Omega (\hat{\rho}_{X_T} - \hat{\rho}_{Y_T})}$
$\Omega$は重み行列で、もし$I$にすれば、自己相関ベクトルのユークリッド距離になる。次数につれて減らしていくという手もある。なお、自己相関のかわりに偏自己相関を使うという手もある。 - ピリオドグラム・ベースの距離。[話が時間領域から周波数領域に移る。こういう話、超苦手なので、パス...]
- ノンパラメトリック・スペクトル推定量に基づく非類似性指標 [まだ周波数領域の話が続いている。パス...]
- 離散ウェーブレット変換に基づく非類似性指標 [どこまで続く泥濘ぞ。パス...]
- シンボル表現SAXに基づく非類似性指標。まず時系列を標準化する。で、これを$w$個の同じ長さのセグメントに切って、セグメント内で平均する(これをピースワイズ累積近似 PAA という)。で、なんだかよくわからんのだが、これを正規分布上の分位点に変換し、さらに文字に変換する(これをシンボリック累積近似 SAX という)。最後に文字列同士の距離をどうにかして求める。[←ま、全くわからん... あっけにとられた。ま、要するに次元縮約の方法なのであろう。見なかったことにしたい]
第2グループ, モデル・ベースなアプローチ。
まずはそれぞれの時系列にARIMAモデルをあてはめる。構造は手で決めてもいいし、AICとかで自動選択してもいい。推定は普通GLSでやる。
- Piccolo距離。まず時系列が非定常なら差分をとって定常にし、季節性があったら除去する[←か、軽くいうねえ... 全然違う時系列がたくさんあったらどうするんだ]。で、AR($k_1$), AR($k_2$)ををあてはめる(次数はAICかBICで選ぶ)。長さ$k_1, k_2$のパラメータ・ベクトルが得られるので、短い方の尻に0をいれて長い方に合わせる。で、差の二乗和の平方根を非類似性指標とする。[いやー、これはあれだな、長い時系列が少数あるときの手法だなあ]
- Maharaj距離 [略]
- Cepstralベースの距離
第3グループ、複雑性ベースの距離。
[圧縮ベースの指標、permutation distribution clusteringというのが挙げられている。誰がそんなもん読むか、全面的にパスだ。とはいえ、最後に出てきた話はこれらの話とは毛色が違い、ちょっと面白いのでメモしておくと...]
よく使われている非類似性指標では、複雑性の高い時系列同士は非類似性が高くなり、複雑なやつと簡単な奴が類似してしまう傾向があるので、既存の非類似性指標が複雑性の影響を受けないように補正するというアイデアがある。
いま、ローデータベースの類似性指標$d(X_T, Y_T)$があるとしよう。これを補正したい。まず、なんでもいいから複雑性を定義する。たとえば
$CE(X_T) = \sqrt{\sum_t^{T-1} (X_t - X_{t+1})^2}$
次に、$CE(X_T)$と$CE(Y_T)$のうち大きい方を小さい方で割り(複雑性が異なる程度を表す)、これを$d(X_T, Y_T)$に掛けてやる。こうすると複雑性が異なる時系列同士の非類似性が高くなる。[←なるほどねえ。細かい工夫があるものだ]
第4グループ、予測ベースの手法。将来の時点についての予測の分布が似ている奴同士を類似しているとみなす。当然ながらこの手法の結果は他のとは全然違ってくる。予測のためのモデルとしては、いろんなタイプの自己回帰モデルが使える。
時系列クラスタリングのツール
まあとにかくこのようにして、ペアワイズの非類似性行列が得られたとしましょう。クラスタリングのためには、p値に基づく階層クラスタリングのアルゴリズム、真のクラスタがわかっているときにそれとクラスタを比較するツール、などをご用意している。
もちろん他のパッケージも活用して下さい。たとえば:
- stats::hclust() [階層クラスタリング]
- cluster::agnes() [これも階層クラスタリング]
- cluster::diana() [これも階層クラスタリング。いま気がついたけど、clusterパッケージの関数名ってむりやり女性の名前にしているのだろうか...]
- cluster::pam() [k-medoids法。そうか、あとで時系列クラスタリングではk-means法はだめだという話が出てくるけど、k-medoidsならいいのか]
- clValid::clValid() [クラスタリングの妥当性を調べる関数]
- fpc::cluster.stats() [クラスタの距離ベース統計量を出してくれる由]
- clvパッケージ
非類似性指標を選ぶときの考慮事項
まず、形に基づく非類似性が欲しいのか、動的構造に基づく非類似性が欲しいのかを考えること。
- 前者の場合は、ローデータベースの指標か複雑性ベースの指標がよいだろう。ただし、データに含まれている特定の歪みに対して不変な指標をうまく選ばねばならない場合もある。たとえば、全体的な値の大きさの違いを事前の標準化で取り除くとか、時系列がワープしてる箇所に影響されないようにDTWを使うとか。一般に、形に基づく非類似性は短い時系列向き。
- 後者の場合は、特徴ベースの指標かモデル・ベースの指標がよいだろう。ただし、それぞれの指標が仮定している規則性に気をつけること。たとえば、TSclustが提供するモデルベースの指標は、背後に定常で線形な過程があるときにのみ使える。予測ベースの指標は1次自己回帰構造を仮定している。
- 予測ベースの指標は他とは全然ちがって、将来予測が似ている奴をくっつける。
クラスタリングの目的がはっきりしたら、上記指針で指標が絞り込める。次はパラメータをうまく調整せよ。計算時間も留意事項だ。
クラスタリングのアルゴリズムにも気をつけなさい。たとえば、ふつうのk-meansは「時系列の集合の重心」と時系列との距離を求めることになるけど、そんな重心が正しく定義できるかどうかわからない。Ward法はユークリッド距離が前提だけど、ユークリッド距離でいいのかわからない。
[なるほどね... この節を読んだだけでも、目を通した甲斐があった]
事例
[TSclustパッケージの使用例を3つ紹介。略]
。。。勉強になりました。
時系列の類似性って、いきなりユークリッド距離とか相関とったりしてはいかんのだろうとなんとなく思ってたのだが、それは場面による話であって、一概にダメともいえないようだ。ふうん。
それはそうと、あれですかね、やっぱし、いったん類似性行列を作んないといけないんですかね。何十万本も時系列があるときはどうしたらいいんだろうか。
論文:データ解析(2018-) - 読了:Montero & Vilar (2014) RのTSclustパッケージで時系列クラスタリング
2018年4月28日 (土)
R言語徹底解説
[a]
Hadley Wickham / 共立出版 / 2016-02-10
現勤務先への転職を機に、20年近く使い続けた我が愛しのSASに別れを告げ、泣く泣くRに乗り換えたのであった。たまに自宅でSAS University Editionを立ち上げると、もう懐かしくて仕方ないです。
とはいえRを使い始めてはやX年 (Xの値については考えたくない)、その間ほぼ毎日使っているわけで、こうしてだましだましその場をしのいでいるのもいかがなものか、やはりきちんと勉強したほうがよいのでは... と後ろめたい気分であった。先日ちょっと時間があいたので、刊行時に大枚はたいて買い込んだまま本棚に積んであったこの本に一通り目を通してみた。R界の神様Hadley Wickhamによる有名な解説書。
せっかくなので、読みながら「おおお」と思ったり「へええ」と思ったりしたところをメモしておく。
1. 導入
2. データ構造
- オブジェクトxがベクトルかどうかを判断したいとき、is.vector(x)はだめ。これは「xが名前以外の属性を持たない」ときにTRUEとなる関数なのである。そうそう、これに気が付いたときはあっけにとられた。なんでこんな名前にするかなあ。is.atomic(x) || is.list(x)を使うべし、とのこと。
- かつて因子型ベクトルは文字型ベクトルに比べてメモリ消費量が少なかったが、いまは変わらない。
- comment属性はprintされない。ほんとだー。
3. データ抽出
- (これは本のメモではなくて、本を読みながらふと試してみたんだけど) x <- 1:3; names(x) <- c("a", "b", "a"); としたとき、x["a"]はc(1,3)ではなく黙って1だけ返す。やっぱりそうだったか。名前で絞るのって怖い。
- x <- 1:3として、x[NA]はc(NA, NA, NA)だが、x[NA_real_]はNAである。なるほど。
- アトミックベクトルxに対してx[[1]]とすると、x[1]と違って名前が消える。おおお...
4. ボギャブラリ
5. コーディングスタイルガイド
6. 関数
- 関数のsrcref属性にソースコードが入っている。コメント付きで。
- 「レキシカルスコープ」の「レキシカル」は、英語のlexicalではなく、コンピュータサイエンス用語の"lexing"(字句解析)に由来している。へー。
- レキシカルスコープの4原則。(1)ネームマスキング。(2)名前から値を探す際のルールは値の型に関わらず同一だが、あきらかに関数っぽい名前の場合は例外で、関数しか探さない。(3)フレッシュスタート。関数が呼び出されるたびに新しい環境が生成される。(4)ダイナミックルックアップ。値が探されるのは関数が生成されたときではなく実行されたとき。
- リスト l に対して、sapply(l, function(x) x[2])はsapply(l, "[", 2)とも書ける。なるほど。
- 関数の引数は遅延評価されるから、その関数のなかで生成する変数でデフォルト引数を定義することさえできてしまう。良いやり方ではないけれど。
- 関数にデフォルト値を与えず、未指定かどうかmissing()で調べてどうにかするコードを書くくらいなら、デフォルト値をNULLにしておいてis.null()で調べたほうが良いのでは、とのこと。どれが必須変数でどれが省略可能な変数かわかりにくくなるから。
- 引数を強制評価するときに使うforce()は force <- function(x) xと定義されている。面白い...
- !is.null(x) || stop("a is null")と軽く書けるのは遅延評価のおかげ。そうですね。逆に言うと、いつもこういうとき||演算子を使わずstopifnot(!is.null(x))と書いているのは、気持ちの上で遅延評価に頼るのが怖いからだと気が付いた。
7. オブジェクト指向実践ガイド
- is.object()でオブジェクトが基本型かどうかがわかる。わかりにくい名前だ...
- S3クラスをすべて表示させる方法はない。
- S3オブジェクトのclass属性を変えることができる、変えるべきではないけれど、とのこと。そういわれてみれば、あまり気にしていなかったけど、オブジェクト指向という意味ではclass属性を変えられるのってすごく奇妙ですね。
(7.4 RC はスキップした)
8. 環境
この章がいちばん難しい。きちんと理解できたとは言い難い。
- 環境はフレームと親環境からなる。フレームとは名前と束縛を保存しているものである。ところがフレームという用語は別の意味で使われていることがある。たとえばparent.frame()は親フレームではなくて呼び出し環境にアクセスしている。
- リストの要素にNULLを付値すればその要素は消えるが、環境のなかのオブジェクトにNULLを付値してもNULLに束縛されるだけ。そういわれてみればそうだ。削除にはrm()を使う。
- かつては大きなデータを扱うために環境を使った。修正してもコピーが生じないから。しかしいまではリストを修正しても全要素をコピーしたりしないので、あんまり意味がなくなった。
9. デバッギング、条件ハンドリング、防御的プログラミング
- is.error <- function(x) inherits(x, "try-error"). なるほど、これは便利だ。いつもtry()の返値の判定で戸惑っていたのである。
- 防御的プログラミングの観点からは、subset()は使わないほうがよい(非標準評価しているから)。また[とsapply()には要注意(引数によって出力の型が変わるから)。[にはdrop=FALSEを付け、sapply()のかわりにvapply()を使うべし。
(9.3.2-9.3.4でtryCatch(), withCallingHandlers()について説明しているんだけど、面倒なのでスキップした。いずれ必要に迫られたときに読もう)
10. 関数型プログラミング
- クロージャ c が持っている値をみるためには、as.list(environment(c))とするか、pryr::unenclose(c)を使う。
- ある型のオブジェクトを食う関数をたくさん作ってリスト lf に入れ、それぞれにオブジェクトxを食わせて動かしまくりたいとする。lapply()を使う場合、結局無名関数か名前付き関数を作るしかない。lapply(lf, function(f) f(x))というように。ああ、やっぱりそうだったのか。 なにか特別なやり方があるのかと思っていた。
(10.5 ケーススタディ:数値積分 はスキップした)
11. 汎関数
- 関数を食ってベクトルを返す関数を汎関数(functional)という。たとえばlapply()がそう。
- mtcars[] <- lapply(mtcars, function(x) x/mean(x) ) と書くより、いったんmtmeans <- lapply(mtcars, mean)としてからmtmeans[] <- Map(`/`, mtcars, mtmeans)としたほうがわかりやすいでしょう、とのこと。そ、そうかなあ... 私はふだんMap()使わないのでびびりました。
- 行列aに対して a1 <- apply(a, 1, identity)として、identical(a, a1)はFALSEになる(a1はaの転置になっているから。apply(a, 2, identity)ならTRUEになる)。apply()のこういう性質のことを「べき等性がない」というのだそうだ。
- Reduce()関数。数値ベクトルのリストlがあり、全要素に共通する値を探したい。つまり、intersect(l[[1]], l[[2]]])をとって、それとl[[3]]とのintersectをとって...を繰り返したい。こういうとき、Reduce(intersect, l)と書ける。すげー。私だったらおそらく、数値が整数なら x <- table(unlist(lapply(l, unique)); as.integer(names(x[x == length(l)]))ってやっちゃう...
(11.7 関数族 はスキップした。ちょっと疲れちゃったもので...きちんと読んだらとても勉強になりそうな内容である)
12. 関数演算子
- たとえばdot_every<-function(f,n){なんとかかんとか}と定義したとして(fは関数, nは整数)、呼び出しはdot_every(hogehoge(hogehoge), 10)となるけど、dot_everyと10が離れてしまって読みにくくなる。こういうのをダグウッドサンドイッチというのだそうだ。アメリカのマンガに出てくる、すごく具材の多いサンドイッチのことらしい。知らんかった。というわけで、dot_every <- function(n, f){なんとかかんとか}と定義したほうが良い由。
- f <- function(a) g(a, b=1)と書く代わりに、pryr::partial()というのを使ってf <- partial(g, b=1)と書けるのだそうだ。こういうのを部分関数適用という由。この例では後者を使う意味がないけど、compose()と併用すると便利である由... うーん...
- splat <- function(f){force(f); function(args){ do.call(f, args) };}とすると、たとえばベクトルxに対してargs <- list(list(x), list(x, na.rm=T)); lapply(args, splat(mean))という風に使える、とのこと。なるほどねえ、これは確かに便利かも。
13. 非標準評価
- quote()は引数(表現式)を評価せずそのまま表現式として返す。substitute()は関数の中で使ったときのみ、変数を置換する。pryr::subs()はグローバル環境で使っても置換する。
- Hadley先生はlibrary()やvignette()といった関数が非標準評価を使っていること(つまり、library("ggplot2")ではなくlibrary(ggplot2)と書けること)に批判的。非標準評価を使うと参照透過でなくなるから(引数を値に変えても結果が同じであることが保証されなくなるから)。そのくらいのことなら""で囲めよ、たった2文字だろ、とのこと。
- Hadley先生いわく、非標準評価を使う関数をつくったらその標準評価版もつくりなさいとのこと。たしかに、以前のdplyrパッケージはそうなってましたね、最近なくなっちゃったけど。ってことは、考え方が変わったのかしらん。
14. 表現式
- 表現式(expression)の要素は、定数(constant), 名前(name), 呼び出し(call)。ほかにペアリストというのもあるけど過去の遺産。
- str()はnameをsymbol, callをlanguageと表記する。
(14.5 ペアリスト, 14.7 再帰関数を用いた抽象構文木の巡回 はスキップした)
15. ドメイン特化言語 (スキップした)
16. パフォーマンス
メモは特にないけど、全編にわたって目から鱗が落ちる内容であった。
17. コードの最適化
- コード高速化のために実験するときは、あらかじめ目標の実行速度を決めておくこと。ずるずるやってると時間の無駄になるから。はい、胸に刻みます...
- 10 %in% x よりany(x == 10)のほうがはるかに高速。
- sapply()よりvapply()のほうが速い。
- cut()はlabels=FALSEとすると速い。
- リスト l にas.data.frame(l)とするのは効率が悪い。個々の要素をデータフレームにしたうえでrbind()しているから。l の中身に自信があるなら、いきなりclass(l) <- "data.frame"; attr(l, "row.names") <- .set_row_names(length(l[[1]])); としちゃえば速い。とはいえ、このやり方を見つけるためにはHadleyさんでさえ時間をかけてソースコードを読んだ由。素人にできることではないな。
18. メモリ
19. Rcppパッケージを用いたハイパフォーマンスな関数 (スキップした)
20. RとC言語のインターフェイス (スキップした)
Mercer, A., Lau, A., Kennedy, C. (2018) For Weighting Online Opt-In Samples, What Matters Most?, Pew Research Center.
先日Pew Research Centerが出していたリリース。仕事の役に立つかと思って読んでみた(←建前. ホンネは「なんだか疲れちゃったので息抜きにパラパラ眺めた」)。
70ページもあるんだけど、ちょうど半分がAppendixである。論文というより広報目的のホワイトペーパーという感じ。正直、こういうの、すごく読みづらい。
いわく。
任意参加型の標本を使った世論調査では、よく母集団に合わせてウェイティングすることがあるけど、あれって意味あんのか。実験してみました。
[なお、Pew Research Centerでは2016年にもオンライン・パネルと確率標本の比較をやっている由]
任意参加型のオンライン・パネルで調査して国レベルの推定値を得る、という場面に注目する。
同じ調査票で複数のパネルからどさっと回答を集めておく。で、そこから票を抽出し、あれこれウェイティングとかして調整して集計しては、公的調査と比べ、一致するかどうか調べる。[それらの公的調査がベンチマークとして正しいのかという問題はあるわけだけど...その話は2016年のレポートをみて、とのこと]
調査時期は2016年の6-7月。パネルは3種類、それぞれ約10000票を集めた。言語は英語かスペイン語。各パネルの回収票から、{2000票, 2500票, ..., 8000票}のいずれかを無作為抽出する。標本サイズによる違いを見たいから。
調整に使う変数は2種類。
- (A)基本的なデモグラ変数: {年齢(6水準)、性別(2)、人種とエスニシティ(5)、教育(5)、地域(9)}。
- (B) (A)に加えて政治的態度と関与の変数: {有権者登録(2)、政党支持(3)、イデオロギー(3)、福音派キリスト教徒か(2)}。
[...ここまで読んで、うわあこういう仕事やりたくねえなあと、思わず天を仰いだ。上記の変数で調整するからには、これらの変数の母集団分布が必要になる。でも全変数の分布を一発で教えてくれるデータソースは、たぶん存在しない。いろんな公的調査からデータを集めてきて、調査設計の違いを勘案しながら摺り合わせ、分布を確定する作業を、誰かがやんなきゃいけない。ものすごく面倒くさくて、そのわりには誰にも評価されない作業だ。あああ、想像するだけで辛い。吐きそう。
いやまて、それだけじゃないぞ。この実験では調整の方法としてマッチングを使うから(後述)、各変数の周辺分布だけでなく、ケースレベルの母集団データが必要になるではないか。おいおい、どうすんだよ。
というわけで、いったん絶望しかけたんだけど、気を取り直してきちんと読んでみた(Appendix B)。はい深呼吸!]
母集団についてのデータソースは次の5種類。(1)米センサス局のAmerican Community Survey(ACS)。これが一番あてになる。(2)米センサス局のCurrent Population Survey(CPS)から、5つの調査データ。(3)General Social Survey(GSS)。(4)PewのReligious Landscape Study(RLS)。(5)PewのPolitical Polarization and Typology Survey.
これらのデータのコーディングを揃えた上で[これも非常に大変なんだけど省略]、個票を20000票ずつ復元抽出する(つまり同じ票を2回抜き出すことも厭わない。なおここでウェイトを使ったり、いろいろとややこしいんだけど読み飛ばした)。
で、これらを縦に積み、37変数のデータセットを作る。値がすべて埋まっているのは性別、年代、未既婚など少数の変数のみで、あとは虫食いだらけである。
虫食いを埋めます。個々の変数について、その値を他の全変数から予測するモデルを作り、値を埋める。これを繰り返し、25バージョンつくる。これを連鎖方程式による多重代入(MICE)という。Azur, et al.(2011, Int.J.Methods in Psychiatric Res.)をみよ。なお、モデルはランダム・フォレスト。Doove, et al.(2014, Comp.Stat.Data Anal.)をみよ。[←MICEって本で読んだことはあったけど、使用例をみるのは初めてだ...]
最後に、ACS由来の行だけを残し、あとは消す。25バージョンのうちひとつを採用する[バージョン間の比較も行っているけど省略]。以下これをsynthetic populationという。
[あれれ? ってことはsynthetic populationのサイズは20000ってこと? ACSだけはもっと積んでおけばよかったのでは...なにか誤解してんのかな...]
本題に戻って... お待たせしました、調整方法のご紹介です(本文ならびにAppendix C)。選手入場!
- その1、レイキング。またの名をiterative proportional fitting。世論調査ではもっともポピュラーな方法である。要するに、調整変数の周辺分布が母集団と標本で一致するような標本ウェイト値をつくるわけである。
synthetic populationからすべての調整変数の周辺分布を得た。またデモグラ変数については適宜カテゴリをつぶしたうえで二元交互作用も出した[詳細略]。Rのsurveyパッケージのcalibrate()でレイキングし、ウェイトを求めた。ウェイトのトリミングはしなかった。このウェイトを使って集計する。 - その2、マッチング。
synthetic populationから1500行を抜き出しし、それぞれの行と一番類似している票を、パネルから抜き出した回収票のなかから探してひとつマッチさせた。ある行にマッチした票は他の行には使わない。で、マッチした票だけを集計する。結局、標本サイズが2000だろうが8000だろうが、1500票しか使わない。[←実務的にはありえないやり方だが、実験としては筋が通っている]。
類似性は次のようにして求めた。まず、synthetic populationから抜き出した1500行と、パネルから抜き出した回収票を縦に積んだ。で、「どっちのデータから来た行か」を調整変数群から予測するランダム・フォレストを組んだ(Rのrangerパッケージ, 木は1000本)。で、ランダムフォレスト上のケース間近接性を類似性とみなした。詳細はZhao, et al. (2016 Contemporary Clinical Trials)をみよ。 - その3、傾向スコア・ウェイティング。
上のランダム・フォレストで「synthetic dataから来た行である確率」$p$を求め、$p/(1-p)$をリスケールしてウェイトにした。
この3つのすべての組み合わせを試す(なにもしないのを含めると8通り)。複数使う場合は、マッチングで票を選ぶ→傾向スコアでウェイティング→レイキングでウェイティング、の順。
[ここまで整理すると、この実験の要因は以下のとおり。(1)標本サイズ13水準。(2)調整手法8水準。(3)調整変数2水準。]
評価方法。
調査票にはACSなどに含まれる項目を24個入れてあった(たとえば「近所の人とどのくらい話しますか」「タブレットを使ってますか」)。各項目について、各カテゴリの(調整後)選択率を求める。で、ACSとかの回答分布と比べ、差の絶対値を求める。 標本抽出を1000回繰り返し、平均を求める。
調整しない場合でもバイアスは押しなべて小さい。ただしバイアスが大きい項目もあり、たとえば「2014年の中間選挙に投票しましたか」は32%ポイントものバイアスがある。[書いてないけど、ネットパネルの回答が高すぎるということだろうか]
結果。[ちゃんと読んでないので、かなり抜け漏れがあると思うけど...]
- ウェイティングによるバイアス除去にはそもそも限界がある。無調整のときのバイアスを100%として、調整で取り除けたのはせいぜい30%。
- 調整手法よりも調整変数の選択のほうが大事。政治関連の変数を調整変数にいれると(B)、調整手法・標本サイズを問わず、バイアスは減った。
- 調整手法に大差なし。細かく言うと、レイキングでは標本サイズとバイアスが無関係。マッチングは標本サイズが大きいときにレイキングよりバイアスが小さかった。傾向スコアマッチングはレイキングよりバイアスが大きかった。レイキングと他の手法を併用するとバイアスがちょっぴり小さくなった。もっともこのへんは下位集団によってもちがっていて、たとえばヒスパニックでは3手法併用とレイキング単体との差が開いた
- 調査トピックによって適切な調整変数は異なる。政治関連の変数を調整変数にいれたら、バイアスが減る項目と減らない項目があった。
- 政治に関する調整変数をつかって調整すると、結果がより共和党寄りになった。[←はっはっは]
推定値の変動について。
世論調査の分野では、調査を独立に繰り返した時に期待される推定値の変動のことをmargin of error(MOE)という[推定量の分散のことですかね]。確率標本ならMOEがすぐにわかるが、任意型パネルの場合には仮想的標本の性質についてのなんらかの仮定が必要になる。
一般に、たくさんの変数について調整するとMOEは大きくなりやすい。そこでMOEを推定してみた。具体的には、1000回の反復を通じて95%信頼区間を構成し、その幅の半分をMOEと呼ぶ。
- 政治関連の変数を調整変数に追加しても、MOEは大きくならなかった。
- サンプルサイズを大きくすると、レイキング単体ではMOEがどんどん下がるけど、3手法併用だとMOEが下げ止まった。[←そりゃそうだろうな、マッチングは常に1500票しか使わないんだから]
バイアス除去とMOEとのトレードオフを考えるため、いくつかのシナリオについてRMSEを調べた。[←そうそう!これが一番大事だと思うのよ。最初からMSEで評価すりゃいいのにと思いながら読んでいた]
傾向スコア+レイキングと3手法併用はRMSEに差なし。3手法併用のほうがちょっぴりバイアスが小さいが、MOEが大きくなるのでRMSEには差がつかない。
ただしトピックによっても異なる。政治についての項目では3手法併用のRMSEが小さく、家族についての項目ではレイキング単体のRMSEが大きい(わずかな差だが、標本サイズとともに開く)。要するに、凝った手法を使って報われるかどうかは場合による。
云々。
。。。とても読みにくかったけど、面白い実験であった。ちゃんとお金かけてこういうの試しているの、すごいなあと感心する。
私が糊口をしのいでおりますところの市場調査の場合だと、ネットパネルで調査して、少数の調整変数(多くの場合は性・年代)の同時分布を国勢調査とかから引っ張ってきて、これを目指して標本ウェイティングを掛けることが多いと思う。 この実験でいうとレイキングに相当する(ウェイトの算出はもっと簡便だけど)。この実験、いろいろ頑張ってウェイティングしたところで、ネットパネルのバイアスはたいして取り除けませんねという話なわけで、なんというか、胸が痛みます。
いっぽう、いっちゃなんだけど、壮大な努力の末にそりゃそうだろうなという結果を得ました、という感じのする実験でもある。
標本ウェイティングによる調整の効果は、標本選択確率、調整変数、目的変数の3者の実質的な関係で決まるので、どんな結果がでたところで、「そういうデータだったんですね」という感想しか持てない面があると思う。
いっけん予想外にみえる結果があったとすれば、調整変数を増やしてもレイキングで推定量の分散が大きくならなかったというところじゃないかと思うけど、調整変数と目的変数の関連が強ければそういうことも起きるはずである(と、Littleさんたちが前に書いていた)。
結果があたりまえでも実務に対する示唆がヴィヴィッドであれば、デモンストレーションとして優れているといえるだろうけど、その点でもちょっと首をひねってしまう面があって...
この実験では、標本が確率標本でなく、重要な共変量の分布が母集団と標本でずれているとき、いわゆるデザインベースのアプローチ(主に調査設計に基づいて調整するアプローチ。目的変数の標本分布は見ないで調整する)で標本選択のバイアスを取り除くという場面を想定している。でも、関心あるトピックがたとえば政治的態度であり、事前の政党支持といったトピックspecificな共変量が想定される場合には、ふつうはモデルベースのアプローチを使うんじゃなかろうか。たとえば、政治的態度の変数を目的変数にとった回帰モデルを推定し、母集団における共変量の同時分布を放り込んで目的変数の分布をシミュレーションするとか。
調査データの分析においてデザインベースのアプローチ(標本ウェイティング)を使う理由は、(多くの公的調査がそうであるに)調査が多目的で関心ある変数の範囲が広いとき、ないし、事前知識が足りなくてトピックspecificな共変量を調整変数として選べないときではないかと思う。だから、「適切な調整変数によるウェイティングが大事です」といわれても、そりゃそうでしょうけど、うぐぐぐ、と思うしかないわけで...
レイキングとマッチング・傾向スコアウェイティングとの間に大差がなかったというの話も、そりゃそうだろうと思う。レイキングのように共変量の周辺分布を母集団と揃える手法が不利になるのは、なにが共変量なのかいまいちはっきりしないときや、標本選択確率に対する共変量の効果に交互作用があるときだ(たとえば「男性の福音派の共和党員だけがパネルに登録していない」とき)。そういう事態が起きてなければ、そりゃレイキングでもなんとかなるでしょう。これは結局、いやー今回は運が良かったですねという話であって、調査一般において「ネットパネルの調整手法はレイキングによるウェイティングで十分」という風に受け取られるとしたら、それはちょっとちがうんじゃないですかね。
この実験、たぶん大きな問題意識として、世論調査による政治的態度の測定と政治行動の予測が念頭にあるのだろうと思う(トランプ勝利を予測するためにはどうしたらよかったのか、というような)。私のように一般的な調査手法研究として読んじゃうほうがおかしいのかもしれない。どうなんでしょうね。専門家の方の意見を伺いたいところだ。
ところで、ここで試している調整のやりかたは、実験の主旨として必要なのはわかるけど、調査実務の上でのリアリティはどのくらいあるんだろうか?
教科書的には、ある共変量についての母集団分布があきらかでないならば、その共変量についてのデザインベースの調整はあきらめるべきであろう。しかしこの実験では、ACSにない変数であっても調整変数として選んでしまい、母集団分布を他の変数から無理やり推測しているわけで、これは相当に違和感がある状況設定だと思う。かの国の世論調査ではほんとにこういうことをやるのかなあ?
調整手法を併用するというのも不思議である。傾向スコアによるウェイティングと共変量を投入したモデリングを併用するというのは聞いたことがあるけど(doubly robust推定というらしい)、傾向スコアでウェイティングしてさらに周辺分布をあわせてウェイティングすることって、実際にあるのだろうか。いや、架空の手法だというならばそれはそれでいいんだけど...
論文:データ解析(2018-) - 読了:Mercer et al. (2018) ネットパネルで調査したとき母集団の構成にあわせてウェイティングすることがあるけど、あれって意味はあるのかどうか試してみました
しばらくの話だが、消費者態度指数ってあるじゃないですか、あれってどういういきさつで、誰が作っているのか、ふと疑問に思った。別に日本のオリジナルではなくて、米国にもミシガン大学の信頼感指数とかあるじゃないですか。誰が最初に作ったの?
調べてみたら、米国にはミシガン大のほかにConference Boardというところが出している信頼感指数がある。Conference Boardというのは非営利の民間調査機関で、「全米経済審議会」と訳すのだそうだ。へええ。調べてみるものね。
前田穣 (1999) 経済意識・経済的態度・経済的信念研究の系譜(1) G.カトーナのマクロ的消費者態度研究. 奈良大学紀要 (27), 107-117.
というわけで、Ciniiを検索してみたら引っかかった奴。 著者は社会学の先生らしい。題名には(1)とあるが、たぶん続編はない。
非計量経済学的なマクロ的消費者行動研究の代表例として、ジョージ・カトーナ(George Katona)の研究を概観します、という紀要論文。カトーナって、消費者行動論の教科書では見かける名前だけど、どんな人か全然知らなかった。いまWikipediaをみたところ、もとはドイツでゲシュタルト心理学やってて、米国に亡命した人らしい。ラザースフェルドとかディヒターとかと似た経歴ですね。
いわく。
マクロ的な消費者行動研究はもともと少ない。例外はカトーナが率いたミシガン大のサーベイリサーチセンターのICS(The Index of Consumer Sentiment)である。[←へえええ!そうだったのね!]
カトーナは心理学者として出発し経済行動の研究を始めた。マクロ経済の心理的研究には3つの主要な敵がいた。
- 態度なんて大数法則で打ち消し合うから無視できるよ説。これに対してカトーナは消費者の行動が独立でないと唱えた。
- 支出は所得に依存するから所得の研究すればいいじゃん説。いっぽうカトーナは、消費支出は所得では決まらない、消費者の自由選択が結局マクロ経済に影響すると唱えた。
- 百歩譲って消費者の態度が経済にとって重要だとしても、そんなん捕捉しにくいから研究しても苦労するばっかじゃん説。これに抗して行われたのがICSだった。
消費者態度が経済に対して外生的に左右されることがある(戦争の危険とかで)、と考えたのはカトーナだけではない。たとえばノエル・ノイマンはマクロ経済の「予言者としての世論」という論文を書いている[←へえー]。
いっぽう批判も多い。たとえば日本では石井健一(1994, in 福村出版から出てる飽戸編の本)という人が、消費者態度指数(暮らし向き)よりGNPが先行すると指摘している。でも、ICSでマクロ経済が予測できるかというのは実はカトーナの主張の検証になっていない。カトーナは消費者態度が支出そのものではなく支出の変化を予測すると考えたからだ。
Shapiro(1972)いわく、カトーナは態度変化のメカニズムが変化すると考えていた、しかしICSを計量経済的モデルで再現できる、ゆえにカトーナの主張はおかしい。[...この節、説明が全然理解できないのでパス...]
カトーナから何が学べるか。ここではインフレーションの研究についてみよう。
通常の経済理論によれば、インフレ時には支出が増大するはずである(貨幣をモノに変えた方が得だから)。しかしICSはインフレ加速時に下がる。これは所得増大の利得がインフレによって侵害されると感じられるからである。こういうカトーナの説明は「不安」といった心理学概念を適用したもので...[すいません、この節も途中から論旨が見えなくなってしまった... きっと私が悪いのです...]
まとめ。かつてH.サイモンはメイヨーらの人間関係論を、それってテイラー的労働者観から感情的存在としての人間を回復しただけで意思決定能力を持つ組織成員に至っていないじゃんと批判したが[←出典は書いてない]、カトーナも消費者意思決定の非合理性を指摘するあまり、人間をなにか感情的存在として理解するきらいがあったのではないか。云々。
論文:マーケティング - 読了:前田(1999) G.カトーナ、消費者態度指数の父
Athey, S., Tibshirani, J., Wager, S. (2017) Generalized Random Forests. arXiv:1610.01271v3 [stat.ME]
著者らが提案する新手法「一般化ランダム・フォレスト」の解説。Rのパッケージgrfとして実装されている。仕事の役に立つかと思って。
付録をあわせて47pもあるのだが、関心のあるところだけ目を通した。
もともとランダム・フォレストというのは $\mu(x) \equiv E[Y | X =x]$を推定するための手法である。つまり、いま$\psi_{\mu(x)}(Y) = Y - \mu(x)$というスコアリング関数があるとして、
$E[\psi_{\mu(x)}(Y)|X =x] = 0$
となる$\mu(x)$を推定する手法である。
これを任意の量$\theta(x)$の推定へと一般化したい。$Y$のかわりに$O$があるとする。$\theta(x)$を次の局所推定方程式によって定義する。$\psi(\cdot)$をなんらかのスコアリング関数、$\nu(x)$をオプションの局外母数として、
$E[\psi_{\theta(x),\nu(x)}(O) | X = x] = 0$
このように一般化することで、条件つき平均だろうが条件つき分位点だろうがなんだろうが扱えるようになる。我々がこれを開発する主な目的は、道具変数による、異質性のある処理効果の推定である。
ここで解決すべき問題が3つある。
- 上のように一般化すると、オリジナルのランダム・フォレストのように、B本の木を作りそれぞれの予測$\hat{\mu}_b(x)$を単純平均しよう、というわけにはいかなくなる。そこで、まずランダム・フォレストでテスト点$x$の近隣集合を求め、それらを使って$\mu(x)$を推定する。
- この適応的近隣関数を$\theta(x)$に合わせて変えなければならない。ある治療の効果を知りたいとしても、その治療が長期的な生存率に及ぼす効果を知りたいときと、入院日数への効果を知りたいときでは、必要な共変量が変わってくるだろう。そこで、まず推定したい非線形な式を勾配ベースの方法で線形に近似してから木の分割点を決める。[←む、難しい... 分かるような、わからないような気分だ]
- $\theta(x)$の漸近的一致性とガウス性の理論的な保証がほしい。以下でそれを示す。
先行研究。
統計学では昔から局所最尤推定というアイデアがある。たとえば経済学でいえば、回帰不連続デザインで使う局所線形回帰、パネルデータで使う多項選択モデル、道具変数を使った回帰、などがそうだ。基本的なアイデアは、共変量がある特定の値をとるときのパラメータ推定を行う際、共変量空間において近くにある事例により重みをつけましょう、というものである。重みはふつうカーネル法で求める。このアプローチの難しい点は、共変量空間が多次元のとき、「次元の呪い」のせいでうまくいかなくなってしまうという点だ。
そこで、カーネル・ウェイティングのかわりにランダム・フォレストでウェイトを求めることを考える。つまり、ある事例の重みを「目標とする共変量ベクトルと同じ葉にその事例が落ちた木がどれだけあるか」で決めるのである。このように、ランダム・フォレストを適応的最近隣推定として用いる発想は、Meinshausenによるランダム・フォレスト・ベースの分位点回帰に遡る。
[ほかに、勾配ベースで分割点を決めるというアイデアの先行研究、ランダムフォレストの漸近的性質についての先行研究について触れている。パス]
なお、注意してほしいんだけど、ここで関心があるのは、単一で低次元なパラメータ(たとえば平均処理効果)を共変量をコントロールしたうえで推定したいという話ではない。関数$\theta(x)$が共変量によって変わっちゃうのをどう推定するかという話である。[←ああ、なるほど...やっと少しだけ意味がわかった。親切に教えてくれて助かるよ]
以下、提案手法の説明。なお、ランダム・フォレストについてよく知らない人はHastieの本とかをみるように。
事例$i = 1, \ldots, n$が、観察量$O_i$, 共変量$X_i$を持っている。$O_i$というのは、たとえばノンパラ回帰であれば$\{Y_i\}$そのものだし、外生的な処理割付($W_i$)の下での処理効果の推定であれば$\{Y_i, W_i\}$である。
ゴールは次の局所推定方程式におけるパラメータ$\theta(x)$の推定である。局外パラメータ(オプション)を$\nu(x)$として、すべての$x$について
$E[\psi_{\theta(x),\nu(x)}(O_i) | X_i = x] = 0$
ふつうのやり方は、まず$x$において事例$i$との関連性を表すなんらかの類似性ウェイト$\alpha_i(x)$を定義し、
$||\sum_i \alpha_i(x) \psi_{\theta, \nu}(O_i)||_2$
を最小にする$(\theta, \nu)$の集合を求め[えーっと、ユークリッド・ノルムを最小にするわけね]、その集合のなかに$(\hat{\theta}(x), \hat{\nu}(x))$が入っていると考えるやりかたである。$\alpha_i(x)$の推定にはふつうカーネル関数を使う。でもこのやりかたは高次元のときにうまくいかない。
そこで、まずB本の木をつくる(作り方は後述)。で、$X_i$がそれぞれの木$b$において$x$と同じ葉に落ちたかどうかを調べ、落ちた割合を求める。これを合計1に調整して$\alpha_i(x)$とする。
木の作り方。[普通の決定木と似ているんだけど、評価関数に工夫があるらしい。難しくてよくわからん。パス]
実際には、計算効率を高めるため、勾配ベースの近似を行う。[以下3p、難しいのでパス。なんだか知らんがxgboostみたいなもんなんですかね]
ここでいったん小休止して[←ほんとにそう書いてある]、分位点回帰フォレストの場合について紹介しよう。$X=x$の下での$Y$の$q$分位点$\theta_q(x)$の推定がゴールである。[...中略...] MeinshausenのquantregForestパッケージと比べると... [以下略]
漸近的性質についての分析。[パス!もちろんパス!8p飛ばすぞ!]
デルタ法による信頼区間。[3p飛ばすぞ!]
応用事例その1, 外生性があるときの条件付き平均部分効果の推定、名付けて「因果フォレスト」。
次のランダム効果モデルを考える。
$Y_i = W_i b_i + e_i$
$\beta(x) = E[b_i | X_i = x]$
ゴールは、なんらかの対比$\xi$についての$\theta(x) = \xi \beta(x)$を推定すること。もし$W_i$が処理割付$\{0, 1\}$だったら、$\beta(x)$が条件つき平均処理効果。
$W_i$は外生で $\{b_i, e_i\} (独立) W_i | X_i$ だと仮定する。[独立性の記号の書き方がわからない...とにかく、交絡がないという仮定である]
[...以下、面倒になってきたので読み飛ばしたけど、やっとこの応用事例のイメージがわいてきた... 「処理効果が共変量によって変わっちゃう場面で、共変量の特定の水準の下での条件つき処理効果を機械学習で推定しよう」という話なのね、なるほど]
応用事例その2、道具変数を使った異質性のある処理効果の推定、その名も「道具変数回帰フォレスト」。
たとえば、母親の就業への子育ての因果効果を測りたい。でも子供の人数はなにかと交絡しているかもしれない(もっと子供が欲しいかとか)。Angrist & Evans(1998)は、子供が二人以上いる母親について、上の二人が同性か異性かに注目した(性別はさすがに偶然で決まるだろう)。同性のほうがもっと子供を欲しがる傾向がある。同性かどうかと就業意欲との間の関連性が、子供の人数をコントロールしたとき消えるなら、コントロールしなかったときに観察される関連性は子どもの人数のせいだといえる。
さて、こういう道具変数回帰への古典的なアプローチでは処理効果のグローバルな理解しか目指さない。ここでは異質性のある処理効果をフォレストで推定することを目的とする。
$n$人のiidな対象者$i$が持つ特徴を$X_i$, アウトカムを$Y_i$、処理割付を$W_i$、道具変数を$Z_i$とし、次の構造モデルを考える:
$Y_i = \mu(X_i) + \tau(X_i) W_i + \epsilon_i$
$W_i$の因果的効果が$\tau(X_i)$。いま、ノイズ$\epsilon_i$が$W_i$と正の相関を持つかもしれないとしよう。この場合、一般に標準的な回帰では$\tau(X_i)$の一致推定量が得られない。さて、$Z_i$が$X_i$の下で$\epsilon_i$と条件付き独立であると知っているとしよう。この場合、$Z_i$が$W_i$になんらかの影響を持っているとするならば(すなわち、$X_i=x$の下で$Z_i$と$W_i$の条件付き共分散が非ゼロならば)、処理効果$\tau(x)$は
$\tau(x) = Cov[Y_i, Z_i|X_i = x] / Cov[W_i, Z_i | X_i = x]$
実際に$\tau(x)$を推定するには次の式を解けばよくて...
[... いま日々の生活でいろいろ忙しいもので、大幅に中略。来世ですっごく頭の良い人に生まれ変わったら読みますね]
事例。Angrist & Evansが挙げた問題について推定してみる。2人以上子供がいる母親について分析する。$Y_i$は母親がセンサスの前年に働かなかったか、$W_i$は母親がセンサス時点で3人以上子供を持っているか、$Z_i$は上の二人が同性か異性か。普通の道具変数回帰で平均処理効果$\tau$を推定するとAngristらの結果が再現された(3人目がいると就業率が下がる)。
さて、提案手法により、母親の年齢とか人種とか父親の年収とかを共変量にして、条件付きの平均処理効果$\tau(x)$を推定してみると... 父の年収が低く、かつ母親の年齢が低いと効果が大きい。[←なるほどね...そういう分析がやりたいのか]
云々。
というわけで、全体の1割くらいしか読んでないけど、なんとなく雰囲気がわかったので良しとしよう。
いやあ、なんというか... generalized RFっていうから、分類や回帰とかだけじゃなくて、打ち切りつき生存時間データとか、いろんなややこしい問題を統一的にあつかってくれるようなランダム・フォレストなのかな、と思って読んだのである。想像のはるか斜め上をいく話であった。