DeepSeek + Excel 实战:多表联动分析与异常数据自动预警教程

摘要: 在数据驱动的时代,高效、精准地从海量数据中提取价值并快速识别异常至关重要。Excel 作为广泛使用的数据处理工具,结合强大的 AI 助手 DeepSeek,可以发挥出远超传统方法的效能。本教程将详细讲解如何利用 Excel 的高级功能(如 Power Query, Power Pivot, DAX)实现多张数据表的智能联动分析,并重点介绍如何借助 DeepSeek 的 AI 能力,构建灵活、智能的异常数据自动预警机制。通过手把手的步骤讲解、丰富的实战案例和完整的代码实现,帮助读者掌握这一强大的数据分析组合技能,提升工作效率和决策质量。

关键词: DeepSeek, Excel, 多表联动, 数据分析, 数据建模, Power Query, Power Pivot, DAX, 异常检测, 自动预警, AI 助手


目录

  1. 引言:数据挑战与解决方案

    • 1.1 多源异构数据的整合困境
    • 1.2 传统异常检测方法的局限性
    • 1.3 DeepSeek + Excel 组合的优势
  2. 环境准备与基础概念

    • 2.1 DeepSeek 简介与接入方式
      • 2.1.1 DeepSeek 是什么?
      • 2.1.2 如何在 Excel 环境中利用 DeepSeek (API/手动交互)
    • 2.2 Excel 高级分析工具概览
      • 2.2.1 Power Query:强大的数据获取与转换引擎
      • 2.2.2 Power Pivot:内存列式数据库与数据模型
      • 2.2.3 DAX:数据分析表达式语言
      • 2.2.4 Excel VBA:自动化与扩展
  3. 实战场景设定:零售业销售与库存分析

    • 3.1 数据表介绍
      • 3.1.1 Sales 表:销售流水记录
      • 3.1.2 Products 表:产品基础信息
      • 3.1.3 Inventory 表:每日库存快照
      • 3.1.4 Stores 表:门店信息
      • 3.1.5 Calendar 表:日期维度表
    • 3.2 核心分析目标
      • 3.2.1 多维度销售业绩分析 (按产品、门店、时间)
      • 3.2.2 库存周转率与健康状况评估
      • 3.2.3 自动识别销售异常值 (突增/突降)
      • 3.2.4 自动识别库存异常值 (负库存、超低库存、呆滞库存)
      • 3.2.5 构建可视化仪表盘
  4. 第一步:数据获取与清洗 - Power Query 实战

    • 4.1 连接数据源 (示例:文件夹中的 CSV 文件)
    • 4.2 加载各原始表至 Power Query 编辑器
    • 4.3 数据清洗关键操作
      • 4.3.1 处理缺失值
      • 4.3.2 修正数据类型
      • 4.3.3 删除重复项
      • 4.3.4 文本清洗 (Trim, Clean)
      • 4.3.5 拆分/合并列
      • 4.3.6 添加自定义列 (计算字段)
    • 4.4 利用 DeepSeek 辅助清洗思路
      • 4.4.1 描述数据问题,获取清洗建议
      • 4.4.2 生成复杂清洗步骤的 M 语言代码片段
    • 4.5 将清洗后的数据加载至 Excel 数据模型 (Power Pivot)
  5. 第二步:构建数据模型与关系 - Power Pivot 实战

    • 5.1 理解维度表与事实表
    • 5.2 建立表间关系
      • 5.2.1 SalesProducts (通过 ProductID)
      • 5.2.2 SalesStores (通过 StoreID)
      • 5.2.3 SalesCalendar (通过 Date)
      • 5.2.4 InventoryProducts (通过 ProductID)
      • 5.2.5 InventoryStores (通过 StoreID)
      • 5.2.6 InventoryCalendar (通过 Date)
    • 5.3 验证关系完整性 (一对多,多对一)
    • 5.4 创建层次结构 (如 年 -> 季度 -> 月 -> 日)
  6. 第三步:编写核心指标 - DAX 语言实战

    • 6.1 DAX 基础语法回顾
    • 6.2 关键销售指标
      • 6.2.1 总销售额:Total Sales = SUM(Sales[SalesAmount])
      • 6.2.2 日均销售额:Avg Daily Sales = AVERAGEX(VALUES(Calendar[Date]), [Total Sales])
      • 6.2.3 同比/环比增长率 (使用 SAMEPERIODLASTYEAR, DATEADD)
    • 6.3 关键库存指标
      • 6.3.1 日均库存量:Avg Daily Inventory = AVERAGEX(VALUES(Calendar[Date]), SUM(Inventory[StockQuantity]))
      • 6.3.2 库存周转率:Inventory Turnover = DIVIDE([Total Sales], [Avg Daily Inventory]) (简化公式,实际需考虑成本)
      • 6.3.3 当前库存状态:基于最近日期的库存量
    • 6.4 利用 DeepSeek 辅助 DAX 编写
      • 6.4.1 描述计算逻辑,获取 DAX 公式建议
      • 6.4.2 调试复杂的 DAX 公式 (解释错误信息)
      • 6.4.3 优化 DAX 公式性能建议
  7. 第四步:多表联动分析 - 数据透视表与图表

    • 7.1 基于数据模型创建数据透视表
    • 7.2 实现多表字段联动分析
      • 7.2.1 分析各门店 (Stores) 不同产品类别 (Products) 的销售额
      • 7.2.2 分析各产品 (Products) 在不同月份 (Calendar) 的库存周转率
      • 7.2.3 切片器联动控制 (门店、产品类别、时间段)
    • 7.3 创建关键绩效指标 (KPI) 卡片
    • 7.4 构建交互式图表
      • 7.4.1 时间趋势折线图 (销售额、库存量)
      • 7.4.2 门店/产品分布柱状图/饼图
      • 7.4.3 库存周转率散点图/气泡图
    • 7.5 利用 DeepSeek 辅助可视化设计
      • 7.5.1 描述分析需求,获取合适的图表类型建议
      • 7.5.2 优化图表格式和布局的建议
  8. 第五步:核心 - 异常数据自动预警机制

    • 8.1 异常检测方法论选择
      • 8.1.1 统计方法:标准差法 (Z-Score)
      • 8.1.2 统计方法:移动平均法 (Moving Average)
      • 8.1.3 统计方法:指数加权移动平均控制图 (EWMA)
      • 8.1.4 业务规则法 (硬性阈值)
      • 8.1.5 结合 DeepSeek 的 AI 辅助判断 (模式识别、上下文理解)
    • 8.2 基于标准差法的预警实现 (DAX/Power Pivot)
      • 8.2.1 计算历史基准值 (如过去 30 天日均销售额)
      • 8.2.2 计算历史标准差 (STDEV.P)
      • 8.2.3 定义异常阈值 (如 基准值 ± 2 * 标准差)
      • 8.2.4 比较当前值与阈值
      • 8.2.5 DAX 度量值示例:
        Sales Baseline (30d) =
        CALCULATE(
            [Avg Daily Sales],
            DATESINPERIOD(Calendar[Date], LASTDATE(Calendar[Date]) - 30, -30, DAY)
        )
        
        Sales StdDev (30d) =
        CALCULATE(
            STDEV.PX(  // X版本处理多行上下文
                VALUES(Calendar[Date]),
                [Total Sales]
            ),
            DATESINPERIOD(Calendar[Date], LASTDATE(Calendar[Date]) - 30, -30, DAY)
        )
        
        Is Sales Outlier =
        VAR CurrentSales = [Total Sales]
        VAR Baseline = [Sales Baseline (30d)]
        VAR Threshold = 2 * [Sales StdDev (30d)]
        RETURN
        IF(
            OR(
                CurrentSales > Baseline + Threshold,
                CurrentSales < Baseline - Threshold
            ),
            "异常",
            "正常"
        )
        

      • 8.2.6 在数据透视表中标记异常值 (条件格式)
    • 8.3 基于 EWMA 控制图的预警实现 (VBA + DeepSeek 辅助计算)
      • 8.3.1 原理简述:指数加权移动平均,对近期数据赋予更高权重,更敏感于微小偏移。
      • 8.3.2 公式: $$ z_t = \lambda x_t + (1 - \lambda) z_{t-1} $$ 其中 $z_t$ 是 t 时刻的 EWMA 值,$x_t$ 是 t 时刻的观测值 (如当日销售额),$\lambda$ 是平滑因子 (0 < $\lambda$ <= 1)。
      • 8.3.3 控制限计算 (较复杂,可借助 DeepSeek 解释或生成计算逻辑)。
      • 8.3.4 实现思路:
        • 使用 VBA 在后台计算每个产品/门店的时间序列 EWMA。
        • 存储历史 EWMA 值和当前值。
        • 比较当前观测值与基于 EWMA 的预测区间。
      • 8.3.5 DeepSeek 的作用:
        • 帮助理解 EWMA 公式和参数选择 ($\lambda$ 的影响)。
        • 辅助编写计算 EWMA 和控制限的 VBA 代码。
        • 解释预警结果 (结合其他因素判断是否为真异常)。
    • 8.4 基于业务规则的预警实现 (DAX/VBA)
      • 8.4.1 负库存预警:
        Negative Inventory Alert =
        IF(
            CALCULATE(
                SUM(Inventory[StockQuantity]),
                LASTNONBLANK(Calendar[Date], 1)  // 获取最新库存快照
            ) < 0,
            "负库存!",
            ""
        )
        

      • 8.4.2 超低库存预警 (低于安全库存):
        Low Inventory Alert =
        VAR CurrentStock = CALCULATE(SUM(Inventory[StockQuantity]), LASTNONBLANK(Calendar[Date], 1))
        VAR SafetyStock = RELATED(Products[SafetyStockLevel])  // 假设安全库存存储在Products表
        RETURN
        IF(
            CurrentStock < SafetyStock,
            "库存过低!",
            ""
        )
        

      • 8.4.3 呆滞库存预警 (长期无销售且库存高):
        Slow-Moving Alert =
        VAR DaysSinceLastSale = CALCULATE(
            MAX(Calendar[Date]),
            FILTER(
                ALL(Sales),
                Sales[ProductID] = EARLIER(Products[ProductID])  // 需在行上下文中
            )
        )  // 获取该产品最后一次销售日期
        VAR DaysNoSale = IF(ISBLANK(DaysSinceLastSale), 999, TODAY() - DaysSinceLastSale)  // 假设TODAY() VBA或最新日期
        VAR CurrentStock = CALCULATE(SUM(Inventory[StockQuantity]), LASTNONBLANK(Calendar[Date], 1))
        RETURN
        IF(
            AND(
                DaysNoSale > Products[SlowMovingThreshold],  // 假设阈值存储在Products表
                CurrentStock > 0
            ),
            "呆滞库存!",
            ""
        )
        

    • 8.5 预警信息汇总与输出
      • 8.5.1 创建“预警汇总”表或工作表。
      • 8.5.2 使用 DAX 度量值或 VBA 将上述各种预警结果汇总到该表。
        • 列出异常项目 (产品、门店、日期)。
        • 标明异常类型 (销售突增、突降、负库存、低库存、呆滞)。
        • 记录异常值、基准值、偏差程度。
      • 8.5.3 设计清晰的预警信息格式。
  9. 第六步:自动化与通知 - VBA 实战

    • 9.1 定时自动刷新
      • 9.1.1 VBA 定时器 (Application.OnTime)
      • 9.1.2 自动刷新 Power Query 查询 (QueryTable.Refresh) 和 数据透视表 (PivotTable.RefreshTable)
    • 9.2 自动检测预警汇总表变化
      • 9.2.1 工作表事件 (Worksheet_Change)
      • 9.2.2 检查“预警汇总”表是否有新增行或特定单元格变化。
    • 9.3 自动通知机制
      • 9.3.1 电子邮件通知 (Outlook 集成)
        Sub SendEmailAlert()
            Dim OutApp As Object
            Dim OutMail As Object
            Dim strBody As String
        
            ' 创建 Outlook 实例
            Set OutApp = CreateObject("Outlook.Application")
            Set OutMail = OutApp.CreateItem(0)
        
            ' 构建邮件正文 (strBody),可以从预警汇总表获取内容
            strBody = "发现数据异常,请及时处理!" & vbCrLf & vbCrLf
            strBody = strBody & "详情请查看附件或登录系统。" ' 可以拼接具体预警信息
        
            With OutMail
                .To = "recipient@example.com" ' 收件人
                .CC = "manager@example.com" ' 抄送
                .Subject = "数据异常预警报告 - " & Format(Now(), "yyyy-mm-dd hh:mm")
                .Body = strBody
                ' 如果需要,添加工作簿作为附件 (.Attachments.Add)
                .Display ' 或 .Send 直接发送
            End With
        
            Set OutMail = Nothing
            Set OutApp = Nothing
        End Sub
        

      • 9.3.2 Teams/钉钉等消息通知 (需调用相应 Webhook API,可请 DeepSeek 辅助编写 HTTP 请求代码)
      • 9.3.3 在 Excel 内弹出消息框 (MsgBox)
    • 9.4 整合:在检测到新预警后触发通知
      • 9.4.1 在 Worksheet_Change 事件中调用 SendEmailAlert 或通知函数。
      • 9.4.2 避免重复通知 (记录上次通知时间或已处理预警)。
  10. 第七步:构建监控仪表盘

    • 10.1 整合分析结果与预警信息
    • 10.2 设计布局:KPI 区、分析图表区、预警列表区。
    • 10.3 设置动态交互:利用切片器、时间线控件联动控制整个仪表盘。
    • 10.4 突出显示预警区域 (颜色、图标)。
    • 10.5 添加数据刷新按钮 (链接到 VBA 宏)。
    • 10.6 添加“查看详情”按钮 (链接到具体数据表或分析报告)。
  11. 优化与高级技巧

    • 11.1 性能优化
      • 11.1.1 Power Query 查询优化 (减少步骤、合并查询、使用索引列)
      • 11.1.2 DAX 优化 (避免迭代器滥用、使用 CALCULATE 替代 FILTER、使用变量)
      • 11.1.3 数据模型优化 (减少列、使用合适的数据类型)
    • 11.2 安全性考虑
      • 11.2.1 工作簿保护
      • 11.2.2 VBA 工程密码保护
      • 11.2.3 敏感数据脱敏 (在 Power Query 中处理)
    • 11.3 错误处理 (VBA 中的 On Error Resume Next, Err 对象)
    • 11.4 日志记录 (记录刷新时间、预警触发时间)
    • 11.5 结合 DeepSeek 进行更复杂的分析
      • 11.5.1 时间序列预测 (未来销售额、库存需求)
      • 11.5.2 根因分析 (DeepSeek 帮助解读异常的可能原因)
      • 11.5.3 生成自然语言分析报告摘要
  12. 总结

    • 12.1 回顾 DeepSeek + Excel 工作流的核心价值
    • 12.2 强调多表联动分析与自动预警的关键实现步骤
    • 12.3 展望:AI 与 BI 工具的深度融合趋势
  13. 附录

    • A. 示例数据表结构 (字段说明)
    • B. 关键 DAX 度量值汇总
    • C. 核心 VBA 代码片段汇总
    • D. DeepSeek 交互提示词示例 (用于获取帮助)
    • E. 推荐学习资源 (Excel, Power BI, DAX, VBA, DeepSeek)

