教程:使用流分析分析欺诈性呼叫数据,并在 Power BI 仪表板中可视化结果

本教程介绍如何使用 Azure 流分析来分析电话呼叫数据。 由客户端应用程序生成的电话呼叫数据包含欺诈性呼叫,这些呼叫由流分析作业检测。 本教程中的技术也适用于其他类型的欺诈检测,如信用卡欺诈或身份盗用。

将在本教程中执行以下任务:

  • 生成示例性的电话呼叫数据并将其发送到 Azure 事件中心。
  • 创建流分析作业。
  • 配置作业输入和输出。
  • 定义用于筛选欺诈性呼叫的查询。
  • 测试和启动作业。
  • 在 Power BI 中可视化结果。

先决条件

在开始之前,请确保已完成以下步骤:

  • 如果没有 Azure 订阅,请创建试用版
  • 请从 Microsoft 下载中心下载电话呼叫事件生成器应用 TelcoGenerator.zip,或者从 GitHub 获取源代码。
  • 需要一个 Power BI 帐户。

登录 Azure

登录到 Azure 门户

创建事件中心

需要先将一些示例数据发送到事件中心,然后流分析才能分析欺诈性呼叫数据流。 在本教程中,你将使用 Azure 事件中心将数据发送到 Azure。

请按以下步骤创建一个事件中心,然后向该事件中心发送调用数据:

  1. 登录 Azure 门户

  2. 选择左侧菜单中的“所有服务”,选择“物联网”,将鼠标悬停在“事件中心”上,然后选择“+ (添加)”按钮。

    Screenshot showing the Event Hubs creation page.

  3. 在“创建命名空间”页上执行以下步骤:

    1. 选择要在其中创建事件中心的 Azure 订阅。

    2. 对于“资源组”,请选择“新建”,然后输入资源组的名称。 事件中心命名空间将在此资源组中创建。

    3. 对于“命名空间名称”,请输入事件中心命名空间的唯一名称。

    4. 对于“位置”,请选择要在其中创建命名空间的区域。

    5. 对于“定价层”,请选择“标准”。

    6. 在页面底部选择“查看 + 创建”。

      Screenshot showing the Create Namespace page.

    7. 在命名空间创建向导的“查看 + 创建”页上,在查看所有设置后,选择页面底部的“创建”。

  4. 成功部署命名空间后,选择“转到资源”以导航到“事件中心命名空间”页。

  5. 在“事件中心命名空间”页上,选择命令栏中的“+事件中心”。

    Screenshot showing the Add event hub button on the Event Hubs Namespace page.

  6. 在“创建事件中心”页上,为事件中心输入一个名称。 将分区计数设置为 2。 对其余设置使用默认选项,然后选择“查看 + 创建”。

    Screenshot showing the Create event hub page.

  7. 在“查看 + 创建”页上,选择页面底部的“创建”。 然后,等待部署成功完成。

授予对事件中心的访问权限,并获取连接字符串

在应用程序可以将数据发送到 Azure 事件中心之前,事件中心必须具有允许访问的策略。 访问策略生成包含授权信息的连接字符串。

  1. 在“事件中心命名空间”页中的左侧菜单上选择“共享访问策略”。

  2. 从策略列表中选择 RootManageSharedAccessKey。

  3. 然后选择“连接字符串 - 主密钥”旁边的复制按钮。

  4. 将连接字符串粘贴到文本编辑器中。 需要在下一部分使用此连接字符串。

    连接字符串如下所示:

    Endpoint=sb://<Your event hub namespace>.servicebus.chinacloudapi.cn/;SharedAccessKeyName=<Your shared access policy name>;SharedAccessKey=<generated key>

    请注意,连接字符串包含多个用分号隔开的键值对:Endpoint、SharedAccessKeyName 和 SharedAccessKey。

启动事件生成器应用程序

