统计简介

G2 做为 DT 时代 web 端数据分析的工具,最核心的部分是其数据分析能力,这些都是基于一系列的统计方法,在 G2 中的统计方法有以下功能:

  • 将一个数据集合合并成一条数据或者多条记录,例如获取数据集合某一列的最大值、最小值和区间值;
  • 对数据集合进行常见的统计操作:mean,median,mode,variance等常见操作;
  • 支持统计方法嵌套,即可以执行连续的统计分析操作。

统计的分类

根据对数据的处理方式的不同,G2 中提供了以下几种统计函数:

  • summary: 汇总统计,计算数据集合的 最大值、最小值、平均数等;
  • bin:封箱统计,将数据划分成一个个的区域,然后在外面嵌套汇总统计;
  • smooth:线性回归、非线性回归以及各种平滑插值算法,用于查找数据的规律;
  • density:样本估计总体的概率密度;
  • region:计算数值区间,误差区间等;
  • map:用于绘制地图的统计函数,根据地名获取经纬度信息等;
  • treemap:用于矩阵树图的绘制计算。
  • link:用于计算关系图的边的坐标

以下是具体的统计函数介绍:

summary

统计名 解释 示例
summary.min('x*y') 计算列 y 的最小值,按照 x 进行分组 示例
summary.max('x*y') 计算列 y 的最大值,按照 x 进行分组 示例
summary.sum('x*y') 计算列 y 的和,按照 x 进行分组 示例
summary.range('x*y') 计算列 y 的最大值、最小值区间的差值,按照 x 进行分组 示例
summary.mean('x*y') 计算列 y 的平均值,按照 x 进行分组 示例
summary.median('x*y') 计算列 y 的中位数,按照 x 进行分组 示例
summary.mode('x*y') 计算列 y 的众数,按照 x 进行分组 示例
summary.sd('x*y') 计算列 y 的标准差,按照 x 进行分组 示例
summary.count('x') 计算按照 x 分组后,各个分组的个数 示例
summary.proportion('x') 计算按照 x 分组后,各个分组的个数占总数的比例 示例
summary.percent('x*y') 计算每个 y 所有数据 sum(y) 的比例 示例
summary.cumulative('x*y') 计算累积值 示例

注意:

  • summary.<method> 可以接收多个列作为参数,例如:summary.max('x') 或者 summary.max('x*y'),此时用最后一个参数进行汇总统计,前面的参数用于分组,下面示例(钻石数据)表示,按照 'cut'(切割工艺)进行分组,然后统计每个分组的最大'price'(价格)
  chart.point().position(Stat.summary.max('cut*price'));

summary 统计函数生成的新字段

需要说明的是,下面几个统计函数在统计过程中会生成新的字段:

  • summary.count('x') 统计按照 'x' 分组后计算每个分组的个数,产生一个新的字段 ..count
  • summary.percent('x') 统计按照 'x' 分组后计算每个分组 x 字段的和占所有字段 x 和的比例,产生一个新的字段 ..percent
  • summary.proportion('x') 统计按照 'x' 分组后计算每个分组x字段个数,占总数的比例,产生一个新的字段 ..proportion

bin

binWidth:用于指定如何对数据进行划分,默认为0.03,将 x轴,y轴划分成 1/0.03 大约33个分片,每个分片作为一个分组。

统计名 解释 示例
bin.dot('x*y', binWidth) 将 x,y 按照一定的比例进行划分多个区域,默认 0.03,将落到这个区域内的点的 x,y 变成统一的值 示例
bin.rect('x*y', binWidth) 将x,y按照一定的比例进行划分多个区域,默认0.03,将落到这个区域内的点的x,y变成统一的值,可以通过这个统计函数获取出一个矩形范围 示例
bin.hex('x*y', binWidth) 将x,y按照一定的比例进行划分多个区域,默认0.03,将落到这个区域内的点的x,y变成统一的值,可以通过这个统计函数获取出一个六边形范围 示例
bin.quantile.letter('x*y',binWidth) 计算y 的四分位值,一般用于形成箱须图 示例

smooth

统计名 解释 示例
smooth.linear('x*y') 线性回归,生成一条线性回归曲线 示例
smooth.quadratic('x*y') 二阶回归曲线 示例
smooth.cubic('x*y') 三阶回归曲线 示例
smooth.log('x*y') Log 回归曲线 --
smooth.exp('x*y') 次幂回归曲线 示例
smooth.loess.<kernelType>('x*y'[, bandWidth]) 核函数局部回归曲线 示例
smooth.loess.<kernelType>('xyz'[, bandWidth]) 核函数局部回归曲面 示例

kernelType:回归曲线函数类型,可选项:uniform、triangular、epanechnikov、quartic、triweight、tricube、gaussian、cosine;

