データストレージ上のデータをJupyter Notebookで統計解析

本ページでは、IoTサービスのデータストレージ上に蓄積したデータを、ブラウザベースの分析ツール「Jupyter Notebook」を用いて統計解析する手順を説明します。
データストレージからAPI経由でデータを取得し、データ整形・グラフでの可視化・変化点検知モデルを使ってデータ傾向の変化を捉えるユースケースを紹介します。

 

データ分析環境のセットアップ

データ取得と統計解析用の実行環境を準備しますが、詳細な手順は本マニュアルでは割愛させて頂きます。詳しくは公式サイトのインストール手順に従ってさい。

 

データストレージからのデータ取得・整形

データストレージAPI使用のための情報取得

データストレージAPIの使用に必要なアクセスキーとシークレットアクセスキーをIIJ IoTサービスのコントロールパネルの「API」画面から取得します。

 

IIJ IoTサービスのコントロールパネルの「データストレージ」画面から取得対象のバケット、オブジェクトキーを取得します。
下記例では1オブジェクトのみ選択していますが、必要なデータ数に合わせて複数オブジェクトの取得が必要になります。

 

 

データストレージAPIを利用したデータ取得

データストレージAPIを利用してデータを取得します。APIの詳細な情報は公式マニュアルをご覧下さい。
本マニュアルではPython3を使用したサンプルを例として紹介します。

import requests
import hashlib
import hmac
import base64
import datetime
from datetime import datetime, date, time,timedelta
import urllib.parse
base_url = "https://s3api.iot.iij.jp"
http_verb = "GET"
bucket = "/<対象のバケット>"
object_key = "<対象のオブジェクトキー>"
access_key = "<アクセスキー>"
secret_key = "<シークレットアクセスキー>"
expire_date = (datetime.now() + timedelta(days=1)).strftime("%s")
string_to_sign = http_verb + "\n" + "\n" + "\n" + expire_date + "\n" + bucket + "/" + object_key
hash_string = hmac.new(secret_key.encode("utf-8"), string_to_sign.encode("utf-8"), hashlib.sha1)
signature = urllib.parse.quote(base64.b64encode(hash_string.digest()).decode("utf-8"))
request_url = base_url + bucket + "/" + object_key + "?Expires=" + expire_date + "&IIJGIOAccessKeyId=" + access_key + "&Signature=" + signature
api_result = requests.request(method=http_verb, url=request_url)

 

取得したデータの整形

JSON形式で取得したデータをPandasのデータフレームに整形し、分析処理に適した形式に変換します。

import json
import pandas as pd
timestamp_tmp = []
value_tmp = []
for json_str in api_result.text.splitlines():
    json_dict = json.loads(json_str)
    timestamp_tmp.append(datetime.fromtimestamp(json_dict["timestamp"]/1000))
    value_tmp.append(value = json_dict["payload"]["value"])

df = pd.DataFrame()
df["timestamp"] = timestamp_tmp
df["value1"] = value_tmp
df.head()

※収集してるデータによってデータ構造や欠損値といった条件が異なるため、対象とするデータに合わせて適宜データの整形処理やクレンジングが必要となります。

 

 

取得したデータの解析

時系列グラフの表示

モデルを作る前に取得したデータをグラフ表示し、データの傾向を把握します。

import holoviews as hv
from holoviews import opts
import bokeh
hv.extension('bokeh')
hv.Curve(df, ('timestamp','時刻'), ('value1','取得値') ,label="変数1").opts(width=1200, height=500, show_grid=True)

 

変化点検知モデルの作成

ここではChangeFinderアルゴリズムを用いた変化点検知モデルを作成します。ChangeFinderではデータの大幅な増加・減少が一定期間継続する事象を「変化点」として捉えており、単純な閾値検知ではなく過去の時系列のデータ傾向も考慮した検知が可能です。

モデルに指定するパラメータの詳細はここでは割愛しますが、公式マニュアルを参考にデータ傾向に合わせて調整してください。

import changefinder
from scipy import stats
cf = changefinder.ChangeFinder(r=0.005, order=1, smooth=100)
df_cf = df.copy()
anomaly_scores = []
for i in df_cf["value1"]:
    score = cf.update(i)
    anomaly_scores.append(score)
df_cf["value1_anom"] = anomaly_scores
ch_score_q1 = stats.scoreatpercentile(anomaly_scores, 25) 
ch_score_q3 = stats.scoreatpercentile(anomaly_scores, 75) 
iqr = ch_score_q3 - ch_score_q1
thr_upper = ch_score_q3 + iqr * 3


学習の結果算出された変化スコア(変化の大きさ)を見ると、4つのポイントでスコアが閾値を超えており、データ傾向の変化が起きている可能性が予想されます。

value1_cf_anom = hv.Curve(df_cf, ('timestamp','時刻'), ('value1_anom','取得値') ,label="変数1(変化スコア)")
value1_cf_anom_th = hv.HLine(thr_upper).opts(color='red', line_dash="dotdash")
(value1_cf_anom * value1_cf_anom_th).opts(opts.Curve(width=1200, height=300, show_grid=True))

上記4つの変化ポイントを元のデータに重ね合わせると、データ傾向の急減・急増のポイントを捉えていることがわかります。

anom_points = []
for i, score in enumerate(df_cf["value1_anom"]):
    if score > thr_upper:
        anom_points.append([df_cf["timestamp"][i],df_cf["value1"][i]])
value1_cf_org = hv.Curve(df_cf, ('timestamp','時刻'), ('value1','取得値'),label="変数1")
value1_cf_detected = hv.Points(anom_points, label="検知点").opts(color='red', legend_position='bottom')
(value1_cf_org * value1_cf_detected).opts(opts.Curve(width=1200, height=300, show_grid=True, title="変数1(検知結果)"))

 

 

取得データ・分析結果の外部出力

分析に用いたデータと変化点検知の結果をCSVとして出力します。

df.to_csv("dataframe.csv", sep=',', index=False)
df_cf.to_csv("result.csv", sep=',', index=False)

 

以上、データストレージのデータをAPIを用いて取得し、Jupyter Notebookを用いたデータ解析の例をご紹介させて頂きました。ご紹介した変化点検知アルゴリズムを用いることで、IoTサービスで取得した様々なセンサーデータの人間では捉えることのできない異常を捉えることが可能となります。
データ取得の方法は、今回ご紹介したAPIの方式以外にも、クライアントツールが提供されていますので、より簡単な方法でデータをダウンロードし、ローカルのデスクトップコンピュータ上のExcelや統計解析ソフトを利用してデータ分析を行うことも可能です。