统计学分为描述统计学和推断统计学,描述统计学是使用特定的数字或图表来体现数据的集中程度或离散程度,如平均数、中位数、众数、方差、标准差;推断统计学是根据样本数据来推断总体特征,如产品检查,一般采用抽检,根据所抽样本的质量合格率作为总体质量合格率的一个估计。
一、均值、中位数、众数、极差、方差、标准差
利用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所示。
#极差
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()
#创建频率分布直方图
#weight为待绘制的定量数据,bins=5边表示将数据划分为5个区间
#normed=Ture时为频率分布直方图
plt.hist(weight,bins=5,normed=True)
#x轴区间范围
plt.xlabel('体重')
plt.ylabel('频率/组距')
plt.title('美国NBA球员体重频率分布直方图')
plt.show()
图4为频率分布直方图:
#箱线图
plt.boxplot(weight,labels=['体重'])
plt.title('美国NBA球员体重箱线图')
plt.show() 图5为箱线图:
图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所示:
图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()
#创建饼形图
#第一个参数为扇形的面积
#x参数为扇形的说明文字
#autopct参数为扇形占比的显示格式
plt.pie(y, labels=x, autopct='%1.1f%%')
plt.title('某家庭月支出饼图')
plt.show() 图8为得到的饼图。