原创

MADlib——基于SQL的数据挖掘解决方案(8)——数据探索之描述性统计

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://wxy0327.blog.csdn.net/article/details/79071818

        对数据进行统计是从定量的角度去探索数据,是最基本的数据探索方式,其主要目的是了解数据从统计学上反映的量的特征,以便我们更好地认识这些将要被挖掘的数据。

        我们先要清楚两个关于统计学的基本概念:总体和样本。统计的总体是人们研究对象的全体,又称母体,如工厂一天生产的全部产品。总体中的每一个基本单位,如一件产品称为个体,个体的特征用一个变量,如x来表示。从总体中随机产生的若干个体的集合称为样本,如n件产品。样本实际上就是从总体中随机取得的一批数据,记作n称为样本容量。从统计学的角度,简单说统计的任务是由样本推断总体;从数据探索的角度,我们就要关注更具体的内容,通常是由样本推断总体的数据特征。

        MADlib提供了描述性统计、概率统计、推论统计三类数据统计模块,本篇介绍描述性统计的相关函数及用法。所谓描述性统计分析,就是对一组数据的各种特征进行分析,以便于描述测量样本的各种特征及其所代表的总体的特征。描述性统计分析的度量值很多,常用的如平均数、标准差、协方差、中位数、频数分布、正态或偏态程度等等。这些统计是进行复杂数据分析的基础。MADlib 1.10.0提供皮尔逊森相关和汇总统计两种描述性统计方法。


一、皮尔森相关

