探索式数据分析 / Exploratory Data Analysis

在统计学中, 探索式数据分析 / Exploratory Data Analysis 在统计学中用于分析数据集来获取数据的主要特征,经常会被用于统计图表 (statistical graphics) 以及 数据可视化(data visualization) 中。

Byzer 在 byzer-org/byzer-extension 的 mlsql-mlib 提供了相关功能的插件实现,

包含如下算子:

  • 数据剖析/DataSummary
  • 模式识别/PatternDistribution
  • 频数分布/DescriptiveMetrics
  • 唯一标识符/UniqueIdentifier

注意

  1. 探索式数据分析相关算子从 Byzer-lang v2.3.2 开始生效
  2. 在 Byzer 发行的产品包中只有 Byzer All-In-One,VSCode Extension 和 K8S 镜像中默认包含该插件,如果您使用的是 Server 版本,请参考Byzer Server 部署 章节中安装 Byzer Extension 的一节进行插件的安装

数据剖析 / DataSummary

Background

在业务真实的数据EDA需求场景背景下,提升和丰富 DataSummary 对数据集的全局统计和剖析的能力。 具体地,DataSummary ET 提供给用户多种功能选项,包括精确计算开关操作( 提供用户小数据量情况下的精确计算分位数,精确计算中位数)以及增加过滤空值和空字符串等功能。

该 ET 属于 Byzer 扩展,代码实现见:SQLDataSummary.scala

User Tutorial

该ET 的输入是一张多个字段的二维表,输出表是多个指标为列名的二维宽表

调用方式如下

-- 假设存在源表数据 table1
select * from table1 as table2;
-- 执行 DataSummary 完成源表数据的数据剖析功能
run table2 as DataSummary.`` as summaryTable;
-- 由于 v2.0 的 DataSummary 展示的剖析指标相对较多,用户可以根据需要选择指标,比如
run table2 as DataSummary.`` as summaryTable
where metrics='mean, median, 75%' -- 选取剖析结果的均值,数据类型,众数,中位数还有3/4分位数作为指标输出
and roundAt='2' -- 剖析数据保留 2 位小数
and approxSwitch="false"; -- 是否精确计算分位数
可选参数
  • metrics 执行要展示的统计值,默认展示所有统计值

比如,用户只想要显示均值,数据类型,众数,还有 3/4 位数, 可以通过如下 SQL 调用

调用方式如下

run table2 as DataSummary.`` as summaryTable
where metrics='mean, datatype, mode, median, 75%'
  • 参数 metrics 可以填的值如下 columnNamemodeuniqueValueRationullValueRatioblankValueRatiomeannonNullCountstandardDeviationstandardErrormaxminmaximumLengthminimumLengthprimaryKeyCandidatedataLengthdataTypeordinalPosition%25median%75

  • 参数 roundAt 指标统计保留位数,默认保留 2 位小数

比如,用户的统计指标,需要展示 4 位小数,可以通过如下调用

run table2 as DataSummary.`` as summaryTable
where rountAt="4";
  • 参数 approxSwitch 指定是否打开近似计算,默认为 false。spark 为了解决大数据量的处理效率, 唯一值,count,众数还有分位数的计算提供了 approxDistinct, approxCount 等功能。如果打开 approxSwitch,就会开启 spark 近似计算,提高计算效率,调用方式如下
run table2 as DataSummary.`` as summaryTable
where approxSwitch="true";
Details

