利用Python进行描述性统计

    统计学分为描述统计学和推断统计学,描述统计学是使用特定的数字或图表来体现数据的集中程度或离散程度,如平均数、中位数、众数、方差、标准差;推断统计学是根据样本数据来推断总体特征,如产品检查,一般采用抽检,根据所抽样本的质量合格率作为总体质量合格率的一个估计。

一、均值、中位数、众数、极差、方差、标准差

    利用Python进行描述性统计分析,需要用到numpy库和scipy库:

from numpy import mean,median,ptp,var,std
from scipy.stats import mode
  首先使用list创造一组数据:

#使用list创造一组数据
data = [93,62,51,93,75,82,93,62,65,51]

  均值就是求数据的算数平均数,描述数据的平均水平:

#均值
a1 = mean(data)
print '均值:'
print a1
  中位数是将数据按大小排列后,位于正中间的数描述,描述中等水平:
#中位数
a2 = median(data)
print '中位数:'
print a2
  众数是在数据中出现次数最多的数,描述一般水平。在一组数据中,可能存在多个众数,如1,2,2,3,3,4,2和3均为众数;也可能不存在众数,如1,2,3,4。众数不仅适用于数值型数据,也适用于非数值型数据,如苹果,苹果,梨,香蕉,苹果为众数。
#众数
a3 = mode(data)
print '众数:'
print a3
  均值、中位数、众数都可以描述数据的集中或离散型程度,各其有利弊:   

  优点 缺点
均值 充分利用所有数据,适用性强 容易受极端值影响
中位数 不受极端值影响 缺乏敏感性
众数 不受极端值影响;当数据具有明显的集中趋势时,代表性好 缺乏唯一性

    根据数据的分布是否对称,数据分布可分为正态分布与偏态分布。偏态分布分为正偏态分布与负偏态分布。其中,若众数<中位数<平均数,则为正偏态分布,如图1所示;若平均数<中位数<众数,则属于负偏态分布,如图2所示。

利用Python进行描述性统计_第1张图片 利用Python进行描述性统计_第2张图片
图1 正偏态分布                                         图2 负偏态分布

  极差为最大值-最小值,简单的描述数据范围大小:

#极差
a4 = ptp(data)
print '极差:'
print a4
  方差描述数据的离散程度,两组极差相同的数据可能有不同的方差:

#方差
a5 = var (data)
print '方差:'
print a5
   标准差也描述数据的离散程度,与方差相比,保持了数据单位的一致性:

#标准差
a6 = std(data)
print '标准差:'
print a6
二、直方图、箱线图、茎叶图、 柱状图、饼图

    利用Python画图需要使用matplotlib库。

import matplotlib.pyplot as plt

   创建一组数据,该数据为30美国NBA球员体重,其中‘\’表示换行接着写。

weight = [225,232,232,245,235,245,270,225,240,240,\
          217,195,225,185,200,220,200,210,271,240,\
          220,230,215,252,225,220,206,185,227,236]

    直方图画法:(1)找出最大值与最小值,确定数据的范围;(2)整理数据,将数据分为几组(尽量使每组都有数据),计算频数分布表;(3)根据频数分布表,画出频数直方图。频数为纵坐标,分组类别为横坐标。通过直方图可以对数据分布有一个直观了解;(4)除了频数直方图,还有频率直方图。频率直方图的纵坐标为频率/组距。频率=频数/总数,组距是分组的极差。

#创建频数分布直方图
#weight为待绘制的定量数据,bins=5边表示将数据划分为5个区间
#normed=False时为频数分布直方图
plt.hist(weight,bins=5,normed=False)
#x轴区间范围
plt.xlabel('体重')
plt.ylabel('频数')
plt.title('美国NBA球员体重频数分布直方图')
plt.show()

    图3所示为频数分布直方图:
利用Python进行描述性统计_第3张图片
图3 频数分布直方图
#创建频率分布直方图
#weight为待绘制的定量数据,bins=5边表示将数据划分为5个区间
#normed=Ture时为频率分布直方图
plt.hist(weight,bins=5,normed=True)
#x轴区间范围
plt.xlabel('体重')
plt.ylabel('频率/组距')
plt.title('美国NBA球员体重频率分布直方图')
plt.show()
    图4为频率分布直方图:
