因果関係を見つけ出すQCA(質的比較分析)で考えるアトリビューションモデル

今回は、QCA(質的比較分析)という手法を用いた新しいアトリビューション分析モデルの開発経過を報告します。

あまり聞き馴染みの無い単語だと思いますが、Rでのサンプルプログラムも記載しているので皆さんの環境でも再現可能です。

「R触れないよ!」という方のためにも概念や考え方も軽く紹介するので「へぇ~、こういう考え方もあるのね」と思って頂ければ幸いです。

 

アトリビューションとは何か?

ご存知かもしれませんが、簡単にアトリビューション分析およびモデルの説明をします。

アトリビューション分析とは、ユーザーが最後に接触した媒体のみ評価するのではなく、それまで接触してきた媒体も含めて評価する分析手法を指します。

デジタルな環境ではユーザーを一意に認識できるようトラッキングできるので、どの媒体に接触したかという「過程」を把握できます。このあたりの技術の進化がアトリビューション分析を後押ししたのだと思います。

過程を評価するアトリビューション分析のモデルについては、様々なアプローチが提案されています。仔細は以下のサイトを見て下さい。

アトリビューション分析5つのモデル|デキるマーケターは知っている?
http://blog.ebis.ne.jp/marketing/attribution-analysis-of-five-models/

 

接触した媒体を均等に評価するか、最初を評価するか。様々なモデルが提案されています。

 

QCAとは何か?

質的比較分析(Qualitative Comparative Analysis)とは、簡単に表現すると「ブール代数や集合論を用いて、データに潜む因果関係を見つけ出そうとする手法」です。

要は、組み合わせから因果性を明らかにしていこうとするのです。

この手法はカリフォルニア大学で社会学を教えるチャールズ・レイガン(※1)によって提唱されました。

最近では森大輔先生(※2)、田村正紀先生(※3)、豊田裕貴先生(※4)他多くの先生方が研究されておられ(巻末に参考文献として掲載しています)、定性的手法と定量的手法の架け橋として注目を集めています。

 

考え方を簡単に紹介します。

広告A、B、Cを「原因」、商品の購入を「結果」と定義して、ある2人が広告を見たかどうかで承認の購入に影響を与えたか考えます。

ある組み合わせ

違いを比べてみて下さい。

「原因」がこの3つの広告施策のみなら、広告Bが原因で商品が買われたという結果になることが想定されます。

…が、世の中こんなシンプルな世界でまとまっていません。世の中はいつだって複雑に入り組んだ現代社会であり、そこにメスを入れるのが探偵ナイトスクープです。

先ほどとは異なるある組み合わせ

もしも上記の結果だった場合、違いを比べる方法だと、「原因」がこの3つの広告施策のみだったとしても想定される原因が分かりません。

例えば、広告Eと広告Fの両方を見たという「相乗効果」があってこそ商品が買われたという仮説、広告Dを「見ていない」から買ったという仮説…色々思い浮かびます。

つまり、実際の世の中は「原因が1つのみ」の条件であるという前提には立てないということです。

そこで手法として用いるのがQCAです。

先図のような限られた原因の列挙という点に変わりはないのですが、十分条件と必要条件を考慮したうえで、考えられる原因の組み合わせと結果の関係を導き出します

先ほど挙げたような「広告Eと広告Fの両方を見た相乗効果」をQCAは示してくれます。

 

現在のアトリビューション分析の多くは、過去に接触した広告の評価はできても、接触した広告の組み合わせの評価(オウンドメディア⇒GoogleならCVはあるけど、メルマガ⇒GoogleならCVは起きにくい等)はされていない場合が多いのではないでしょうか。

またデータ的には「CVした人」と「CVしていない人」の両方を対象に、「原因」と考えられる接触媒体との接触度と「結果」との組み合わせを見ることになります。多くのアトリビューション分析が「CVした履歴」に限られる中でQCAは「CVしていない履歴」も含めて評価します

この2点がQCAをアトリビューション分析に応用すると新しいと感じました。

 

まずはQCAをやってみよう!

というわけで、さっそくQCAをRで実践してみましょう。

RでのQCA実装方法については以下の論文が非常に良くまとまっていますのでご一読ください。

QCA: A Package for QualitativeComparative Analysis
https://journal.r-project.org/archive/2013-1/thiem-dusa.pdf

 

まずは原因列⇒結果列の表を作成します。そこに、人単位の実施した内容の行を追加していきます。前提としては以下のような二項列です。

今回は、列単位に見て「接触したか/していないか」でデータを埋めていきます。

FuzzyなfsQCAという手法を用いれば、0から1の連続量に置換して分析が可能です。なので1回接触しようが10回接触しようが同じとしない方法があります。ですが、いきなりジャンプするとアキレス腱断裂するので、まずはホップ、ステップ。

(0から1の連続量への置換は何で判断するかも結構難しいので)

 