在启动 TelcoGenerator 应用之前,应该对其进行配置,以便将数据发送到此前创建的 Azure 事件中心。

  1. 提取 TelcoGenerator.zip 文件的内容。

  2. 在所选文本编辑器中打开 TelcoGenerator\TelcoGenerator\telcodatagen.exe.config 文件。有多个 .config 文件,因此请确保打开正确的文件。

  3. 使用以下详细信息更新配置文件中的 <appSettings> 元素:

    • 将 EventHubName 键的值设置为连接字符串末尾的 EntityPath 的值。
    • 将 Microsoft.ServiceBus.ConnectionString 键的值设置为在末尾没有 EntityPath 值 (;EntityPath=myeventhub) 的连接字符串。 别忘了删除 EntityPath 值前面的分号。
  4. 保存文件。

  5. 接下来打开命令窗口,转到解压缩 TelcoGenerator 应用程序的文件夹。 然后输入以下命令:

    .\telcodatagen.exe 1000 0.2 2
    

    此命令采用以下参数:

    • 每小时的呼叫数据记录数。
    • 欺诈概率 (%),即应用模拟欺诈呼叫的频率。 值 0.2 表示大约有 20% 的通话记录似乎具有欺诈性。
    • 持续时间(小时),即应用应运行的小时数。 还可以通过在命令行终止此过程 (Ctrl+C) 来随时停止该应用。

    几秒钟后,当应用将电话通话记录发送到事件中心时,应用将开始在屏幕上显示通话记录。 这些电话呼叫数据包含以下字段:

    记录 定义
    CallrecTime 呼叫开始时间的时间戳。
    SwitchNum 用于连接呼叫的电话交换机。 在此示例中,交换机是表示来源国家/地区(美国、中国、英国、德国或澳大利亚)的字符串。
    CallingNum 呼叫方的电话号码。
    CallingIMSI 国际移动用户标识 (IMSI)。 它是呼叫方的唯一标识符。
    CalledNum 呼叫接收人的电话号码。
    CalledIMSI 国际移动用户标识 (IMSI)。 它是呼叫接收人的唯一标识符。

创建流分析作业

有了呼叫事件流以后,即可创建流分析作业,以便从事件中心读取数据。

  1. 若要创建流分析作业,请导航到 Azure 门户
  2. 选择“创建资源”并搜索“流分析作业” 。 选择“流分析作业”磁贴并选择“创建” 。
  3. 在“新建流分析作业”页上,执行以下步骤:
    1. 对于“订阅”,请选择包含该事件中心命名空间的订阅。

    2. 对于“资源组”,请选择先前创建的资源组。

    3. 在“实例详细信息”部分,对于“名称”,请输入流分析作业的唯一名称。

    4. 对于“区域”,请选择要在其中创建流分析作业的区域。 我们建议将作业和事件中心放在同一区域以获得最佳性能,这样还无需为不同区域之间的数据传输付费。

    5. 对于“托管环境 <”,请选择“云”(如果尚未选择)。 流分析作业可以部署到云或边缘设备。 你可以通过云部署到 Azure 云,利用 Edge 部署到 IoT Edge 设备。

    6. 对于“流单元”,请选择“1”。 流单元表示执行作业所需的计算资源。 默认情况下,此值设置为 1。 若要了解如何缩放流单元,请参阅了解和调整流单元一文。

    7. 在页面底部选择“查看 + 创建”。

      Screenshot that shows the Create Azure Stream Analytics job page.

  4. 在“查看 + 创建”页上查看设置,然后选择“创建”以创建流分析作业。
  5. 部署作业后,选择“转到资源”,以导航到“流分析作业”页。

配置作业输入

下一步是使用在上一部分创建的事件中心,为用于读取数据的作业定义输入源。

  1. 在“流分析作业”页上,在左侧菜单中的“作业拓扑”部分选择“输入”。

  2. 在“输入”页上,选择“+ 添加输入”和“事件中心”。

    Screenshot showing the Input page for a Stream Analytics job.

  3. 在“事件中心”页上执行以下步骤:

    1. 对于“输入别名”,请输入 CallStream。 输入别名是用于标识输入的易记名称。 输入别名只能包含字母数字字符、连字符和下划线,而且长度必须介于 3 到 63 个字符之间。

    2. 对于“订阅”,请选择在其中创建了事件中心的 Azure 订阅。 事件中心可以位于流分析作业所在的订阅中,也可以位于另一订阅中。

    3. 对于“事件中心命名空间”,请选择在上一部分创建的事件中心命名空间。 当前订阅中可用的所有命名空间均列在下拉列表中。

    4. 对于“事件中心名称”,请选择在上一部分创建的事件中心。 所选命名空间中可用的所有事件中心均列在下拉列表中。

    5. 对于“事件中心使用者组”,请保持选中“新建”选项,以便在事件中心上创建新的使用者组。 建议对每个流分析作业使用不同的使用者组。 如果未指定任何使用者组,流分析作业将使用 $Default 使用者组。 如果作业包含自联接或具有多个输入,则稍后的某些输入可能会由多个读取器读取。 这种情况会影响单个使用者组中的读取器数量。

    6. 对于“身份验证模式”,请选择“连接字符串”。 使用此选项可以更轻松地测试本教程。

    7. 对于“事件中心策略名称”,请选择“使用现有”,然后选择先前创建的策略。

    8. 选择页面底部的“保存” 。

      Screenshot showing the Event Hubs configuration page for an input.

配置作业输出

