1 统计的哲学认知
“在线新华字典”中对统计一词的解释是“为反映社会某种现象的现状、过
程或特征,采用各种调查方法以取得所需资料并进行整理和分析研究的工作。如进行人口普查,对所取得的资料进行分类、分组、汇总,据以分析研究人口的各种构成和变动情况等。“统计”一词,也常用以指统计资料或统计学”。
“百度百科”中对统计的描述如下:一般来说,统计这个词包括三个含义:
统计工作、统计资料和统计学。这三者之间存在着密切的联系,统计资料是统计工作的成果,统计学来源于统计工作。原始的统计工作即人们收集数据的原始形态已经有几千年的历史,而它作为一门科学,还是从17世纪开始的。英语中统计学家和统计员是同一个,但统计学并不是直接产生于统计工作的经验总结。每一门科学都有其建立、发展和客观条件,统计科学则是统计工作经验、社会经济理论、计量经济方法融合、提炼、发展而来的一种边缘性学科。统计的由来是人类对事物数量的认识形成的定义,汉语中的“统计”有合计、总计的意思。统计的含义是指对某一现象有关的数据的搜集、整理、计算和分析等的活动。常用统计方法包括均值、中位数、众数、正态分布、抽样、标准差、概率论、检验、方差分析、卡方检验等。
统计的对象是客观现象总体的数量特征和数量关系,即研究大量客观现象总体的数量方面,通过对这个对象的研究,以认识客观现象总体的规律性。统计研究的4个物性,(1)统计的数量性体现在数量的多少、数量关系及质与量互变的数量界面,数字是统计的语言,统计研究必须通过数字来测量事物量的类型、大小、关系等。(2)统计的总体性体现在是以客观现象总体的数量方面作为研究对象的。(3)统计的变异性体现在总体各个体的特征表现存在着差异,组成总体的事物必须存在着差异性才有必要进行统计研究。(4)统计的社会性体现在数量总是反映某个系统有意识的活动的条件、过程和结果上,它总是与系统资源的占用有关,反映者系统各要素之间的关系,如占有关系、分配关系、交换关系等。
统计的研究对象是客观现象的总体数量及数量间关系。统计的结果需要反映在有意识活动的条件、过程和结果上。比如说根据统计得出当前内存空间的小碎块太多,与是启动碎块清理工作,再比如统计得出当前公司的薪酬平均水平远低于全行业薪酬最低水平,与是公司做出提高公司的薪酬标准。可以看出统计结果是一种判断的依据,与已定的标准和统计结果做比较来决定下一步的行动。所以统计是基于过去、依据规则、着眼未来的一种处理行为。
2 程序中的统计认识
程序中的统计也处处存在,普通的数组运算都是基于总量进行处理的,根据数组中某种取值数据的量的多少,来决定算法。比如一个大文件的切割,我们会根据大文件的大小,按照一定块的数量进行切割,所以切割算法需要预先知道总量。
2.1 程序代码中的统计
在代码中统计的处理是以数组为对象进行代码编制的。我们以统计一个字串中标点符号个数为例。统计是以总体作为对象的,该字串就是一个个体组成的总体,里面有字母数字也有标点符号。要统计一个总体中标点符号的数量,就需要对原有的总体进行查询找到每一个标点符号,并放入样本总体中,即标点符号数组,在样本总体采集完毕后,对样本数量进行清点,则统计出标点符号的数量。所以程序分两部分(1)样本总体的创建;(2)样本总体的统计。
package com.faintbear;
import java.io.*;
public class Test
{
Char[] c;
Public void bdcreate()//样本总体创建
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
if(str == null) throw new Exception("")//原总体的创建
c = str.toCharArray();
int words = 0;
int ip = 0;
boolean wordflag = false;//样本总体创建算法
for(int i=0;i<c.length;i++){
if((c[i]>='a' && c[i] <= 'z') || (c[i] >= 'A' && c[i] <= 'Z')){
if(wordflag) {
continue;
}else{
words++;
}
wordflag = true;
}else{
wordflag = false;
if(c[i] != ' ')
ip++;
}
}
Public int bdsum()//样本总体统计
{
Return c.length;
}
public static void main(String[] args) throws Exception
{
Bdcreate();//样本总体创建
Bdsum();//样本总体统计
}
}
2.2 数据库中的统计
以mysql中的统计语句为例,来体会数据库中的统计方法。
2.2.1 使用排序使数据有序
通常,你的所有数据真正需要的仅仅是按某种顺序排列。SQL的ORDER BY语句可以以字母或数字顺序组织数据。因此,相似的值按组排序在一起。然而,这个分组时排序的结果,并不是真的分组。ORDER BY显示每条记录而分组可能代表很多记录。
2.2.2 进行分组除去重复值
排序和分组之间的最大区别是:排序的数据显示所有记录(在限定标准范围之内),而分组数据不是显示所有记录。GROUP BY语句对于同样的值只显示一条记录。例如,下面的语句中的GROUP BY语句对数据源中重复出现的数据只返回唯一的zip编码列。
SELECT ZIP FROM Customers GROUP BY ZIP
只包括由GROUP BY和SELECT语句共同定义的那些记录,换句话说,SELECT列表必须满足GROUP BY列表,但是有一个例外就是SELECT列表可以包含聚合函数(GROUP BY语句不允许使用聚合函数)。需要注意的是GROUP BY语句不会对结果分组进行排序。为了使分组按字母或数字有序排列,需要添加ORDER BY语句。此外,在GROUP BY语句中不能引用使用了别名的字段。分组栏目必须是潜在的数据,但它们并不需要显示在结果中。
2.2.3 在分组之前进行数据筛选
你可以添加一个WHERE语句来筛选有GROUP BY所得分组中的数据。例如,下面的语句只返回肯塔基州顾客的唯一ZIP编码列。
SELECT ZIP FROM CustomersWHEREState = ’KY’ GROUP BY ZIP
必须注意的是WHERE语句是在GROUP BY语句求值之前进行数据过滤的。与GROUP BY语句一样,WHERE语句也不支持聚合函数。
2.2.4 返回所有分组
当你使用WHERE语句过滤数据时,结果分组中只显示你指定的那些记录,而符合分组定义但是不满足过滤条件的数据不会包含在某个分组中。当你想在分组中包含所有数据时添加关键字ALL即可,这时WHERE条件就不起作用。例如,在前面的例子中添加关键字ALL就会返回所有的ZIP分组,而不是仅在肯塔基州的那些。
SELECT ZIP FROM CustomersWHEREState = ’KY’ GROUP BY ALL ZIP
这样看来,这两个语句存在冲突,你可能不会以这种方式使用关键字ALL。当你使用聚合函数计算某一列时,使用ALL关键字可能会很方便。例如,下面的语句计算每个肯塔基州ZIP中的顾客数,同时,还会显示其它的ZIP值。
SELECT ZIP, Count(ZIP) AS KYCustomersByZIP FROM
CustomersWHEREState = ’KY’ GROUP BY ALL ZIP
结果分组包括潜在数据中的所有ZIP值,然而,对于那些不是肯塔基州ZIP分组的聚合列(KYCustomersByZIP)将会显示0。远程查询不支持GROUP BY ALL。
2.2.5 分组后筛选数据
WHERE语句在GROUP BY语句之前进行计算。当你需要在分组之后筛选数据时,可以使用HAVING语句。通常情况下,WHERE语句和HAVING语句的返回结果是一样的,但是值得注意的是这两个语句不可互换。当你迷惑时,可以遵循下面的说明:使用WHERE语句过滤记录,使用HAVING语句过滤分组。
一般情况,你会使用HAVING语句和某个聚合函数计算一个分组。例如,下面的语句返回一个唯一的ZIP编码列,但是可能不会包含潜在数据源中所有的ZIP。
SELECT ZIP, Count(ZIP) AS CustomersByZIP FROM
Customers GROUP BY ZIP HAVING Count(ZIP) = 1
只有那些包含一位顾客的分组显示在结果中。
2.2.6 进一步了解WHERE和HAVING语句
如果你对何时应该使用WHERE,何时使用HAVING仍旧很迷惑,请遵照下面的说明:
WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。
HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。
2.2.7 使用聚合函数统计分组数据
分组数据可以帮助我们分析数据,但是有时我们可能需要更多的信息而不仅仅是分组。你可以使用聚合函数来统计分组数据。例如,下面的语句显示每批订购单的总价钱。
SELECT OrderID, Sum(Cost * Quantity) AS OrderTotal
FROM Orders GROUP BY OrderID
对于其它的分组来说,SELECT和GROUP BY列必须匹配。而SELECT语句包含聚合函数时这一规则是一个例外。
2.2.8 8.统计聚合数据
你可以继续统计数据为每个分组显示一个分类统计。SQL的ROLLUP操作符可以为每个分组显示一个额外的分类统计。这个分类统计是使用聚合函数计算每个分组中的所有记录得到的结果。下面的语句为每个分组计算OrderTotal:
SELECT Customer, OrderNumber, Sum(Cost * Quantity)
AS OrderTotal FROM Orders GROUP BY Customer,
OrderNumber WITH ROLLUP
对于有两个分别为20和25 OderTotal值的分组,ROLLUP显示一个OrderTotal值45。ROLLUP结果中的第一条记录是唯一的,因为它是计算所有分组记录,这个值是整个记录集的总值。 ROLLUP在聚合函数中不支持 DISTINCT,也不支持GROUP BY ALL语句。
2.2.9 统计每个列
CUBE操作符比ROLLUP更进一步,它返回每个分组中重复值的个数。它的结果和ROLLUP相同,但是对每位客户的每一列CUBE包含一个额外的记录。下面的语句显示每个分组的统计和额外每位客户的统计。
SELECT Customer, OrderNumber, Sum(Cost * Quantity)
AS OrderTotal FROM Orders GROUP BY Customer,
OrderNumber WITH CUBE
CUBE可以给最综合的统计。它不仅完成聚合和ROLLUP的功能,还可以计算定义分组的其它列,换句话说,CUBE统计每个可能的列组合。
CUBE不支持GROUP BY ALL语句。
2.2.10 对统计结果排序
当CUBE的结果令人迷惑时(它经常是这样),可以添加一个GROUPING函数,如下所示:
SELECT GROUPING(Customer), OrderNumber,
Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP
BY Customer, OrderNumber WITH CUBE
结果中每行包含两个额外的值:
值1表示左边的值是一个统计值,是ROLLUP或CUBE的操作符。
值0表示左边的值是一条由最初的GROUP BY语句产生的详细记录。