次に「不完備真理表」を作成します。

真理表とは入力値の全てのパターンとそれに対する結果の値を表にしたものですから、「不完備」という頭文字が付くということは完全では無いということです。

 

# まずはパッケージのインストールから
> install.packages("QCA")
> library(QCA)

# データ取得(あるデモデータの1日分の全ユーザー接触履歴)
> qca <- read.csv("lists.csv",header=TRUE)
> head(qca)

  OM YA GA FB TS YH GO CV
1  0  0  0  1  0  0  0  0
2  1  0  0  0  0  0  0  0
3  0  0  0  0  0  0  1  0
4  0  0  0  0  0  0  1  0
5  0  0  0  0  0  0  1  0
6  0  0  0  0  0  1  0  0

> qcatT <- truthTable(qca, outcome = "CV",sort.by=c("n,incl"))
> qcatT

  OUT: outcome value
    n: number of cases in configuration
 incl: sufficiency inclusion score

     OM YA GA FB TS YH GO OUT n   incl  PRI  
  2  0  0  0  0  0  0  1   0  152 0.382 0.382
 17  0  0  1  0  0  0  0   0  123 0.057 0.057
 65  1  0  0  0  0  0  0   0  119 0.328 0.328
  3  0  0  0  0  0  1  0   0   57 0.246 0.246
  9  0  0  0  1  0  0  0   0   30 0.067 0.067
 66  1  0  0  0  0  0  1   0   28 0.929 0.929
 33  0  1  0  0  0  0  0   0   28 0.000 0.000
 18  0  0  1  0  0  0  1   0   19 0.684 0.684

 

qcatTの内容が「不完備真理表」になります。1つ1つ見ていきましょう。

この表ですが、要はSQLで言うところの「GROUP BY OM,YA,GA,FB,TS,YH,GO」です。nはその件数を表しています。

OUTは指定した”CV”を表しています。

inclとは整合性を表しています。これは、OM~GOまでの行の0/1の組み合わせがn個あったとして、OUTである”CV”が1のデータがn個中何個かを表します。

例えばNo.2はn=152に対して、incl=0.382なので、うちOUT=1が58個あることを意味しています。

集計する際にOUT=1とincl=1になるように集計しているのですが、そうならない場合はOUT=0として、整合性がどれくらい取れているか(うち1がn個の何割を占めているか?)を確認するようです。

 

あとは、この真理表の結果をもとにブールの最小化に挑みます。

 

> qcaSP <- eqmcc(qcatT, include = "?", row.dom = TRUE, use.tilde = TRUE, details = TRUE,sort.by=c("cov.r"))
> qcaSP

n OUT = 1/0/C: 15/595/0 
  Total      : 610 

M1: TS + FB*GO + OM*YH + YH*GO + OM*YA*GA + OM*GA*~FB*~GO => CV

                  incl   PRI    cov.r  cov.u 
-------------------------------------------- 
1  TS             1.000  1.000  0.016  0.011 
2  FB*GO          1.000  1.000  0.011  0.011 
3  OM*YH          1.000  1.000  0.021  0.016 
4  YH*GO          1.000  1.000  0.005  0.005 
5  OM*YA*GA       1.000  1.000  0.011  0.011 
6  OM*GA*~FB*~GO  1.000  1.000  0.021  0.021 
-------------------------------------------- 
   M1             1.000  1.000  0.079

 

結果として6通り考えられるようです。「+」とはORであり、「*」とはANDです。先述した相乗効果のようなもので「自社メディアかつYahoo!検索への接触」ということになります。

文字の前に付いた「~」とはNOTです。6番目は「自社メディアかつGoogle広告かつfacebook広告ではなく加えてGoogle検索でもないならCVに至る」という意味です。

M1に6通りの組み合わせが結果である「CV」に対して右矢印を突き刺していますが、これは十分条件であることを指しています。「⇔」とあれば必要十分条件を意味しています。

conv.rとはCV=1である行数中、明記された条件が占める割合です。2番目の「facebook広告かつGoogle検索」なら100%CVしていて、かつそれは全CVの1.1%を占めるというわけです。

 

M1は6パターンあって、それらを足し合わせても全体の7.9%…ちょっと少ないです。

その理由として、「不完備真理表」を作成する際にincl(整合性)が1(つまり100%)でなければOUTが1とは認めない、としているからです。

 

     OM YA GA FB TS YH GO OUT n   incl  PRI  
66  1  0  0  0  0  0  1   0   28 0.929 0.929

 

この場合、28件中OUT=1が92.9%あるのに100%じゃないからダメ!ということでOUTは0となっています。

え~そういうデータがあるかもしれないけどノイズと見做していいじゃん~それくらいの矛盾は見逃してよ~という場合、閾値を下げる方法があります。

 