最后一步是定义作业的输出接收器,以便在其中写入转换后的数据。 在本教程中,请使用 Power BI 来输出和可视化数据。

  1. 从 Azure 门户打开“所有资源”,然后选择 ASATutorial 流分析作业。

  2. 在“流分析作业”的“作业拓扑”部分,选择“输出”选项 。

  3. 选择“+ 添加”>“Power BI”。

  4. 在输出表单中填写以下详细信息:

    设置 建议的值
    输出别名 MyPBIoutput
    组工作区 我的工作区
    数据集名称 ASAdataset
    表名称 ASATable
    身份验证模式 用户令牌
  5. 选择“授权”并按提示向 Power BI 进行身份验证。

    Configure Stream Analytics output

  6. 选择 Power BI 页面底部的“保存”。

    本教程采用用户令牌身份验证模式。

创建查询以转换实时数据

此时,设置一个流分析作业以读取传入数据流。 接下来创建一个分析实时数据的查询。 这些查询使用类似 SQL 的语言,该语言具有特定于流分析的一些扩展。

本教程的这一部分会创建并测试多个查询,展示可以转换输入流以便进行分析的几种方法。

此处创建的查询只会在屏幕中显示已转换的数据。 在后面的部分中,你将把转换后的数据写入 Power BI。

若要了解有关语言的详细信息,请参阅 Azure 流分析查询语言参考

使用传递查询进行测试

如果想要将每个事件存档,可使用传递查询读取事件负载中的所有字段。

  1. 在 Azure 门户中导航到你的流分析作业,在左侧菜单上的“作业拓扑”下选择“查询”。

  2. 在查询窗口中输入以下查询:

    SELECT 
        *
    FROM 
        CallStream
    

    注意

    对于 SQL,关键字不区分大小写,空格也不重要。

    在此查询中,CallStream 是创建输入时指定的别名。 如果使用了其他别名,请改为使用该名称。

  3. 选择“测试查询”。

    流分析作业对来自输入的示例数据运行查询,并在窗口底部显示输出。 结果表明事件中心和流分析作业配置正确。

    Sample output from test query.

    你看到的确切记录数取决于你在采样中捕获的记录数。

减少使用列投影的字段数

在许多情况下,分析并不需要输入流中的所有列。 可以使用查询投影一组返回的字段,这些字段比传递查询中的字段要小。

运行以下查询,并注意输出。

SELECT CallRecTime, SwitchNum, CallingIMSI, CallingNum, CalledNum 
INTO
    [MyPBIoutput]
FROM 
    CallStream

按区域计算传入呼叫数:带聚合功能的翻转窗口

假设要计算每个区域的传入呼叫数。 在流数据中,当要执行聚合函数(如计数)时,需要将流划分为临时单位,因为数据流本身实际上是无限的。 使用流分析开窗函数执行此操作。 然后,可以使用该窗口中的数据作为一个单元。

