今回はGoogle Search Consoleが提供しているデータの日付ずれについて書いていこうと思います。
Search Consoleは非常に便利で高機能な解析ツールですが、どうやら集計されているタイムゾーンが太平洋夏時間となっており、太平洋夏時間で集計されたデータが日本だと前日のデータとして保管されます。
以下の記事が非常に分かりやすく説明されていました。
太平洋夏時間と日本時間を日本からみて表にしてみました。
タイムゾーン | 開始時間 | 終了 |
---|---|---|
日本時間 | 当日0:00- | 当日-23:59 |
太平洋夏時間 | 当日16:00- | 翌日-15:59 |
つまり、サーチコンソール上にある日当たりの集計データはその日の16時から翌日の15時59分までに得られた集計データということになります。
よって多少の誤差は出ますがpandasというPythonのデータ処理ツールを使用して、日付のずれを解消してみたいと思います。
実行環境 |
---|
Windows Subsystem for Linux |
Python 3.6.9 |
pip 9.0.1 |
使用ライブラリ | ライセンス |
---|---|
japanize-matplotlib==1.0.5 | MIT |
matplotlib==3.1.1 | PSF |
pandas==1.0.0 | BSD |
seaborn==0.11.0 | BSD |
まずはサーチコンソールからデータをCSVファイルとしてエクスポートしてきます。
恐らくZIP形式でファイルがダウンロードされるので、作業ディレクトリ等で解凍し、「日付.csv」というファイルをpandasで抽出します。
import pandas as pd
df = pd.read_csv('console/日付.csv')
df.head()
"""
日付 クリック数 表示回数 CTR 掲載順位
0 2021-10-14 332 4701 7.06% 15.22
1 2021-10-13 419 4920 8.52% 14.03
2 2021-10-12 392 4523 8.67% 13.43
3 2021-10-11 353 4340 8.13% 14.29
4 2021-10-10 244 3239 7.53% 14.84
"""
日付列のデータは文字列となっているので、pd.to_datetime()でdatetime型へ変換しstrftime('%a')で日付を取得します。
day_week = pd.to_datetime(df['日付']).map(lambda x: x.strftime('%a'))
day_week.head(7)
"""
0 Thu
1 Wed
2 Tue
3 Mon
4 Sun
5 Sat
6 Fri
Name: 日付, dtype: object
"""
英語で表記されている曜日を日本語に変換してから、元のデータフレームに「曜日」列として追加します。
# pandasのマッピングで使う関数
def jp_week(df):
"""
英語から日本語に変換
"""
if df == 'Mon':
return '月'
elif df == 'Tue':
return '火'
elif df == 'Wed':
return '水'
elif df == 'Thu':
return '木'
elif df == 'Fri':
return '金'
elif df == 'Sat':
return '土'
elif df == 'Sun':
return '日'
上記で作成した変換器の関数をmap()もしくわapply()に入れる。
df['曜日'] = day_week.map(jp_week)
# df['曜日'] = day_week.apply(jp_week)
df.head()
"""
日付 クリック数 表示回数 CTR 掲載順位 曜日
0 2021-10-14 332 4701 7.06% 15.22 木
1 2021-10-13 419 4920 8.52% 14.03 水
2 2021-10-12 392 4523 8.67% 13.43 火
3 2021-10-11 353 4340 8.13% 14.29 月
4 2021-10-10 244 3239 7.53% 14.84 日
"""
データの並びを新しい順から古い順に並び替えます。
# 並びを逆にする
df_sort = df.sort_values('日付')
# バラバラになったインデックスをリセットする
df_reset = df_sort.reset_index(drop=True)
df_reset.head()
"""
日付 クリック数 表示回数 CTR 掲載順位 曜日
0 2020-06-03 98 1146 8.55% 12.44 水
1 2020-06-04 87 1163 7.48% 13.52 木
2 2020-06-05 76 794 9.57% 14.05 金
3 2020-06-06 59 722 8.17% 14.56 土
4 2020-06-07 89 1087 8.19% 15.09 日
"""
df_reset.tail()
"""
日付 クリック数 表示回数 CTR 掲載順位 曜日
494 2021-10-10 244 3239 7.53% 14.84 日
495 2021-10-11 353 4340 8.13% 14.29 月
496 2021-10-12 392 4523 8.67% 13.43 火
497 2021-10-13 419 4920 8.52% 14.03 水
498 2021-10-14 332 4701 7.06% 15.22 木
"""
グラフ描画ツールを使って分析します。
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
import japanize_matplotlib
plt.rcParams["font.family"] = "IPAexGothic"
fig = plt.figure(figsize=(15, 10))
ax_1 = fig.add_subplot(2, 1, 1)
ax_2 = fig.add_subplot(2, 1, 2)
ax_1.plot(df_reset['曜日'][-7:], df_reset['表示回数'][-7:], marker='o')
ax_2.plot(df_reset['曜日'][-14:-7], df_reset['表示回数'][-14:-7], color='g')
ax_1.set_title('今週', fontsize=15)
ax_2.set_title('先週', fontsize=15)
ax_1.annotate('金曜16時~土曜16時迄のデータ', ('金', 2500), ('金', 4500), arrowprops=dict(facecolor='r'), fontsize=15)
ax_1.annotate('土曜16時~日曜16時迄のデータ', ('土', 2500), ('土', 4000), arrowprops=dict(facecolor='r'), fontsize=15)
plt.savefig('console_graph_1.png')
plt.show()
「日付」と「曜日」列のデータフレームからshift()メソッドを使いインデックス番号の小さい方向へずらします。
# shift(1)で後方、shift(-1)で前方にシフトする
df_reset_shift = df_reset[['日付', '曜日']].shift(-1)
df_reset_shift.tail()
"""
日付 曜日
494 2021-10-11 月
495 2021-10-12 火
496 2021-10-13 水
497 2021-10-14 木
498 NaN NaN
"""
後ほど上記のデータフレームを結合するので、元のデータフレームから「日付」と「曜日」列を除外したデータフレームを作成しておきます。
# 日付を曜日を除外したデータフレームを作成
df_reset_drop = df_reset.drop(['日付', '曜日'], axis=1)
df_reset_drop.head()
"""
クリック数 表示回数 CTR 掲載順位
0 98 1146 8.55% 12.44
1 87 1163 7.48% 13.52
2 76 794 9.57% 14.05
3 59 722 8.17% 14.56
4 89 1087 8.19% 15.09
"""
新しいデータフレームと日付と曜日がシフト済みのデータフレームを結合します。
# 除外されたデータフレームとシフト済みのデータフレームを結合する
df_join = df_reset_drop.join(df_reset[['日付', '曜日']].shift(-1))
df_join.tail()
"""
クリック数 表示回数 CTR 掲載順位 日付 曜日
494 244 3239 7.53% 14.84 2021-10-11 月
495 353 4340 8.13% 14.29 2021-10-12 火
496 392 4523 8.67% 13.43 2021-10-13 水
497 419 4920 8.52% 14.03 2021-10-14 木
498 332 4701 7.06% 15.22 NaN NaN
"""
最新のデータは一段ずれているので、最後の行を削除します。
# 最新データが1つ前にずれたので、日付無しとなった最後の行を削除する
df_shift = df_join.drop(df_reset.index[-1])
df_shift.tail()
"""
クリック数 表示回数 CTR 掲載順位 日付 曜日
493 130 1948 6.67% 18.61 2021-10-10 日
494 244 3239 7.53% 14.84 2021-10-11 月
495 353 4340 8.13% 14.29 2021-10-12 火
496 392 4523 8.67% 13.43 2021-10-13 水
497 419 4920 8.52% 14.03 2021-10-14 木
"""
これで日付ずれの修正が完了しました。
グラフ描画ツールで再度分析してみます。
fig = plt.figure(figsize=(15, 10))
ax_1 = fig.add_subplot(2, 1, 1)
ax_2 = fig.add_subplot(2, 1, 2)
ax_1.plot(df_shift['曜日'][-7:], df_shift['表示回数'][-7:], marker='o')
ax_2.plot(df_shift['曜日'][-14:-7], df_shift['表示回数'][-14:-7], color='g')
ax_1.annotate('金曜16時~土曜16時迄のデータ', ('土', 2500), ('土', 4500), arrowprops=dict(facecolor='r'), fontsize=15)
ax_1.annotate('土曜16時~日曜16時迄のデータ', ('日', 2500), ('日', 4000), arrowprops=dict(facecolor='r'), fontsize=15)
ax_1.set_title('今週', fontsize=15)
ax_2.set_title('先週', fontsize=15)
plt.savefig('console_graph_2.png')
plt.show()
丸一日集計結果と日付がずれているわけではないので完璧なデータではないですが多少の誤差を考慮しておけば参考データとなるかと思います。
それでは最後までご覧いただきありがとうございました。