Python3を使用した時系列視覚化のガイド
序章
時系列分析は、順序付けられた、多くの場合時間的なデータの研究を含む統計のブランチに属しています。 適切に適用されると、時系列分析は予期しない傾向を明らかにし、有用な統計を抽出し、将来の傾向を予測することさえできます。 これらの理由から、経済学、天気予報、キャパシティプランニングなどの多くの分野に適用されています。
このチュートリアルでは、時系列分析で使用されるいくつかの一般的な手法を紹介し、時系列データを操作および視覚化するために必要な反復手順を説明します。
前提条件
このガイドでは、ローカルデスクトップまたはリモートサーバーのいずれかで時系列分析を行う方法について説明します。 大規模なデータセットの操作はメモリを大量に消費する可能性があるため、いずれの場合も、このガイドの計算の一部を実行するには、コンピュータに少なくとも2GBのメモリが必要です。
このチュートリアルでは、 JupyterNotebookを使用してデータを操作します。 まだお持ちでない場合は、チュートリアルに従って、Python3用のJupyterNotebookをインストールおよびセットアップする必要があります。
ステップ1—パッケージのインストール
データ操作の柔軟性が高いpandas
ライブラリと、Pythonで統計計算を実行できるstatsmodels
ライブラリを活用します。 これら2つのライブラリを一緒に使用すると、Pythonが拡張され、より優れた機能が提供され、分析ツールキットが大幅に向上します。
他のPythonパッケージと同様に、pandas
およびstatsmodels
をpip
とともにインストールできます。 まず、ローカルプログラミング環境またはサーバーベースのプログラミング環境に移りましょう。
cd environments
. my_env/bin/activate
ここから、プロジェクトの新しいディレクトリを作成しましょう。 これをtimeseries
と呼び、ディレクトリに移動します。 プロジェクトを別の名前で呼ぶ場合は、ガイド全体で必ずtimeseries
の代わりに自分の名前を使用してください
mkdir timeseries cd timeseries
これで、pandas
、statsmodels
、およびデータプロットパッケージmatplotlibをインストールできます。 それらの依存関係もインストールされます。
pip install pandas statsmodels matplotlib
この時点で、pandas
およびstatsmodels
の操作を開始する準備が整いました。
ステップ2—時系列データのロード
データの操作を開始するには、JupyterNotebookを起動します。
jupyter notebook
新しいノートブックファイルを作成するには、右上のプルダウンメニューから New > Python3を選択します。
これにより、必要なライブラリをロードできるノートブックが開きます(pandas
、matplotlib
、および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—時系列データを使用したインデックス作成
pandas
DataFrameのインデックスとして日付が設定されていることに気付いたかもしれません。 Pythonで時系列データを操作するときは、日付がインデックスとして使用されていることを確認する必要があるため、常にそれを確認してください。これは、次のコマンドを実行することで実行できます。
co2.index
OutputDatetimeIndex(['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=2284
とfreq='W-SAT'
は、土曜日から毎週2,284個の日付スタンプがあることを示します。
週次データは扱いにくい場合があるため、代わりに時系列の月次平均を使用しましょう。 これは、便利なresample
関数を使用して取得できます。この関数を使用すると、時系列をバケット(1か月)にグループ化し、関数を各グループ(平均)に適用して、組み合わせることができます。結果(グループごとに1行)。
y = co2['co2'].resample('MS').mean()
ここで、MS
という用語は、バケット内のデータを月ごとにグループ化し、各月の開始をタイムスタンプとして使用していることを意味します。
y.head(5)
Output1958-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':]
Output1990-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']
Output1995-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()
Output5
この出力は、時系列に値が欠落している5か月があることを示しています。
一般に、データにギャップがないように、欠落している値が多すぎない場合は、欠落している値を「埋める」必要があります。 これは、 fillna()コマンドを使用してpandas
で実行できます。 簡単にするために、時系列で最も近いnull以外の値で欠落している値を埋めることができますが、ローリング平均が望ましい場合があることに注意することが重要です。
y = y.fillna(y.bfill())
欠落している値が入力されたら、null値が存在するかどうかをもう一度確認して、操作が機能したことを確認できます。
y.isnull().sum()
Output0
これらの操作を実行した後、時系列のすべての欠落している値を正常に埋めたことを確認します。
ステップ5—時系列データの視覚化
時系列データを操作する場合、それを視覚化することで多くのことが明らかになります。 注意すべき点は次のとおりです。
- 季節性:データは明確な周期的パターンを表示していますか?
- トレンド:データは一貫した上向きまたは下向きの勾配に従いますか?
- ノイズ:残りのデータと一致しない外れ値または欠落値はありますか?
matplotlib
APIのpandas
ラッパーを使用して、データセットのプロットを表示できます。
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で時系列データを視覚化および操作した経験が得られます。
スキルセットをさらに向上させるために、別のデータセットを読み込んで、このチュートリアルのすべての手順を繰り返すことができます。 たとえば、pandas
ライブラリを使用してCSVファイルを読み取るか、statsmodels
ライブラリがプリロードされたsunspots
データセットを使用することができます: [X156X ]。