Search Consoleデータの日付ずれをpandasで修正


投稿日 2021年10月25日 >> 更新日 2023年3月1日

今回は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

pandasを使って日付を修正する

まずはサーチコンソールからデータを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()

丸一日集計結果と日付がずれているわけではないので完璧なデータではないですが多少の誤差を考慮しておけば参考データとなるかと思います。

それでは最後までご覧いただきありがとうございました。