目录
1. 描述性统计概念
2. 利用NumPy和SciPy进行数值分析
3. 利用Matplotlib进行可视化
4. 总结
5. 参考资料
1 描述性统计概念
描述性统计主要是对数据集中的数据进行分析,借助图表或总结性的数值得出反映客观现象和总体情况的各种描述性特征,包括数据的集中趋势、离散程度、频数分布等。利用Python中的NumPy和SciPy工具可对数据集进行数值分析,而Matplotlib可用来绘制图形,直观反映数据的统计特征。
2 利用NumPy和SciPy进行数值分析
2.1 基本概念
NumPy是Python中常用的数值计算包,特点如下:使用ndarray,即多维数组,能提供以数组为导向的快速数值计算;多样的数学函数;用于读/写数据到磁盘的便利工具等。
利用np.array函数创建数组:
import numpy as np
data1 = [1,2,3]
arr1 = np.array(data1)
arr1
array([1, 2, 3])
嵌套序列能被转换成多维数组:
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data2)
arr2
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
生成一组服从标准正态分布的(定量)数据:
from numpy.random import normal, randint
data3 = normal(0,1,size=10)
data3
array([-1.07931404, 0.31514773, -0.19889441, 0.28404286, 1.66185355,
0.6419591 , -0.11142133, -1.07634972, 0.06064659, 0.01672238])
生成一组服从均匀分布的(定性)数据:
data4 = randint(0,5, size=10)
data4
array([0, 1, 3, 0, 0, 1, 3, 2, 4, 4])
除了np.array,还有一些其他函数能创建数组:
2.2 数据集中趋势度量:平均数、中位数、众数
对于定量数据,平均值和中位数直观地反映了数据的中心位置。定性数据的中心位置由众数体现。
平均值:数据总和除以数据量。缺点:对异常值不敏感。
中位数:将数据按照从小到大的顺序排列,位于该排列中间位置的那个数据。奇数为本身,偶数求平均。
四分位数:把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。QL=下四分位数,即第25百分位数;QU=上四分位数,即第75百分位数。
众数:一组数据中出现次数最多的那个数据。
使用NumPy计算均值和中位数,以及百分位数(四分位数):
import numpy as np
from numpy import mean,median
# 创建数组:
percentiles = np.array([2.5, 12, 56, 37, 69, 92, 86, 70, 42, 25, 52, 75, 97.5])
# 计算平均值,结果保留两位小数:
a = round(mean(percentiles),2)
# 计算中位数:
b = median(percentiles)
# 计算百分位数(下四分位数):
c = np.percentile(percentiles, 25)
print('平均数:%s,中位数:%s,下四分位数:%s. '%(a,b,c))
平均数:55.08 ,中位数:56.0 ,下四分位数:37.0 .
使用pandas进行描述统计:
import pandas as pd
percentiles = [2.5, 12, 56, 37, 69, 92, 86, 70, 42, 25, 52, 75, 97.5]
(pd.DataFrame(percentiles)).describe() # 结果与NumPy相同
四分位数的应用——识别出可能的异常值。对异常值进行检查常用Turkey's test方法:
最小估计值——Q1-K(Q3-Q1)
最大估计值——Q3+K(Q3-Q1)。K的取值为1.5时,检出中度异常值;K的取值为3时,检出极度异常值。
2.3 数据离散趋势的度量:方差、标准差
方差:各个数据分别与其平均数之差的平方的和的平均数。
标准差:方差开根号。
离散系数(变异系数):标准差与均值的比值。离散系数越小,数据的离散程度就越小。
极差:表示统计资料中的变异量数,其最大值与最小值之间的差距。
from numpy import mean, ptp, var, std
scores = [31, 24, 23, 25, 14, 25, 13, 12, 14, 23,
32, 34, 43, 41, 21, 23, 26, 26, 34, 42,
43, 25, 24, 23, 24, 44, 23, 14, 52,32,
42, 44, 35, 28, 17, 21, 32, 42, 12, 34]
a = max(scores) # 最大值
b = min(scores) # 最小值
c = ptp(scores) # 极差
d = var(scores) # 方差
e = std(scores) # 标准差
f = mean(scores) / std(scores) # 变异系数
print('最大值:',a,'\n','最小值:',b,'\n','极差:',c,'\n','方差:',round(d,2),'\n'
'标准差:',round(e,2),'\n','变异系数:',round(f,2))
最大值: 52
最小值: 12
极差: 40
方差: 106.34
标准差: 10.31
变异系数: 2.76
2.4 偏差程度:Z-分数
Z-分数是指一个分数与平均数的差再除以标准差的过程。公式: z=(x-μ)/σ。其中x为某一具体分数, μ为平均数,σ为标准差。Z值代表着原始分数和总体平均值之间的距离,是以标准差为单位计算。应用:6σ管理方法。
# Z分数的计算实例
from numpy import mean,std
scores = [31, 24, 23, 25, 14, 25, 13, 12, 14, 23,
32, 34, 43, 41, 21, 23, 26, 26, 34, 42,
43, 25, 24, 23, 24, 44, 23, 14, 52, 32,
42, 44, 35, 28, 17, 21, 32, 42, 12, 34]
zScores = []
m = mean(scores)
n = std(scores)
# 用for循环遍历分数列表,求出Z分数并输出到新列表中
for i in scores:
zScore = round((i - m) / n,2)
zScores.append(zScore)
print(zScores)
[0.25, -0.43, -0.53, -0.33, -1.4, -0.33, -1.5, -1.59, -1.4, -0.53, 0.35, 0.54, 1.41, 1.22, -0.72, -0.53, -0.24, -0.24, 0.54, 1.32, 1.41, -0.33, -0.43, -0.53, -0.43, 1.51, -0.53, -1.4, 2.29, 0.35, 1.32, 1.51, 0.64, -0.04, -1.11, -0.72, 0.35, 1.32, -1.59, 0.54]
2.5 相关程度:相关系数,协方差
为了衡量两组数据的相关程度,引入协方差、相关系数的概念。协方差计算公式:
协方差的绝对值越大表示两组数据的相关程度越大。协方差为正值表示正相关,负值为负相关,0为不相关。相关系数是基于协方差但进行了无量纲处理。
# 协方差、相关系数计算实例:某网站曝光量及费用成本相关程度分析
from numpy import array,cov,corrcoef
exposure = [18481,15094,17619,16825,18811,10430,18]
cost = [4616,4649,4600,4557,4541,568,0]
data = array([exposure,cost])
# 计算曝光量与费用成本的协方差:
# 参数bias=1,表示结果除以N而不是(N-1)
g = cov(data,bias = 1)
# 计算曝光量与费用成本的相关系数:
h = corrcoef(data)
print(g)
print(h)
[[39095208.40816326 11076753.2244898 ]
[11076753.2244898 3812724.81632653]]
[[1. 0.90726255]
[0.90726255 1. ]]
协方差的返回结果为矩阵,第i行第j列的数据表示第i组数与第j组数的协方差,对角线为方差。相关系数的返回结果也是矩阵,第i行第j列的数据表示第i组数与第j组数的相关系数,对角线为1。
3 使用Matplotlib进行可视化
3.1 基本概念
图形可以直观地展示数据的分布特征。以下实例通过构造某公司广告投入、销量、消费者评分相关数据,探索了利用Matplotlib实现数据可视化的实践。
import csv
import numpy as np
# 生成模拟数据
costs = []
sales = []
scores = []
# 生成200个模拟数据
for i in range(200):
# 广告投入服从均值为60,标准差为9的正态分布
cost = np.random.normal(60,9)
# 销量由广告费作为自变量的线性回归模型产生,误差服从标准正态分布
sale = (cost * 0.78 ) + 48 + np.random.normal(0,1)
# 消费者评分服从均值为78,标准差为9的正态分布
score = np.random.normal(78,9)
if 85 <= score and score <= 100:
group = 'A'
elif score >= 70:
group = 'B'
elif score <= 55:
group = 'C'
else:
group = 'D'
costs.append(cost)
sales.append(sale)
scores.append(group)
data = [costs,sales,scores]
fn = 'sales.csv'
with open (fn,"w",newline = "") as fp: # 创建CSV文件写入对象
wr = csv.writer(fp)
for item in data:
wr.writerow(item)
# 可视化——消费者评分柱状图
from matplotlib import pyplot
def drawBar(scores):
xticks = ['A', 'B', 'C', 'D']
scoreGroup = {}
# 对每一等级的评价进行频数统计
for score in scores:
scoreGroup[score] = scoreGroup.get(score, 0) + 1
# 创建柱状图,参数1为柱的横坐标,参数2为柱的高度,参数align为柱的对齐方式
pyplot.bar(range(4), [scoreGroup.get(xtick, 0) for xtick in xticks], align='center')
pyplot.xticks(range(4), xticks)
# 设置横纵坐标轴文字说明
pyplot.xlabel('Score')
pyplot.ylabel('Frequency')
# 设置图标题
pyplot.title('Scores Of Customers')
# 绘图
pyplot.show()
drawBar(scores)消费者评分柱状图
# 可视化——饼图
from matplotlib import pyplot
# 绘制饼图
def drawPie(scores):
labels = ['A', 'B', 'C', 'D']
scoreGroup = {}
for score in scores:
scoreGroup[score] = scoreGroup.get(score, 0) + 1
# 参数1为扇形面积,label为扇形说明文字,参数3为扇形占比的显示格式
pyplot.pie([scoreGroup.get(label, 0) for label in labels], labels=labels, autopct='%1.1f%%')
pyplot.title('Scores Of Customers')
pyplot.show()
drawPie(scores)消费者评分饼图
# 可视化——直方图
from matplotlib import pyplot
def drawHist(costs):
pyplot.hist(costs, 60)
pyplot.xlabel('Costs')
pyplot.ylabel('Frequency')
pyplot.title('Costs Of Products')
pyplot.show()
drawHist(costs)广告投入直方图
# 关系分析——散点图
from matplotlib import pyplot
def drawScatter(costs, sales):
pyplot.scatter(costs, sales)
pyplot.xlabel('Costs')
pyplot.ylabel('Sales')
pyplot.title('Costs & Sales Of Products')
pyplot.show()
drawScatter(costs, sales)广告投入-销售量散点图
# 箱型图:
from matplotlib import pyplot
def drawBox(costs):
pyplot.boxplot([costs], labels=['Costs'])
pyplot.title('Costs Of Products')
pyplot.show()
drawBox(costs)广告投入箱型图
箱型图最上和最下两条横线是上界线和下界线,高于上界线和低于下界线的数据是异常值。红线是中位数,箱形的上下框线为上下四分位数。
4 总结
描述性统计能够直观反映一组数据的基本特征,但是由于简单,难以描述多元变量之间的复杂关系。相较于统计特征数值,数据展现的一种直观方式是可视化。可通过数据间的关系,选择合适的图表来展示数据。
数据成分展示:用于表示整体的一部分,常用饼图表示,柱形图也可表示成分关系。
数据排序:用于不同项目、类别间数据比较,常用柱形图、条形图等。
时间序列:用于表示发展趋势,常用折线图、柱形图等。
频率分布:柱形图。
相关性:散点图。