자습서: 일괄 처리 검색 및 Power BI를 사용하여 변칙 시각화(일변량)

Important

2023년 9월 20일부터 새 Anomaly Detector 리소스를 만들 수 없습니다. Anomaly Detector 서비스는 2026년 10월 1일에 사용 중지됩니다.

이 자습서를 사용하여 시계열 데이터 집합 내의 변칙을 일괄 처리로 찾습니다. Power BI 데스크톱을 사용하여 Excel 파일을 가져와 Anomaly Detector API에 대한 데이터를 준비하고 전체 통계 변칙을 시각화합니다.

이 자습서에서는 다음 작업을 수행하는 방법을 알아봅니다.

  • Power BI Desktop을 사용하여 시계열 데이터 집합 가져오기 및 변환
  • 일괄 처리 변칙 검색을 위해 Anomaly Detector API와 Power BI Desktop 통합
  • 예상 값, 표시 값 및 변칙 검색 경계를 포함하여 데이터 내에서 검색된 변칙 시각화

필수 조건

참고 항목

Anomaly Detector API를 사용할 때 최상의 결과를 얻으려면 JSON 형식 시계열 데이터에 다음이 포함되어야 합니다.

  • 예상되는 누락된 요소 수가 10% 이하이고 동일한 간격으로 구분된 데이터 요소
  • 데이터에 명확한 계절 패턴이 없는 경우 12개 이상의 데이터 요소가 있습니다.
  • 데이터에 명확한 계절 패턴이 있는 경우 적어도 4개의 패턴이 발생합니다.

시계열 데이터 로드 및 서식 지정

시작하려면 Power BI Desktop을 열고 필수 구성 요소에서 다운로드한 시계열 데이터를 로드합니다. 이 Excel 파일에는 일련의 UTC(협정 세계시) 타임스탬프 및 값 쌍이 포함되어 있습니다.

참고 항목

Power BI는 .csv 파일, SQL 데이터베이스, Azure Blob Storage 등과 같은 다양한 원본의 데이터를 사용할 수 있습니다.

기본 Power BI Desktop 창에서 홈 리본을 선택합니다. 리본의 외부 데이터 그룹에서 데이터 가져오기 드롭다운 메뉴를 열고 Excel을 선택합니다.

An image of the

대화 상자가 나타나면 예제 .xlsx 파일을 다운로드한 폴더로 이동하여 선택합니다. 탐색기 대화 상자가 나타나면 Sheet1을 선택한 다음 편집을 선택합니다.

An image of the data source

Power BI는 첫 번째 열의 타임스탬프를 데이터 형식으로 Date/Time 변환합니다. Anomaly Detector API로 보내려면 이러한 타임스탬프를 텍스트로 변환해야 합니다. Power Query 편집기가 자동으로 열리지 않으면 홈 탭에서 쿼리 편집을 선택합니다.

Power Query 편집기에서 변환 리본을 선택합니다. 임의의 열 그룹에서 데이터 형식: 드롭다운 메뉴를 열고 텍스트를 선택합니다.

An image of the data type drop down

열 형식 변경에 대한 알림을 가져오면 현재 바꾸기를 선택합니다. 그런 다음 홈 리본에서 닫기 및 적용 또는 적용선택합니다.

데이터를 보내고 응답 형식을 지정하는 함수 만들기

데이터 파일의 형식을 지정하고 Anomaly Detector API로 보내려면 위에서 만든 테이블에서 쿼리를 호출할 수 있습니다. Power Query 편집기의 리본에서 새 원본 드롭다운 메뉴를 열고 빈 쿼리를 선택합니다.

새 쿼리가 선택되었는지 확인한 다음 고급 편집기를 선택합니다.

An image of the

고급 편집기 내에서 다음 파워 쿼리 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을 선택하고 호출을 선택하여 데이터시트에서 쿼리를 호출합니다.

An image of the invoke function

Important

완료되면 코드에서 키를 제거하고 공개적으로 게시하지 마세요. 프로덕션의 경우 Azure Key Vault와 같은 자격 증명을 안전하게 저장하고 액세스하는 방법을 사용합니다. 자세한 내용은 Azure AI 서비스 보안 문서를 참조하세요.

데이터 원본 개인 정보 및 인증

참고 항목

데이터 개인 정보 보호 및 액세스에 대한 조직의 정책에 유의하세요. 자세한 내용은 Power BI Desktop 개인 정보 수준을 참조하세요.

외부 데이터 원본을 활용하기 때문에 쿼리를 실행하려고 할 때 경고 메시지가 나타날 수 있습니다.

An image showing a warning created by Power BI

이 문제를 해결하려면 파일옵션 및 설정을 선택합니다. 그런 다음 옵션을 선택합니다. 현재 파일 아래에서 개인 정보를 선택하고 개인 정보 수준을 무시하고 잠재적으로 성능을 향상시킵니다.

또한 API에 연결하는 방법을 지정하라는 메시지가 나타날 수 있습니다.

An image showing a request to specify access credentials

이 문제를 해결하려면 메시지에서 자격 증명 편집을 선택합니다. 대화 상자가 표시되면 익명을 선택하여 API에 익명으로 연결합니다. 그런 다음 연결을 선택합니다.

그런 다음 홈 리본에서 닫기 및 적용선택하여 변경 내용을 적용합니다.

Anomaly Detector API 응답 시각화

기본 Power BI 화면에서 위에서 만든 쿼리를 사용하여 데이터를 시각화합니다. 먼저 시각화에서 꺾은선형 차트선택합니다. 그런 다음, 호출된 함수의 타임스탬프를 꺾은선형 차트의 에 추가합니다. 마우스 오른쪽 단추로 클릭하고 타임스탬프를 선택합니다.

Right-clicking the Timestamp value

호출된 함수의 다음 필드를 차트의 값 필드에 추가합니다. 아래 스크린샷을 사용하여 차트를 작성할 수 있습니다.

  • UpperMargins
  • LowerMargins
  • ExpectedValues

An image of the chart settings

필드를 추가한 후 차트에서 선택하고 크기를 조정하여 모든 데이터 요소를 표시합니다. 차트는 아래 스크린샷과 유사합니다.

An image of the chart visualization

변칙 데이터 요소 표시

Power BI 창의 오른쪽에 있는 필드 창 아래에서 마우스 오른쪽 단추로 호출된 함수 쿼리 아래의 을 클릭하고, 새 빠른 측정을 선택합니다.

An image of the new quick measure screen

표시되는 화면에서 계산으로 필터링된 값을 선택합니다. 기본 값을 .로 Sum of Value설정합니다. 그런 다음, IsAnomaly호출된 함수 필드에서 필터로 끕니다. 필터 드롭다운 메뉴에서 선택합니다True.

A second image of the new quick measure screen

확인을 선택하면 필드 목록 하단에 Value for True 필드가 표시됩니다. 마우스 오른쪽 단추로 클릭하고 이름을 Anomaly(변칙)로 변경합니다. 차트의 값에 추가합니다. 그런 다음, 서식 도구를 선택하고, X축 유형을 범주별로 설정합니다.

An image of the format x axis

서식 도구와 데이터 색을 선택하여 차트에 색을 적용합니다. 차트가 다음과 같이 표시됩니다.

An image of the final chart