bandwidth:代表核函数带宽占数据总范围的百分比,是可选的,默认0.01。

  • Stat.smooth.loess.uniform('x*y'[, bandWidth]) 根据核函数 uniform 估计离散点数据的回归曲线;
  • Stat.smooth.loess.triangular('x*y'[, bandWidth]) 根据核函数 triangular 估计离散点数据的回归曲线;
  • Stat.smooth.loess.epanechnikov('x*y'[, bandWidth]) 根据核函数 epanechnikov 估计离散点数据的回归曲线;
  • Stat.smooth.loess.quartic('x*y'[, bandWidth]) 根据核函数 quartic 估计离散点数据的回归曲线;
  • Stat.smooth.loess.triweight('x*y'[, bandWidth]) 根据核函数 triweight 估计离散点数据的回归曲线;
  • Stat.smooth.loess.tricube('x*y'[, bandWidth]) 根据核函数 tricube 估计离散点数据的回归曲线;
  • Stat.smooth.loess.gaussian('x*y'[, bandWidth]) 根据核函数 gaussian 估计离散点数据的回归曲线;
  • Stat.smooth.loess.cosine('x*y'[, bandWidth]) 根据核函数 cosine 估计离散点数据的回归曲线。

density

根据核函数估计数据的分布密度函数。

统计名 解释 示例
density.kernel.<kernelType>('x'[, bandwidth]) 核密度估计概率密度曲线 示例
density.kernel.<kernelType>('x*y'[, bandwidth]) 核密度估计概率密度曲面 示例
density.normal('x', 0.01) 正态分布估计概率密度 示例

kernelType:核函数类型,可选项:uniform、triangular、epanechnikov、quartic、triweight、tricube、gaussian、cosine;

bandwidth:代表核函数带宽占数据总范围的百分比,是可选的,默认0.01。

  • Stat.density.uniform('x'[, bandWidth]) 根据核函数 uniform 估计数据的概率密度函数;
  • Stat.density.triangular('x'[, bandWidth]) 根据核函数 triangular 估计数据的概率密度函数;
  • Stat.density.epanechnikov('x'[, bandWidth]) 根据核函数 epanechnikov 估计数据的概率密度函数;
  • Stat.density.quartic('x'[, bandWidth]) 根据核函数 quartic 估计数据的概率密度函数;
  • Stat.density.triweight('x'[, bandWidth]) 根据核函数 triweight 估计数据的概率密度函数;
  • Stat.density.tricube('x'[, bandWidth]) 根据核函数 tricube 估计数据的概率密度函数;
  • Stat.density.gaussian('x'[, bandWidth]) 根据核函数 gaussian 估计数据的概率密度函数;
  • Stat.density.cosine('x'[, bandWidth]) 根据核函数 cosine 估计数据的概率密度函数。

region

统计名 解释 示例
region.spread.range('x*y') 计算列y的最大值、最小值,构成一个数组,按照x进行分组 示例
region.spread.sd('x*y') 计算列y的标准差的上下范围,构成一个数组,按照x进行分组 示例

map

统计名 解释 示例
map.region('name') 计算对应名称的图形的坐标区域:name 地名,返回格式: [[经度], [纬度]]。 示例
map.center('name') 返回对应名称区域的中心点坐标:name 地名,返回格式: [经度, 纬度] 示例
map.name('x*y') 根据提供的经纬度坐标,获取该坐标对应的区域地名:x 代表经度,y 代表纬度
map.location('x*y') 根据传入的 x y 地理坐标点将点定位到相应的位置:x 代表经度,y 代表纬度 示例

map 对应的统计函数都会自动生成两个经纬度字段:

  • ..long 经度
  • ..lant 维度

treemap

统计名 解释 示例
treemap('children*value') 用于生成简单的 treemap 示例
treemap.squarify('children*value') 划分成比例合适的矩形
treemap.sliceDice('children*value') 是横竖交替的划分,适用于极坐标 示例

treemap的统计函数,都是传入chilren字段和value字段来计算treemap的范围,所以都会自动生成两个字段:

  • ..x,是一个数组,有4个值,每个值代表一个顶点的x坐标
  • ..y,是一个数组,有4个值,每个值代表一个顶点的y坐标
统计名 解释 示例
link('source*target',nodes) 生成指定节点的链接 示例
link.weight('source target weight',nodes) 生成指定节点的有宽度的连接线
link.weight('source target sourceWeight * targetWeight',nodes) 生成指定节点的有宽度变化的连接线 示例
link.sankey('source target weight',nodes) 生成桑基图中指定节点的有宽度的连接线 示例

link 统计函数假定了传入的nodes节点存在以下字段:

  • id 用于判定source,target字段对应的节点
  • x 节点的x坐标
  • y 节点的y坐标

自动生成了表示x,y坐标的字段:

  • ..x, x轴方向的坐标位置,是个二维数组,不带权重时表示起点和终点的x坐标,带权重时表示四个顶点的x坐标
  • ..y, y轴方向的坐标位置,是个二维数组,不带权重时表示起点和终点的y坐标,带权重时表示四个顶点的y坐标

示例

  • 示例 1:使用 bin.rect 和 summary.count 统计函数绘制马赛克图。
$.getJSON('../../static/data/diamond.json',function (data) {
  var Stat = G2.Stat;
  var chart = new G2.Chart({
    id : 'c1',
    width : 800,
    height : 400
  });

  chart.source(data);
  chart.polygon().position(Stat.bin.rect('carat*price',0.01)).color(Stat.summary.count(),'lightness');
  chart.render();
});
  • 示例二:嵌套使用统计函数 bin.rect 和 summary.count 绘制直方图。
$.getJSON('../../static/data/car.json',function (data) {
  var Stat = G2.Stat;
  var chart = new G2.Chart({
    id : 'c2',
    width : 800,
    height : 400
  });

  chart.source(data);
  chart.interval().position(Stat.summary.count(Stat.bin.rect('hwy')));
  chart.render();
});