チュートリアル: バッチ検出とPower BI (一変量) を使用して異常を視覚化する

重要

2023 年 9 月 20 日から、新しい Anomaly Detector リソースを作成することはできません。 Anomaly Detector サービスは、2026 年 10 月 1 日に廃止されます。 オープンソースのmicrosoft/anomaly-detectorを統合するMicrosoft Fabricに移行するか、オープンソースの anomaly-detector プロジェクトに直接移行することをお勧めします。

このチュートリアルを使用して、時系列データ セット内の異常をバッチとして検出します。 Power BIデスクトップを使用すると、Excel ファイルを取得し、Azure AI Anomaly Detectorのデータを準備し、その全体で統計的な異常を視覚化します。

このチュートリアルで学習する内容は次のとおりです。

  • Power BI Desktop を使用して時系列データ セットをインポートおよび変換する
  • Power BI Desktop とバッチ異常検出のAzure AI Anomaly Detectorを統合する
  • 予期された値と確認された値を含み、データ内で見つかった異常と、異常検出の境界を視覚化します。

前提条件

最良の結果を得るために、Azure AI Anomaly Detector を利用する場合は、JSON 形式の時系列データに次の要素を含めてください。

  • 同じ間隔で区切られたデータ ポイント。予測されるポイント数の 10% しか失われません。
  • データに明確な季節性パターンがない場合、少なくとも 12 のデータ ポイント。
  • データに明確な季節性パターンがある場合、少なくとも 4 つのパターン オカレンス。

時系列データを読み込んで書式を設定する

開始するには、Power BI Desktop を開き、前提条件からダウンロードした時系列データを読み込みます。 この Excel ファイルには、一連の協定世界時 (UTC) タイムスタンプと値のペアが含まれています。

Power BIでは、.csv ファイル、SQL データベース、Azure BLOB ストレージなど、さまざまなソースからのデータを使用できます。

メイン Power BI デスクトップ ウィンドウで、Home リボンを選択します。 リボンの External data グループで、Get Data ドロップダウン メニューを開き、Excel を選択します。

Power BI の「データの取得」ボタンの画像

ダイアログ ボックスが表示されたら、サンプルの .xlsx ファイルをダウンロードしたフォルダーに移動し、このファイルを選択します。 [ナビゲーター] ダイアログが表示されたら、[Sheet1] を選択してから [編集] を選択します。

Power BI のデータ ソース「ナビゲーター」画面の画像

Power BIは、最初の列のタイムスタンプを Date/Time データ型に変換します。 Azure AI Anomaly Detectorに送信するには、これらのタイムスタンプをテキストに変換する必要があります。 Power Query エディターが自動的に開かない場合は、[ホーム] タブで Edit Queries を選択します。

Power Query エディターで Transform リボンを選択します。 [任意の列] グループで [データ型:] ドロップダウン メニューを開き、[テキスト] を選択します。

[データ型] ドロップ ダウンの画像

列の型の変更について通知されたら、[現在のものを置換] を選択します。 その後、[ホーム] リボンの [閉じて適用] または [適用] を選択します。

データを作成して応答の書式を設定するための関数を作成する

データ ファイルを書式設定してAzure AI Anomaly Detectorに送信するには、上記で作成したテーブルに対してクエリを呼び出します。 Power Query エディターで、Home リボンから New Source ドロップダウン メニューを開き、 Blank Query を選択します。

新しいクエリが選択されていることを確認し、詳細エディターを選択します。

詳細エディター内で、次の Power Query M スニペットを使用してテーブルから列を抽出し、API に送信します。 その後、クエリにより JSON 応答からテーブルが作成されて返されます。 apiKey 変数を有効なAzure AI Anomaly Detector キーに置き換え、endpointをエンドポイントに置き換えます。 詳細エディターにクエリを入力したら、Done を選択します。

(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 サービス security に関する記事を参照してください。

データ ソースのプライバシーと認証

データのプライバシーとアクセスのための組織のポリシーに注意してください。 詳細については、「Power BI デスクトップのプライバシー レベル」を参照してください。

クエリは外部データ ソースを利用するため、実行しようとすると警告メッセージが表示されることがあります。

Power BI によって作成された警告を示す画像

これを解決するには、[ファイル] をクリックしてから、[オプションと設定] を選択します。 次に、[オプション] を選択します。 [現在のファイル][プライバシー] を選択して、[プライバシー レベルを無視し、可能であればパフォーマンスを向上させる] を選択します。

さらに、API に接続する方法を指定するよう求めるメッセージが表示されることもあります。

アクセス資格情報を指定する要求が表示されているイメージ

これを解決するには、メッセージ内の [資格情報を編集] を選択します。 ダイアログ ボックスが表示されたら、[匿名] を選択して API に匿名で接続します。 次に、[接続]\(Connect\) を選択します。

その後、[ホーム] リボンの [閉じて適用] を選択して、変更内容を適用します。

Azure AI Anomaly Detector応答を視覚化する

メインのPower BI画面で、上記で作成したクエリを使用してデータを視覚化します。 まず、[視覚化][折れ線グラフ] を選択します。 次に、呼び出された関数から折れ線グラフの [軸] へのタイムスタンプを追加します。 これを右クリックし、[タイムスタンプ] を選択します。

タイムスタンプ値を右クリックしている

次に、[呼び出された関数] の以下のフィールドを、グラフの [値] フィールドに追加します。 下のスクリーンショットを使用すると、グラフの作成に役立ちます。

  • UpperMargins
  • ロワーマージン
  • 期待値

グラフ設定の画像

フィールドを追加したら、グラフを選択し、すべてのデータ ポイントが表示されるようにサイズを変更します。 次のようなスクリーンショットのようなグラフが表示されます。

グラフの視覚化の画像

異常データ ポイントを表示する

Power BI ウィンドウの右側にある FIELDS ペインの下にある Invoked Function クエリの下にある Value を右クリックし、New クイック メジャー を選択します。

新しいクイック メジャー画面のイメージ

表示される画面で、計算として [フィルターされた値] を選択します。 [基準値]Sum of Value に設定します。 次に、IsAnomaly フィールドの [フィルター] までドラッグします。 True ドロップダウン メニューから を選択します。

新しいクイック メジャー画面のイメージ 2

[OK] を選択すると、フィールドの一覧の下部に Value for True フィールドが表示されます。 これを右クリックして、名前を「異常」に変更します。 これをグラフの [値] に追加します。 次に、[形式] ツールを選択し、X 軸の種類を [カテゴリ別] に設定します。

X 軸の形式変更の画像

[形式] ツールで [データの色] を選択して、グラフに色を適用します。 次のようなグラフが表示されます。

完成したグラフの画像