> qcatT <- truthTable(qca, outcome = "CV",incl.cut = c(0.3), sort.by=c("n"))
> qcatT

     OM YA GA FB TS YH GO OUT n   incl  PRI  
  2  0  0  0  0  0  0  1   1  152 0.382 0.382
 17  0  0  1  0  0  0  0   0  123 0.057 0.057
 65  1  0  0  0  0  0  0   1  119 0.328 0.328
  3  0  0  0  0  0  1  0   0   57 0.246 0.246
  9  0  0  0  1  0  0  0   0   30 0.067 0.067
 33  0  1  0  0  0  0  0   0   28 0.000 0.000
 66  1  0  0  0  0  0  1   1   28 0.929 0.929

 

引数(incl.cut)でカットする基準を明記します。0.5以上ならOKと見做していいじゃん!としました。その結果、No.66ですがOUTが1になりました。

閾値をどこに設定するか?(矛盾をどこまで許容するか?)は決めの問題ですが、全体のCVRを基準にしてもいいのではないかと考えます。全体基準を上回る≒ノイズではないという見方です。

さて、その結果は以下の通りです。

 

> qcaSP <- eqmcc(qcatT, include = "?", row.dom = TRUE, use.tilde = TRUE, details = TRUE,sort.by=c("cov.r"))
> qcaSP

n OUT = 1/0/C: 358/252/0 
  Total      : 610 

M1: ~GA*GO + ~YA*GO + OM*~FB + OM*~GA + YA*YH <=> CV

           incl   PRI    cov.r  cov.u 
------------------------------------- 
1  ~GA*GO  0.481  0.481  0.481  0.005 
2  ~YA*GO  0.509  0.509  0.587  0.074 
3  OM*~FB  0.489  0.489  0.455  0.032 
4  OM*TS   0.459  0.459  0.381  0.005 
5  YA*YH   0.333  0.333  0.005  0.005 
------------------------------------- 
   M1      0.461  0.461  0.873

 

M1で必要十分条件が表現されました。

多くの組み合わせから考えるに、今回のデータではリスティング非接触・SEO接触がCVのための十分条件と表現される結果となりました

一方で、No.4に「自社メディアかつ他社媒体」のパターンも提示されていて、これが「組み合わせで考えるアトリビューションモデルなのだ」と訴えたいのであります。

データ的には他社媒体の殆どがリタゲ系なので、オウンドメディア接触したユーザーに広告表示させると良い感じに広告見てかつCVしてくれるよという因果推論が成り立ちそうです

 

自己批判と考察

今回の結果について自己批判をしたいと思います。

1点目、接触する媒体の順番を評価していないということです。自社メディア⇒Google広告⇒CVも、Google広告⇒自社メディア⇒CVも同じと見做しています。

多くのアトリビューションモデルが均等配分だから同じく評価できていない気はするのですが「組み合わせ」を考える上では順番まで考えておきたいところです。

もっとも、データがあるのでどちらが先の事例が多いか?というのは分かりますし、何より潜在層向け⇒顕在層向けという流れの中で逆はねーだろ!という話もあるかと思います。

 

2点目、正確な意味での因果ではないということです。あくまで列挙された原因系の中での因果推論になります。

最近、ある人に「因果関係が無いからダメだよ、この分析」と言われたことを根に持っているのですが、数字だけでどうやって因果関係を証明するんだ!という心の雄叫びはともかく、因果の仮説ではなく因果の証明までは難しいです。

 

3点目、大規模なデータには向かないということです。QCA自体も恐らくはスモールなデータを想定されていますし、森大輔先生も論文でそのように書かれています。

データが増えるほどノイズも増えるので、恐らくはシグナルとの分離が難しくなると考えられます。incl(整合性)も合わなくなる可能性があります。

(サンプリングしたデータでQCA分析)×20回とかが良いのかなぁ…ここは今後の研究課題です。

 

現状ではQCAのみでアトリビューション分析を完結させるというよりも、組み合わせで考える補佐的な存在に留まりそうですが、ユーザーを時間軸で捉えるアドエビスの「カスタマージャーニー分析」を含めて使うと、改めて媒体の貢献度が出せるのではないかと考えます。

特に、QCAを使えば「CVに至るに欠かせない媒体」が見えるようになるので、そこへリソース配分を強化することで、よりCVを獲得できるようになるのではないか、とも思います。

引き続きの研究課題です。

 

参考文献

※1:社会科学における比較研究―質的分析と計量的分析の統合にむけて

 

チャールズ・C. レイガン Charles C. Ragin
ミネルヴァ書房 1993-03

※2:判例研究への質的比較分析(QCA)の応用の可能性 : 米国の弁護人依頼権に関する判例の分析を例に
http://ci.nii.ac.jp/naid/110010019424

※3:経営事例の質的比較分析: スモールデータで因果を探る

 

田村 正紀
白桃書房 2015-09-12

※4:日本分類学会第35回大会プログラム「少数事例の分析のためのQCA(質的比較分析)」

Written by