バスケット分析の難しさ
以前インターン先で、スーパーのPOSデータを使って併売実験を行ったのですが、バスケット分析で出した結果、あまりいい結果にならなかったので注意点というか、分析をする上で大事だと感じたことをメモります。
目次
ターゲット
分析に興味のあるかた、始めたばっかの方、lift値ってなんだっけ?という方
バスケット分析とは
バスケット分析とは一言でいうと、よく一緒に買われている商品の組み合わせをみつける分析手法です。
信頼度や支持度やリフト値など聞きなれない言葉が出てきますが、詳しくはこちらの記事と本を参照してください。とても細かく説明されていてとても参考にさせていただきました。
R本は特にRのコードが紹介されていて、パラメータのチューニングの際にとても参考になりました。
研究室でもこれを教科書として輪読しています。
商品分析の手法(ABC分析、アソシエーション分析)
- 作者: 金明哲
- 出版社/メーカー: 森北出版
- 発売日: 2017/03/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
リフト値ってなに?
バスケット分析で用いられるリフト値というのは、簡単に言うと、なにもしないより組み合わせて売ることがどのくらい効果があるのかを知る指標となります。
1以上の値であれば効果があると判断できます。
他にも支持度と確信度という指標があり、三つの指標を総合して判断していきます。
バスケット分析の注意点
バスケット分析で併売の効果があると判断できた組み合わせでも実際には併売の効果があまりないことがあります。
併売の向きが考慮されていない
AとBの商品を近くにおいて併売効果を高めようとしたときに、もともとAがあった場所の近くにBをおくのか、Bの近くにAを置くのでは効果が変わってきます。
例えば、チョコボールとゴディバのチョコがよく買われているとします。
そのときゴディバのチョコをチョコボールが売っている駄菓子ゾーンの近くに置いて、はたして本当に売れるでしょうか?
どちらかというとゴディバのチョコが置いてある高級菓子ゾーンの近くにチョコボールを置いたほうが売れそうですよね。値段が異なる場合、併売の向きも考える必要があります。
商品カテゴリが離れすぎている
また、お肉と、洗剤がよく買われている組み合わせだとします。そこでお肉の売り場の近くに洗剤を置いたとします。結果はどうでしょうか?
あまり売れなそうですよね。逆も然りです。このようにいくらよく買われている組み合わせだとしても併売の効果が出にくいこともあるのです。
みんなに買われる商品が省かれていない
もうひとつは、よく売れすぎている商品は省いたほうがいいです。
例えば、もやしは、スーパーではよく売れる商品ひとつであり、単価も安いため、様々な商品と併売の組み合わせとして上位に入って来てしまいます。
ですが、併売商品が多すぎて、具体的なストーリーが描きにくいため、除いて考えたほうがいいことがあります。
因果関係と相関関係
上記のようにバスケット分析上では併売の効果が高いとされた商品でも実際には効果が出なかったというのは、まさしく相関関係でしかないからなんですね。
しかし、相関関係の中には因果関係がしっかりできているものもあるのでものは試しでいっぱい併売をやってみるというのも一つの手かもしれません。
分析手法はあくまで分析なので実践して効果測定まできちんと追っていくことが大切です。
Googleトレンドをスプレッドシートから検索
Googleトレンドで一度にたくさんのキーワードのトレンドを確認したいことがあるのですが、通常5つまでしか同時に検索することができないんです。
そこで今回はスプレッドシートで、検索したいキーワードのトレンドを取得できるような仕組みを作ってみました。
どうやって作るか
スプレッドシートのimportxml()を使ってGoogle トレンドから元のデータを引っ張ってきます。
そのデータからleft(),right(),find()などを使いながらうまいこと処理して、トレンドの数字だけを引っ張ってくることができれば、完成です。
完成系
ちょっと複雑なので先に完成系を貼っておきます。コピーしてご利用ください。
検索数が多い場合はスクレイピングのスピードが下がるので、その場合は時間を空けて試してみてください。
作ってみましょう
1.googleトレンドから元データを取得
まずgoogleトレンドの検索結果の元データを取得します。
=importxml("https://www.google.com/trends/fetchComponent?q="&"検索したいキーワード"&"&geo=JP&hl=ja&cid=TIMESERIES_GRAPH_0&export=5")
試しにキーワード"楽天"のトレンドを取得してみました。
Google Trendsvar _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-4401283-1']); _gaq.push(['_setDomainName', 'google.com']); _gaq.push(['_setAllowLinker', true]);_gaq.push(['_setCookiePath', '/trends']);_gaq.push(['_trackPageview', window.location.pathname + window.location.search + window.location.hash]); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); google.load('visualization', '1',{'packages':['corechart']});google.setOnLoadCallback(drawChart); function drawChart() { var chartData = {""columns"":[{""id"":""d"",""label"":""Date"",""type"":""datetime""},{""role"":""annotation"",""type"":""string""},{""p"":{""html"":true},""role"":""annotationText"",""type"":""string""},{""id"":""q0"",""label"":""楽天"",""type"":""number""},{""role"":""annotation"",""type"":""string""},{""p"":{""html"":true},""role"":""annotationText"",""type"":""string""},{""role"":""certainty"",""type"":""boolean""}],""headlineDataPoints"":[],""width"":485,""axisAnnotations"":[{""row"":84,""url"":""//support.google.com/trends/bin/answer.py?hl\u003dja\u0026answer\u003d1383240""}],""rows"":[ [{""v"":new Date(2004, 0, 16, 12, 0),""f"":""2004年1月""},null,null,19,null,null,true], [{""v"":new Date(2004, 1, 15, 12, 0),""f"":""2004年2月""},null,null,20,null,null,true], [{""v"":new Date(2004, 2, 16, 12, 0),""f"":""2004年3月""},null,null,19,null,null,true], [{""v"":new Date(2004, 3, 16, 0, 0),""f"":""2004年4月""},null,null,20,null,null,true], [{""v"":new Date(2004, 4, 16, 12, 0),""f"":""2004年5月""},null,null,21,null,null,true], [{""v"":new Date(2004, 5, 16, 0, 0),""f"":""2004年6月""},null,null,20,null,null,true], [{""v"":new Date(2004, 6, 16, 12, 0),""f"":""2004年7月""},null,null,20,null,null,true], [{""v"":new Date(2004, 7, 16, 12, 0),""f"":""2004年8月""},null,null,20,null,null,true], ... [{""v"":new Date(2016, 8, 16, 0, 0),""f"":""2016年9月""},null,null,49,null,null,true], [{""v"":new Date(2016, 9, 16, 12, 0),""f"":""2016年10月""},null,null,46,null,null,true],[{""v"":new Date(2016, 10, 16, 0, 0),""f"":""2016年11月""},null,null,47,null,null,true], [{""v"":new Date(2016, 11, 16, 12, 0),""f"":""2016年12月""},null,null,53,null,null,true], [{""v"":new Date(2017, 0, 16, 12, 0),""f"":""2017年1月""},null,null,48,null,null,true], [{""v"":new Date(2017, 1, 15, 0, 0),""f"":""2017年2月(集計途中のデータ)""},null,null,46,null,null,true],[{""v"":new Date(2017, 2, 16, 12, 0),""f"":""2017年3月""},null,null,null,null,null,true]],""showHeadlines"":false,""percentData"":false,""colors"":[""#3f85f2""],""height"":230}; var htmlChart = new trends.HtmlChart( 'time-chart', chartData.columns, chartData.rows, chartData.headlineDataPoints, null , chartData.showHeadlines,true, chartData.percentData, chartData.colors, chartData.width, chartData.height, chartData.axisAnnotations,true);htmlChart.render(); } body {margin: 8px};
上がトレンドの検索結果となります。
データの概要を簡単に説明すると、2004年からのデータで、100を検索ボリュームの最大値としてトレンド結果を返してくれています。
[{""v"":new Date(2017, 0, 16, 12, 0),""f"":""2017年1月""},null,null,48,null,null,true]
2017年1月のトレンドは48となります。(nullに挟まれている数字)
2.元データから必要なデータを抽出する
取得した元データから必要なデータは、「2017年1月のトレンドは48」というデータのみです。
それらを集めて、下の表のようなものを作っていきます1。
キーワード | 1月 | 2月 | 3月 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 | 10月 | 11月 | 12月 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
楽天 | 20 | 40 | 60 | 80 | 20 | 40 | 60 | 80 | 20 | 40 | 60 | 80 |
amazon | 50 | 60 | 80 | 70 | 50 | 60 | 80 | 70 | 50 | 60 | 80 | 70 |
メルカリ | 10 | 20 | 40 | 90 | 10 | 20 | 40 | 90 | 10 | 20 | 40 | 90 |
元データからfind()してleft()やright()で該当の数字だけを取り除く処理はまた別の機会に書きたいと思います2:。
mid()を使うともっとシンプルにかけるよ。などございましたらコメントください。宜しくお願いします。