Python で時系列データのグラフ化
Google Search Console の “日付.csv” を Python で読み込み,クリック数,表示回数,CTR,掲載順位の時系列データをグラフ化する。
Python とライブラリのバージョン
Python のバージョン,ライブラリのバージョンは以下のとおり。
- Python 3.11.1
- pandas 1.5.3
- matplotlib 3.6.3
使用したデータ
“日付.csv” には,以下のデータ(抜粋)が記載されている。(『目指せ!電気主任技術者~解説ノート』の 2022年1月1日~12月31日までのデータである。)
日付,クリック数,表示回数,CTR,掲載順位
2022-12-31,105,1767,5.94%,20.03
2022-12-30,124,1819,6.82%,14.95
2022-12-29,131,2013,6.51%,16.56
2022-12-28,190,2513,7.56%,16.15
2022-12-27,321,4430,7.25%,14.09
データ前処理
“日付.csv” の特徴は,日付が新しいものから記載されていること,CTR は単位 “%” があることである。時系列データをグラフ化するため,データを昇順にソートし,CTR の単位 “%” を削除し,数値に変換する処理が必要である。
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv('日付.csv', usecols = ['日付','クリック数','表示回数','CTR','掲載順位'], encoding='utf-8')
df = df.sort_values('日付')
df['日付']=pd.to_datetime(df['日付'])
# CTR の単位 "%" を削除し,数値に変換
df['CTR']=df['CTR'].str.replace('%','')
df['CTR']=df['CTR'].astype(float)
グラフ化
クリック数の推移
クリック数の時系列データをグラフ化する。
plt.plot(df['日付'],df['クリック数'],label='clicks')
plt.plot(df['日付'],df['クリック数'].rolling(7).mean(),label='moving average (7 days)')
plt.plot(df['日付'],df['クリック数'].rolling(28).mean(),label='moving average (28 days)')
plt.grid(True)
plt.xlabel('date')
plt.ylabel('clicks')
plt.legend(loc = 'upper left')
plt.savefig("date_clicks.png",dpi=300)
plt.show()
グラフ化したクリック数の推移を以下に示す。青線で時系列データ,赤線で 7 日間移動平均,緑線で 28 日間移動平均線を描画している。df[‘クリック数’].rolling(N).mean() だけで,N 日間の移動平均を計算できるのは,非常に便利だ。
追記 横軸の年月データフォーマットを変更
時系列データが 1 年の場合,横軸の表示が 2022-01,2022-03 でも読める。しかし,長い期間では,年月が重なって読めなくなる。そこで,年月の表示を以下のように見直す。
ライブラリ読み込み
import matplotlib.dates as mdates
年月の表示フォーマットを変更
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter("%y/%m"))
変更後の時系列データのグラフ
年月の表示フォーマットを変更した後のクリック数の時系列データのグラフを示す。横軸の表示が 2022-01 から 22/01 に変更できた。
表示回数の推移
表示回数の時系列データをグラフ化する。
plt.plot(df['日付'],df['表示回数'],label='impressions')
plt.plot(df['日付'],df['表示回数'].rolling(7).mean(),label='moving average (7 days)')
plt.plot(df['日付'],df['表示回数'].rolling(28).mean(),label='moving average (28 days)')
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter("%y/%m"))
plt.grid(True)
plt.xlabel('date')
plt.ylabel('impressions')
plt.legend(loc = 'upper left')
plt.savefig("date_impressions.png",dpi=300)
plt.show()
グラフ化した表示回数の推移を以下に示す。
CTR の推移
CTR の時系列データをグラフ化する。
plt.plot(df['日付'],df['CTR'],label='impressions')
plt.plot(df['日付'],df['CTR'].rolling(7).mean(),label='moving average (7 days)')
plt.plot(df['日付'],df['CTR'].rolling(28).mean(),label='moving average (28 days)')
plt.grid(True)
plt.xlabel('date')
plt.ylabel('CTR')
plt.legend(loc = 'upper right')
plt.savefig("date_CTR.png",dpi=300)
plt.show()
グラフ化したCTR の推移を以下に示す。データ前処理で,CTR を数値に変換しているため,CTR の推移をグラフ化できる。
掲載順位の推移
掲載順位の時系列データをグラフ化する。
plt.plot(df['日付'],df['掲載順位'],label='impressions')
plt.plot(df['日付'],df['掲載順位'].rolling(7).mean(),label='moving average (7 days)')
plt.plot(df['日付'],df['掲載順位'].rolling(28).mean(),label='moving average (28 days)')
plt.grid(True)
plt.xlabel('date')
plt.ylabel('ranking')
plt.ylim(30,1)
plt.legend(loc = 'lower right')
plt.savefig("date_ranking.png",dpi=300)
plt.show()
グラフ化した掲載順位の推移を以下に示す。掲載順位の縦軸を反転させるため,plt.ylim(30,1) を記載している。
更新履歴
- 2024年1月4日 横軸の年月データフォーマット変更について追加