数据分析之路—数据的描述性统计

  • 2019 年 10 月 8 日
  • 筆記

原创:a廉小宝

数据的描述性统计

将知识点关键概念也记录下来加一些自己的理解,知识是第一生产力? 使用编程语言对所学知识加以实践,实践才能体现理论的价值⛽️

理论:

数据描述的维度及指标

数据的集中趋势描述

数据的集中趋势描 述是寻找反映事物特征的数据集合的代表值或中心值,这个代表值或中 心值可以很好地反映事物目前所处的位置和发展水平,通过对事物集中 趋势指标的多次测量和比较,还能够说明事物的发展和变化趋势。国家 的人均GDP就是一个集中趋势指标,虽然每个人对国家的GDP贡献度不 一样,但是人均GDP能够代表每个人对国家GDP的平均贡献度,从而反 映一个国家的经济发展水平。

算术平均值
1.简单算术平均值

将数据集合的所有数据值相加的和除以数据值个数就得到简单算术平均值

假设有一组包含n个数值的数据集合,它们的数值分别为x1 ,x2 , …,xn ,该数据集合的简单算术平均值的计算公式为:

2.加权算术平均值

因为简单算术平均值认为所有的数据值都具有同等的重要性,所以 每个数据值都具有相同的权重。但是有些时候,每个数据值的权重是不 一样的,需要用加权算术平均值来表示数据集合的集中趋势

假设有一个数据集合,总共包括k个不同类别的数据组,各组的简单算术平均值 表示为x1-,x-2,…,x-k,每个数据组的数值个数分别为f1,f2,…, fk,每组的数值个数就是每个数据组的权重,那么加权算术平均值的计算公式可以表示为:

3.使用算术平均值的注意事项

当数据集合中有 极大值或极小值存在时,会对算术平均值产生很大的影响,其计算结果 会掩盖数据集合的真实特征,这时算术平均值就失去了代表性

几何平均值

有些数据之间的关系不是加减关系,而是乘除关系。此时,应该用 几何平均值来表示由这样的数值组成的数据集合的集中趋势。例如,银 行的平均存款年利率、汽车工厂每条生产线的平均产品合格率、国家十 年来的平均发展速度等。几何平均值被用于各种定比数据的平均值计 算,假设有一个定比数据集合,集合中的数值分别为x1,x2,…,xn, 且所有的数值均大于 0,那么该数据集合的几何平均值的计算公式为

比如 生产线上工序1合格率为85%,工序2合格率为97%,工序3合格率为94% … 那么生产单件的产品的合格率为

众数

数据集合中出现次数最多的数值被称为众数。如果在一个数据集合 中,只有一个数值出现的次数最多,那么这个数值就是该数据集合的众 数

中位数

对于数据集合(x1,x2,…,xn),将所有的数值按照它们的大小,从高到低或从低到高进行排序,如果数据集合包含的数值个数是基 数,那么排在最中间的数值就是该数据集合的中位数;如果数据集合的 数值个数是偶数,那么取最中间两个数值的算术平均值作为中位数。例 如,现有数据集合{2,3,5,7,8,9,10}和{3,5,7,8,9,10, 11,12},它们的中位数分别为7和8.5

中位数与算术平均值相比,中位数的优势在于不受数据集合中个别 极端值的影响,表现出稳定的特点。这一特点使其在数据集合的数值分 布有较大偏斜时,能够保持对数据集合特征的代表性。因此,中位数常 被用来度量具有偏斜性质的数据集合的集中趋势(啥时候国家统计局公布一下工资中位数让我知道我没有怎么拖后腿)

数据的离散程度描述

极差

极差又被称为全距,是指数据集合中最大值与最小值的差值,表示 整个数据集合能够覆盖的数值距离

)

平均偏差

离散程度是一个相对概念,需要通过与参考值的对比才能表示出离 散程度。因为算术平均值是最重要也是最常用的集中趋势指标,所以均 值也就自然能够成为参考值

方差和标准差
1.总体的方差和标准差

如果数据集合(x1,x2,…,xn)就是数据总体,并且数据集合有 N个数值(个案),假设数据总体的均值为μ,那么总体方差σ2的计算公式为:

总体标准差是方差的正值平方根,其计算公式为:

2.样本的方差和标准差

一般情况下,能够作为数据总体的数据集合容量都是非常庞大的, 基于成本的考虑,不可能采集数据总体的全部数值(个案)。通常的做 法是从数据总体中随机抽取一定数量的样本数值,然后用样本数值的方 差和标准差来估计总体的方差和标准差。为了区分,样本的均值用x-表 示,样本方差用s2表示,样本标准差用s表示。假设样本容量为n,那么:

样本方差是总体方差的无偏估计,并不代表任意抽取某个样本,用 样本方差公式计算得到的样本方差等于总体方差。这句话的真实意思是 从总体中抽取全部可能情况的样本容量为n的样本,这些样本计算得到 的样本方差的均值等于总体方差,也就是无偏的。

变异系数

方差和标准差虽然能够表示数据集合中每个数值(个案)距离算术 均值的平均偏差距离,但是这个距离的大小程度却不能很好展现,特别 是对于算术平均值不同的两个数据集合。如果两者的方差和标准差相等 时,那么到底哪个数据集合的离散程度更高、更低或相同?对于这个问 题,方差和标准差解决不了,变异系数却可以(也就是不同的数量级等问题会影响到指标,一个人一小时完成10件标准差2和一个人一小时完成100件标准差2.1显然后者更优秀)

四分位极差

