探索式数据分析 / Exploratory Data Analysis
在统计学中,探索式数据分析 / Exploratory Data Analysis在统计学中用于分析数据集来获取数据的主要特征,经常会被用于统计图表 (statistical graphics)以及数据可视化(data visualization)中。 Byzer 在byzer-org/byzer-extension的mlsql-mlib提供了相关功能的插件实现, 包含如下算子: 数据剖析/Dat
在统计学中, 探索式数据分析 / Exploratory Data Analysis 在统计学中用于分析数据集来获取数据的主要特征,经常会被用于统计图表 (statistical graphics)
以及 数据可视化(data visualization)
中。
Byzer 在 byzer-org/byzer-extension 的 mlsql-mlib 提供了相关功能的插件实现,
包含如下算子:
- 数据剖析/DataSummary
- 模式识别/PatternDistribution
- 频数分布/DescriptiveMetrics
- 唯一标识符/UniqueIdentifier
注意:
- 探索式数据分析相关算子从
Byzer-lang v2.3.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 可以填的值如下
columnName
,mode
,uniqueValueRatio
,nullValueRatio
,blankValueRatio
,mean
,nonNullCount
,standardDeviation
,standardError
,max
,min
,maximumLength
,minimumLength
,primaryKeyCandidate
,dataLength
,dataType
,ordinalPosition
,%25
,median
,%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 工具,完成全局数据剖析指标展示,所包含的指标包括:
- 列名 columnName
- 数据类型 dataType
- 唯一值比例 uniqueValueRatio
- 空(空值的比例)nullValueRatio
- 空白(空字符串的比例)blankValueRatio
- 均值 mean
- 中位数 (仅数值类型, 非数值类型展示为 0.0) median
- 众数 (仅数值类型,多个众数只显示一个,非数值类型展示 0) mode
- 标准差 (仅数值类型非数值类型展示为0),standardDeviation
- 标准误差(见下方,仅数值类型 standardError
- 最小值 (仅数值类型) max
- 最大值 (仅数值类型) min
- 最小长度 (该列中数据的最小长度)maximumLength
- 最大长度(该列中数据的最小长度)minimumLength
- 序号位置(字段在table中的位置/顺序)ordinalPosition
- 主健候选者(是/否,唯一值的比例为100%的字段,则“是”。)primaryKeyCandidate
- 非空计数 (不是空值的数据量)nonNullCount
- 四分位数 -- %25
- 四分三位数 -- %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是会报错提示参数设置错误。
返回结果示例:
columnName | descriptiveMetrics |
---|---|
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_ID | havana_id | a | b |
---|---|---|---|
1 | 1 | aaa | bbb |
2 | 2 | aaa | bbb |
3 | 3 | aaa | bbb |
4 | 1 | aaa | bbb |
5 | 2 | aaa | bbb |
6 | 3 | aaa | bbb |
可选参数
-
source 设置替换现有列或者创建新列,
new
或replace
,默认值new
。 -
columnName 设置唯一值列的列名,默认为
Unique_ID
,如果输入的列存在,会报错终止操作。
更多推荐
所有评论(0)