DataSummary ET 是一个数据 EDA 工具,完成全局数据剖析指标展示,所包含的指标包括:

  1. 列名 columnName
  2. 数据类型 dataType
  3. 唯一值比例 uniqueValueRatio
  4. 空(空值的比例)nullValueRatio
  5. 空白(空字符串的比例)blankValueRatio
  6. 均值 mean
  7. 中位数 (仅数值类型, 非数值类型展示为 0.0) median
  8. 众数 (仅数值类型,多个众数只显示一个,非数值类型展示 0) mode
  9. 标准差 (仅数值类型非数值类型展示为0),standardDeviation
  10. 标准误差(见下方,仅数值类型 standardError
  11. 最小值 (仅数值类型) max
  12. 最大值 (仅数值类型) min
  13. 最小长度 (该列中数据的最小长度)maximumLength
  14. 最大长度(该列中数据的最小长度)minimumLength
  15. 序号位置(字段在table中的位置/顺序)ordinalPosition
  16. 主健候选者(是/否,唯一值的比例为100%的字段,则“是”。)primaryKeyCandidate
  17. 非空计数 (不是空值的数据量)nonNullCount
  18. 四分位数 -- %25
  19. 四分三位数 -- %75

模式分布 / PatternDistribution

Background

模式分布 ET 是字符串的模式分布统计的算法 ET。 该 ET 主要是对标 SAS 系统的模式统计功能,总结字符串类型列的文本模式,从统计学的角度观察数据的模式分布,从而更好的结合数据离散化的加工。

该 ET 属于 Byzer 扩展,代码实现见:SQLDataSummary.scala

User Tutorial

该ET 该 ET 的输入是一张多个字段的二维表,输出两列,包含原始列名(只统计 String 类型的列),还有模式分布的 Json 字符串。

调用方式如下

set abc='''
{"name": "elena", "age": 57, "phone": 15552231521, "income": 433000, "label": 0}
{"name": "candy", "age": 67, "phone": 15552231521, "income": 1200, "label": 0}
{"name": "bob", "age": 57, "phone": 15252211521, "income": 89000, "label": 0}
{"name": "candy", "age": 25, "phone": 15552211522, "income": 36000, "label": 1}
{"name": "candy", "age": 31, "phone": 15552211521, "income": 300000, "label": 1}
{"name": "finn", "age": 23, "phone": 15552211521, "income": 238000, "label": 1}
''';

load jsonStr.`abc` as table1;
select name, age, income from table1 as table2;
run table2 as PatternDistribution.`` as pd_table;
可选参数
  • limit 设置最多的模式行,如果模式总数不超过patternLimit的值,默认为100. 比如 name 这一列的模式有 105 个模式,但是 patternLimit 是100, 最后结果表 name 这一列只会显示 100 个模式

调用方式如下

run table2 as PatternDistribution.`` where limit=1000 as pd_table;
  • excludeEmptyVal 设置是否过滤空值,ture 或者 false,默认 true

比如 name 这一列有包含空值或者空字符串,如果 excludeEmptyVal 为 true,那么模式统计不会考虑空值,反之亦然

调用方式如下

run table2 as PatternDistribution.`` where excludeEmptyVal="true" as pd_table;
  • patternLimit 指- 设置最长的模式长度,默认为 1000。 比如 name 这一列的某一个模式长度为 2000, 模式的结果里值展示 substr(0, 1000) 的子串 调用方式如下
run table2 as PatternDistribution.`` where patternLimit=1000 as pd_table;

 

频数分布 / DescriptiveMetrics

Background

频数分布 ET 主要是帮助用户从统计的角度计算 count,输入是一张多列二维表,输出是一个两列的二维表,列1为字段名,列2为该字段的值的分布情况,并以 Json String 的方式展示。

该 ET 属于 Byzer 扩展,代码实现见:SQLDescriptiveMetrics.scala

User Tutorial

该 ET 的输入是一张多个字段的二维表,输出输出两列,包含原始列名(只统计 String 类型的列),还有频数分布的 Json 字符串。

调用方式如下

-- 假设存在源表数据 table1
select * from table1 as table2;
-- 通过run/train关键字执行,频数分布为精确计算,内部有使用Action算子,会触发spark job提交
run table1 as DescriptiveMetrics.`` as descriptiveMetrics
where metricSize='1000'; -- 支持通过参数metricSize控制条数,默认为100条。metricSize小于等于0是会报错提示参数设置错误。

返回结果示例:

columnNamedescriptiveMetrics
age[{"18":1},{"21":7}]
address[{"上海":1},{"广州":7}]

可选参数

  • metricSize 设置最大返回条数。默认返回频数最高的 100 条。按照列名降序排列。

比如 age 这一列不同的值有行数 1000+,但是 metricSize 是100,最后结果表 name 这一列只会显示频数最高的100条。

 

唯一标识符算子/UniqueIdentifier

Background

在某些 EDA 需求中,需要对表生成一列全局唯一的值,该唯一值列为数字顺序递增,不会出现数据乱序,可以选择替换现有列或者创建新列。

该 ET 属于 Byzer 扩展,代码实现见:SQLUniqueIdentifier.scala

User Tutorial

通过Byzer ET的方式执行唯一标识符计算,可以设置可选参数来控制替换现有列或者创建新列,如果是创建新列,需要指定一个列名,默认为Unique_ID,新的列会插入到表的第一列前面;如果选择替换现有列,则会在原有列的位置,进行数据覆盖。

唯一值生成规则:唯一值为从 1 开始的自增ID,步长为 1

调用方式如下

-- 假设存在源表数据 table1
select * from table1 as table2;
-- 调用唯一标识符计算的ET,返回值包括原始列名和频数分布的json数据
run table2 as UniqueIdentifier.`` where source="replace" and columnName="income" as uniqueIdentifier;

返回结果示例:

Unique_IDhavana_idab
11aaabbb
22aaabbb
33aaabbb
41aaabbb
52aaabbb
63aaabbb

可选参数

  • source 设置替换现有列或者创建新列,new 或 replace,默认值 new

  • columnName 设置唯一值列的列名,默认为 Unique_ID,如果输入的列存在,会报错终止操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想做全栈的胖胖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值