!!!###!!!title=智能洞察——VisActor/VMind 教程文档!!!###!!!!!!###!!!description=在数据驱动决策的时代,图表作为数据可视化的核心工具,能够直观地呈现复杂的数据关系。然而,单纯依赖人眼观察和分析图表,往往难以快速、全面地挖掘出数据背后隐藏的洞察。本教程将向你介绍VMind中智能洞察功能,如何通过`getInsights`快速从图表中获取各种类型的洞察,并提供一些示例。!!!###!!!

智能洞察

在数据驱动决策的时代,图表作为数据可视化的核心工具,能够直观地呈现复杂的数据关系。然而,单纯依赖人眼观察和分析图表,往往难以快速、全面地挖掘出数据背后隐藏的洞察。

本教程将向你介绍VMind中智能洞察功能,如何通过getInsights快速从图表中获取各种类型的洞察,并提供一些示例。

getInsights

VMind的getInsights函数是一个强大的工具,它可以帮你从图表中获取图表洞察,并产生语义化的解释。这个函数只需要如下两个参数:

  • spec: 当前VChart图表的具体spec配置
  • options (DataInsightOptions): 洞察相关配置,控制了具体洞察的数量,使用的算法和对应算法的具体配置

在产生智能洞察的过程中,VMind主要做了两件事情,

  • 先通过内置的统计学算法,获取当前图表中蕴含的数据洞察;
  • 再这些识别出来的洞察传递给大模型;让大模型对这些洞察进行润色和语义化解释,在润色过程中,VMind会将字段信息和洞察类型传递给大模型,并不会把任何数据细节传递给大模型

其中第二部大模型润色并不是必须的,可以通过options.usePolish对其进行关闭,此时会得到数据洞察和模版化的语义内容。

内置算法

目前VMind内置的算法主要为统计学相关算法,具体如下所示:

  • LOF(Local Outlier Factor) 局部异常因子检测算法
  • zScore 全局异常点检测
  • IQR (Interquartile Range) 四分位全局异常检测算法
  • Page-Hinkley Test 时序数据异常检测算法
  • Bayesian Inference 转折点检测算法
  • Mann-Kendall Test 趋势检测算法
  • Pearson Correlation Coefficient / SpearmanCorrelation 相关性检测
  • DBSCAN (Density-Based Spatial Clustering of Applications with Noise) 算法
  • Coefficient of Variation 基于变异系数的周期性检测
  • 基础的统计指标,例如最大/最小/平均值/占比异常等等

大模型润色

大模型在智能洞察中,只是起到了一个文本润色功能,使得最终的结果有着较强的可读性,是个可选配置。

洞察类型

目前根据已有的内置算法,VMind可以识别出以下9类不同的洞察类型:

  • 异常点
  • 时序异常点
  • 转折点
  • 占比贡献巨大点
  • 异常区间
  • 整体趋势
  • 异常趋势
  • 相关性
  • 基础统计指标

根据不同的洞察结果,用户可以选取不同的标注/高亮方式在图表中进行呈现。

使用案例

下面是一个使用getInsights的例子:

import VMind from '@visactor/vmind';