此转换需要一个不重叠的时间窗口序列,每个窗口具有一组可对其进行分组和聚合的离散数据。 这种类型的窗口称为“翻转窗口”。 在翻转窗口中,可以获得按 SwitchNum(它表示发起呼叫的国家/地区)分组的传入呼叫的计数。

  1. 将以下查询粘贴到查询编辑器中:

    SELECT 
        System.Timestamp as WindowEnd, SwitchNum, COUNT(*) as CallCount 
    FROM
        CallStream TIMESTAMP BY CallRecTime 
    GROUP BY TUMBLINGWINDOW(s, 5), SwitchNum
    

    此查询在 FROM 子句中使用 Timestamp By 关键字来指定输入流中要用于定义翻转窗口的时间戳字段。 在这种情况下,窗口按每条记录中的 CallRecTime 字段将数据划分为段。 (如果未指定任何字段,开窗操作将使用每个事件到达事件中心的时间。 请参阅流分析查询语言参考中的“到达时间与应用程序时间”。

    投影包括 System.Timestamp,后者将返回每个窗口结束时的时间戳。

    若要指定想要使用翻转窗口,请在 GROUP BY 子句中使用 TUMBLINGWINDOW 函数。 在函数中,可以指定时间单位(从微秒到一天的任意时间)和窗口大小(单位数)。 在此示例中,翻转窗口由 5 秒时间间隔组成,因此你会收到按国家/地区的每 5 秒的呼叫计数。

  2. 选择“测试查询”。 在结果中,请注意“WindowEnd”下的时间戳以 5 秒为增量。

使用自联接检测 SIM 欺诈

在此示例中,将欺诈使用情况视为来自同一用户的呼叫,但与另一个 5 秒内的呼叫位于不同的位置。 例如,同一用户不能合法地同时从美国和澳大利亚发起呼叫。

若要检查这些情况,可以使用流数据的自联接基于 CallRecTime 值将流联接到自身。 然后,可以查找 CallingIMSI 值(始发号码)相同但 SwitchNum 值(来源国家/地区)不同的呼叫记录。

当对流数据使用联接时,该联接必须对可以及时分隔匹配行的程度施加一定限制。 如前所述,流数据实际上是无限的。 使用 DATEDIFF 函数在联接的 ON 子句中指定关系的时间限制。 此示例中联接基于调用数据的 5 秒时间间隔。

  1. 将以下查询粘贴到查询编辑器中:

    SELECT System.Timestamp AS WindowEnd, COUNT(*) AS FraudulentCalls
        INTO "MyPBIoutput"
        FROM "CallStream" CS1 TIMESTAMP BY CallRecTime
        JOIN "CallStream" CS2 TIMESTAMP BY CallRecTime
        ON CS1.CallingIMSI = CS2.CallingIMSI
        AND DATEDIFF(ss, CS1, CS2) BETWEEN 1 AND 5
        WHERE CS1.SwitchNum != CS2.SwitchNum
        GROUP BY TumblingWindow(Duration(second, 1))
    

    除了联接中的 DATEDIFF 函数以外,此查询与任何 SQL 联接类似。 此 DATEDIFF 版本特定于流分析,它必须显示在 ON...BETWEEN 子句中。 参数为时间单位(此示例中为秒)和联接的两个源的别名。 此函数与标准 SQL DATEDIFF 函数不同。

    WHERE 子句包含标志欺诈呼叫的条件:始发交换机不同。

  2. 选择“测试查询”。 查看输出,然后选择“保存查询”。

启动作业并可视化输出

  1. 若要启动作业,请导航到作业“概述”,然后选择“启动” 。

  2. 选择“现在”作为作业输出启动时间,然后选择“启动”。 可以在通知栏中查看作业状态。

  3. 作业成功以后,请导航到 Power BI,然后使用工作或学校帐户登录。 如果流分析作业查询输出结果,则创建的 ASAdataset 数据集存在于“数据集”选项卡下。

  4. 从 Power BI 工作区选择“+ 创建”,创建名为“欺诈性呼叫”的新仪表板。

  5. 在窗口顶部,选择“编辑”和“添加磁贴” 。 然后选择“自定义流数据”和“下一步”。 在“你的数据集”下选择“ASAdataset”。 从“可视化效果类型”下拉列表中选择“卡”,然后向“字段”添加“欺诈性呼叫”。 选择“下一步”,为磁贴输入一个名称,然后选择“应用”,创建该磁贴。

    Create Power BI dashboard tiles

  6. 使用以下选项再次执行步骤 5:

    • 转到“可视化效果类型”后,选择“折线图”。
    • 添加轴,然后选择“windowend”。
    • 添加值,然后选择“欺诈性电话”。
    • 对于“要显示的时间窗口”,请选择最近 10 分钟。
  7. 添加两个磁贴以后,仪表板应该如以下示例所示。 请注意,如果事件中心发送器应用程序和流分析应用程序正在运行,则 Power BI 仪表板会在新数据到达时定期进行更新。

    Screenshot of results in Power BI dashboard.

将 Power BI 仪表板嵌入到 Web 应用中

在本教程的此部分中,请使用 Power BI 团队创建的示例性 ASP.NET Web 应用程序来嵌入仪表板。 有关如何嵌入仪表板的详细信息,请参阅使用 Power BI 嵌入一文。

若要设置应用程序,请访问 PowerBI-Developer-Samples GitHub 存储库,然后按照“用户拥有数据”部分的说明操作(请使用 integrate-web-app 子部分下的重定向 URL 和主页 URL)。 由于我们使用的是“仪表板”示例,因此请使用 GitHub 存储库中的 integrate-web-app 示例代码。 在浏览器中运行应用程序后,请执行以下步骤,将此前创建的仪表板嵌入网页中:

  1. 选择“登录到 Power BI”,以便授予应用程序访问 Power BI 帐户中的仪表板的权限。

  2. 选择“获取仪表板”按钮,此时会在表中显示帐户的仪表板。 找到此前创建的仪表板的名称 powerbi-embedded-dashboard,然后复制相应的 EmbedUrl

  3. 最后,将 EmbedUrl 粘贴到相应的文本字段中,然后选择“嵌入仪表板”。 现在可以查看嵌入 Web 应用程序中的同一仪表板了。

后续步骤

本教程介绍了如何创建简单的流分析作业、如何分析传入数据,以及如何在 Power BI 仪表板中展示结果。 若要详细了解流分析作业,请继续阅读下一教程: