数据统计分析案例(对比分析、销量定比分析、同比、双坐标图、环比、shift、贡献度分析(帕累托法则)、差异化分析、resample、季节性波动分析)

  • 本文来自《Python数据分析从入门到精通》——明日科技编著
  • 本章以案例为主,通过简单的知识讲解使读者了解数据统计分析中常用的分析方法,如对比分析,同比、定比和环比分析,贡献度分析,差异化分析,相关性分析和时间序列分析的概念。通过典型案例,将数据统计分析方法与前面学习的内容相结合,力求将所学内容应用到实践中。

9.1 对比分析

9.1.1 什么是对比分析

  • 对比分析法是将两个或两个以上的数据进行比较,分析其中的差异,从而揭示这些事物代表的发展变化情况和规律性。
  • 特点:非常直观地看出事物某方面的变化或差距,而且可以准确、量化地表示出变化的差距是多少。
  • 对比分析法通常是把两个相互联系的指标数据进行比较,从数量上展示和说明研究对象规模的大小、水平的高低、速度的快慢,以及各种关系是否协调。对比分析一般来说有以下几种对比方法:纵向对比、横向对比、标准对比、实际与计划对比。

9.1.2 对比分析各品牌销量表现TOP10

  • 对比国产品牌汽车2020年1月销量:(01)
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('car.xlsx')
df1=df.head(10)
df1

在这里插入图片描述

plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df1['车型']
y=df1['1月销量']
#plt.grid(axis='y') #网格线https://blog.csdn.net/kudou1994/article/details/94025161
#调整图表距左的空白
plt.subplots_adjust(left=0.2)
#4个方向的坐标轴上的刻度线是否显示
plt.tick_params(bottom=False,left=False)
# 添加刻度标签
plt.yticks(range(10))
#图表标题
plt.title('20201月国产品牌汽车销量TOP10')
plt.barh(x, y,color='Turquoise')  #柱子蓝绿色
plt.show()

在这里插入图片描述

9.2 同比、定比和环比分析

  • 在数据分析中,有一个重要的分析方法,叫趋势分析法,即将两期或连续数期报告中某一指标进行对比,确定其增减变化的方向、数额和幅度,以确定该指标的变动趋势。趋势分析法中的指标,有同比分析、定比(定基比)分析和环比分析,以及同比增长率分析、定比(定基比)增长率分析和环比分析增长率分析。

9.2.1 同比、定比和环比概述

在这里插入图片描述

9.2.2 京东电商单品销售同比增长情况分析(02/01)

  • 下面分析2020年2月与2019年2月相比,京东电商《零基础学Python(全彩版)》一书销量同比增长情况:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df=pd.read_excel('JD2019.xlsx')
#数据处理,提取20192月和20202月的数据
df= df.set_index('日期') # 将日期设置为索引
df

在这里插入图片描述

df1=pd.concat([df['2019-02'],df['2020-02']]) #将20192月数据和20202月数据拼接在一起
df1

在这里插入图片描述

df1=df1[df1['商品名称']=='零基础学Python(全彩版)'] #提取"零基础学Python(全彩版)"书籍
df1=df1[['北京','上海','广州','成都','武汉','沈阳','西安']]
df2=df1.T   #行列转置
df2

在这里插入图片描述

x=np.array([0,1,2,3,4,5,6])
y1=df2['2019-02-01']
y2=df2['2020-02-01']
#同比增长率
df2['rate']=((df2['2020-02-01']-df2['2019-02-01'])/df2['2019-02-01'])*100
y=df2['rate']
print(y)
width =0.25                                     #柱子宽度
plt.rcParams['font.sans-serif']=['SimHei']      #解决中文乱码
plt.title('全国各地区销量及同比增长情况')       #图表标题
plt.ylabel('销售数量(册)')                    #y轴标签
#x轴标签
plt.xticks(x,['北京','上海','广州','成都','武汉','沈阳','西安'])
#双柱形图
plt.bar(x,y1,width=width,color = 'orange',label='2019年2月')
plt.bar(x+width,y2,width=width,color = 'deepskyblue',label='20202月')
# 增长率标签
for a, b in zip(x,y):
    plt.text(a,b,('%.1f%%' % b), ha='center', va='bottom', fontsize=11)
