数据科学、数据分析、人工智能必备知识汇总-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/140174015 |
---|
两个相互联系的指标进行比较的方法,包括绝对数比较,相对数比较
- 绝对数比较通常使用相减的方式
- 相对数比较通常使用相除的方式来进行,包含结构分析、比例分析、空间比较分析、动态对比分析
1. 数据准备
导包 |
---|
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.lines import lineStyles
from networkx.algorithms.bipartite import color
# 非交互式显示
%matplotlib inline
# 设置为黑体
plt.rcParams['font.sans-serif']=['SimHei']
# 设置轴中负号编码
plt.rcParams['axes.unicode_minus']=False
生成数据 |
---|
# np.random.rand(30,2)以给定形状生成随机序列,这里是30行2列,每个值生成范围[0,1)
A_and_B_sale = np.random.rand(30,2)*1000
# pd.period_range(start='2017-06-01',end='2017-06-30') 生成随机时间序列,当指定freq='D'时,从start或end开始生成,而不是东挑西凑
d_time = pd.period_range(start='2017-06-01',end='2017-06-30',freq='D')
data = pd.DataFrame(A_and_B_sale,columns=['A_sale','B_sale'],index=d_time)
data
2. 绝对数比较
折线图和柱状图 |
---|
# 画布
fig = plt.figure(figsize=(15,10))
subplot1 = fig.add_subplot(211)
'''30天内A/B产品日销售额'''
# 将data中日期取出来
list = ["%s-%s-%s" %(str(item.year)[-2:],item.month,item.day) for item in data.index]
# 画两个产品的对比折线图
subplot1.plot(list,data['A_sale'],linestyle="-.",label='A_sale')
subplot1.plot(list,data['B_sale'],linestyle="--",label='B_sale')
# 设置标题
subplot1.set_title('AB产品销量对比-折线图')
# 设置x轴刻度标签
# labels = [list[i] for i in range(0,len(list),3)]
labels = list[::3] # 和上面等价,每隔3个日期显示一个标签
subplot1.set_xticks(labels,labels,rotation=45)
# 显示图例
subplot1.legend()
'''多系列柱状图比较'''
subplot2 = fig.add_subplot(212)
x = np.arange(0,len(list)*2,2)
width = 0.7
subplot2.bar(x-width+0.3,data['A_sale'],color='b',width=width,label='A_sale')
subplot2.bar(x+0.3,data['B_sale'],color='r',width=width,label='B_sale')
subplot2.set_title("AB产品销量对比-柱状图")
subplot2.set_xticks(x,list,rotation=45)
subplot2.legend()
绝对值对比,作差 |
---|
# 绝对数比较,相减
x = range(len(data))
y1 = data['A_sale']
y2 = -data['B_sale'] # 这里设置为负数是方便图像表示
# 创建画布
fig = plt.figure(figsize=(15,7))
# 柱状图
subplot1 = fig.add_subplot(211)
plt.bar(x,y1,color='b',width=1,label='A_sale',edgecolor='black')
plt.bar(x,y2,color='r',width=1,label='B_sale',edgecolor='black')
subplot1.legend()
# 折线图
subplot2 = fig.add_subplot(212)
y3 = y1+y2 # 因为y2是负数,所以y1+y2是作差
plt.plot(x,y3,color='green',label='A_sale-B_sale',linestyle='--',marker='o')
plt.grid()
# 添加一个辅助线
plt.axhline(y=0,color='r',linestyle='--',label='参考值0')
plt.legend()
3. 相对数比较
有联系的指标综合计算后的对比,数值为相对数。分为结构分析、比例分析、空间比较分析、动态对比分析
- 相对数比较应用场景更多,反映结构情况和比例关系
- 消除很多绝对数比较的刚量影响等外部因素
3.1 结构分析
分组的基础上,各组总量指标与总体的总量指标对比(量与总量),计算出各组数量在总量中所占比重。反映总体的内部结构
1. 数据准备 |
---|
- 这里我们准备两种产品销量数据
- 但是和绝对值比较不同的时,本次两种商品的销售额,一个是千元级别,一个是百元级别
- 这种情况下,就不能使用绝对值比较了
# 相对数分析数据准备:30天内a和b产品的日销售额
data = pd.DataFrame({'A_sale': np.random.rand(30) * 1000,'B_sale':np.random.rand(30) * 200},index=pd.period_range(start='20170601', periods=30, freq='D'))
data
生成量与总量的关系
# A、B产品销售额量级不同,用相对比较
data['A_per'] = data['A_sale']/data['A_sale'].sum()
data['A_per%'] = data['A_per'].apply(lambda x:'%.2f%%' % (x*100)) # 百分号形式
data['B_per'] = data['B_sale']/data['B_sale'].sum()
data['B_per%'] = data['B_per'].apply(lambda x:'%.2f%%' % (x*100))
data
画两条折线图 |
---|
绝对值对比很难看出结构性变化,通过观察销售额占比来看售卖情况的对比,例如某一天A产品比B产品售卖情况更好
同时,相对值对比可以反应“强度”–>两个性质不同但有一定联系的总量指标对比,用来说明“强度”、“密度”、“普遍程度”。例如国内生产总值“元/人”,人口密度"人/平方公里"
fig = plt.figure(figsize = (10,6))
axes = fig.subplots(2,1,sharex=True)
# x轴,时间
x = ['%s-%s-%s' % (str(i.year)[-2:],i.month,i.day) for i in data.index.tolist()]
# 首先用总量画图,会发现出来的图没有任何参考价值
axes[0].plot(x,data['A_sale'],color='r',linestyle='--',marker='o',label='A_sale')
axes[0].plot(x,data['B_sale'],color='g',linestyle='--',marker='o',label='B_sale')
axes[0].set_title('直接绝对值对比')
axes[0].legend()
# 相对值对比
axes[1].plot(x,data['A_per'],color='r',linestyle='--',marker='o',label='A产品日销量占比')
axes[1].plot(x,data['B_per'],color='g',linestyle='--',marker='o',label='B产品日销量占比')
axes[1].set_title('A、B产品销量结构对比')
axes[1].legend()
# 设置x坐标轴显示
labels = [x[i] for i in range(0,len(x),3)]
plt.xticks(ticks=labels,labels=labels,rotation=45)
3.2 比例分析
分组基础上,将总体不同部分的指标数值进行对比,其相对指标一般称为“比例相对数”
比例相对数=总体中某一部分数值/总体中另一部分数值 -->“男女比例”、“基本建设投资额中工业、农业、教育投资比例”、…
数据准备 |
---|
生成某人月消费和月收入
# 基于月生成一年的消费、工资薪水情况
# 消费按照2000-3000/月随机,工资按5000-5500/月随机
data = pd.DataFrame({'consumption':np.random.rand(12)*1000 + 2000,'salary':np.random.rand(12)*500 + 5000},
index=pd.period_range(start='201701', periods=12, freq='M'))
data
统计他每个月消费占比
data['每月消费占收入比'] = data['consumption']/data['salary']
data['每月消费占收入比%'] = data['每月消费占收入比'].apply(lambda x:'%.2f%%' % (x*100))
data
画一张面积图 |
---|
看看它月消费占工资比
x = ['%s-%s-%s' %(i.year,i.month,i.day) for i in data.index.tolist()] # x轴刻度
plt.plot(x,data['每月消费占收入比'],linestyle='--',color='r',marker='o',label='月消费占月工资比') # 画线
plt.fill_between(x=x,y1=data['每月消费占收入比'],alpha=0.5,color='g',label='消费情况') # 填充曲线下面积
plt.legend()
plt.ylim(0.3,0.6) # 设置y轴区域为0.3-0.6
plt.xticks(ticks=x[::3],labels=x[::3],rotation=45)# 修改x轴刻度
3.3 空间比较分析
基本上就是同比和环比
- 同类现象在同一时间不同空间的指标数值进行对比,反应同类现象在不同空间上的差异程度和现象发展不平衡的状况
- 空间比较相对数=甲空间某一现象的数组 / 乙空间同类现象的数组
- 例如,绝对数为例,我国多经济总量世界第一,但从人均水平来看是另一回事
数据准备 |
---|
# 30天内ABCD四个产品的日销售情况
data = pd.DataFrame({'A':np.random.rand(30)*5000,
'B':np.random.rand(30)*2000,
'C':np.random.rand(30)*10000,
'D':np.random.rand(30)*800},
index=pd.period_range(start='20170601', periods=30, freq='D'))
data
同月内,不同产品(空间)的销售情况 |
---|
# 时间相同,但是空间不同(4个不同产品,就是4个不同空间,注意空间是抽象概念)
data.sum().plot(kind='bar',color=['r','g','b','c'])
for i,j in zip(range(4),data.sum()):
plt.text(i-0.25,j+2000,'%.2f' %j,color='k')
同10天内,不同空间的销售情况 |
---|
- 多系列柱状图,横向比较前十天4个产品的销售额
- 涉及到同比和环比的概念
- 同比:例如A在2015年3月和2016年3月的比较,也就是相邻时间段的同一时间点
- 环比:A在2015年3月和2015年4月的比较,也就是相邻时间段的比较,而不是同一时间点
data[:10].plot(kind='bar',color=['r','g','b','c'],grid=True,figsize=(15,5))
3.4 动态对比分析(纵向对比分析)
- 同一现象在不同时间上的指标数值进行对比,反应现象的数量随着时间推移而发生变动的程度及趋势
- 最基本的方法,计算动态相对数–>发展速度
- 动态相对数(发展速度) = 某一现象的报告期数值/同一现象的基期数值
- 基期:用来比较的基础时期
- 报告期:所要研究的时期,又称计算期
逐期增长量:报告期水平与其前一期水平之差,也就是本期相较于上一期增减的绝对数量
累计增长量:报告期水平与某一固定基期水平之差,说明报告期与某固定时期相比增减的绝对数量
定基增长速度:报告期累计增长量与固定基期水平之比。表明某种现象在一段时期内总的增长速度
环比增长速度:逐期增长量与上一期发展水平之比,表明社会经济现象前一时期的增长速度
数据准备 |
---|
30天内A产品的销售情况
data = pd.DataFrame({'A':np.random.rand(30)*2000+1000},index=pd.period_range(start='20170601', periods=30, freq='D'))
data
创建新字段,方便做逐期增长量 |
---|
逐期增长量就是这一个 减去 上一个,所以我们通过data.shift(1)[‘目标字段’],将所有值向下移动一行,即可方便的做逐期增长量
data['shift_1_A'] = data.shift(1)['A'] # 将A向下移一行
data['z_growth'] = data['A'] - data['shift_1_A'] # 相减即可算出逐期增长量
data
向下移一行,那么会出现缺失值NaN,可以填充一下
# 填充0,到缺失位置
data.fillna(0,inplace=True)
累计增长量 |
---|
就是报告期 减去 基期,例如data[base]=1000就是固定基期值,每次都用报告期-基期就可以了
data['base'] = 1000#基期
data['l_growth'] = data['A'] - data['base'] # 累计增长量
data
展示两种增长率情况 |
---|
# 展示两种增长率情况
data[['l_growth','z_growth']].plot(figsize=(15,5),style='--',alpha=0.8)
plt.axhline(y=0,color='r',linestyle='--',alpha=0.8) # 添加y轴参考线
plt.legend(loc='lower left')
plt.grid()
定基增长速度和环比增长速度 |
---|
# 定基增长速度 = 累计增长量/定基期
data['lspeed'] = data['l_growth']/data['base']
# 环比增长速度 = 逐期增长量 / 上一期发展水平
data['zspeed'] = data['z_growth']/data.shift(1)['A']
data
# 画图
data[['lspeed','zspeed']].plot(figsize=(15,5),style='--',alpha=0.8)
plt.axhline(y=0,color='r',linestyle='--',alpha=0.8) # 添加y轴参考线
plt.legend(loc='lower left')
plt.grid()