Google Analytics で、
前提
ライブラリ
python の
- pandas
- statsmodels
入力データ
Google Analytics の、集客 > Search Console > ランディングページ
から
期間設定をし、
データの 読み込んで、 散布図を 描画、 重回帰分析を 実施する
相関関係を
import pandas as pd df = pd.read_csv("acquisition-sc-landingpages.csv") df.head()
ランディング ページ | 表示回数 | クリック数 | クリック率 | 平均掲載順位 | セッション | 直帰率 | ページ/セッション | サイトの滞在時間(目標 2 の完了数) | サイトの滞在時間(目標 2 の値) | サイトの滞在時間(目標 2 のコンバージョン率) | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | /blog/typeerror-builtin_function_or_method-obj... | 3,537 | 127 | 3.59% | 15.0 | 132 | 94.70% | 1.08 | 5 | <¥1 | 3.79% |
1 | /blog/Try-static-analysis-of-Python-using-Sona... | 2,360 | 85 | 3.60% | 12.0 | 75 | 81.33% | 1.20 | 7 | <¥1 | 9.33% |
2 | /blog/get-single-result-on-django-model-filter/ | 2,334 | 195 | 8.35% | 8.8 | 203 | 88.18% | 1.13 | 17 | ¥2 | 8.37% |
3 | /blog/Use-the-Google-Place-API-as-a-facility-s... | 2,068 | 142 | 6.87% | 18.0 | 149 | 83.89% | 1.14 | 11 | ¥1 | 7.38% |
4 | /blog/WSGIRequest-object-is-not-subscriptable-... | 1,845 | 64 | 3.47% | 9.5 | 62 | 87.10% | 1.11 | 4 | <¥1 | 6.45% |
# クリック数が1回以上あるデータを抽出 df_clicked = df[df["クリック数"] >= 1] # データを編集する df_clicked = df_clicked.assign(直帰率=df_clicked['直帰率'].str.rstrip('%').astype('float') / 100.0) df_clicked = df_clicked.assign(クリック率=df_clicked['クリック率'].str.rstrip('%').astype('float') / 100.0) # 必要なカラムのみ取り出し df_clicked = df_clicked.loc[:,['クリック率','直帰率','サイトの滞在時間(目標 2 の完了数)','平均掲載順位']]
%matplotlib inline import matplotlib.pyplot as plt plt.rcParams['figure.figsize'] = (15, 10) plt.rcParams['font.family'] = 'IPAexGothic' ax = df_clicked.plot(kind='scatter', x='サイトの滞在時間(目標 2 の完了数)', y='平均掲載順位',color='RED', label='サイトの滞在時間 2分以上の数',s=10); # 掲載順位を反転させる ax.set_ylim([80, 0])
(80, 0)
ax = df_clicked.plot(kind='scatter', x='直帰率', y='平均掲載順位',color='BLUE', label='直帰率',s=10); # 掲載順位を反転させる ax.set_ylim([80, 0])
(80, 0)
ax = df_clicked.plot(kind='scatter', x='クリック率', y='平均掲載順位',color='GREEN', label='クリック率',s=10); # 掲載順位を反転させる ax.set_ylim([80, 0])
(80, 0)
重回帰分析を 実施する
statsmodels.api.OLS
を
OLS
は、Ordinary Least Square
の
- Rの
数式を 使わない
import statsmodels.api as sm # Fit and summarize OLS model y = df_clicked['平均掲載順位'] X = df_clicked[['クリック率', '直帰率', 'サイトの滞在時間(目標 2 の完了数)']] # 切片を追加する mod = sm.OLS(y, sm.add_constant(X)) res=mod.fit() print(res.summary())
OLS Regression Results ============================================================================== Dep. Variable: 平均掲載順位 R-squared: 0.125 Model: OLS Adj. R-squared: 0.111 Method: Least Squares F-statistic: 8.501 Date: Sat, 28 Jul 2018 Prob (F-statistic): 2.62e-05 Time: 12:14:45 Log-Likelihood: -701.70 No. Observations: 182 AIC: 1411. Df Residuals: 178 BIC: 1424. Df Model: 3 Covariance Type: nonrobust ======================================================================================= coef std err t P>|t| [0.025 0.975] --------------------------------------------------------------------------------------- const 29.6176 3.402 8.706 0.000 22.904 36.331 クリック率 -37.3386 9.001 -4.148 0.000 -55.100 -19.577 直帰率 -8.3988 3.635 -2.311 0.022 -15.572 -1.226 サイトの滞在時間(目標 2 の完了数) -0.8279 0.318 -2.604 0.010 -1.455 -0.200 ============================================================================== Omnibus: 79.274 Durbin-Watson: 1.921 Prob(Omnibus): 0.000 Jarque-Bera (JB): 260.565 Skew: 1.785 Prob(JB): 2.62e-57 Kurtosis: 7.649 Cond. No. 34.1 ============================================================================== Warnings: [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
- Rの
数式を 使う
statsmodels.formula.api.ols
を使うと、 formula
にRの 数式を 指定でき、 出力も Rの lm
と同様の 形式に なります。
import statsmodels.formula.api as smf df2 = df_clicked.copy() df2['AveragePosition'] = df2['平均掲載順位'] df2['CTR'] = df2['クリック率'] df2['Bouncerate'] = df2['直帰率'] df2['Goal2Completions'] = df2['サイトの滞在時間(目標 2 の完了数)'] mod = smf.ols(formula="AveragePosition ~ CTR + Bouncerate + Goal2Completions", data=df2) res = mod.fit() print(res.summary())
OLS Regression Results ============================================================================== Dep. Variable: AveragePosition R-squared: 0.125 Model: OLS Adj. R-squared: 0.111 Method: Least Squares F-statistic: 8.501 Date: Sat, 28 Jul 2018 Prob (F-statistic): 2.62e-05 Time: 12:14:49 Log-Likelihood: -701.70 No. Observations: 182 AIC: 1411. Df Residuals: 178 BIC: 1424. Df Model: 3 Covariance Type: nonrobust ==================================================================================== coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------------ Intercept 29.6176 3.402 8.706 0.000 22.904 36.331 CTR -37.3386 9.001 -4.148 0.000 -55.100 -19.577 Bouncerate -8.3988 3.635 -2.311 0.022 -15.572 -1.226 Goal2Completions -0.8279 0.318 -2.604 0.010 -1.455 -0.200 ============================================================================== Omnibus: 79.274 Durbin-Watson: 1.921 Prob(Omnibus): 0.000 Jarque-Bera (JB): 260.565 Skew: 1.785 Prob(JB): 2.62e-57 Kurtosis: 7.649 Cond. No. 34.1 ============================================================================== Warnings: [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
出力の 説明
個人的に
- 結果上部
項目名 | 説明 |
---|---|
Dep. Variable: | 目的変数名が出力されます。 |
R-squared | 決定係数 |
Model | 回帰分析のModelの名前が出力されます |
Adj. R-squared | 自由度修正済決定係数 |
Method | 分析方法? Model OLS とほぼ同じかもしれません。 |
F-statistic | F 統計量 |
Date | 実行した日 |
Prob (F-statistic) | F 統計量のp値 |
Time: | 実行した時刻 |
Log-Likelihood | 最大化対数尤度 |
No. Observations | サンプルサイズ |
AIC | 赤池情報量規準 |
Df Residuals | 残差の自由度 |
BIC | ベイズ情報量規準 |
Df Model説明変数の数 | |
Covariance Type | 共分散の種類 |
- 説明変数の
出力部
項目名 | 説明 |
---|---|
coef | 相関係数 |
std err | 標準誤差 |
t | t値 |
P>t | 両側検定のp値 |
[0.025 0.975] | 95%信頼区間 |
- 結果下部
残差に関する、 検定の 結果が 出力されます。
Omnibus
、Durbin-Watson
等が検定の 種類で、 その 結果が 数値と して 出力されています。
詳しい意味に ついては 少し 調べて 限りは、 ピンとくる ものが なく、 後日詳細調べてみようかと 思います。
結果を 分析する
サマリのR-squared: 0.125
あまりうまく
データの
データの 標準化し、 1つの 散布図に 描画する
滞在時間 2分の
データの
from sklearn.preprocessing import StandardScaler ## データの標準化を行う準備 # 標準化を行うモデル std = StandardScaler() # モデルにデータを学習させる std.fit(df_clicked) # データを標準化する std_data = pd.DataFrame(std.transform(df_clicked), columns=df_clicked.columns) std_data.head()
クリック率 | 直帰率 | サイトの滞在時間(目標 2 の完了数) | 平均掲載順位 | |
---|---|---|---|---|
0 | -0.533060 | 0.504502 | 1.258045 | -0.261439 |
1 | -0.532013 | -0.046450 | 1.980330 | -0.506833 |
2 | -0.034441 | 0.235825 | 5.591754 | -0.768587 |
3 | -0.189474 | 0.059043 | 3.424900 | -0.016045 |
4 | -0.545631 | 0.191321 | 0.896903 | -0.711328 |
import matplotlib.pyplot as plt plt.rcParams['figure.figsize'] = (15, 10) plt.rcParams['font.family'] = 'IPAexGothic' ax1 = std_data.plot(kind='scatter', x='サイトの滞在時間(目標 2 の完了数)', y='平均掲載順位',color='RED', label='サイトの滞在時間 2分以上の数',s=10); ax2 = std_data.plot(kind='scatter', x='直帰率', y='平均掲載順位',color='BLUE', label='直帰率',s=10, ax=ax1); ax3 = std_data.plot(kind='scatter', x='クリック率', y='平均掲載順位',color='GREEN', label='クリック率',s=10, ax=ax2); # 掲載順位を反転させる ax1.set_ylim([10, -10]) ax2.set_ylim([10, -10]) ax3.set_ylim([10, -10])
(10, -10)
以下の
- サイトの
滞在時間、 クリック率と 掲載順位は 正の 相関、 直帰率と 掲載順位には 負の 相関が ある。 - 直帰率は、
zスコアは 負の 方法に 広がっている。 直帰率 100% に 近い データが 多そう。 - サイトの
滞在時間、 クリック率 は 正の 方法に 広がっている。 滞在時間の 短い(2分を 超えない)ページ、 クリック率の 低い ページが 多そう。
重回帰分析を 実施する
import statsmodels.formula.api as smf df2 = std_data.copy() df2['AveragePosition'] = df2['平均掲載順位'] df2['CTR'] = df2['クリック率'] df2['Bouncerate'] = df2['直帰率'] df2['Goal2Completions'] = df2['サイトの滞在時間(目標 2 の完了数)'] mod = smf.ols(formula="AveragePosition ~ CTR + Bouncerate + Goal2Completions", data=df2) res = mod.fit() print(res.summary())
OLS Regression Results ============================================================================== Dep. Variable: AveragePosition R-squared: 0.125 Model: OLS Adj. R-squared: 0.111 Method: Least Squares F-statistic: 8.501 Date: Sat, 28 Jul 2018 Prob (F-statistic): 2.62e-05 Time: 12:15:22 Log-Likelihood: -246.06 No. Observations: 182 AIC: 500.1 Df Residuals: 178 BIC: 512.9 Df Model: 3 Covariance Type: nonrobust ==================================================================================== coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------------ Intercept 1.041e-16 0.070 1.48e-15 1.000 -0.138 0.138 CTR -0.2916 0.070 -4.148 0.000 -0.430 -0.153 Bouncerate -0.1667 0.072 -2.311 0.022 -0.309 -0.024 Goal2Completions -0.1875 0.072 -2.604 0.010 -0.330 -0.045 ============================================================================== Omnibus: 79.274 Durbin-Watson: 1.921 Prob(Omnibus): 0.000 Jarque-Bera (JB): 260.565 Skew: 1.785 Prob(JB): 2.62e-57 Kurtosis: 7.649 Cond. No. 1.27 ============================================================================== Warnings: [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
結果を 分析する
以下の
- サマリの
決定係数は、 R-squared: 0.135
で標準化前の、 R-squared: 0.125
に比べて 少し 説明できるようになっている。 - CTR の、
P>t
の値は、 0.015
でCTR、 Bouncerate、 Goal2Completions の 中では 掲載順位に 与える 影響が 最も 強そう。 - Bouncerate の、
P>t
の値は、 0.504
で掲載順位に 与える 影響は あまりなさそう。 - 直帰率が
高くても、 ページ滞在時間が 長い ページが あり、 その ページの 掲載順位が 低いとは 言えず、 掲載順位が 高い 傾向が ありそう。 - Goal2Completions の、
P>t
の値は、 0.098
であり、CTRほどではないが、 掲載順位に 与える 影響が 最も 強そう。 - CTRと
掲載順位の 関係は、 掲載順位が 高いから、 CTRが 上がるとも 言える。 - ページ滞在時間が
長い ページ(良い コンテンツ)を 作ると、 その 結果と して 掲載順位が 上がり、 掲載順位に 比例して CTRが 上がっていきそう。
参考
分析実施時に
scikit-learn での
線形回帰の 実行方法
scikit-learn で線形回帰 (単回帰分析・重回帰分析) – Python で データサイエンス pandas での
線形回帰の 実行方法
pythonとパンダちゃんで 重回帰分析 | kote2.tokyo Rの線型回帰の
説明
R言語で線形モデルに よる 回帰分析 | 全人類が わかる 統計学 Rの数式を
StatsModels で 使う
Fitting models using R-style formulas — statsmodels 0.9.0 documentation回帰分析
回帰分析 - WikipediaStatsModelsの
サマリーの 出力フォーマットを 変更できる
StatsModels : Tips — 苦労する遊び人の 玩具箱 1 ドキュメント F統計量に
ついて
「R二乗値なんて 信仰に すぎない!」に ついて (F統計量の お話) - Men talking over coffee with smoking Ark Royal. 自由度修正済決定係数に
ついて
[27-4. 決定係数と重相関係数 | 統計学の 時間 | 統計WEB] (https://bellcurve.jp/statistics/course/9706.html)
以上です。
コメント