利用Python进行描述性统计_第4张图片
图4 频率分布直方图
    也可以通过设置bins的值,自行设定分组组距,如bins=[179.5,199.5,219.5,239.5,259.5,279.5],如图4-1所示:
  利用Python进行描述性统计_第5张图片
图4-1 自定义(相同)组距

    也支持不相同的组距设置,bins=[179.5,210,219.5,240,279.5],如图4-2所示:
  利用Python进行描述性统计_第6张图片
图4-2 自定义(不同)组距
    箱线图(1)下四分位数Q1:将数据按升序排序,位于25%处的数据;(2)上四分位数Q3将数据按升序排序,位于75%处的数据;(3)四分位距IQR=Q3-Q1,是描述数据离散程度的一个统计量;(4)异常点是小于Q1-1.5IQR或大于Q3+1.5IQR的值;(5)下边缘是除异常点意外的数据中的最小值;(5)上边缘是 除异常点意外的数据中的最大值。

#箱线图 
plt.boxplot(weight,labels=['体重'])
plt.title('美国NBA球员体重箱线图')
plt.show()
    图5为箱线图:

利用Python进行描述性统计_第7张图片

图5 箱线图

    茎叶图保留了数据的全部信息,能直观显示数据的分布状况,将茎叶图逆时针旋转90度后,就可以得到一个类似于频数直方图的图。在Python中不能直接调用函数来画茎叶图,在这里我们自己定义一个stem()函数来画,需要用到math库和itertools库:

import math
from itertools import groupby
#茎叶图
#参数data为数据集,n=10表示以个位数字为叶子
#sorted(data)表示对data进行排序
#lambda x为一个匿名函数,x表示sorted(data)中的元素
#math.floor(x/n) 表示取x的百位和十位数作,并向下取整作为茎;lst中为数据的个位数,作为叶子
def stem(data,n):
    for k,g in groupby(sorted(data),key = lambda x: math.floor(x/n)):
        lst = map(str, [d % n for d in list(g)])
        print k, '|', ' '.join(lst)
#调用函数   
stem(weight,10)

    对于sorted更详细的解释    https://www.cnblogs.com/zle1992/p/6271105.html 

    对于map更详细的解释 http://www.runoob.com/python/python-func-map.html

    对于join更详细的解释 https://www.cnblogs.com/jsplyy/p/5634640.html

    得到的茎叶图如图6所示:

利用Python进行描述性统计_第8张图片

图6 茎叶图

     以下为某家庭月支出数据:     

食品 2500
服装 1000
出行 500
教育 800
医疗 400
其他 600
合计 5800
    导入数据:
        
#绘制柱状图
x = ['食品','服装','出行','教育','医疗','其他']
y = [2500,1000,500,800,400,600]

     柱状图是显示一段时内的数据变化或显示各项之间的比较情况,与直方图相比:

  直方图 柱形图
横坐标 同一个变量的分组划分 不同组别之间
作用 显示一组数据的分布情况 不同组别的数据差异

#创建柱状图
#第一个参数为柱的横坐标
#第二个参数为柱的高度
#参数align为柱的对齐方式,以第一个参数为参考标准
plt.bar(range(len(x)),y,0.4,color = 'rbg',align = 'center')

#设置柱的文字说明
#第一个参数为文字说明的横坐标
#第二个参数为文字说明的内容
plt.xticks(range(len(x)),x)

#设置横坐标的文字说明
plt.xlabel('类别')
#设置纵坐标的文字说明
plt.ylabel('月支出')
#设置标题
plt.title('某家庭月支出柱形图')
#绘图
plt.show()
    图7为得到的柱形图。
  利用Python进行描述性统计_第9张图片
图7 柱状图
    饼图是根据各项所占比例决定在饼图中的扇形面积,简单且通俗易懂。
#创建饼形图
#第一个参数为扇形的面积
#x参数为扇形的说明文字
#autopct参数为扇形占比的显示格式
plt.pie(y, labels=x, autopct='%1.1f%%')
plt.title('某家庭月支出饼图')
plt.show()
    图8为得到的饼图。
  利用Python进行描述性统计_第10张图片
图8 饼图

    


                      




 

 

你可能感兴趣的:(利用Python进行描述性统计)