序章

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

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

前提条件

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

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

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

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

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

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

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

  1. mkdir timeseries
  2. cd timeseries

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

  1. pip install pandas statsmodels matplotlib

この時点で、作業を開始する準備が整いました pandasstatsmodels.

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

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

  1. jupyter notebook

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

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

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—時系列データを使用したインデックス作成

日付が私たちのインデックスとして設定されていることに気づいたかもしれません pandas DataFrame。 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')

The 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 日付スタンプインデックスを処理する機能であり、データをすばやくスライスできます。 たとえば、データセットをスライスして、1年以降のデータポイントのみを取得できます。 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か月があることを示しています。

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

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

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

y.isnull().sum()
Output
0

これらの操作を実行した後、時系列のすべての欠落している値を正常に埋めたことを確認します。

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

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

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

使用できます pandas ラッパー matplotlib データセットのプロットを表示するAPI:

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

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

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

結論

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

スキルセットをさらに向上させるために、別のデータセットを読み込んで、このチュートリアルのすべての手順を繰り返すことができます。 たとえば、CSVファイルを使用して読み取りたい場合があります。 pandas ライブラリを使用するか、 sunspots プリロードされたデータセット statsmodels 図書館: data = sm.datasets.sunspots.load_pandas().data.