SPSS Modeler ヒモトク
ブログで学ぶSPSS_Modeler #11- 時系列データを扱う「シーケンス関数」をおさらいしよう!前編
2022年11月04日
カテゴリー Data Science and AI | SPSS Modeler ヒモトク | アナリティクス | データサイエンス
記事をシェアする:
皆様こんにちは。株式会社AITの林と申します。前回の登場からはや2年。時が過ぎるのは早いですね。
弊社はIBM製品の販売、導入、サポートを主な業務とするビジネスパートナーです。
私は2年前と変わらずSPSS Modelerを中心にアナリティクス製品全般の技術担当マネージャーとして、SPSS等のソリューションの導入やデータ分析のお手伝いをさせていただいております。
さて、今回のお題は「SPSS Modeler春のオンラインユーザーイベント2022」でも取り上げられていた、時系列データの扱いには欠かせない「シーケンス関数」についてです。
他のブログ記事でも何回も登場していますが、 弊社お客様からも、
- 「ユーザー会で拝見した@OFFSET関数について教えてほしい!」
- 「時系列データから特徴量を作成するにはどうすればよいのか?」
というご要望やご質問をいただいておりましたので、この機会にまとめてみようと思いました。 センサーデータや時系列データを扱う上で、とても役立つ関数です。ぜひ参考にしてみてください!
対象の関数は?
CLEM式ビルダーの関数の一覧に「シーケンス」というグループがあります。この「シーケンス」を選択して表示される関数を今回ご紹介します。
なんと、28種類もあります。しかし、よく見ると同じ関数名で引数の数が異なるものや番号が付与されているものなど似たような関数が複数ありますね。 ちょっと分類してみましょう。
・統計量計算系
一つ目は統計量の計算に役立つ関数です。
一覧にまとめた関数は、名称からある程度仕様が想像できますよね。15個ありますが基本5種類だと思って大丈夫です。
・差分計算系
差分を計算するDIFF関数です。ただ単純な差分計算だけではありません。
・特殊関数系
最後のグループです。名称からすぐには仕様が想像できない関数もありますね。特殊な働きをする関数たちです。
全部で9個ありますが、中でも@OFFSET関数はとても便利な関数ですので、今回のブログを参考に活用してみてください。
シーケンス関数を利用する前に
今回利用する主なデータは円山動物園の日次入園者数データです。札幌市のHPで公開されております。
※ https://ckan.pf-sapporo.jp/dataset/sapporo_maruyama_zoo_visitors
時系列データを扱う場合やシーケンス関数を利用する場合は、必ず分析者がデータの順序を確認してください。
データを理解して意図した順番にデータをソートしておきましょう。今回のデータは日付順に整理されていますが、データによっては整理されていない場合もあります。
統計量計算してみる
まずは、統計量を計算する15個の関数を紹介します。引数の数が異なる以外、同じ関数名のものについては、同じ統計量を計算してくれます。
①SUM(FIELD) < MAX, MIN, SDEV, MEAN >
SUM<MAX/MIN/SDEV/MEAN>関数の引数が1つのバージョンです。引数にはFIELDを指定します。
この関数の仕様は読み込んだレコードまでの全レコードの値を集計してくれます。3レコードまで読み込んだ場合は3レコード分を集計します。
2018/1/1から2018/1/10までの入園者数があります。
@SUMはレコードを読込むたびに入園者数を足していき、結果的に累積の入園者数を計算してくれていますね。最初の3日間で7056名、10日間で15714名の入園がありました。1/10は休園でようですね。
@MEAN/MAX/MIN/SDEVもレコードを読込みながら平均、最大値、最小値、標準偏差を計算してくれます。
例では、@SUM、@SDEV関数の記述方法を説明していますが、関数名が異なる以外は、記述方法は一緒<@XXXX(FIELD)>です。
②SUM(FIELD, EXPR) < MAX, MIN, SDEV, MEAN >
SUM<MAX/MIN/SDEV/MEAN>関数の引数が2つのバージョンです。第2引数のEXPRで指定した数値分のレコードのFIELD値を集計してくれる関数です。
例えば、EXPRに3を指定することで自身のレコードを含め3レコード分の集計値を計算してくれます。
上記の例で、@MEANは3日間移動平均を計算してくれていることになりますね。@SUM/MAX/MIN/SDEVも同様に3日分のレコードからの計算値です。
③SUM(FIELD, EXPR, INT) < MAX, MIN, SDEV, MEAN >
SUM<MAX/MIN/SDEV/MEAN>関数の引数が3つのバージョンです。 第3引数のINTには整数を入力します。
EXPRで指定されたレコード分集計対象とするのですが、INTで指定した値を超えては集計できない関数となります。
上記の例を解説します。
- 「A:総入園者数」を1週間単位で集計することが目的です。(日曜日起点)
- 1週間単位で集計するために、週単位がわかるように日付に日曜(1)~土曜(7)の数値をdatetime_weekday関数で付与しました。※WEEKDAYフィールド
- 1週間単位のため最大7つのレコードを集計する必要がありますが、前週のレコードは集計対象としたくありません。そのためにWEEKDAYフィールドの数値を利用します。日曜なら1レコードだけ集計。月曜は日曜と合わせて2レコードまで集計というロジックを考えます。
- @SUM(FIELD, 7, WEEKDAY)と記述することで、基本7レコードまで集計するがWEEKDAYの値で上限数を制御しています。日曜日なら1,土曜日なら7がWEEKDAYに代入され、意図したように集計されます。
この関数の説明のために少しイレギュラーなストリームを作成しましたが、 @SUM(A:総入園者数, WEEKDAY)と、集計対象を可変にするように書いても同じ計算となります。
差分を計算してみる
つづいて、DIFF関数について説明をしていきます。
DIFF1(FIELD)関数はわかりやすいと思います。
DIFF2(FIELD)関数とDIFF1(FIELD1, FIELD2)関数で?となり始め、
DIFF2(FIELD1, FIELD2)に至っては??となり、最初使用したときは、どんな計算しているの?となります。 一つ一つ、確認して理解をしていきましょう!
① DIFF1(FIELD)
DIFF1(FIELD)関数は1レコード前の指定したフィールドの差分を計算します。
「B:有料入園者数」と「C:無料入園者数」の差分を計算しています。 DIFF1(FIELD)関数は、「自身のレコード – 1つ前のレコード」が計算式となります。
②DIFF2(FIELD)
DIFF2(FIELD)関数は「差分の差分」を計算します。<2つ前のレコードと1つ前のレコードの差分> と <1つ前のレコ-ドと現行レコードの差分>の差分を計算。差分差分差分。。。例で見たほうがわかりやすいですね。
まずは、2018/1/1~2018/1/3までのレコードに注目してください。「B:有料入園者数」の差分を計算したのが「DIFF1_有料」のフィールドの値です。続いて「DIFF2_有料」のフィールドの値を見てみましょう。「DIFF1_有料」の値の差分になっていることがわかると思います。
DIFF2(B:有料入園者数)とすることで、差分の差分を計算してくれているのです。 C:無料入園者数のフィールドについても同様の計算をしています。
③DIFF1(FIELD1, FIELD2)
DIFF1(FIELD1 , FIELD2)関数は2つフィールドを指定することで、<FIELD1の差分>と<FIELD2の差分>を除算(割り算)した値を計算します。
「DIFF1_FF」の値が、「DIFF1_有料」と「DIFF1_無料」を割り算した値と同値であることがわかります。「B:有料入園者数」と「C:無料入園者数」それぞれの差分の値が「DIFF1_有料」と「DIFF1_無料」です。 データ例が適切ではないで理解しにくいのですが、例えば、移動時間と移動距離の関係を例にしてみると、 DIFF1(移動距離、移動時間) = 距離/時間 = 速度 ですよね。 そう、DIFF1(FIELD1,FIELD2)関数は、レコード間における速度(平均速度)のような値を計算してくれる関数なのです。
④DIFF2(FIELD1, FIELD2)
さて、最難関の関数の登場です。DIFF1(FIELD1,FIELD2)と同じような感じ?ではないのです。さてここでは今まで登場したDIFF1(FIELD1,FIELD2)関数とDIFF1(FIELD) を総動員します。下がDIFF2(FIELD1, FIELD2)の計算式です。
さて上記の例を確認しましょう。 「DIFF1_FF」は「B:有料入園者数」と「C:無料入園者数」の差分の除算を計算しているフィールドです。 DIFF1_無料が「C:無料入園者数」の差分の値です。「DIFF2_FF」がDIFF2(FIELD1, FIELD2)の関数で計算したフィールドです。2018/1/2と2018/1/3のレコードで下の式に当てはめると、
( 0.919 – (-4.162) ) / 136 ≒ 0.037 となります。
<差分の除算>の差分を<FIELD2の差分>で除算していますね。 データの例があまり適切でないので意味が分からなくなりますが、移動時間と移動距離の関係で考えてみると
- DIFF1(移動距離、移動時間) = 距離/時間 = 速度 ですね。
- DIFF2(移動距離、移動時間) = 速度の差分 / 時間 = 加速度 となりますね。
そうDIFF2(FIELD1,FIELD2)はレコード間における加速度(平均加速度)のような値を計算できる関数なのです。 データを時間と距離のデータでやってみました。下記が出力例です。若干速度と加速度の値が異なりますね。測定データはその時点で測定したもので、DIFF関数はレコード間の差分から求めた値のため、その違いから差が発生しています。
>後編へ続く
→これまでのSPSS Modelerブログ連載のバックナンバーはこちら
→SPSS Modelerノードリファレンス(機能解説)はこちら
→SPSS Modeler 逆引きストリーム集(データ加工)はこちら
林 啓一郎
株式会社AIT 開発事業本部 ソリューション戦略第2部 次長
データ分析者達の教訓 #21- 異常検知には異常を識別する「データと対象への理解」が必要
Data Science and AI, SPSS Modeler ヒモトク, アナリティクス...
皆さんこんにちは。IBMの宮園です。IBM Data&AIでデータサイエンスTech Salesをしています。 このリレー連載ブログはSPSS Modelerの実際のユーザーで第一線で活躍するデータ分析者に、デー ...続きを読む
【予約開始】「SPSS秋のユーザーイベント2024」が11月27日にオンサイト開催
Data Science and AI, SPSS Modeler ヒモトク, アナリティクス...
本年6月800名を超える方々にオンライン参加いただいたSPSS春のユーザーイベントに続き、『秋のSPSSユーザーイベント』を11月27日に雅叙園東京ホテルにて現地開催する運びとなりました。 このイベントは ...続きを読む
データ分析者達の教訓 #20- 分析プロジェクトはスピードが命。鉄もデータも熱いうちに打て
Data Science and AI, SPSS Modeler ヒモトク, アナリティクス...
皆さんこんにちは。山下研一です。IBM Data&AIでデータサイエンスTech Salesをしています。 このリレー連載ブログはSPSS Modelerの実際のユーザーで第一線で活躍するデータ分析者に、データ活 ...続きを読む