← 返回信息流
AI 资讯Hacker News·1 天前

让统计数据常驻 SQL:无需离开数据库即可实时分析

原标题:Statistics that live in your SQL

速览

该技术方案允许用户在 SQL 查询中直接执行复杂的统计运算,无需将数据导出至外部分析工具。这种“在数据库内计算”的模式显著降低了数据移动的成本和延迟。对于需要实时洞察的业务场景,它能大幅提升数据分析的效率和响应速度。

AI 深度解读

Statistics that live in your SQL:the-stats-duck v0.6.0 深度解读

背景

在数据分析和科学计算领域,SQL 一直是处理结构化数据的基石,但传统的 SQL 往往局限于聚合、过滤和连接操作,缺乏原生支持高级统计推断、回归分析及可视化的能力。这通常迫使数据分析师在 SQL 引擎之外,将数据导出到 Python(如 Pandas、SciPy)、R 或专门的统计软件中进行后续处理,造成了工作流的割裂。

the-stats-duck 是一个开源的 DuckDB 扩展,旨在解决这一痛点。它作为 BedevereKoliLang 背后的统计引擎,允许用户在不离开 SQL 环境的情况下执行真正的统计分析,包括分布函数、假设检验、回归分析甚至数据绘图。该项目采用 MIT 许可证,具有极高的可移植性,不仅可以在本地 DuckDB 实例中运行,甚至可以直接在浏览器中运行。

此次发布的 v0.6.0 版本(代号 i-m-not-dead)带来了多项重大功能更新,包括更丰富的统计分布、基于公式的线性回归、自助法(Bootstrap)置信区间、以及全新的绘图语法(ggsql)。

核心内容

1. 全局数据概览:meta() 函数

面对新数据集,首要任务通常是探索其结构。meta() 函数提供了一次性扫描整个表格的能力,返回每一列的完整画像(Profile),每列一行。

  • 功能定位:虽然与 DuckDB 内置的 SUMMARIZE 有重叠,但 meta() 是一个表函数(Table Function)。这意味着它可以像普通表一样被 JOIN、过滤或在 CTE(公共表表达式)中组合使用。
  • 示例场景:若需统计“有多少数值型列”或“总共有多少缺失值”,只需对 meta() 的结果进行聚合查询即可,极大地简化了数据探查流程。

2. 原生 SQL 回归分析:lm()

v0.6.0 引入了类似 R 语言的公式语法,直接在 SQL 中执行普通最小二乘法(OLS)回归。

  • 系数表lm() 返回每个变量的估计值(estimate)、标准误(std_error)、t 统计量(t_statistic)和 p 值(p_value)。
  • 模型摘要lm_summary() 提供模型层面的指标,包括 R²、调整后的 R²、F 统计量及其 p 值、残差自由度(residual df)和 Sigma。
  • 公式支持:支持加法预测项和移除截距(使用 - 1)。虽然交互项和行内转换尚未在 v0.6 中实现,但已在规划中。
  • 底层实现:基于 X'X 的 Cholesky 分解,经过完整案例过滤(complete-case filtered),并在 carsmtcars 数据集上与 R 语言进行了四位小数的交叉验证,确保精度。

3. 非参数置信区间:bootstrap()

当数据不满足正态分布假设时,bootstrap() 提供了一种基于重采样的稳健方法。

  • 工作原理:对数据进行有放回的重采样,返回每次重采样统计量(如均值、中位数、标准差等)的 LIST<DOUBLE>
  • 区间计算:配合 list_aggregate(list, 'quantile_cont', p) 函数,可以计算百分位数置信区间。
  • 可复现性:支持传入 seed 参数,确保结果可复现,即使在 GROUP BY 分组操作中也能保持一致性。

4. 纯 SQL 可视化:VISUALIZE ... DRAW

the-stats-duck 引入了一个小型的绘图语法(命名为 ggsql),编译为 Vega-Lite 格式,由 Bedevere 渲染。v0.6.0 增加了小提琴图(violin marks)、二维分面(2-D facets)以及每层统计平滑(STAT smooth)。

  • 散点图与趋势线:通过 DRAW point DRAW line STAT smooth 即可在一行代码中生成带有 LOESS 平滑趋势线的散点图。
  • STAT 修饰符
    • smooth:在 (x, y) 上注入 Vega-Lite 的 LOESS 变换。如果映射了 color,则按颜色分组绘制拟合曲线。
    • summary:重写层的数据 SQL,计算 AVG(y) GROUP BY x,将每个单元格折叠为其均值。
    • identity:显式的无操作(no-op)。
    • 限制smooth 不适用于本身已包含统计变换的标记(如 regressiondensityviolinhistogram)。
  • 线性回归图DRAW regression 标记绘制单一直线,即 y ~ x 的最小二乘拟合,按颜色分组时,每个组别获得一条线性趋势线,而非 LOESS 曲线。

5. 新增分布函数与随机采样器

分布家族大幅扩展,新增了负二项分布、超几何分布、威布尔分布、对数正态分布和泊松分布。

  • 完整支持:每个分布都提供了 R 风格的 d(密度/概率质量)、p(累积分布)、q(分位数)函数,以及完整的随机采样器(r 系列,如 rnorm, rt, rchisq, rf, rgamma, rbeta, rexp, rweibull, rlnorm, rpois)。
  • 精度验证:所有函数均与 R 语言进行了六位小数的交叉验证。用户可以在 SQL 中模拟、拟合和测试,无需往返于其他语言。
  • 示例:绘制泊松分布(λ=3)的概率质量函数,只需在 0...10 范围内评估 dpois 并绘制柱状图,全程在 SQL 中完成。

6. 性能飞跃:读取 SAS/SPSS/Stata 文件

针对 XPT 格式文件的读取性能进行了重大优化。

  • 旧版问题:之前的实现存在 O(N²) 复杂度错误,即对于每 2,048 行数据块,都会从头重新解析文件。
  • 新版优化:v0.6.0 将文件解析为缓冲的、可溢出的列式存储,并从中流式读取。每个文件仅解析一次。
  • 性能数据
    • 20 万行、7MB 的 XPT 文件:从 ~67 秒 降至 ~1.3 秒(52倍加速)。
    • 真实的 CDISC 试点数据 qs.xpt(12.2 万行):从 ~39 秒 降至 ~1.1 秒(36倍加速)。
    • 160 万行数据:从 ~70 分钟 降至 ~15 秒。

关键要点

  • SQL 即统计平台:the-stats-duck 将统计引擎直接嵌入 DuckDB,使 SQL 具备分布、检验、回归和绘图能力,消除了数据导出到 Python/R 的需求。
  • 表函数灵活性meta() 等函数作为表函数设计,允许在 SQL 中进行复杂的组合、过滤和聚合,增强了数据探查的灵活性。
  • R 语言兼容性:回归分析 (lm) 和分布函数 (d/p/q/r) 采用 R 风格的公式和命名约定,并经过严格交叉验证,确保统计结果的准确性。
  • 可视化语法增强:新增的 ggsql 语法支持 LOESS 平滑、线性回归叠加、小提琴图和二维分面,使得在 SQL 中生成复杂统计图表成为可能。
  • 性能重大突破:XPT 文件读取速度提升最高达 52 倍,解决了之前 O(N²
查看原文 →kolistat.com