GMOアドマーケティング SSP開発チームのKA.Mです。普段はSSPに関わる問い合わせ対応、配信、バックエンド、バッチとSSPに関わるシステム開発をしています。
本日は日頃エンジニアチーム内で行っている社内勉強会の1つである機械学習勉強会のエントリーとなります。私は大学時代に統計の基礎は学びましたがそこから10年という年月が経ち知識も風化しつつあり、この機会を利用して改めて知識を整理し業務に役立てようと勉強会に参加しています。
今回のテーマは分散分析(英:analysis of variance、略称:ANOVA)の一元配置法について学びましたので、ざっくりではありますが概要を説明したいと思います。
まず、分散分析とはどのようなものなのか。Wikipediaには以下のようにあります。
観測データにおける変動を誤差変動と各要因およびそれらの交互作用による変動に分解することによって、要因および交互作用の効果を判定する、統計的仮説検定の一手法
引用元 | 分散分析、2017年1月24日、ウィキペディア日本語版、https://ja.wikipedia.org/wiki/分散分析
なるほど、難しいですね。
そこで、Python初学者である筆者がPythonの環境を構築しながら実際に分散分析の一元配置法を解きたいと思います。
環境
今回はjupyterで下記ライブラリを利用して実現します。
Python3はhomebrewからインストールしています。
ソフトウェア | バージョン | 説明 |
---|---|---|
Python | 3.7.0 | プログラミング言語 |
pip | 18.1 | Pythonのパッケージ監理ツール |
jupyter | 1.0.0 | Pythonの実行完了 |
pandas | 0.23.4 | Pythonのデータ解析ライブラリ |
matplotlib | 3.0.0 | Pythonのグラフ描画用ライブラリ |
seaborn | 0.9.0 | Pythonのグラフ美化ライブラリ |
ライブラリインストール
pipでJupyter, Pandas, Matplotlib, Seabornをインストールします。
1 2 3 4 5 |
$ pip install jupyter $ pip install pandas $ pip install matplotlib $ pip install seaborn |
Jupyterの起動
Jupyterはターミナルから簡単に起動できます。
1 2 |
$ jupyter notebook |
New > Python3
を選択する事でPython3環境となります。
私はPython初学者だったため、xxxx.pyというファイルを開き、試行錯誤していましたので、
最初の躓きポイントだと思います。
対象データ
テストデータを取り込みます。
今回、pandasはDataFrameでのみ利用する形となります。pandasにはその他にも多くの機能があるため、今後Pythonにより多く触れ紹介できる機会を作れたらと考えています。
1 2 3 4 5 6 7 8 |
# IN import pandas as pd df = pd.DataFrame.from_dict({ "group":["A","A","A","B","B","B","B","C","C","C","C","C","D","D","D"], "result":[60,53,53,61,50,55,52,63,66,64,61,58,52,62,61] }) df.head() |
続いて、箱プロットで対象をグラフィカルに表示します。
Seabornを使う事で味気ない箱プロットがグラフィカルに変わります。
1 2 3 4 5 |
# IN import seaborn as sns sns.set() sns.boxplot(x = "group", y = "result", data = df, color = 'gray') |
分散分析表
分散分析表を作成するにはstatsmodelsを利用します。
1 2 3 4 5 6 7 |
# IN import statsmodels.formula.api as smf import statsmodels.api as sm from pandas.core import datetools ols_model = smf.ols("result ~ group", data = df).fit() sm.stats.anova_lm(ols_model, type = 2) |
また、今回利用はしていませんがstatsmodelsで他にも多くの分析が行われています。
1 2 3 |
# IN ols_model.summary() |
推定
はじめに最適水準を確認します。
1 2 3 |
# IN df.groupby("group").mean() |
Cが良さそうです。
1 2 3 |
# IN target = df[df["group"] == "C"] |
では点推定を行います。
1 2 3 4 5 |
# IN import scipy as sp mu = sp.mean(target) mu |
続いて、区間推定を行います。
1 2 3 4 5 6 |
# IN size = len(target) -1 scale = sp.std(target, ddof = 1) / sp.sqrt(len(target)) interval = sp.stats.t.interval(alpha = 0.95, df = size, loc = mu, scale = scale) interval |
最後に予測区間を求めます。
1 2 3 4 5 |
# IN from statsmodels.sandbox.regression.predstd import wls_prediction_std predstd, interval_l, interval_u = wls_prediction_std(ols_model) predstd, interval_l, interval_u |
まとめ
Python初学者という事もあり、ライブラリの利用方法や効率の良い求め方など不明な点が多々あり、手探りで予測区間まで求めましたが、もっとより良い方法があるのではないかと思っています。
GMOアドマーケティングは今後もユーザの動向を分析し、ユーザにあった広告を表示する事でユーザ体験向上に取り組んでまいります。
リクルーティング
GMOアドマーケティングではユーザの動向を分析し、ユーザ・ファーストな広告表示をするため、機械学習に力を入れています。
もし、興味がございましたら、下記ページからお問い合わせ下さい。