详细内容展开 (示例节选 - 以第8节“异常数据自动预警机制”部分为例):

(接上文第8节)

8.1 异常检测方法论选择

在构建预警系统前,选择合适的异常检测方法至关重要。常见的方法有:

  • 统计方法 (Statistical Methods): 基于数据的统计分布特性来判断异常。
    • 标准差法 (Z-Score): 计算数据点与均值的偏差,用标准差单位衡量。简单直观,假设数据服从正态分布(或近似)。公式:$$ z = \frac{x - \mu}{\sigma} $$ 其中 $x$ 是观测值,$\mu$ 是均值,$\sigma$ 是标准差。通常 |z| > 2 或 3 被认为是异常。优势: 计算简单,易于在 DAX 中实现。劣势: 对极端值本身敏感(影响 $\mu$ 和 $\sigma$),不适用于非高斯分布或小样本。
    • 移动平均法 (Moving Average): 计算一定窗口内数据的平均值作为基准线,当前值显著偏离此线则视为异常。优势: 能反映近期趋势。劣势: 滞后性,对窗口大小敏感。
    • 指数加权移动平均控制图 (Exponentially Weighted Moving Average - EWMA): 对 MA 的改进,赋予近期数据更高权重。公式如前所述。优势: 对小偏移更敏感,能更快检测到过程漂移。劣势: 计算稍复杂,需要选择合适的平滑因子 $\lambda$ 和控制限参数。VBA 实现更灵活。
  • 业务规则法 (Business Rules): 基于领域知识和业务逻辑定义硬性阈值。例如,“库存低于安全库存水平”、“销售金额为负数”、“连续30天无销售且库存大于0”。优势: 规则明确,易于理解和实现。劣势: 可能不够灵活,无法捕捉统计意义上的异常模式。
  • AI 辅助判断 (DeepSeek): 利用 DeepSeek 的自然语言理解和模式识别能力。可以向 DeepSeek 描述数据特征、历史模式、当前异常点,询问其是否合理或可能的原因。优势: 能结合上下文,处理复杂的、非数值型的异常(如文本描述矛盾),提供解释性。劣势: 依赖提示词质量,需要人工复核,不能完全自动化替代规则。

