序章

時系列分析は、順序付けられた、多くの場合時間的なデータの研究を含む統計のブランチに属しています。 適切に適用されると、時系列分析は予期しない傾向を明らかにし、有用な統計を抽出し、将来の傾向を予測することさえできます。 これらの理由から、経済学、天気予報、キャパシティプランニングなどの多くの分野に適用されています。

このチュートリアルでは、時系列分析で使用されるいくつかの一般的な手法を紹介し、時系列データを操作および視覚化するために必要な反復手順を説明します。

前提条件

このガイドでは、ローカルデスクトップまたはリモートサーバーのいずれかで時系列分析を行う方法について説明します。 大規模なデータセットの操作はメモリを大量に消費する可能性があるため、いずれの場合も、このガイドの計算の一部を実行するには、コンピュータに少なくとも2GBのメモリが必要です。

このチュートリアルでは、 JupyterNotebookを使用してデータを操作します。 まだお持ちでない場合は、チュートリアルに従って、Python3用のJupyterNotebookをインストールおよびセットアップする必要があります。

ステップ1—パッケージのインストール

データ操作の柔軟性が高いpandasライブラリと、Pythonで統計計算を実行できるstatsmodelsライブラリを活用します。 これら2つのライブラリを一緒に使用すると、Pythonが拡張され、より優れた機能が提供され、分析ツールキットが大幅に向上します。

他のPythonパッケージと同様に、pandasおよびstatsmodelspipとともにインストールできます。 まず、ローカルプログラミング環境またはサーバーベースのプログラミング環境に移りましょう。

  1. cd environments
  1. . my_env/bin/activate

ここから、プロジェクトの新しいディレクトリを作成しましょう。 これをtimeseriesと呼び、ディレクトリに移動します。 プロジェクトを別の名前で呼ぶ場合は、ガイド全体で必ずtimeseriesの代わりに自分の名前を使用してください

  1. mkdir timeseries
  2. cd timeseries

これで、pandasstatsmodels、およびデータプロットパッケージmatplotlibをインストールできます。 それらの依存関係もインストールされます。

  1. pip install pandas statsmodels matplotlib

この時点で、pandasおよびstatsmodelsの操作を開始する準備が整いました。

ステップ2—時系列データのロード

データの操作を開始するには、JupyterNotebookを起動します。

  1. jupyter notebook

新しいノートブックファイルを作成するには、右上のプルダウンメニューから New > Python3を選択します。

Create a new Python 3 notebook

これにより、必要なライブラリをロードできるノートブックが開きます(pandasmatplotlib、およびstatsmodelsを参照するために使用される標準の省略形に注意してください)。 ノートブックの上部に、次のように書く必要があります。

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

このチュートリアルの各コードブロックの後に、ALT + ENTERと入力してコードを実行し、ノートブック内の新しいコードブロックに移動する必要があります。

便利なことに、statsmodelsにはデータセットが組み込まれているため、時系列データセットをメモリに直接読み込むことができます。

1958年3月から2001年12月までのCO2サンプルを収集した、「米国マウナロア天文台の連続大気サンプルからの大気CO2」というデータセットを使用します。 このデータは次のように取り込むことができます。

data = sm.datasets.co2.load_pandas()
co2 = data.data

時系列データの最初の5行がどのように見えるかを確認しましょう。

print(co2.head(5))
Output
co2 1958-03-29 316.1 1958-04-05 317.3 1958-04-12 317.6 1958-04-19 317.5 1958-04-26 316.4

パッケージがインポートされ、CO2データセットの準備ができたら、データのインデックス作成に進むことができます。

ステップ3—時系列データを使用したインデックス作成

pandasDataFrameのインデックスとして日付が設定されていることに気付いたかもしれません。 Pythonで時系列データを操作するときは、日付がインデックスとして使用されていることを確認する必要があるため、常にそれを確認してください。これは、次のコマンドを実行することで実行できます。

co2.index
Output
DatetimeIndex(['1958-03-29', '1958-04-05', '1958-04-12', '1958-04-19', '1958-04-26', '1958-05-03', '1958-05-10', '1958-05-17', '1958-05-24', '1958-05-31', ... '2001-10-27', '2001-11-03', '2001-11-10', '2001-11-17', '2001-11-24', '2001-12-01', '2001-12-08', '2001-12-15', '2001-12-22', '2001-12-29'], dtype='datetime64[ns]', length=2284, freq='W-SAT')

dtype=datetime[ns]フィールドは、インデックスが日付スタンプオブジェクトで構成されていることを確認し、length=2284freq='W-SAT'は、毎週土曜日から2,284の日付スタンプがあることを示します。

週次データは扱いにくい場合があるため、代わりに時系列の月次平均を使用しましょう。 これは、便利なresample関数を使用して取得できます。この関数を使用すると、時系列をバケット(1か月)にグループ化し、関数を各グループ(平均)に適用して、組み合わせることができます。結果(グループごとに1行)。

