python 時系列データの前期伸び率、前年同期比伸び率、四半期移動平均を計算する


統計検定 2級で、産業系の指数の、前期比伸び率、前年同期比伸び率、四半期移動平均を答える問題が出題されます。
python で、指数の時系列データを読み込んで、前期比伸び率、前年同期比伸び率、四半期移動平均 の計算ができるか試してみました。
結果を以下に記載します。


入力データについて

最新結果の概要|全産業活動指数|経済産業省 の、時系列表 > 原指数 の時系列データを計算に用います。


使用するライブラリについて

計算には以下のライブラリを用います。

移動平均

  • numpy
  • pandas

各月ごとに計算する

ファイルの読み込み

各値の計算をするため、まずファイルを読み込みます。

# データの読み込み
import pandas as pd
df1 = pd.read_table("All-industry-activity-index.tsv")
df1
日付原指数
02017/03113.6
12017/04101.8
22017/05100.9
32017/06105.3
42017/07105.0
52017/08103.3
62017/09106.5
72017/10105.0
82017/11105.2
92017/12111.2
102018/01101.1
112018/02100.8
122018/03114.9
132018/04103.2
142018/05102.5

グラフ描画

原指数のグラフを描画します。

%matplotlib inline
import matplotlib.pyplot as plt
# matplotlib の設定を調整   
plt.rcParams['font.family'] = 'IPAPGothic' #全体のフォントを設定
plt.rcParams["figure.figsize"] = [12, 6]
plt.rcParams['font.size'] = 20 #フォントサイズを設定 default : 12
plt.rcParams['xtick.labelsize'] = 15 # 横軸のフォントサイズ
plt.rcParams['ytick.labelsize'] = 15
df1.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x115efec88>

png

前月比を追加する

diff で前月との差分、pct_change で変化率、rolling で移動平均を計算できます。

df1['前月差分']= df1['原指数'].diff()
df1['変化率']= df1['原指数'].pct_change()
df1['移動平均'] = df1['原指数'].rolling(window=3, center=False).mean()
df1.head()
日付原指数前月差分変化率移動平均
02017/03113.6NaNNaNNaN
12017/04101.8-11.8-0.103873NaN
22017/05100.9-0.9-0.008841105.433333
32017/06105.34.40.043608102.666667
42017/07105.0-0.3-0.002849103.733333

移動平均の 1番目、2番目がNaN なのは、window指定が 3 のためです。
続いて原指数と、移動平均のグラフを描いてみます。

df1.loc[:,['移動平均','原指数']].plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1161e0ac8>

png


四半期ごとに計算する

元データは、毎月ごとの時系列データになっています。これを、DatetimeIndex の quarter を使用して四半期ごとに集計します。

四半期ごとにデータをグルーピングする

# データの読み込み
import pandas as pd
df2 = pd.read_table("All-industry-activity-index.tsv")

#  日付 を DatetimeIndex に変換、INDEXとして設定
df2 = df2.set_index(pd.DatetimeIndex(df['日付']))
#  DatetimeIndex  に四半期ごとにグループ化    
df_q = df2.set_index([df2.index.quarter, df2.index.year,  df2.index])
df_q.index.names = ['quarter', 'year', 'date']
df_q
日付原指数
quarteryeardate
120172017-03-012017/03113.6
220172017-04-012017/04101.8
2017-05-012017/05100.9
2017-06-012017/06105.3
320172017-07-012017/07105.0
2017-08-012017/08103.3
2017-09-012017/09106.5
420172017-10-012017/10105.0
2017-11-012017/11105.2
2017-12-012017/12111.2
120182018-01-012018/01101.1
2018-02-012018/02100.8
2018-03-012018/03114.9
220182018-04-012018/04103.2
2018-05-012018/05102.5
df_q = df_q.mean(level=['quarter','year'])
df_q['前期比伸び率']= df_q['原指数'].pct_change()
df_q['前年同期比伸び率'] = (df_q['原指数'] - df_q['原指数'].shift(4)) / df_q['原指数']
df_q['四半期移動平均'] = df_q['原指数'].rolling(window=4, center=True).mean()
df_q
原指数前期比伸び率四半期移動平均前年同期比伸び率
quarteryear
12017113.600000NaNNaNNaN
22017102.666667-0.096244NaNNaN
32017104.9333330.022078107.083333NaN
42017107.1333330.020966105.083333NaN
12018105.600000-0.014312105.129167-0.075758
22018102.850000-0.026042NaN0.001783

pandas の rolling だと、偶数の中心化移動平均の計算は実行できないようです。
続いて原指数と、移動平均のグラフを描いてみます。

df_q.loc[:,['四半期移動平均','原指数']].plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1166f8630>

png

四半期の移動平均は、前後の点が少ないため、あまり算出できていません。    
四半期のデータではない場合もmin_periods を指定することで、計算に必要なデータが少ない場合も、移動平均を算出することができます。        

参考

以下、参考にした記事になります。

以上です。

コメント