ページの先頭行へ戻る
Symfoware Analytics ServerV12.2.0 利用ガイド
FUJITSU Software

6.3.1 Data Analytics Library for Pythonパッケージを利用したデータ分析

Symfoware Analytics Serverでは、テンソル解析を用いて外れ値検知アルゴリズムを組み込んだData Analytics Library for Pythonパッケージ“pgxa”を提供しています。このパッケージを使用して、Pythonスクリプトを作成することでデータ分析が行えます。パッケージの内容は以下の通りです。

サブモジュール名

説明

pgxa.descca

外れ値検知

パッケージの格納先

パッケージは、以下に格納されています。

/opt/FJSVsymas/ext/PYTHON_PKG/pgxa

6.3.1.1 動作環境

Python2.6以降で動作できます。

6.3.1.2 pgxa.desccat(外れ値検知)

テンソル解析を用いて複数項目を対象にクラスタリングを実施した結果から外れ値を検出します。

大規模離散データから特徴的なデータ集合を検出する場合に使用できます。利用シーンの例としてはサーバのアクセスログから通常のアクセスとは異なる不正アクセスのような異常な動作を検出できます。

従来のクラスタリング手法の課題である大量データに対応するために、クラスタリングは最小記述長原理に基づいた情報量の観点からデータ分割する手法で処理を実施しています。これは、pgxa.desccat.cluster()を実行することで実現できます。

また、数百万件のデータを入力として得られた数万個のクラスタに対してスコアリングを実施することで外れ値を検出します。

このクラスタの評価方法として圧縮率スコアのスコアリング方法を採用しています。

圧縮率スコア(pgxa.desccat.sccomp())は、クラスタ内にあるデータの符号長(ビット数)の圧縮率の平均値およびクラスタリング前のデータを比較して、その差分が大きいほど外れ値として評価します。

pgxa.desccat(外れ値検知)を構成する関数は以下のとおりです。

図6.3 外れ値検知の運用の流れ

  1. データ準備

    対象のデータから外れ値検知として解析する列を選択して、クラスタリング実行時の入力データとします。入力データは、リスト型の辞書によるメモリまたはCSV形式のファイル名を指定してください。

  2. クラスタリング

    準備したデータに対するクラスタリングをpgxa.desccat.cluster()を使用して行います。
    クラスタリングを行ったあと、各レコードにクラスタIDとレコード番号が付与されます。データ構造が類似したクラスタ(レコード集合)が生成されます。

    クラスタIDとは、どのクラスタに分類されたかを示す識別子です。

  3. スコアリング

    クラスタリングの結果を入力とするスコアリング処理をpgxa.desccat.sccomp()を使用して行います。
    圧縮率スコアが大きいものほどクラスタ内のレコード集合に外れ値があることを示します。このスコアをもとに圧縮率スコアが大きいクラスタに注目した分析および元データの内容と組み合わせたその他の分析を実施してください。また、圧縮率スコアが大きいクラスタに想定した特徴がみられない場合は、データ準備の列の選択から再度実施してください。

6.3.1.2.1 pgxa.desccat.cluster()

最小記述長に基づいたクラスタリングを行います。

書式

clusterdata = pgxa.desccat.cluster(
    data=None,
    colcnt=1,
    loop=100,
    loop_divide=100,
    loop_marge=100,
    epsilon1=0.01,
    epsilon2=0.01)

パラメーター

引数

パラメーター

必須

説明

第1引数

data

入力データをメモリまたはファイル名で指定します。

  • メモリ

    defaultdict(list)型で引数を指定します。また、listにはカラム数分のデータを設定して、defaultdictには入力レコード数分のデータを設定します。

  • ファイル名

    str型でCSV形式のファイル名を指定します。CSVファイルのデータ形式の詳細は、“第1引数にファイル名で指定した場合の指定方法”を参照してください。

  • 上記以外

    エラーになります。

第2引数

colcnt

カラム数をint型で指定します。省略した場合は、デフォルト値の1を採用します。

  • dataにメモリを指定した場合

    省略可能です。

  • dataにファイル名を指定した場合

    必ず指定してください。

第3引数

loop

クラスタリング全体の最大ループ数をint型で指定します。1~100000の範囲で指定してください。省略した場合は、デフォルト値の100を採用します。

なお、通常はデフォルト値を指定してください。値を小さくすると処理速度が早くなりクラスタリングの精度が落ちる場合があります。

第4引数

loop_divide

クラスタ分割時の最大ループ数をint型で指定します。1~100000の範囲で指定してください。省略した場合は、デフォルト値の100を採用します。

なお、通常はデフォルト値を指定してください。値を小さくすると処理速度が早くなりクラスタリングの精度が落ちる場合があります。

第5引数

loop_marge

クラスタ結合時の最大ループ数をint型で指定します。1~100000の範囲で指定してください。省略した場合は、デフォルト値の100を採用します。

なお、通常はデフォルト値を指定してください。値を小さくすると処理速度が早くなりクラスタリングの精度が落ちる場合があります。

第6引数

epsilon1

クラスタ分割時の評価値幅係数をfloat型で指定します。0~100の範囲でfloat型の実数値で指定してください。ただし、0は含みません。
省略した場合は、デフォルト値の0.01を採用します。

データの内容により、クラスタを作成せずに終了する場合があります。その場合には、本引数の値を大きくすることでクラスタが生成されやすくなります。

第7引数

epsilon2

クラスタ結合時の評価値幅係数をfloat型で指定します。0~100の範囲でfloat型の実数値で指定してください。ただし、0は含みません。
省略した場合は、デフォルト値の0.01を採用します。