plt.legend()
plt.show()

在这里插入图片描述

  • 从分析结果得知:上海、武汉同比增长较小。

9.2.3 单品销量定比分析(02/02)

  • 下面实现京东电商《零基础学Python(全彩版)》一书2019年销量定比分析,以2019年1月为基础,基点为1:
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel('JD2019.xlsx')
df

在这里插入图片描述

#数据处理
df1 = df[df['商品名称'] == '零基础学Python(全彩版)'].sort_values('日期')
df1 = df1[['北京', '上海', '广州', '成都', '武汉', '沈阳', '西安', '日期']]
df1 = df1.set_index('日期')  #将日期设置为索引
df1['全国销量'] = df1.sum(axis=1)  #求和运算
df1

在这里插入图片描述

#选取2019年数据
df1=df1['2019-01-01':'2019-12-01']
print(df1)

在这里插入图片描述

df1['January']=df1.iloc[0,7] #将第1行第8列数据,即1月份的全国销量作为固定期数据
df1

在这里插入图片描述

#定比分析(以20191月为基期,基点为1)
df1['base']=df1['全国销量']/df1['January']
df1

在这里插入图片描述

  • 绘制双坐标图
x=[0,1,2,3,4,5,6,7,8,9,10,11]
y1=df1['全国销量']
y2=df1['base']
fig = plt.figure()
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文乱码
plt.rcParams['axes.unicode_minus'] = False  #用来正常显示负号
ax1 = fig.add_subplot(111)                  #添加子图
plt.title('2019年全国销量定比分析')         #图表标题
#图表x轴标题
plt.xticks(x,['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'])
ax1.bar(x,y1,color = 'blue',label='left',alpha=0.5)
ax1.set_ylabel('全国销量(册)')            #y轴标签
ax2 = ax1.twinx()                           #添加一条y轴坐标轴
ax2.plot(x,y2,color='r',linestyle='-',marker='D',linewidth=2)
for a,b in zip(x,y2):
    plt.text(a, b+0.02, '%.3f' %b, ha='center', va= 'bottom',fontsize=9)
plt.show()

在这里插入图片描述

9.2.4 单品销量环比增长情况分析

  • 下面分析京东电商《零基础学Python(全彩版)》一书2019年销量环比增长情况:
    在这里插入图片描述
#环比增长率
df1['rate']=((df1['全国销量']-df1['全国销量'].shift())/df1['全国销量'])*100
df1

在这里插入图片描述

#选取2019年数据
df1=df1['2019-01-01':'2019-12-01']
print(df1)
df1.to_excel('aa.xlsx')

在这里插入图片描述

x=[0,1,2,3,4,5,6,7,8,9,10,11]
y1=df1['全国销量']
y2=df1['rate']
fig = plt.figure()
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文乱码
plt.rcParams['axes.unicode_minus'] = False  #用来正常显示负号
ax1 = fig.add_subplot(111)                  #添加子图
plt.title('2019年全国销量及环比增长情况')   #图表标题
#图表x轴标题
plt.xticks(x,['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'])
ax1.bar(x,y1,color = 'deepskyblue',label='left')
ax1.set_ylabel('全国销量(册)')            #y轴标签
ax2 = ax1.twinx()                           #添加一条y轴坐标轴
ax2.plot(x,y2,color='r',linestyle='-',marker='o',mfc='w',label=u"增长率")
# 设置右侧y轴格式
fmt = '%.1f%%'
yticks = mtick.FormatStrFormatter(fmt)
ax2.yaxis.set_major_formatter(yticks)
ax2.set_ylim(-100,100)
ax2.set_ylabel(u"增长率")
for a,b in zip(x,y2):
    plt.text(a, b+0.02, '%.1f%%' % b, ha='center', va= 'bottom',fontsize=8)
#调整图表距右的空白
plt.subplots_adjust(right=0.8)
plt.show()