const specJson = {
    type: 'line',
    xField: ['年份'],
    yField: ['高考录取率'],
    data: [
      {
        id: 'data',
        values: [
          {"年份": 1977, "高考录取率": 0.05},
          {"年份": 1978, "高考录取率": 0.07},
          {"年份": 1979, "高考录取率": 0.06},
          {"年份": 1980, "高考录取率": 0.08},
          {"年份": 1981, "高考录取率": 0.11},
          {"年份": 1982, "高考录取率": 0.17},
          {"年份": 1983, "高考录取率": 0.23},
          {"年份": 1984, "高考录取率": 0.29},
          {"年份": 1985, "高考录取率": 0.96},
          {"年份": 1986, "高考录取率": 0.3},
          {"年份": 1987, "高考录取率": 0.27},
          {"年份": 1988, "高考录取率": 0.25},
          {"年份": 1989, "高考录取率": 0.23},
          {"年份": 1990, "高考录取率": 0.22},
          {"年份": 1991, "高考录取率": 0.21},
          {"年份": 1992, "高考录取率": 0.25},
          {"年份": 1993, "高考录取率": 0.34},
          {"年份": 1994, "高考录取率": 0.36},
          {"年份": 1995, "高考录取率": 0.37},
          {"年份": 1996, "高考录取率": 0.4},
          {"年份": 1997, "高考录取率": 0.36},
          {"年份": 1998, "高考录取率": 0.34},
          {"年份": 1999, "高考录取率": 0.56},
          {"年份": 2000, "高考录取率": 0.59},
          {"年份": 2001, "高考录取率": 0.59},
          {"年份": 2002, "高考录取率": 0.63},
          {"年份": 2003, "高考录取率": 0.62},
          {"年份": 2004, "高考录取率": 0.61},
          {"年份": 2005, "高考录取率": 0.57},
          {"年份": 2006, "高考录取率": 0.57},
          {"年份": 2007, "高考录取率": 0.56},
          {"年份": 2008, "高考录取率": 0.57},
          {"年份": 2009, "高考录取率": 0.62},
          {"年份": 2010, "高考录取率": 0.69},
          {"年份": 2011, "高考录取率": 0.72},
          {"年份": 2012, "高考录取率": 0.75},
          {"年份": 2013, "高考录取率": 0.75},
          {"年份": 2014, "高考录取率": 0.74},
          {"年份": 2015, "高考录取率": 0.74},
          {"年份": 2016, "高考录取率": 0.75},
          {"年份": 2017, "高考录取率": 0.74},
          {"年份": 2018, "高考录取率": 0.81},
          {"年份": 2019, "高考录取率": 0.8},
          {"年份": 2020, "高考录取率": 0.8},
          {"年份": 2021, "高考录取率": 0.93},
          {"年份": 2022, "高考录取率": 0.96}
      ]
      }
    ]
  };
const vmind = new VMind(options)
const { insights } = await vmind.getInsights(specJson, {
  /** 最多产生 maxNum个洞察内容 */
  maxNum: numLimits,
});

最终产生的结果如下:

可以准确识别出整体的趋势以及1985年明显异常的高考录取率

返回结构

以整体趋势为例,返回的结构化内容如下:

const outlierInsight = {
  /** 类型为异常点Insight */
  type: 'outlier',
  /** 具体的异常点数据 */
  data: [
    {
      index: 8,
      dataItem: {
        年份: 1985,
        高考录取率: 0.96,
      }
    }
  ],
  /** 数值字段 */
  fieldId: '高考录取率',
  /** 当前异常点数值 */
  value: 0.96,
  /** 洞察置信度得分 */
  significant: 1,
  /** 当前系列名称,因为当前图表没有进行seriesField配置,只包含一个系列,因此为vmind的默认值 */
  seriesName: 'vmind_default_series',
  /** 通过pageHinkley算法检测得到 */
  name: 'pageHinkley',
  /** 具体的文本话含义 */
  textContent: {
    /** 具体的文本模版 */
    content: '${b}期间出现显著异常,值为${c}。',
    /** 模版中的变量解析 */
    variables: {
      b: {
        isDimValue: true,
        value: 1985,
        fieldName: '年份'
      },
      c: {
        value: 0.96,
        isMeasure: true,
        fieldName: '高考录取率'
      }
    },
    /** 直接将模版变量进行数值替换的结果 */
    plainText: '1985期间出现显著异常,值为0.96。'
  }
}

洞察添加

识别出图表洞察后,我们可以借助VChart强大的标注能力,将这些内容添加到图表中,最终效果可以如下图所示:

参数详解

具体参数详解可见:getInsights