将所有数据按照大小,从低到高进 行排序,如果数据集合的数值个数是奇数,那么排在最中间的数据值即 为中位数;如果数值个数是偶数,那么取最中间两个数值的算术平均值 作为中位数。以此类推,排在四分之一位置的数值即为第一四分位数 Q1;排在四分之二位置的数值为第二四分位数Q2 ,也就是中位数;排在四分之三位置的数值为第三四分位数Q3。这三个四分位数将整个数据集合分成四等分。四分位极差等于第一四分位数与第三四分位数的差 值(Q3-Q1),这个差值区间包含了整个数据集合50%的数据值

数据的分布形态描述

集中趋势和 离散程度是数据分布的两个重要特征,但要全面了解数据分布的特点还要知道数据分布的形状是否对称、倾斜程度以及分布的扁平程度。偏态和峰态就是对分布形状的测度。

偏态系数

高度偏态系数 SK>1 或 SK<-1 中等偏态分布 0.5<SK<1 或 -0.5<SK<-1 正态分布 SK=0

峰态系数

峰态通常是指标准正态分布比较而言。如果一组数据服从标准正态分布,则峰态系数的值等于0;若峰态系数的值明显不等于0,则表明分布比正态分布更平或者更尖,通常称为平峰或尖峰分布。

代码实践:

python

import numpy as npy  import pandas as pd  import scipy.stats as s    data_pre = npy.random.random_integers(1, 10, 5)  data = pd.Series(data_pre)  print(data)      # 所有的描述展示  print(data.describe(include='all'))    # 单独统计  # 众数  print('众数:', data.mode()[0])  # 中位数  print('中位数:', data.median())  # 分位数  print('四分位:n 第一分位:{0} n 第二分位:{1} n 第三分位:{2}'.format(data.quantile(0.25)                                                          , data.quantile(0.5)                                                          , data.quantile(0.75)))  # 算术平均数  print('算术平均数:', data.mean())    # 加权平均数  qs = npy.random.rand(data.count())  tmp = data * qs/qs.sum()  print('加权平均数:%.3f' % tmp[0])    # 几何平均数  print('几何平均数: %.3f' % s.gmean(data))    # 方差  print('方差:%.3f' % data.var())    # 标准差  print('标准差:%.3f' % data.std())    # 极差  print('极差:',  data.max()-data.min())    # 平均差  print('平均差:%.3f' % npy.abs(data-data.mean()).mean())    # 四分位极差  print('四分位极差:', data.quantile(0.75)-data.quantile(0.25))    # 异众比率  print('异众比率:', 1-data.value_counts()[data.mode()].sum()/data.count())    # 离散系数  print('离散系数:', data.std()/data.mean())    # 峰态系数  print('峰态系数:', s.kurtosis(data))

Excle

可视化图表

散点图用来分析统计一些聚集点指标

折线图

import matplotlib.pylab as pyl  import numpy as npy    x = [10, 20, 30, 40, 80]  y = [53, 74, 22, 18, 51]    pyl.title("show")  pyl.xlabel("age")  pyl.ylabel("salary")  pyl.xlim(0, 100)  pyl.ylim(0, 100)  pyl.plot(x, y)  pyl.show()

柱状图

data2 = npy.random.normal(50.0, 10.0, 100)#(均数、西格玛、个数)  # print(data2)  pyl.hist(data2)  pyl.show()
# -*- coding: utf-8 -*-  import math      # 算数平均数  def avg(num_list):      return sum(num_list)/len(num_list)      # 几何平均数  def avg_geometry(num_list):      sum = 1      if num_list and len(num_list) > 0:          length = len(num_list)          for num in num_list:              sum *= num          return math.pow(sum, 1.0/length)      # 中位数/分位数  def median(num_list, split_num=2):      num_list.sort()      length = len(num_list)      result = []      if not split_num or split_num == 2:          if length % 2 == 0:              return (num_list[int(length/2-1)] + num_list[int(length/2)])/2          else:              return num_list[length/2-1]      else:          if length % split_num == 0:              i = split_num              while i > 1:                  result.append((num_list[int(length / i - 1)] + num_list[int(length / i)]) / 2)                  i -= 1              return result          else:              i = split_num              while i > 1:                  result.append(num_list[int(length / i - 1)])                  i -= 1              return result      # 平均差  def average_deviation(num_list):      avg_num = avg(num_list)      return sum([abs(num-avg_num) for num in num_list])/len(num_list)      # 方差  def variance(num_list):      avg_num = avg(num_list)      return sum([math.pow(num - avg_num, 2) for num in num_list])/len(num_list)      # 标准差  def standard_deviation(num_list):      return math.pow(variance(num_list), 1.0/2)      # 离散系数 又叫变异系数 标准差/平均数  def coefficient_dispersion(num_list):      return standard_deviation(num_list)/avg(num_list)      # 众数  def mode(num_list):      dict = {}      result = []      max = 0      if num_list and len(num_list) > 0:          for num in num_list:              if num in dict:                  dict[num] += 1              else:                  dict[num] = 1          d1 = sorted(dict.values(), reverse=True)          max = d1[0]          for num in dict:              count = dict.get(num, 0)              if count == max:                  result.append(num)      return result      # 异众比率 不是众数在总数占比  def variation_ratio(num_list):      count = 0      mode_nums = mode(num_list)      for num in num_list:          if num not in mode_nums:              count += 1      return count/len(num_list)      if __name__ == '__main__':      list = [2, 10, 60, 6, 5, 6]      # 以下 在numpy都有实现      print(mode(list))      print(avg(list))      print(avg_geometry(list))      print(median(list))      print(average_deviation(list))      print(variance(list))      print(standard_deviation(list))      print(variation_ratio(list))      print(coefficient_dispersion(list))      print(median(list, split_num=3))