洋食の日記

「だ・である」調ではなく「です・ます」調で書きはじめれば良かったなと後悔してる人のブログです

Pandasで「ビジネス活用事例で学ぶデータサイエンス入門」を勉強する(第5章)

はじめに

マーケティング寄りのデータ分析の知識を補うため、以下の本で勉強を始めた。事例ベースな内容で、とても読みやすい。 Pandasも習得したいので、Pandasに翻訳しながら読み進めている。今回は第5章を勉強した。

ビジネス活用事例で学ぶ データサイエンス入門

ビジネス活用事例で学ぶ データサイエンス入門

ちなみに、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つの観点が出てきたりして、ちょっと、この章は読みづらい感がある。