Python > scikit-learnによる時系列データのクラスタリング

更新日 2019-08-16
広告
Pythonのscikit-learn (sklearn)のKMeansを使って、時系列データを分類(クラスタリング)します。
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from matplotlib import pylab as plt
import seaborn as sns
%matplotlib inline
sns.set()

UC Irvine Machine Learning Repositoryで提供しているデータセットを使います。 電力消費のデータセットです。 https://archive.ics.uci.edu/ml/datasets/ElectricityLoadDiagrams20112014

このデータは、CSV形式ですが、少し特徴があります。 まず、カラムの区切り文字が、カンマ(,)ではなくセミコロン(;)です。 また、各数値の小数点が、ピリオド(.)ではなくカンマ(,)です。 これを考慮して、データをpandasで読み込みます。

# 区切文字に';'を、小数点に','を指定します。
df = pd.read_csv('LD2011.txt', index_col=[0], sep=';', decimal=',')
読み込んだデータdfは、各列が各需要家(370人)になっています。そして、各行が時刻になっています。 sklearnのKMeansは、各行をクラスタリングするので、dfを転置します。
dfT = df.T
dfTは、各行が需要家で、各列が時刻になっています。 それでは試しに、クラスタ数4で、クラスタリングしてみます。
kmeans = KMeans(n_clusters=4)
kmeans.fit(dfT)
少し時間がかかります。 クラスタリングが完了したら、ラベルを見てみます。
labels = kmeans.labels_
print(labels)
以下が、labelsの内容です。
[3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 3 3 3 3 3 3 3 3 3 3 3 3 0 3 0 3 3 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 3 3 3 3 3 0 3 3 0 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 0 3 3 0 3 0 3 0 3 0
 3 3 3 3 3 2 0 3 3 3 3 3 3 3 3 3 3 3 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
 3 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 3 3 3 3 3 3 3 3 0 3 3 3 3 0 3 3 3 3 3
 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3]

全需要家(370人)のラベルです。 0から3のいずれかが割り振られていることがわかります。ほとんど3ですね。 学習をやり直すと、割り振られる番号が変わることがあります。

これは必須ではありませんが、1年分のデータを可視化すると処理が重くなるかもしれないので、1月分のデータだけを抜き出します。

# 1月分のデータを取得
df_jan = df['2011-01-01 00:00:00':'2011-02-01 00:00:00']
では、可視化していきます。 まずはラベル3のデータ。
mt001_jan = df_jan['MT_001']
# 時刻データとして表示すると重くなるので、x軸は単なる連番とする。
x = np.arange(len(mt001_jan))
plt.plot(x, mt001_jan.values)
消費電力がゼロのクラスタですね。わかりやすいです。 次に、ラベル0のデータを一部、表示してみます。
消費電力が500から3500くらいの需要家群ですね。 次は、ラベル1。

毎日の消費電力のアップダウン(10000~30000)が非常に大きい需要家です。

このように、時系列データをクラスタリングできます。 もちろん、クラスタリング数を増やせば、より細かい分類ができます。

広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system