1.  皮尔森相关简介

        两个具有二元变量或连续变量的数据对象之间的相关性是对象属性之间线性联系的度量。更准确地描述是,两个数据对象x和y之间的皮尔森相关(Pearson's correlation)系数由下式定义:

 

        这里我们使用标准的统计学记号和定义:


其中分别表示x与y的均值。分别表示x与y的标准差(standard deviation)。表示x与y的协方差(covariance)。

        标准差是各个数据与均值偏离程度的度量,这种偏离有时也称为变异。均值可能被离群点扭曲,并且由于标准差用均值计算,因此它也对离群点敏感。两个变量的协方差是度量两个随机变量相关程度的指标,如果一个变量跟随着另一个变量同时变大或者变小,那么这两个变量的协方差就是正值,反之为负值。协方差的值越接近0,表明两个变量越不具有线性关系。

        虽然协方差能反映两个随机变量的相关程度(协方差大于0的时候表示两者正相关,小于0的时候表示两者负相关),但是协方差值的大小并不能很好地度量两个随机变量的关联程度。为了更好的度量两个随机变量的相关程度,引入了皮尔森相关系数。由公式可知,皮尔森相关系数(相关度)是在协方差的基础上除以了两个随机变量的标准差得到的。

        相关度总是在-1到1之间取值。当两个变量的线性关系增强时,相关系数趋于1或-1;当一个变量增大,另一个变量也增大时,表明它们之间是正相关的,相关系数大于0;如果一个变量增大,另一个变量却减小,表明它们之间是负相关的,相关系数小于0;特别地,如果相关系数等于1,表示完全相关,-1表示完全负相关,即,其中ab是常数。


        下面两个x和y的值集分别给出相关度为-1和+1的情况。为简单起见,第一组中取x和y的均值为0。

        x=(-3,6,0,3,6)

        y=(1,-2,0,-1,2)

        x=(3,6,0,3,6)

        y=(1,2,0,1,2)


        如果相关度为0,表明两个随机变量之间不存在线性相关关系。然而,仍然可能存在非线性关系。在下面的例子中,数据对象的属性之间存在非线性关系,但是它们的相关度为0。

        x=(-3,-2,-1,0,1,2,3)

        y=(9,4,1,0,1,4,9)


        由于两个变量的相关系数直接指出了两个变量线性相关的程度,对于数据探索,皮尔森相关系数比协方差更可取。


2.  MADlib的皮尔森相关函数

        MADlib的皮尔森相关函数为输入源表中的所有数字列生成一个互相关矩阵。如源表中有M个变量(M个数字列),则函数输出是一个Mx M的方形对称矩阵,其中的第(i,j)个元素值就是第i个变量与第j个变量的皮尔森相关系数。输出矩阵对角线上的元素,即变量与自身的相关性总是1.0。

 

(1)语法

        MADlib的皮尔森相关性有两个函数,一个输出相关系数,另一个输出协方差。两个函数的语法只有函数名不同,参数完全一样。

        相关系数函数

correlation( source_table,  
             output_table,  
             target_cols,  
             verbose  
           )  

        协方差函数语法如下,该函数用于计算变量间的协方差。

covariance( source_table,  
            output_table,  
            target_cols,  
            verbose  
           )

(2)参数

参数名称

数据类型

描述

source_table

VARCHAR

包含输入数据的源表名。

output_table

VARCHAR

保存相关矩阵的输出表名。输出表有N行,N+2列,N为目标列数。除输出表外,函数同时还会创建一个名为<output_table>_summary的概要表。输出表和概要表中各字段的含义分别由表2、表3给出。

target_cols(可选)

VARCHAR

缺省值为‘*’。需要计算相关性的列组成的逗号分隔字符串。如果为NULL或‘*’,结果产生源表中所有数字列相关系数或协方差。

verbose(可选)

BOOLEAN

缺省值为FALSE。如果设置为TRUE,将在控制台打印出详细信息。

表1 correlation及covariance函数参数说明

 

列名

数据类型

含义

column_position

INTEGER

指示‘output_table’中变量位置序列号。

variable

VARCHAR

包含相关变量的列名。

<...>

 

表剩下的部分是‘source_table’表中数字列的N x N的相关系数矩阵。

表2 correlation及covariance输出表列说明


        注意,输出表作为下三角矩阵排列,上三角形设为空,对角线元素值为1.0。

 

列名

数据类型

含义

method

VARCHAR

值为‘Correlation’或‘Covariance’。

source_table

VARCHAR

源表名。

output_table

VARCHAR

输出表名。

column_names

VARCHAR[]

计算相关性的列名组成的逗号分隔字符串。

mean_vector

FLOAT8[]

各列均值构成的向量。

total_rows_processed

BIGINT

处理的总行数。

total_rows_skipped

BIGINT

因为缺失值而跳过计算的行数。

表3 概要表列说明


(3)  示例

  • 查看联机帮助

-- 相关系数函数  
select madlib.correlation();  
-- 用法  
select madlib.correlation('usage');  
-- 示例  
select madlib.correlation('example');  
  
-- 协方差函数  
select madlib.covariance();  
-- 用法  
select madlib.covariance('usage');  
-- 示例  
select madlib.covariance('example'); 

  • 创建输入数据集,共有6列,其中id、temperature和humidity三列是数字类型。

drop table if exists example_data;  
create table example_data(  
    id serial, outlook text,  
    temperature float8, humidity float8,  
    windy text, class text);  
insert into example_data values  
(1, 'sunny', 85, 85, 'false', 'dont play'),  
(2, 'sunny', 80, 90, 'true', 'dont play'),  
(3, 'overcast', 83, 78, 'false', 'play'),  
(4, 'rain', 70, 96, 'false', 'play'),  
(5, 'rain', 68, 80, 'false', 'play'),  
(6, 'rain', 65, 70, 'true', 'dont play'),  
(7, 'overcast', 64, 65, 'true', 'play'),  
(8, 'sunny', 72, 95, 'false', 'dont play'),  
(9, 'sunny', 69, 70, 'false', 'play'),  
(10, 'rain', 75, 80, 'false', 'play'),  
(11, 'sunny', 75, 70, 'true', 'play'),  
(12, 'overcast', 72, 90, 'true', 'play'),  
(13, 'overcast', 81, 75, 'false', 'play'),  
(14, 'rain', 71, 80, 'true', 'dont play'),  
(15, null, 100, 100, 'true', null),  
(16, null, 110, 100, 'true', null);

  • 在数据集上运行correlation()函数

-- 计算所有数字列的相关系数  
drop table if exists example_data_output, example_data_output_summary;   
select madlib.correlation( 'example_data',  
                           'example_data_output'  
                         );  
  
-- target_cols设置为NULL或‘*’同样也是计算所有数字列的相关系数  
drop table if exists example_data_output, example_data_output_summary;  
select madlib.correlation( 'example_data',  
                           'example_data_output',  
                           '*'  
                         );  
  
-- 只计算temperature和humidity两列的相关系数  
drop table if exists example_data_output, example_data_output_summary;  
select madlib.correlation( 'example_data',  
                           'example_data_output',  
                           'temperature, humidity'  
                         ); 

        函数执行时缺省在控制台打印类似如下的信息:

                             correlation                                
----------------------------------------------------------------------  
 Summary for 'correlation' function                                     
 Output table = example_data_output                                     
 Non-numeric columns ignored: ['outlook', 'windy', 'class']             
 Producing correlation for columns: ['id', 'temperature', 'humidity']   
 Total run time = ('example_data_output', 3, 2.883681058883667)  
(1 row) 

  • 查看相关矩阵

select * from example_data_output order by column_position;

        结果:

 column_position |  variable   |    temperature    | humidity   
-----------------+-------------+-------------------+----------  
               1 | temperature |                 1 |           
               2 | humidity    | 0.616876934548786 |        1  
(2 rows) 

        根据皮尔森相关系数计算公式,执行下面的查询验证函数执行结果:

select t1.cov /t2.std pearson_correlation  
  from (select s / c cov  
          from (select sum((temperature-avgt) * (humidity-avgh)) s  
                  from example_data,  
                       (select avg(temperature) avgt ,avg(humidity) avgh from example_data) t1) t1,  
               (select count(*) - 1 c from example_data) t2) t1,  
       (select madlib.array_stddev(array_agg(temperature))*madlib.array_stddev(array_agg(humidity)) std  
          from example_data) t2;

        结果:

 pearson_correlation 
---------------------
   0.616876934548786
(1 row)

        可以看到,按公式得出的humidity与temperature的相关系数与函数的输出结果相同。

  • 计算数据集特征的协方差

drop table if exists cov_output, cov_output_summary;  
select madlib.covariance( 'example_data',  
                          'cov_output'  
                         );  

        函数执行时缺省在控制台打印如下信息:

                              covariance                                
----------------------------------------------------------------------  
 Summary for 'correlation' function                                     
 Output table = cov_output                                              
 Non-numeric columns ignored: ['outlook', 'windy', 'class']             
 Producing correlation for columns: ['id', 'temperature', 'humidity']   
 Total run time = ('cov_output', 3, 1.0324928760528564)  
(1 row)

  • 查看协方差矩阵

select * from cov_output order by column_position;

        结果:

 column_position |  variable   |   id    | temperature | humidity 
-----------------+-------------+---------+-------------+----------
               1 | id          |   21.25 |             |         
               2 | temperature | 22.1875 |      146.25 |         
               3 | humidity    |  8.6875 |      82.125 | 121.1875
(3 rows)

        注意,函数输出中humidity与temperature的协方差是82.125,分母用n代替了n-1,若出于无偏估计的要求,应该被(n-1)除:

dm=# select s/c cov1, s/(c-1) cov2
dm-#   from (select sum((temperature-avgt) * (humidity-avgh)) s  
dm(#           from example_data,  
dm(#                (select avg(temperature) avgt ,avg(humidity) avgh from example_data) t1) t1,  
dm-#        (select count(*) c from example_data) t2; 
  cov1  | cov2 
--------+------
 82.125 | 87.6
(1 row)

        当前实现在计算列的相关系数时,会忽略列中包含的空值,这意味着NULL对最终相关性结果没有任何影响。

        相关系数的一个常见应用是特征选择与降维。相关系数的绝对值大小表示两个变量之间的线性相关强度,正负号表示相关的方向。一般来说,若观测数据的个数越多,计算出来的相关系数越能真实地反映客观事物的本来面目。

        设相关系数为r,当0.7≤|r|<1时,称为高度相关;当0.4≤|r|<0.7时,称为中等相关;当0.2≤|r|<0.4时,称为低度相关;当|r|<0.2时,称为极低相关。如果变量x与y是高度相关的,说明它们传递了相似的信息,可能只需要保留x、y之一,而抛弃掉另一个。

        由于事务之间的复杂性,在实际研究中,要结合具体变量的特点和专业知识,解释通过统计方法确定的皮尔森相关系数。两个高度相关的变量,它们之间可能具有明显的因果关系,也可能只具有部分因果关系,还可能没有直接因果关系,其数量上的相互关联,只是它们共同受到其它第三个变量所支配的结果。除此之外,相关系数r接近0,只是表示这两个变量不存在明显的线性相关模式,但不能肯定地说这两个变量之间就没有规律性的联系。如前面所示的,两个变量之间存在明显的某种曲线性相关,但计算线性相关系数时,其r值往往接近零。

 

二、汇总统计

1.  汇总统计简介

        汇总统计(summary statistics)是量化的,用单个数或数的小集合捕获可能很大的值集的各种特征。对于大多数应用,汇总统计是最常见的统计形式。统计量是加工出来的、反映样本数量特征的函数,它不含任何未知量。

(1)基本统计量

        非严格定义情况下,一个数据集合的基本统计量包括总记录数、不同值的个数及各自占比、缺失值的记录数及占比、空白值的记录数及占比等值。从数据库表的角度看,这些统计量简单而直观,对目标属性列使用基本的count(*)、count(distinct)函数,以及类似 is null 这样的过滤条件执行数据库查询即可得到诸如此类的统计量。


(2)频率和众数

        给定一个无序的、分类在上取值的数据集合,设集合中有m个数据对象,则值的频率定义为:

分类属性的众数(mode)是具有最高频率的值。

        分类属性常常(但并非总是)具有少量值,因此这些值的众数和频率可能是令人感兴趣的和有用的。而对于连续数据,按此定义的众数通常没有意义,因为单个值的出现不超过一次。然而,在某些情况下,众数可能提供关于值的性质或关于出现遗漏值的重要信息。例如,以毫米为单位测量,20个人的身高通常不会重复,但是如果以分米为单位测量,则某些人可能具有相同的身高。此外,如果使用唯一的值表示遗漏值,则该值常常表现为众数。


(3)百分位数

        对于有序数据,考虑值集的百分位数(percentile)更有意义。具体地说,给定一个有序的或连续的属性x和0与100之间的数p,第p个百分位数是一个x值,使得xp%的观测值小于。例如,从1到10的整数的百分位数依次为:1,2,3,4,5,6,7,8,9,10。按照惯例,,而


(4)位置度量:均值和中位数

        对于连续数据,两个使用最广泛的汇总统计是均值(mean)和中位数(median),它们是值集位置的度量。考虑m个对象的集合和属性x,设是这m个对象的x属性值,设代表以非递减序排序后的x值。这样,,而,于是均值和中位数定义如下:

        概括地说,如果有奇数个值,则中位数是中间值;如果有偶数个值,则中位数是中间两个值的平均值。这样,对于7个值,中位数是,而对于10个值,中位数是

        尽管有时将均值解释为值集的中间,但是这仅当值以对称方式分布时才是对的。如果值的分布是倾斜的,则中位数是中间的一个更好的指示符。此外,均值对于离群值很敏感,对于包含离群值的数据,中位数也可以提供一个中间值的良好估计。

        为了克服传统均值定义的问题,有时使用截断均值(trimmed mean)概念。指定0和100之间的百分位数p,丢弃高端和低端(p/2)%的数据,然后用常规的方法计算均值,所得的结果即是截断均值。中位数是p=100%时的截断均值,而标准均值是对应于p=0%时的截断均值。


(5)散布度量:极差和方差

        连续数据的另一组常用的汇总统计是值集的散布度量。这种度量表明属性值是否散布很宽,或者是否相对集中在单个点(如均值)附近。

        最简单的散布度量是极差(range)。给定属性x,它具有m个值x的极差定义为:

        尽管极差标识最大分布,但是如果大部分值都集中在一个较窄的范围内,并且更极端的值的个数相对较少,则可能会引起误解。因此,作为散布的度量,方差(variance)更可取。通常,属性x的观测值的方差记作,定义如下:

标准差是方差的平方根,记作,它与x具有相同的单位。


        方差对离群值特别敏感,因为它使用均值与其它值的差的平方。这就常常需要使用比值集散布更稳健的估计。下面是三种这样的度量的定义:绝对平均偏差(absolute average deviation,AAD)、中位数绝对偏差(median absolute deviation,MAD)和四分位数极差(interquartile range,IQR)。


(6)分布度量:偏度和峰度

        值集的偏度(skewness)反映分布的对称性,偏度大于零称为右偏态,此时数据位于均值右边的比位于左边的多;偏度小于零称为左偏态,情况相反;而偏度接近0则可认为分布是对称的。

        峰度(kurtosis)是分布形状的另一种度量。正态分布的峰度为3,若峰度比3大得多,表示分布有沉重的尾巴,说明样本中含有较多远离均值的数据,因而峰度可以用作衡量偏离正态分布的尺度之一。


2.  MADlib的汇总统计函数

        MADlib的summary()函数为任意数据表生成汇总统计。该函数调用MADlib库中的多种方法提供数据汇总度量值。

(1)  语法

        summary()函数语法如下:

summary ( source_table,  
          output_table,  
          target_cols,  
          grouping_cols,  
          get_distinct,  
          get_quartiles,  
          ntile_array,  
          how_many_mfv,  
          get_estimates  
        ) 

        该函数返回以下三部分内容:

  • output_table:TEXT类型,输出表的名称。
  • row_count:INTEGER类型,输出表的行数。
  • duration:FLOAT8类型,计算汇总值所用的秒数。


(2)  参数

参数名称

数据类型

描述

source_table

TEXT

包含输入数据的源表名。

output_table

TEXT

包含汇总值的输出表名。汇总结果保存在output_table参数指定的表中,表5给出输出表列的说明。

target_cols(可选)

TEXT

缺省值为NULL,请求汇总列组成的逗号分隔字符串。如果为NULL,为所有列生成汇总统计。

grouping_cols(可选)

TEXT

缺省值为NULL,分组列构成的逗号分隔字符串。如果为NULL,为全表生成汇总统计(不分组)。函数为每个分组列独立计算汇总统计信息,也就是说分组列不合并在一起(类似SQL中的grouping合计),这点与常规的PostgreSQL风格的GROUP BY命令不同。

get_distinct(可选)

BOOLEAN

缺省为TRUE,表示计算不同值。

get_quartiles(可选)

BOOLEAN

缺省为TRUE,表示计算四分位数。

ntile_array(可选)

FLOAT8[]

缺省值为NULL。要计算的百分位数组。如果为NULL,不计算分位数值。MADlib 1.10.0 不支持PostgreSQL 9.3及以后版本。

how_many_mfv

INTEGER

缺省值为10,指定需要计算的最频繁值的数目。

get_estimates

BOOLEAN

缺省值为TRUE,表示为不同值和最频繁值产生估算。如果该参数为FALSE,计算精确值(根据数据大小可能需要更长的运行时间。)

表4 summary函数参数说明

 

列名

数据类型

含义

group_by

TEXT

分组列的名称,没分组时为NULL。

group_by_value

TEXT

分组的值,没分组时为NULL。

target_column

TEXT

请求汇总统计的目标列。

column_number

INTEGER

目标列的物理列号,是该列对应的pg_attribute.attnum值。

data_type

TEXT

目标列的数据类型,显示标准GPDB类型描述。

row_count

BIGINT

目标列的行数。

distinct_values

BIGINT

目标列不同值的个数。如果调用summary()函数时get_estimates参数设置为TRUE,该值为基于Flajolet Martin算法的不同值估算。

missing_values

BIGINT

目标列中缺失值的行数。

blank_values

BIGINT

空白的数目。空白值是由下面的正则表达式定义: '^\w*$'

fraction_missing

FLOAT

小数表示的具有丢失值的行占总行数的百分比。

fraction_blank

FLOAT

小数表示的具有空白值的行占总行数的百分比。

mean

FLOAT

目标列的均值,如果目标列不是数字类型,则该值为NULL。

variance

FLOAT

目标列的方差,如果目标列不是数字类型,则该值为NULL。

min

FLOAT

目标列的最小值。对于字符串类型,该值为最短字符串的长度。

max

FLOAT

目标列的最大值。对于字符串类型,该值为最长字符串的长度。

first_quartile

FLOAT

目标列的第一个四分位数,仅针对数字列。MADlib 1.10.0 不支持PostgreSQL 9.3及以后版本。

median

FLOAT

目标列的中位数,仅针对数字列。MADlib 1.10.0 不支持PostgreSQL 9.3及以后版本。

third_quartile

FLOAT

目标列的第三个四分位数,仅针对数字列。MADlib 1.10.0 不支持PostgreSQL 9.3及以后版本。

quantile_array

FLOAT[]

对应ntile_array百分位的值。MADlib 1.10.0 不支持PostgreSQL 9.3及以后版本。

most_frequent_values

TEXT[]

包含出现最频繁的值的数组。how_many_mfv参数决定数组长度,缺省值是10。如果调用summary()函数时get_estimates参数设置为TRUE(缺省),使用更快的并行聚合方法估算频繁值。

mfv_frequencies

BIGINT[]

包含最频繁值的频率计数的数组。

表5 summary函数输出表列说明


(3)  示例

  • 查看summary()函数的联机帮助。

select * from madlib.summary();  
-- 用法  
select madlib.summary('usage');  
-- 示例  
select madlib.summary('example'); 

  • 创建输入数据集。

drop table if exists houses;  
create table houses (id int, tax int, bedroom int, bath float, price int,  
             size int, lot int);  
copy houses from stdin with delimiter '|';  
  1 |  590 |       2 |    1 |  50000 |  770 | 22100  
  2 | 1050 |       3 |    2 |  85000 | 1410 | 12000  
  3 |   20 |       3 |    1 |  22500 | 1060 |  3500  
  4 |  870 |       2 |    2 |  90000 | 1300 | 17500  
  5 | 1320 |       3 |    2 | 133000 | 1500 | 30000  
  6 | 1350 |       2 |    1 |  90500 |  820 | 25700  
  7 | 2790 |       3 |  2.5 | 260000 | 2130 | 25000  
  8 |  680 |       2 |    1 | 142500 | 1170 | 22000  
  9 | 1840 |       3 |    2 | 160000 | 1500 | 19000  
 10 | 3680 |       4 |    2 | 240000 | 2790 | 20000  
 11 | 1660 |       3 |    1 |  87000 | 1030 | 17500  
 12 | 1620 |       3 |    2 | 118600 | 1250 | 20000  
 13 | 3100 |       3 |    2 | 140000 | 1760 | 38000  
 14 | 2070 |       2 |    3 | 148000 | 1550 | 14000  
 15 |  650 |       3 |  1.5 |  65000 | 1450 | 12000  
\. 

  • 运行summary()函数。

drop table if exists houses_summary;  
select * from madlib.summary( 'houses',  
                              'houses_summary',  
                              'tax,bedroom,bath,price,size,lot',  
                              'bedroom',  
                              true,  
                              true,  
                              array[0.1, 0.2, 0.3],  
                              5,  
                              false  
                            );  

        结果:

  output_table  | row_count |   duration      
----------------+-----------+---------------  
 houses_summary |        21 | 2.05865597725  
(1 row)

        这里为除id外的其它6个数字列计算汇总统计值,并且按‘bedroom’列分组。array[0.1, 0.2, 0.3]参数表示求每一列的10%、20%、30%的百分位值。

  • 查看汇总统计数据。

\x on  
select * from houses_summary; 

        结果:

-[ RECORD 1 ]--------+-----------------------------------
group_by             | bedroom
group_by_value       | 2
target_column        | tax
column_number        | 2
data_type            | int4
row_count            | 5
distinct_values      | 5
missing_values       | 0
blank_values         | 
fraction_missing     | 0
fraction_blank       | 
mean                 | 1112
variance             | 373020
min                  | 590
max                  | 2070
first_quartile       | 680
median               | 870
third_quartile       | 1350
quantile_array       | {626,662,718}
most_frequent_values | {1350,590,680,2070,870}
mfv_frequencies      | {1,1,1,1,1}
-[ RECORD 2 ]--------+------------------------------------  
...  
-[ RECORD 21 ]-------+------------------------------------  
... 

        可以看到,输出表有21条记录。bedroom列具有2、3、4三个值,summary函数按每个bedroom的值分三组计算其它5列的汇总统计值,并且会按不分组(表级)计算全部6个列的汇总统计值,因此生成21条结果数据。

  • 可以执行下面的查询验证madlib.summary函数输出中tax的概要:

select t1.*,t2.most_frequent_values,t2.mfv_frequencies from  
(   
select bedroom group_by_value,  
       count(tax) row_count,  
       count(distinct tax) distinct_values,  
       sum(case when tax is null then 1 else 0 end) missing_values,  
       sum(case when tax is null then 1 else 0 end)/count(*) fraction_missing,  
       avg(tax) mean,  
       power(madlib.array_stddev(array_agg(tax)),2) variance,  
       min(tax) min,  
       max(tax) max,  
       percentile_cont(0.25) within group(order by tax) first_quartile,  
       median(tax),  
       percentile_cont(0.75) within group(order by tax) third_quartile,
       regexp_split_to_array(
       percentile_cont(0.1) within group(order by tax)||','||
	   percentile_cont(0.2) within group(order by tax)||','||
	   percentile_cont(0.3) within group(order by tax), ',') quantile_array
  from houses   
 group by group_by_value) t1,  
(  
select bedroom group_by_value,  
       array_agg(tax order by rn) most_frequent_values,  
       array_agg(c order by rn) mfv_frequencies  
  from (select row_number() over (partition by bedroom order by count(tax)) rn,  
               bedroom,  
               tax,  
               count(*) c   
          from houses  
         group by bedroom,tax  
         order by bedroom,count(*) desc) t1  
 where rn <=5  
 group by bedroom) t2  
 where t1.group_by_value = t2.group_by_value; 

        结果:

-[ RECORD 1 ]--------+--------------------------
group_by_value       | 2
row_count            | 5
distinct_values      | 5
missing_values       | 0
fraction_missing     | 0
mean                 | 1112
variance             | 373020
min                  | 590
max                  | 2070
first_quartile       | 680
median               | 870
third_quartile       | 1350
quantile_array       | {626,662,718}
most_frequent_values | {1350,680,590,870,2070}
mfv_frequencies      | {1,1,1,1,1}
-[ RECORD 2 ]--------+--------------------------  
...  
-[ RECORD 3 ]--------+--------------------------  
... 


文章最后发布于: 2018-01-16 13:11:44
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览