实战建议: 通常组合使用这些方法。例如:

  • 业务规则处理明确的逻辑错误(如负库存)。
  • 统计方法(Z-Score 或 EWMA)检测数值型指标的显著波动。
  • 将初步筛选出的异常点,结合 DeepSeek 进行二次判断,提供更丰富的背景信息和可能的原因分析,减少误报。

8.2 基于标准差法的预警实现 (DAX/Power Pivot)

我们以检测单日门店销售额异常为例,详细说明如何在 DAX 中实现标准差法预警。

(1) 计算历史基准值 (Sales Baseline (30d)) 我们需要计算过去 30 天(不包括今天)的日均销售额作为基准 $\mu$。这里使用 DATESINPERIOD 函数创建时间段。

Sales Baseline (30d) =
CALCULATE(
    [Avg Daily Sales],  // 这是之前定义的日均销售额度量值
    DATESINPERIOD(
        Calendar[Date],
        LASTDATE(Calendar[Date]) - 30,  // 基准期结束日期 (昨天)
        -30,  // 向前推30天
        DAY
    )
)

解释:LASTDATE(Calendar[Date]) 获取模型中最后一个日期(假设是最新销售数据日期)。LASTDATE(Calendar[Date]) - 30 得到 30 天前的日期。DATESINPERIOD 从这个日期开始,往回取 30 天(-30)的日期范围。然后在这个范围内计算 [Avg Daily Sales]

