> >

見えるぞ!私にも未来が見える!Google AnalyticsのデータをFBProphetで予測させてみた。[prophet][python][Google Analytics]

スポンサーリンク

pythonのfbprophetという時系列予測ライブラリを使って、Google Analyticsのセッション数予測を行ってみました。

このfbprophetというライブラリはpandasのdataframe形式にて[ds(日付),y(値)]を与えるだけで、未来の数値予測をしてくれるライブラリです。

例えばどんなことができるのか、というとこんな事ができます。

参考:
Pythonでデータ分析:Prophetを使ってビットコインの予測(笑)をやってみる

曜日別の動きはどうなのかわかりませんが、ファンダメンタルを無視したトレンド予測としては割と有用な結果ではないかと見てとれます。

もちろんこの予測を信用してBTCを買っても売っても私は何も保証しません(笑)

では、本題に戻りまして、このfbprophetをGoogle Analyticsに適用させてみます。

その前に、そもそものGoogle Analyticsのデータを確認してみます。

このデータはこのサイトのセッション値です。

日次のセッション平均でおよそ150程度といったところでしょうか。

サイト内のコンテンツがビジネスツールに寄っているので、土日祝日の減少がパッと見てわかるグラフですね。

このGoogle AnalyticsのデータをpythonでAPIを経由して取得、その後、pandasのdataframeに変換してprophetに投入という流れです。

環境情報は以下の通りです。

OS/Mac High Sierra
Python3.6.5(Anaconda)

※恐らくwindowsでも同ソースで動作すると思われます

必要となるライブラリのインストールは以下にて実施してください。

pip install --upgrade google-api-python-client
pip install fbprophet

ソースコードは以下の通りです。

githubはこちら

# CLIENT_SECRET_FILE,APPLICATION_NAME,credential_path,profileは自身の環境にあわせて変更してください。

from __future__ import print_function
import httplib2
import os

from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage

from datetime import datetime as dt

import pandas as pd
import numpy as np
from fbprophet import Prophet
import matplotlib.pyplot as plt

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

SCOPES = 'https://www.googleapis.com/auth/analytics.readonly' # GoogleAnalyticsの権限
CLIENT_SECRET_FILE = './secret/client_secret_XXXXXXXXXXXXXXX.apps.googleusercontent.com.json' # Google API Consoleから事前に取得して設置する。自身の環境に合わせて変更してください。
APPLICATION_NAME = '' # Google API Consoleにて設定したアプリケーション名。自身の環境に合わせて変更してください。
DISCOVERY_URI = ('https://analyticsreporting.googleapis.com/$discovery/rest') # API実行のエンドポイント

# 実行権限取得
def get_credentials():

    home_dir = os.path.expanduser('~')
    credential_dir = os.path.join(home_dir, '.credentials') # 権限設定ファイル(json)の設置ディレクトリ設定
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir,'ga.googleapis.com-XXXXXXXXXXXXXXX.json')# 権限設定ファイル(json)のファイル名を指定。自身の環境に合わせて変更してください。

    store = Storage(credential_path)
    credentials = store.get()

    # 権限設定ファイル(json)が無い場合は取得する
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        print('Storing credentials to ' + credential_path)
    return credentials

# GAから日次セッションを取得
def get_results(service, profile_id, limit):
    return service.reports().batchGet(
        body={
            'reportRequests': [
            {
            'viewId': profile_id,
            'dateRanges': [{'startDate': '2017-01-01', 'endDate': 'today'}],
            'metrics': [{'expression': 'ga:sessions'}],
            'dimensions': [{'name': 'ga:date'}],
            'pageSize': limit
            }]
        }
     ).execute()

# 日付フォーマットをyyyymmdd -> yyyy/mm/ddに変換
def date_format_yyyymmdd(date_yyyymmdd):
    adt = dt.strptime(date_yyyymmdd, '%Y%m%d')
    newstr = adt.strftime('%Y/%m/%d')
    return newstr

# プログラムの実行
def main():
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = discovery.build('analytics', 'v4', http=http, discoveryServiceUrl=DISCOVERY_URI)
    profile = '' #自身の環境に合わせて変更してください。
    limit = '10000'

    data = get_results(service, profile, limit)
    data_len = len(data['reports'][0]['data']['rows'])

    data_li = []

    for i in range(data_len):
        data_dim = data['reports'][0]['data']['rows'][i]['dimensions'][0]
        data_met = data['reports'][0]['data']['rows'][i]['metrics'][0]['values'][0]

        data_dim = date_format_yyyymmdd(data_dim)

        data_li.append([data_dim,data_met])

    df = pd.DataFrame(data_li,columns=['ds','y'])
    model = Prophet()
    model.fit(df)

    future_data = model.make_future_dataframe(periods=365, freq = 'd')
    forecast_data = model.predict(future_data)

    model.plot(forecast_data)
    model.plot_components(forecast_data)
    plt.show()

# 実行の実態はここ
if __name__ == '__main__':
    main()

試しに実施してみた結果は以下のとおりです。

うーん。。。イマイチな事この上ない結果ですね。。。

与えたデータが2017年1月1日〜2018年7月27日までと約1年半しかない事と数値が少ないので、仕方ないのかもしれません。

BTCの価格データであれば、ある程度それっぽい予測値になっているので、数値そのものの変動幅や日数が多い必要はありそうですね。

ただ、曜日別の指数を見ると、Google Analyticsのグラフを参照したときにも見て取れた土日の減少は正確につかめています。

一応、2015年6月からデータそのものはあるのですが、「レンタルサーバーからVPSに移行したことによるURL変更」やGoogle TagManagerからデータ転送方法を「従来のアナリティクス」から「ユニバーサルアナリティクス」に変更したりで、Google Analyticsのデータが分断されてしまっているので、正直面倒。。。

まぁCSV化して読み込ませたり、DBにデータを入れてから読ませればできるにはできるけども。。。

気が向いたら過去分を更にひっぱり出して実験してみます。

それでは、今回はここまで。

見えるぞ!私にも未来が見える!Google AnalyticsのデータをFBのProphetで予測させてみた。でした。

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です