y = co2['co2'].resample('MS').mean()

ここで、MSという用語は、バケット内のデータを月ごとにグループ化し、各月の開始をタイムスタンプとして使用していることを意味します。

y.head(5)
Output
1958-03-01 316.100 1958-04-01 317.200 1958-05-01 317.120 1958-06-01 315.800 1958-07-01 315.625 Freq: MS, Name: co2, dtype: float64

pandasの興味深い機能は、日付スタンプインデックスを処理できることです。これにより、データをすばやくスライスできます。 たとえば、データセットをスライスして、1990年以降のデータポイントのみを取得できます。

y['1990':]
Output
1990-01-01 353.650 1990-02-01 354.650 ... 2001-11-01 369.375 2001-12-01 371.020 Freq: MS, Name: co2, dtype: float64

または、データセットをスライスして、10月1995と10月1996の間のデータポイントのみを取得することもできます。

y['1995-10-01':'1996-10-01']
Output
1995-10-01 357.850 1995-11-01 359.475 1995-12-01 360.700 1996-01-01 362.025 1996-02-01 363.175 1996-03-01 364.060 1996-04-01 364.700 1996-05-01 365.325 1996-06-01 364.880 1996-07-01 363.475 1996-08-01 361.320 1996-09-01 359.400 1996-10-01 359.625 Freq: MS, Name: co2, dtype: float64

時間データを処理するために適切にインデックス付けされたデータを使用すると、欠落している可能性のある値の処理に進むことができます。

ステップ4—時系列データの欠落値の処理

実世界のデータは乱雑になる傾向があります。 プロットからわかるように、時系列データに欠測値が含まれることは珍しくありません。 これらをチェックする最も簡単な方法は、データを直接プロットするか、以下のコマンドを使用して、出力で欠落しているデータを明らかにすることです。

y.isnull().sum()
Output
5

この出力は、時系列に値が欠落している5か月があることを示しています。

一般に、データにギャップがないように、欠落している値が多すぎない場合は、欠落している値を「埋める」必要があります。 これは、pandasfillna()コマンドを使用して実行できます。 簡単にするために、時系列で最も近いnull以外の値で欠落値を埋めることができますが、ローリング平均が望ましい場合があることに注意することが重要です。

y = y.fillna(y.bfill())

欠落している値が入力されたら、null値が存在するかどうかをもう一度確認して、操作が機能したことを確認できます。

y.isnull().sum()
Output
0

これらの操作を実行した後、時系列のすべての欠落値を正常に入力したことがわかります。

ステップ5—時系列データの視覚化

時系列データを扱う場合、それを視覚化することで多くのことが明らかになります。 注意すべき点は次のとおりです。

  • 季節性データは明確な周期的パターンを表示していますか?
  • トレンドデータは一貫した上向きまたは下向きの勾配に従いますか?
  • ノイズ残りのデータと一致しない外れ値または欠落値はありますか?

matplotlibAPIのpandasラッパーを使用して、データセットのプロットを表示できます。

y.plot(figsize=(15, 6))
plt.show()

Timeseries Visualization Figure 1

データをプロットすると、いくつかの識別可能なパターンが表示されます。 時系列には明らかな季節性パターンがあり、全体的に増加傾向があります。 時系列分解と呼ばれる方法を使用してデータを視覚化することもできます。 その名前が示すように、時系列分解により、時系列をトレンド、季節性、ノイズの3つの異なるコンポーネントに分解できます。

幸い、statsmodelsは、箱から出して季節分解を実行するための便利なseasonal_decompose関数を提供します。 詳細については、次の論文「 STL:Loessに基づく季節トレンド分解手順」を参照してください。

以下のスクリプトは、Pythonで時系列の季節分解を実行する方法を示しています。 デフォルトでは、seasonal_decomposeは比較的小さいサイズの図形を返すため、このコードチャンクの最初の2行は、出力図形が視覚化するのに十分な大きさであることを確認します。

from pylab import rcParams
rcParams['figure.figsize'] = 11, 9

decomposition = sm.tsa.seasonal_decompose(y, model='additive')
fig = decomposition.plot()
plt.show()

Timeseries Seasonal-Trend Decomposition Visualization Figure 2

時系列分解を使用すると、データの変化する平均または変動をすばやく簡単に識別できます。 上のプロットは、データの上昇傾向とその年間の季節性を明確に示しています。 これらは、時系列の構造を理解するために使用できます。 多くの予測方法はこの構造化分解の概念に基づいて予測を生成するため、時系列分解の背後にある直感は重要です。

結論

このガイドに従えば、Pythonで時系列データを視覚化および操作した経験が得られます。

スキルセットをさらに向上させるために、別のデータセットを読み込んで、このチュートリアルのすべての手順を繰り返すことができます。 たとえば、pandasライブラリを使用してCSVファイルを読み取るか、statsmodelsライブラリがプリロードされたsunspotsデータセットを使用することができます: [X156X ]。