チュートリアル: バッチ検出と Power BI (一変量) を使用して異常を視覚化する
重要
2023 年 9 月 20 日以降は、新しい Anomaly Detector リソースを作成できなくなります。 Anomaly Detector サービスは、2026 年 10 月 1 日に廃止されます。
このチュートリアルを使用して、時系列データ セット内の異常をバッチとして検出します。 Power BI Desktop を使用して、Excel ファイルを取得し、Anomaly Detector API のデータを準備して、全体を通しての統計的異常を視覚化します。
このチュートリアルで学習する内容は次のとおりです。
- Power BI Desktop を使用して時系列データ セットをインポートして変換する
- バッチの異常検出のために Power BI Desktop を Anomaly Detector API と統合する
- 予期された値と確認された値を含み、データ内で見つかった異常と、異常検出の境界を視覚化します。
前提条件
- Azure サブスクリプション
- Microsoft Power BI Desktop (無料で利用可能)。
- 時系列データ ポイントを含む Excel ファイル (.xlsx)。
- Azure サブスクリプションを入手したら、Azure portal で Anomaly Detector リソースを作成し 、キーとエンドポイントを取得します。
- 対象のアプリケーションを Anomaly Detector API に接続するには、作成したリソースのキーとエンドポイントが必要です。 この作業は、このクイックスタートの中で後から行います。
Note
Anomaly Detector API を使用したときに最善の結果を得るには、JSON 形式の時系列のデータに以下の項目を含める必要があります。
- 同じ間隔で区切られたデータ ポイント。予測されるポイント数の 10% しか失われません。
- データに明確な季節性パターンがない場合、少なくとも 12 のデータ ポイント。
- データに明確な季節性パターンがある場合、少なくとも 4 つのパターン オカレンス。
時系列データを読み込んで書式を設定する
開始するには、Power BI Desktop を開き、前提条件からダウンロードした時系列データを読み込みます。 この Excel ファイルには、一連の協定世界時 (UTC) タイムスタンプと値のペアが含まれています。
Note
Power BI では、.csv ファイル、SQL データベース、Azure BLOB ストレージなど、さまざまなソースのデータを使用できます。
Power BI Desktop のメイン ウィンドウで、 [ホーム] リボンを選択します。 リボンの [外部データ] グループで、[データの取得] ドロップダウン メニューを開き、[Excel] を選択します。
ダイアログ ボックスが表示されたら、サンプルの .xlsx ファイルをダウンロードしたフォルダーに移動し、このファイルを選択します。 [ナビゲーター] ダイアログが表示されたら、[Sheet1] を選択してから [編集] を選択します。
Power BI は、最初の列のタイムスタンプを Date/Time
データ型に変換します。 Anomaly Detector API に送信するためには、これらのタイムスタンプをテキストに変換する必要があります。 Power Query エディターが自動的に開かない場合は、ホーム タブで [クエリの編集] を選択します。
Power Query エディターで [変換] リボンを選択します。 [任意の列] グループで [データ型:] ドロップダウン メニューを開き、 [テキスト] を選択します。
列の型の変更について通知されたら、[現在のものを置換] を選択します。 その後、[ホーム] リボンの [閉じて適用] または [適用] を選択します。
データを作成して応答の書式を設定するための関数を作成する
データ ファイルの書式を設定して Anomaly Detector API に送信するために、上記で作成したテーブルに対するクエリを呼び出すことができます。 Power Query エディターの [ホーム] リボンから、[新しいソース] ドロップダウン メニューを開いて、[空のクエリ] を選択します。
新しいクエリが選択されていることを確認してから、[詳細エディター] を選択します。
詳細エディター内で、次の Power Query M スニペットを使用して、テーブルから列を抽出して API に送信します。 その後、クエリにより JSON 応答からテーブルが作成されて返されます。 apiKey
変数を有効な Anomaly Detector API キーに置き換え、endpoint
をエンドポイントに置き換えます。 詳細エディターにクエリを入力したら、[完了] を選択します。
(table as table) => let
apikey = "[Placeholder: Your Anomaly Detector resource access key]",
endpoint = "[Placeholder: Your Anomaly Detector resource endpoint]/anomalydetector/v1.0/timeseries/entire/detect",
inputTable = Table.TransformColumnTypes(table,{{"Timestamp", type text},{"Value", type number}}),
jsontext = Text.FromBinary(Json.FromValue(inputTable)),
jsonbody = "{ ""Granularity"": ""daily"", ""Sensitivity"": 95, ""Series"": "& jsontext &" }",
bytesbody = Text.ToBinary(jsonbody),
headers = [#"Content-Type" = "application/json", #"Ocp-Apim-Subscription-Key" = apikey],
bytesresp = Web.Contents(endpoint, [Headers=headers, Content=bytesbody, ManualStatusHandling={400}]),
jsonresp = Json.Document(bytesresp),
respTable = Table.FromColumns({
Table.Column(inputTable, "Timestamp")
,Table.Column(inputTable, "Value")
, Record.Field(jsonresp, "IsAnomaly") as list
, Record.Field(jsonresp, "ExpectedValues") as list
, Record.Field(jsonresp, "UpperMargins")as list
, Record.Field(jsonresp, "LowerMargins") as list
, Record.Field(jsonresp, "IsPositiveAnomaly") as list
, Record.Field(jsonresp, "IsNegativeAnomaly") as list
}, {"Timestamp", "Value", "IsAnomaly", "ExpectedValues", "UpperMargin", "LowerMargin", "IsPositiveAnomaly", "IsNegativeAnomaly"}
),
respTable1 = Table.AddColumn(respTable , "UpperMargins", (row) => row[ExpectedValues] + row[UpperMargin]),
respTable2 = Table.AddColumn(respTable1 , "LowerMargins", (row) => row[ExpectedValues] - row[LowerMargin]),
respTable3 = Table.RemoveColumns(respTable2, "UpperMargin"),
respTable4 = Table.RemoveColumns(respTable3, "LowerMargin"),
results = Table.TransformColumnTypes(
respTable4,
{{"Timestamp", type datetime}, {"Value", type number}, {"IsAnomaly", type logical}, {"IsPositiveAnomaly", type logical}, {"IsNegativeAnomaly", type logical},
{"ExpectedValues", type number}, {"UpperMargins", type number}, {"LowerMargins", type number}}
)
in results
[パラメーターの入力] の下にある Sheet1
を選択してデータ シートでクエリを呼び出して、[呼び出し] を選択します。
重要
終わったらコードからキーを削除し、公開しないよう注意してください。 運用環境では、Azure Key Vault などの資格情報を格納してアクセスする安全な方法を使用します。 詳細については、Azure AI サービスのセキュリティに関する記事を参照してください。
データ ソースのプライバシーと認証
Note
データのプライバシーとアクセスのための組織のポリシーに注意してください。 詳細については、Power BI Desktop のプライバシー レベルに関するページを参照してください。
クエリは外部データ ソースを利用するため、実行しようとすると警告メッセージが表示されることがあります。
これを解決するには、[ファイル] をクリックしてから、[オプションと設定] を選択します。 次に、[オプション] を選択します。 [現在のファイル] で [プライバシー] を選択して、 [プライバシー レベルを無視し、可能であればパフォーマンスを向上させる] を選択します。
さらに、API に接続する方法を指定するよう求めるメッセージが表示されることもあります。
これを解決するには、メッセージ内の [資格情報を編集] を選択します。 ダイアログ ボックスが表示されたら、 [匿名] を選択して API に匿名で接続します。 次に、 [接続](Connect) を選択します。
その後、[ホーム] リボンの [閉じて適用] を選択して、変更内容を適用します。
Anomaly Detector API 応答を視覚化する
Power BI のメイン画面で、上で作成したクエリの使用を開始して、データを視覚化します。 まず、 [視覚化] で [折れ線グラフ] を選択します。 次に、呼び出された関数から折れ線グラフの [軸] へのタイムスタンプを追加します。 これを右クリックし、 [タイムスタンプ] を選択します。
次に、 [呼び出された関数] の以下のフィールドを、グラフの [値] フィールドに追加します。 下のスクリーンショットを使用すると、グラフの作成に役立ちます。
- 値
- UpperMargins
- LowerMargins
- ExpectedValues
フィールドを追加したら、グラフを選択し、すべてのデータ ポイントが表示されるようにサイズを変更します。 次のようなスクリーンショットのようなグラフが表示されます。
異常データ ポイントを表示する
Power BI ウィンドウの右側にある [フィールド] ウィンドウの [Invoked Function query] (呼び出された関数のクエリ) で [値] を右クリックし、[新しいクイック メジャー] を選択します。
表示される画面で、計算として [フィルターされた値] を選択します。 [基準値] を Sum of Value
に設定します。 次に、 [呼び出された関数] フィールドの IsAnomaly
を [フィルター] までドラッグします。 [フィルター] ドロップダウン メニューから True
を選択します。
[OK] を選択すると、フィールドの一覧の下部に Value for True
フィールドが表示されます。 これを右クリックして、名前を「異常」に変更します。 これをグラフの [値] に追加します。 次に、 [形式] ツールを選択し、X 軸の種類を [カテゴリ別] に設定します。
[形式] ツールで [データの色] を選択して、グラフに色を適用します。 次のようなグラフが表示されます。