3 统计量分析
3.1 定义
用统计指标队定量数据进行统计描述,常从集中度趋势和离中度趋势两个方面进行分析
3.2 集中度趋势
指一组数据向某一中心靠拢的倾向,核心在于寻找数据的代表值或中心值
3.2.1 均值(算术平均数)
有时,为了反映在均值中不同成分所占的不同重要程度,为数据集中的每一个xi赋予fi
类似,频率分布表的平均数(x1f1 + x2f2 + ... + xifi) / (f1 + f2 + ... + fi) ((f1 + f2 + ... + fi) 为1) fi为xi在i组中的频数
data = pd.DataFrame({'value':np.random.randint(100,120,100),
'f':np.random.rand(100)})
data['f'] = data['f'] / data['f'].sum() # f为权重,这里将f列设置成总和为1的权重占比
print(data.head())
# 创建数据
mean = data['value'].mean()
print('简单算数平均值为:%.2f' % mean)
# 简单算数平均值 = 总和 / 样本数量 (不涉及权重)
mean_w = (data['value'] * data['f']).sum() / data['f'].sum()
print('加权算数平均值为:%.2f' % mean_w)
# 加权算数平均值 = (x1f1 + x2f2 + ... + xnfn) / (f1 + f2 + ... + fn)
简单算数平均值为:109.27
加权算数平均值为:108.46
均值作为一个统计量,对极端值很敏感,如果数据中存在极端值或者数据是偏态分布,均值不能很好的度量数据的集中趋势,需去掉极端异常值
3.2.2 中位数(位置平均数)
将一组观测值按从小到大的顺序排列,位于中间的那个数。即在全部数据中,小于和大于中位数的数据个数相等
med = data['value'].median()
print('中位数为%i' % med)
中位数为109
3.2.3 众数
数据集中出现最频繁的值,众数不具有唯一性,并不经常用来度量定性变量的中心位置,更适用于定性变量,一般用于离散型变量而非连续性变量
m = data['value'].mode()
print('众数为',m.tolist())
众数为112
data['value'].plot(kind = 'kde',style = '--k',grid = True)
# 密度曲线
plt.axvline(mean,hold=None,color='r',linestyle="--",alpha=0.8)
plt.text(mean + 5,0.005,'简单算数平均值为:%.2f' % mean, color = 'r')
# 简单算数平均值
plt.axvline(mean_w,hold=None,color='b',linestyle="--",alpha=0.8)
plt.text(mean + 5,0.01,'加权算数平均值:%.2f' % mean_w, color = 'b')
# 加权算数平均值
plt.axvline(med,hold=None,color='g',linestyle="--",alpha=0.8)
plt.text(mean + 5,0.015,'中位数:%i' % med, color = 'g')
# 中位数
数据符合正太分布,所以中位数及均值较为集中
3.3 离中趋势量
指一组数据中各数据以不同程度的距离偏离中心的趋势
3.3.1 极差
data = pd.DataFrame({'A_sale':np.random.rand(30)*1000,
'B_sale':np.random.rand(30)*1000},
index = pd.period_range('20170601','20170630'))
print(data.head())
print('------')
# 创建数据
# A/B销售额量级在同一水平
a_r = data['A_sale'].max() - data['A_sale'].min()
b_r = data['B_sale'].max() - data['B_sale'].min()
print('A销售额的极差为:%.2f, B销售额的极差为:%.2f' % (a_r,b_r))
A销售额的极差为:990.78, B销售额的极差为:921.67
极差队数据集的极端值非常敏感,并且忽略了位于最大值和最小值之间的数据分布
3.3.2 标准差
度量数据偏离均值的程度,标准差越大,离中趋势越明显
a_std = data['A_sale'].std()
b_std = data['B_sale'].std()
print('A销售额的标准差为:%.2f, B销售额的标准差为:%.2f' % (a_std,b_std))
A销售额的标准差为:255.51, B销售额的标准差为:260.38
q2a = data['A_sale'].median()
q2b = data['B_sale'].median()
fig = plt.figure(figsize = (12,4))
ax1 = fig.add_subplot(1,2,1)
data['A_sale'].plot(kind = 'kde',style = 'k--',grid = True,title = 'A密度曲线')
plt.axvline(q2a,hold=None,color='r',linestyle="--",alpha=0.8)
plt.axvline(q2a - a_std,hold=None,color='b',linestyle="--",alpha=0.8)
plt.axvline(q2a + a_std,hold=None,color='b',linestyle="--",alpha=0.8)
# A密度曲线,1个标准差
ax2 = fig.add_subplot(1,2,2)
data['B_sale'].plot(kind = 'kde',style = 'k--',grid = True,title = 'B密度曲线')
plt.axvline(q2b,hold=None,color='r',linestyle="--",alpha=0.8)
plt.axvline(q2b - b_std,hold=None,color='b',linestyle="--",alpha=0.8)
plt.axvline(q2b+ b_std,hold=None,color='b',linestyle="--",alpha=0.8)
# B密度曲线,1个标准差
AB产品符合正太分布,离中位数一个标准差区间密度图
如果数据符合正太分布,超过距离平均值3个标准差的值出现的概率为P 小于0.3%,属于极个别小概率事件,定于为异常值
3.3.3 四分卫间距(分位差)
是上四分卫数Qu与下四分卫数Ql之差,期间包含了全部观测值的一半,其值越大,说明数据的变异程度越大。
a_iqr =data['A_sale'].quantile(0.75)-data['A_sale'].quantile(0.25)
b_iqr =data['B_sale'].quantile(0.75)- data['B_sale'].quantile(0.25)
print('A销售额的分位差为:%.2f, B销售额的分位差为:%.2f' % (a_iqr,b_iqr))
A销售额的分位差为:358.99, B销售额的分位差为:439.30
color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
data.plot.box(vert=False,grid = True,color = color,figsize = (10,3))
# 绘制箱型图
通过箱型图识别异常值,通常被定义为小于QL-1.5IQR或大于Qu+1.5IQR的值。IQR即为四分卫间距。
箱型图依据实际数据绘制,没有对数据作限制性要求,且四分位数具有一定的鲁棒性:多达25%的数据可以变得任意远而不会很大的扰动四分位数,即异常值不能对四分位比标准施加影响。
4 周期性分析
周期性分析师探索某个变量是否随着时间变化而呈现出某个周期性变化趋势
时间尺度相对较长的周期性趋势有年度周期性趋势,季节性周期性趋势,周度周期性趋势,甚至更短的天,小时周期性趋势
5 贡献度分析(帕累托分析)
原理为帕累托法则,又为20/80定律。例如对于一个公司,80%利润来自于20%的畅销产品,而其他80%的产品只产生了20%的利润
对于企业,应用贡献度分析可以重点改善盈利最高的前80%的产品,或者重点发展综合影响最高的80%部门
df = pd.read_excel(r'C:\chapter3 data\catering_dish_profit.xls',sheetname= 0,index_col='菜品名')
print(df)
data = df['盈利'].copy()
data.sort_values(ascending=False,inplace= True)
# 由大到小排列
p = data.cumsum()/data.sum() # 创建累计占比,Series
key = p[p>0.8].index[0]
# 找到累计占比超过80%时候的index
key_num = data.index.tolist().index(key)
# 找到key所对应的索引位置
plt.figure(figsize = (10,4))
data.plot(kind = 'bar', color = 'g', alpha = 0.5, width = 0.7)
plt.ylabel('盈利_元')
# 创建盈利柱状图
p.plot(style = '--ko', secondary_y=True) # secondary_y → y副坐标轴
plt.axvline(key_num,hold=None,color='r',linestyle="--",alpha=0.8)
plt.text(key_num+0.2,p[key],'累计占比为:%.3f%%' % (p[key]*100), color = 'r') # 累计占比超过80%的节点
plt.ylabel('盈利_比例')
# 绘制营收累计占比曲
A1-A7占菜品种类的70%,贡献了85%的利润,企业应增加菜品A1-A7菜品的投入,减少A8~A10的投入以获得更高的盈利额