对比、同比、定比与环比分析

437 阅读4分钟

对比分析

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')

df = pd.read_excel('car.xlsx')
df1 = df.head(10) #只读取了前10条

plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x = df1['车型']
y = df1['1月销量']
#plt.grid(axis='y')
#调整图表距左的空白
plt.subplots_adjust(left=0.2)
#4个方向的坐标轴上的刻度线是否显示
plt.tick_params(bottom=False,left=False)
# 添加刻度标签
plt.yticks(range(10))  #要多于当前标签数量
#图表标题
plt.title('2020年1月国产品牌汽车销量TOP10')
plt.barh(x, y,color='Turquoise')  #barh是横向的柱状图(可以理解为正常柱状图旋转了90度),柱子蓝绿色
plt.show()

image.png

同比、定比和环比分析

  • 同比:本期数据与历史数据进行比较(去年这个裙子能穿,今年穿不了)

  • 定比:本期数据与特定时期数据比较(年龄36岁是18岁的两倍)

  • 环比:本期数据与上期数据进行比较(这个月好像比上个月胖了20斤)

  • 同比的好处是可以排除一部分季节因素;

  • 环比的好处是可以更直观地表明阶段性的变化,但是会受季节性因素影响;

  • 定比常用于财务数据分析

案例1:京东电商单品销量同比增长情况分析

image.png

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
mpl.use('TkAgg')

df=pd.read_excel('JD2019.xlsx')
#数据处理,提取2019年2月和2020年2月的数据
df= df.set_index('日期') # 将日期设置为索引

df1=df[df['商品名称']=='零基础学Python(全彩版)']
df1=df1[['北京','上海','广州','成都','武汉','沈阳','西安']]
# print(df1)
df2=df1.T   #行列转置
# print(df2)
x=np.array([0,1,2,3,4,5,6])
y1=df2['2019-02-01']
y2=df2['2020-02-01']
print(y1)
print(y2)
#同比增长率
df2['rate']=((y2-y1)/y1)*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='2020年2月')
# 增长率标签
for a, b in zip(x,y):
    plt.text(a,b,('%.1f%%' % b), ha='center', va='bottom', fontsize=11)
plt.legend()

plt.show()

image.png

案例2: 单品销量定比分析

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')

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

#选取2019年数据
df1=df1['2019-01-01':'2019-12-01']  #包头包尾
print(df1)
df1['January']=df1.iloc[0,7]  #iloc[0,7]选取第一行第第8列

#定比分析(以2019年1月为基期,基点为1)
df1['base']=df1['全国销量']/df1['January']
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()

image.png

案例3: 单品销量环比增长情况分析

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
import matplotlib.ticker as mtick
df=pd.read_excel('JD2019.xlsx')

#数据处理
df1=df[df['商品名称']=='零基础学Python(全彩版)'].sort_values('日期')
df1=df1[['北京','上海','广州','成都','武汉','沈阳','西安','日期']]
df1= df1.set_index('日期')          #将日期设置为索引
df1['全国销量']=df1.sum(axis=1)     #求和运算
#环比增长率
df1['rate']=((df1['全国销量']-df1['全国销量'].shift())/df1['全国销量'])*100
#选取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 = 'pink',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()

image.png