時系列データのプロット
実世界のデータの多くは時系列で整理されています。可視化は時系列データのパターンを見出すための優れた方法です。 Matplotlibを使用した時系列データのプロットを試みます。
サンプルデータとして以下を使用します。date列は時系列、value01とvalue02は時系列で変化する計測値列です。
date,value01,value02
2021-01-01,1,100
2021-01-02,3,500
2021-01-03,2,200
2021-01-04,4,600
2021-01-05,3,300
2021-01-06,5,700
2021-01-07,4,400
2021-01-08,6,800
2021-01-09,5,500
2021-01-10,7,900
2021-01-11,6,600
2021-01-12,8,1000
2021-01-13,7,700
2021-01-14,9,1100
2021-01-15,8,800
2021-01-16,10,1200
まずはサンプルデータをインポートします。(日付をインデックスとして)pandas.read_csv
import pandas as pd
df = pd.read_csv('df.csv', parse_dates=['date'], index_col='date')
時系列データの全体をプロットします。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
plt.xticks(rotation=90)
ax.plot(df.index, df['value01'])
ax.set_xlabel('Date')
ax.set_ylabel('Value01')
plt.show()
時系列データのズームインをし、プロットします。ズームインした期間の拡大図が得られます。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
plt.xticks(rotation=90)
# ズームイン
df_zoom_in = df['2021-01-01':'2021-01-05']
ax.plot(df_zoom_in.index, df_zoom_in["value01"])
plt.show()
複数変数の時系列プロット
2つの変数value01とvalue02を同時にプロットしてみると、下記のようにvalue01の特徴を見出すことができなくなります。
理由はvalue01の測定値スケールが1~10まで、value02の100~1200よりずっと小さいから。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
plt.xticks(rotation=90)
ax.plot(df.index, df['value01'])
ax.plot(df.index, df['value02'])
plt.show()
この場合、双軸を使用します。2つの異なるy軸スケールを使用して、同じサブプロットにプロットします。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
plt.xticks(rotation=90)
ax.plot(df.index, df['value01'], color='b')
# X軸を共有する双軸
ax2 = ax.twinx()
ax2.plot(df.index, df['value02'], color='r')
plt.show()
時系列データを多数プロットする場合、プロット用関数を定義してみます。
matplotlib.axes.Axes.tick_params
def plot_timeseries(axes, x, y, color, xlabel, ylabel):
axes.plot(x, y, color=color)
axes.set_xlabel(xlabel)
axes.set_ylabel(ylabel, color=color)
axes.tick_params('y', colors=color)
定義した関数を使ってみます。
fig, ax = plt.subplots()
plt.xticks(rotation=90)
plot_timeseries(ax, df.index, df['value01'], 'blue', 'Date', 'Value01')
ax2 = ax.twinx()
plot_timeseries(ax2, df.index, df['value02'], 'red', 'Date', 'Value02')
plt.show()
時系列データの注釈
注釈を付けることは、可視化を強化する重要な方法です。特定の部分を参照するテキストでデータのいくつかの特徴を強調でき、その特徴を説明します。
fig, ax = plt.subplots()
plt.xticks(rotation=90)
plot_timeseries(ax, df.index, df['value01'], 'blue', 'Date', 'Value01')
ax2 = ax.twinx()
plot_timeseries(ax2, df.index, df['value02'], 'red', 'Date', 'Value02')
ax2.annotate('annotate day', xy=(pd.Timestamp('2021-01-10'), 900),
xytext=(pd.Timestamp('2021-01-10'), 200),
arrowprops={'arrowstyle': '->', 'color': 'gray'})
plt.show()