在这里插入图片描述

9.3 贡献度分析(帕累托法则)

9.3.1 什么是贡献度分析

  • 贡献度分析又称为80/20法则、二八法则、帕累托法则,帕累托定律、最省力法则或不平衡原则。
  • 该法则是由意大利经济学家“帕累托”提出的。80/20法则认为:原因和结果、投入和产出、努力和报酬之间本来存在着无法解释的不平衡。例如,一个公司80%的利润常常来自20%的产品,那么使用贡献度分析就可以分析获利最高的20%的产品。
  • 下面简单介绍一下贡献度相关算法。累计贡献率(%)=累加销售收入/销售总收入x100%
  • 通过上述公式得出累计贡献率,当累计贡献率接近80%(不一定是80%),然后找到该产品在图表中相应位置并进行标注。

9.3.2 产品贡献度分析

  • 下面分析淘宝电商全彩系列图书2018年上半年销售收入占比80%的产品。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
aa =r'./data11.xls'
df = pd.DataFrame(pd.read_excel(aa))
# 分组统计排序
# 通过reset_index()函数将groupby()的分组结果重新设置索引
df1 = df.groupby(["图书编号"])["买家实际支付金额"].sum().reset_index()
df1 = df1.set_index('图书编号')  # 设置索引
df1

在这里插入图片描述

df1 = df1[u'买家实际支付金额'].copy()
df2=df1.sort_values(ascending=False)  # 降序排列
print(df2)

在这里插入图片描述