データの内容により、クラスタを作成せずに終了する場合があります。その場合には、本引数の値を大きくすることでクラスタが生成されやすくなります。ただし、第6引数の影響は小さいです。

注意

  • ループ数の変更は、第3引数loopを優先して変更してください。

  • 評価値係数の変更は、第6引数epsilon1を優先して変更してください。

入力データは、カラム数の指定値に合わせて設定します。また、カラムに対応するデータ型は文字列で指定してください。

戻り値

パラメーター

説明

clusterdata

クラスタリング結果データが返却されます。入力データの先頭2列にデータが追加されdefaultdict(list)型で返却されます。list型の先頭に第1列目クラスタID(int型)、第2列目レコード番号(int型)が追加されます。

クラスタリング結果データの出力を示します。

クラスタIDには、どのクラスタに分類されたかを示す識別子が1~レコード数の範囲で設定されます。また、レコード番号は入力データの行番号が設定されます。

例)

レコード

list[0]
クラスタID

list[1]
レコード番号

list[2]
入力データ(list型にカラム数分をセット)

dict[1](list)

10

1

"a.a.a.a"

"b.b.b.b"

80

dict[2](list)

15

3

"c.c.c.c"

"b.b.b.b"

1234

dict[3](list)

31

2

"b.b.b.b"

"d.d.d.d"

80

例外

処理中に異常が発生した場合は、例外オブジェクトが返却されます。例外オブジェクトのメッセージ番号およびエラーメッセージの内容を参照して対処してください。

例外オブジェクト

説明

pgxa.desccat.DesccatInputError

入力パラメーターに誤りがあります。以下の情報を返却します。

  • msgno

    メッセージ番号をint型で返却します。

  • errmsg

    エラーメッセージをstr型で返却します。

pgxa.desccat.DesccatClusterError

クラスタリング処理中にエラーが発生しました。以下の情報を返却します。

  • msgno

    メッセージ番号をint型で返却します。

  • errmsg

    エラーメッセージをstr型で返却します。

実行例

import pgxa.desccat
from collections import defaultdict
data = defaultdict(list)
col = []
col.append("135.008.060.182")
col.append("172.016.112.050")
col.append(1106)
col.append(25)
data[1] = col
## data add #
try:
clusterdata = pgxa.desccat.cluster( data, 0, 100, 100, 100, 0.01, 0.01 );
except DesccatInputError , DesccatInternalError , DesccatClusterError  as e:
	print e.msgno :: e.msg
6.3.1.2.2 pgxa.desccat.sccomp()

pgxa.desccat.clusterの出力結果に対して圧縮率スコアを算出します。

書式

sccomp = pgxa.desccat.sccomp (clusterdata)

パラメーター

引数

パラメーター

必須

説明

第1引数

clusterdata

pgax.desccat.clusterの出力結果を指定します。

戻り値

パラメーター

説明

sccomp

圧縮率スコアが返却されます。defaultdict(list)型で返却されます。クラスタID分のレコードが返却され、レコードの内容はlist型で以下の値が返却されます

1項目:圧縮率スコア

2項目:クラスタID

3項目:クラスタ内レコード数

圧縮率スコアの出力を示します。

例)

データ型

list[0]
圧縮率スコア

list[1]
クラスタID

list[2]
クラスタ内レコード数

defaultdict [1](list)

2.639857

15

70

defaultdict [2](list)

2.639857

31

24

defaultdict [3](list)

2.13068

10

3

例外

処理中に異常が発生した場合は、例外オブジェクトが返却されます。例外オブジェクトのメッセージ番号およびエラーメッセージの内容を参照して対処してください。

例外オブジェクト

説明

pgxa.desccat.DesccatInputError

入力パラメーターに誤りがあります。以下の情報を返却します。

  • msgno

    メッセージ番号をint型で返却します。

  • errmsg

    エラーメッセージをstr型で返却します。

pgxa.desccat.DesccatScoreError

スコアリング処理中にエラーが発生しました。以下の情報を返却します。

  • msgno

    メッセージ番号をint型で返却します。

  • errmsg

    エラーメッセージをstr型で返却します。

6.3.1.2.3 サンプルスクリプト

Symfoware Analytics Serverでは、Data Analytics Library Pythonパッケージを利用したデータ分析を行うサンプルスクリプトを提供しています。

pgxa.desccat.clusterおよびpgxa.desccat.sccompを用いて、クラスタリングおよびスコアリング結果を出力するサンプルスクリプトを以下に格納しています。

格納先)
/opt/FJSVsymas/template/python/desccat_test.py

サンプルスクリプトをもとに、実際に使用するスクリプトを作成してください。

サンプルスクリプトの処理の流れは以下の通りです。

  1. 入力データの作成

  2. クラスタリングの実行(pgxa.desccat.cluster)

  3. スコアリングの実行(pgxa.desccat.sccomp)

サンプルスクリプトの実行結果を以下に示します。

実行結果)
# PYTHONPATH=/opt/FJSVsymas/ext/PYTHON_PKG python /opt/FJSVsymas/template/python/desccat_test.py
## Input Data ##
['135.008.060.182', '172.016.112.050', 1106, 25]
['111.222.111.033', '172.016.112.050', 99, 25]
Clustering:OK
## Clustering Result ##
[1, 1, ['135.008.060.182', '172.016.112.050', 1106, 25]]
[2, 2, ['111.222.111.033', '172.016.112.050', 99, 25]]
Scoreing:OK
## Scoreing Result   ##
[0.6931471805599453, 2, 1]
[0.6931471805599453, 1, 1]