(2) 计算历史标准差 (Sales StdDev (30d)) 计算同一时间段内,每日销售额的标准差 $\sigma$。由于 STDEV.P 函数期望单列值,而 [Total Sales] 在日期上下文中是标量,我们需要使用 STDEV.PX (或 STDEVX.P) 函数,它接受一个表(这里是 VALUES(Calendar[Date]))和一个表达式([Total Sales])来计算标准差。

Sales StdDev (30d) =
CALCULATE(
    STDEV.PX(
        VALUES(Calendar[Date]),  // 构成每日销售额的日期列表
        [Total Sales]            // 每个日期的总销售额
    ),
    DATESINPERIOD(
        Calendar[Date],
        LASTDATE(Calendar[Date]) - 30,
        -30,
        DAY
    )
)

(3) 定义异常阈值 & 判断异常 (Is Sales Outlier) 设定阈值为 基准值 ± 2 * 标准差。比较当前日期(LASTDATE(Calendar[Date]))的销售额是否超出此范围。

Is Sales Outlier =
VAR CurrentDate = LASTDATE(Calendar[Date])  // 当前分析的最新日期
VAR CurrentSales = CALCULATE([Total Sales], Calendar[Date] = CurrentDate)  // 当前日销售额
VAR Baseline = [Sales Baseline (30d)]       // 过去30天日均基准
VAR StdDev = [Sales StdDev (30d)]           // 过去30天标准差
VAR UpperThreshold = Baseline + 2 * StdDev  // 上阈值
VAR LowerThreshold = Baseline - 2 * StdDev  // 下阈值

RETURN
IF(
    OR(
        CurrentSales > UpperThreshold,
        CurrentSales < LowerThreshold
    ),
    "异常",  // 如果超出阈值
    "正常"   // 否则
)

(4) 应用与可视化

  • 在数据透视表中,将 StoreName (门店), Calendar[Date], [Total Sales], [Is Sales Outlier] 拖入行区域或值区域。
  • [Is Sales Outlier] 列应用条件格式,当值为“异常”时,将整行或销售额单元格标记为醒目的颜色(如红色)。
  • 可以添加一列显示偏差程度:Deviation = [Total Sales] - [Sales Baseline (30d)]

这样,刷新数据后,就能直观地看到哪些门店在哪天的销售额出现了显著异常。



结语

通过本教程的学习,您应该能够掌握利用 DeepSeek 的强大 AI 能力赋能 Excel,构建一套完整的多表联动分析系统和智能异常数据自动预警流程。这套方案将显著提升您从海量、复杂数据中提取洞察的速度和深度,并实现关键业务风险的实时监控与快速响应。请结合附录中的资源,不断练习和探索,将这套强大的组合应用到您实际的工作场景中,释放数据的真正价值。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