はじめに
マーケティング寄りのデータ分析の知識を補うため、以下の本で勉強を始めた。事例ベースな内容で、とても読みやすい。 Pandasも習得したいので、Pandasに翻訳しながら読み進めている。今回は第5章を勉強した。
- 作者: 酒巻隆治,里洋平
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/06/25
- メディア: 単行本
- この商品を含むブログ (1件) を見る
ちなみに、CSVファイルなどのデータは、本のサポートページ(SBクリエイティブ:ビジネス活用事例で学ぶ データサイエンス入門)で配布されている。
翻訳したコード
第5章では、Web系のデータ分析では定番?のバナー広告のA/Bテストを扱っている。作業はJupyter Notebook上で行った。 カイ二乗検定が使われているが、Pandasにはカイ二乗検定はない様子なので、SciPyのstats.chi2_contingencyを使う。
%matplotlib inline # Jupyter Notebookでmatplotlibの図が表示されないときにつけるおまじない import matplotlib.pyplot as plt import pandas as pd import numpy as np from scipy.stats import chi2_contingency # データを読み込む。 ab_test_imp = pd.read_csv('section5-ab_test_imp.csv') ab_test_goal = pd.read_csv('section5-ab_test_goal.csv') # transition_idが同じものをくっつける。 ab_test_imp_goal = pd.merge(ab_test_imp, ab_test_goal, on=['transaction_id'], how='outer', suffixes=['','.g']) # user_id.gがNaNだった場合に「0」それ以外では「1」として、クリックされたかを判定するフラグとする。 ab_test_imp_goal['is_goal'] = 1 - ab_test_imp_goal['user_id.g'].apply(np.isnan).astype(int) # 集計してクリック率を計算する。 sum_goal = ab_test_imp_goal.groupby('test_case')['is_goal'].sum() sz_user = ab_test_imp.groupby('test_case')['user_id'].size() sum_goal / sz_user # ※ Jupyter Notebook上には以下の用にクリック率が表示される。 # Aが約8%で、Bが約11%となった。 # test_case # A 0.080256 # B 0.115460 # dtype: float64 # カイ二乗検定により、クリック率に統計的な差があるかを確認する。 cr = ab_test_imp_goal.pivot_table(index='test_case',columns='is_goal', values='user_id', aggfunc='count') # ※ crは以下のようなクロス集計結果となる # is_goal 0 1 # test_case # A 40592 3542 # B 38734 5056 # chi2, p, dof, expected = chi2_contingency(cr.as_matrix()) print(chi2) # 308.375052893 print(p) # 4.93413963379e-69
chi2の値が本と同様の値となり、p値も本と同様にとても小さな値となった。 p値が小さいということで 「バナーAとバナーBでは、クリックされなかった(0)とクリックされた(1)の割合に差がない」という帰無仮説が棄却され、広告をバナーAとバナーBに分けたことで、クリック率が変わったと判断できる。 本では、この後、テストケースごとのクリック率を計算したりするが、今回は省略。
おわりに
Rのchisq.test関数と勝手が違ったので、手間取ってしまった。本ではカイ二乗検定の詳しい説明がないので、気になる方は別な統計本を買って勉強する必要がある。「統計的に有意な差」と「ビジネス的に意味があるか」という2つの観点が出てきたりして、ちょっと、この章は読みづらい感がある。