# 图表字体黑体,字号为8
plt.rc('font', family='SimHei', size=8)
plt.figure("贡献度分析")
df2.plot(kind='bar')
plt.ylabel(u'销售收入(元)')
p = 1.0*df2.cumsum()/df2.sum()
print(p)
# 图表字体黑体,字号为8
plt.rc('font', family='SimHei', size=8)
plt.figure("贡献度分析")
df2.plot(kind='bar')
plt.ylabel(u'销售收入(元)')
p = 1.0*df2.cumsum()/df2.sum()
print(p)
p.plot(color='r', secondary_y=True, style='-o', linewidth=0.5)
plt.title("产品贡献度分析")
# p[9]就是第前10种产品的累计贡献率,xytext表示标注的坐标
plt.annotate(format(p[9], '.4%'), xy=(9, p[9]), xytext=(9 * 0.9, p[9] * 0.9),
            arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.1"))  # 添加标记,并指定箭头样式。
plt.ylabel(u'收入(比例)')
plt.show()
  • 从下图可以看出,到图书编号为B13时,累计贡献率就已经达到了0.817665(接近总销售收入的80%),其中共有10种产品,接下来在图表中进行标注。
    在这里插入图片描述
    在这里插入图片描述

9.4 差异化分析

9.4.1 差异化概述

  • 任何事物都存在差异,如同上课听讲,有人听得津津有味,有人昏昏欲睡。
  • 那么,通过差异化分析,比较不同事物之间在某个指标上存在的差异,根据差异定制不同的策略。对于产品而言,差异化分析是指企业在其提供给顾客的产品上,通过各种方法满足顾客的偏好,是顾客能够把它同其他竞争企业提供的同类产品有效地区别开来,从而使企业在市场竞争中占据有利的地位。
  • 比较常见的有性别差异、年龄差异。通过差异化分析比较不同性别之间在某个指标上存在的差异,通过分析结果对不同性别定制不同的方案。例如,分析不同性别的同学在学习上的差异,了解男生和女生之间的这些差异,因材施教,定制不同的弥补弱项的方案。对于女生,可以有意识地培养她的思维能力;而对于男生,可以买些书籍,来增强他薄弱环节的方面。
  • 年龄差异化分析,了解不同年龄的需求,投其所好,使企业的利润最大化。例如,网购、自媒体、汽车、旅游业等行业,通过年龄差异化分析,找出不同年龄段用户群体的喜好,从而增加产品销量。

9.4.2 学生成绩性别差异分析

  • “女孩喜欢毛绒玩具,男孩喜欢车”这大概是天生的。
  • 科学研究表明,男孩和女孩的差别在相当程度上是由生理基础决定的。通过高科技扫描就可以发现,男孩和女孩的大脑都会有某些部位更发达、更忙碌。
  • 随着孩子的成长,这种天生的性别差异就会对孩子的学习有所影响,并且不断强化。而反过来,学习的本身也在改变着大脑的机能发育。因为当孩子玩耍和学习时,相对应的脑细胞就会更加活跃且随时更新,而那些不经常使用的部分将会逐渐退化萎缩。
  • 下面我们用数据说话,通过雷达图分析男生、女生各科成绩差异:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_excel('成绩表.xlsx')
plt.rcParams['font.sans-serif']=['SimHei']                     #解决中文乱码
labels = np.array(['语文','数学','英语','物理','化学','生物']) #标签
dataLenth = 6  #数据长度
#计算女生、男生各科平均成绩
df1 = np.array(df[df['性别']=='女'].mean().round(2))
df2 = np.array(df[df['性别']=='男'].mean().round(2))

#print(df1-df2)
#设置雷达图的角度,用于平分切开一个平面
angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
labels = np.concatenate((labels,[labels[0]]))
df1 = np.concatenate((df1, [df1[0]]))    #使雷达图闭合
df2 = np.concatenate((df2, [df2[0]]))    #使雷达图闭合
angles = np.concatenate((angles, [angles[0]])) #使雷达图闭合
plt.polar(angles, df1, 'r--', linewidth=2,label='女生') #设置极坐标系,r--代表red和虚线
plt.fill(angles, df1,facecolor='r',alpha=0.5)         #填充
plt.polar(angles, df2,'b-', linewidth=2,label='男生') #设置极坐标系,bo代表blue和实心圆
plt.fill(angles, df2,facecolor='b',alpha=0.5)         #填充
plt.thetagrids(angles * 180/np.pi, labels)    #设置网格、标签
plt.ylim(0,140)                               #设置y轴上下限
plt.legend(loc='upper right',bbox_to_anchor=(1.2,1.1))  #图例及图例位置
plt.show()

在这里插入图片描述

9.5 相关性分析

9.5.1 相关性概述

  • 任何事物之间都存在一定的联系。例如,夏天温度的高低与空调的销量就存在相关性。当温度升高时,空调的销量也会相应提高。
  • 相关性分析是指对多个具备相关关系的数据进行分析,从而衡量数据之间的相关程度或密切程度。相关性可以应用到所有数据的分析过程中。如果一组数据的改变引发另一组数据朝向相同方向变化,那么两组数据存在正相关性,例如,身高与体重,一般个子高的人体重会中一些,个人矮的人体重会轻一些;如果一组数据的改变引发另一组数据朝相反方向变化,那么这两组数据存在负相关性,例如,运动与体重。

广告展现量与费用成本相关性分析

  • 为了促进销售,电商营销比如要投入广告,这样就会产生广告展现量和费用成本相关的数据。通常情况下,我们认为费用高,广告效果就好,它们之间比如存在联系,但仅通过主管判断没有说服力,无法证明数据之间关系的真实存在,也无法度量它们之间关系的强弱。因此,我们要通过相关性分析来找出数据之间的关系。

  • 下面来看一下费用成本与广告展现量相关数据情况:
    在这里插入图片描述
    在这里插入图片描述

  • 相关性分析方法很多,简单的相关性分析方法是将数据进行可视化处理,单纯从数据的角度很难发现数据之间的趋势和联系,而将数据绘制成图表后就可以直观地看出数据之间的趋势的联系。

  • 首先对数据进行简单处理,由于“费用.xlsx”表中同一天会产生多个类型的费用,所以需要按天统计费用,然后将“展现量.xlsx”和“费用.xlsx”两张表的数据合并,最后绘制散点图,程序代码如下:

import pandas as pd
import matplotlib.pyplot as plt
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
df_y = pd.read_excel('展现量.xlsx')
df_x = pd.read_excel('费用.xlsx')

在这里插入图片描述
在这里插入图片描述

df_x= df_x.set_index('日期')                #将日期设置为索引
df_y= df_y.set_index('日期')                #将日期设置为索引
df_x.index = pd.to_datetime(df_x.index)     #将数据的索引转换为datetime类型
df_x=df_x.resample('D').sum()               #按天统计费用
data=pd.merge(df_x,df_y,on='日期')          #数据合并

plt.rcParams['font.sans-serif']=['SimHei']  #解决中文乱码
plt.xlabel('费用成本(x)')
plt.ylabel('广告展现量(y)')
plt.scatter(data['费用'], data['展现量'])   #绘制散点图,以“费用”和“展现量”作为横纵坐标
plt.show()

在这里插入图片描述

  • 虽然图表清晰地展示了广告展现量与费用成本的相关性,但无法判断数据之间有什么关系,相关系数也没有准确的度量,并且数据超过两组也无法完成各组数据的相关性分析。
  • 下面再介绍一种方法——相关系数方法。相关系数是反映数据之间关系密切程度的统计指标,相关系数的取值范围是-1~1
  • 计算相关关系需要一定的计算公式,而再Python中无须使用繁琐的公式,通过DataFrame对象提供的corr()函数就可以轻松实现,关键代码如下:
#相关系数
data.corr()

在这里插入图片描述

  • 从分析结果得知:“费用”与“费用”自身的相关性是1,与“展现量”“点击量”的相关系数分别是0.856、0.859;“展现量”与“展现量”自身的相关性是1,与“点击量”“订单金额”的相关系数分别是0.939、0.728。那么,除了“商品关注度”相关系数比较低,其他都很高,可以看出“费用”与“展现量”“点击量”等有一定的正相关性,而且相关性很强。
  • 相关系数的优点是可以通过数字对变量的关系进行度量,并且带有方向性,1表示正相关,-1表示负相关,越靠近0相关性越弱。缺点是无法利用这种关系对数据进行预测。

9.6 时间序列分析

9.6.1 时间序列概述

  • 顾名思义,时间序列就是按照时间顺序排列的一组数据序列。时间序列分析就是找出数据变化发展的规律,从而预测未来的走势。
  • 时间序列分析有以下几种表现形式:
  • 长期趋势变化:受某种因素的影响,数据依据时间变化,按某种规则稳步增长或下降。使用的分析方法有移动平均法、指数平滑法等。
  • 季节性周期变化:受季节性更替等因素影响,数据依据固定周期规则性的变化。季节性周期变化,不局限于自然季节,还包括月、轴等短周期。例如,空调、羽绒服、冷饮的销售,双十一、双十二流量再一周之内的波动等。采用的方法为季节指数。
  • 循环变化:指一种较长的时间上、下起伏周期性波动,一般循环时间为2~15年。
  • 随机性变化:由许多不确定因素引起的数据变化,在时间序列中无法预计。

9.6.2 年增长趋势和季节性波动分析(06)

  • 下面分析淘宝店铺近3年增长趋势和季节性变动:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('TB.xls')
df1=df[['订单付款时间','买家实际支付金额']]
df1 = df1.set_index('订单付款时间')         #将“订单付款时间”设置为索引
plt.rcParams['font.sans-serif']=['SimHei']  #解决中文乱码
#按年统计数据
df_y=df1.resample('AS').sum().to_period('A')
print(df_y)
#按季度统计数据
df_q=df1.resample('Q').sum().to_period('Q')
print(df_q)
#绘制子图
fig = plt.figure(figsize=(8,3))
ax=fig.subplots(1,2)
df_y.plot(subplots=True,ax=ax[0])
df_q.plot(subplots=True,ax=ax[1])
#调整图表距上部和底部的空白
plt.subplots_adjust(top=0.95,bottom=0.2)
plt.show()

9.7 小节

  • 本节通过常用的数据分析方法并结合图表,以案例的形式呈现,每一种分析方法都对应一个恰当的分析案例,一张贴切的图表,力求使读者能够真正理解数据分析,并将其应用到实际数据分析工作中。每一个案例都经过作者反复揣摩,希望能够对读者有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值