- 本文来自《Python数据分析从入门到精通》——明日科技编著
- 随着电商行业的激烈竞争,电商平台推出了各种数字营销方案,付费广告也是花样繁多。那么电商投入广告后,究竟能给企业增加多少收益,对销量的影响究竟有多大,是否满足了企业的需求,是否达到了企业的预期效果。针对这类问题企业将如何应对和处理,而不是凭直觉妄加猜测。
12.1 概述
- 某电商投入了几个月的广告费,收益还不错,未来6个月计划多投入一些广告,那么多投入的广告能给企业带来多少收益?为此,我们用Python结合科学的统计分析方法对某电商的销售收入和广告费数据进行了分析与预测,首先探索以往销售收入和广告费两组数据间的关系,然后进行销售收入的预测。
12.4 分析方法
- 经过对某电商销售收入和广告费的分析后,得知这两组数据存在一定的线性关系,因此我们采用线性回归的分析方法对未来6个月的销售收入进行预测。
- 线性回归包括一元线性回归和多元线性回归。
12.5 项目实现过程
- 用Python编写程序实现某电商销售收入的预测,首先分析某电商销售收入和广告费数据,然后通过折线图、散点图判断销售收入和广告费两组数据的相关性,最后实现销售收入的预测。
12.5.1 数据处理
- 某电商存在以下两组历史数据并分别存在两个Excel文件中:一个是销售收入数据;另一个是广告费数据。在分析预测前,首先要对这些数据进行处理,提取与数据分析相关的数据。
- 例如,销售收入分析只需要“日期”和“销售码洋”,关键代码如下:
df=df[['日期','销售码洋']]
12.5.2 日期数据统计并显示
- 为了便于分析每天和每月销售收入数据,需要按天、按月统计Excel表中的销售收入数据,这里主要使用Pandas中的DataFrame对象的resample()方法和to_period()方法实现日期数据的统计并显示:
import pandas as pd
import matplotlib.pyplot as plt
df= pd.read_excel('.\data\销售表.xlsx')
df=df[['日期','销售码洋']]
df['日期'] = pd.to_datetime(df['日期']) #将日期转换为日期格式
df1= df.set_index('日期',drop=True) #设置日期为索引,并删除原来的日期列
df1
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a1d24a52a03ed3aaec5947944d185867.png)
#按天统计销售数据
df_d=df1.resample('D').sum().to_period('D')
df_d
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/680c1ded593d9eb51ed8fd658a556af4.png)
#按月统计销售数据
df_m=df1.resample('M').sum().to_period('M')
df_m
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7cd8f29c967eab6d1db14b6d8dc4f6ce.png)
df_d.to_excel('result1.xlsx') #导出结果
df_m.to_excel('result2.xlsx') #导出结果
12.5.3 销售收入分析
#图表字体为黑体,字号为10
plt.rc('font', family='SimHei',size=10)
#绘制子图
fig = plt.figure(figsize=(9,5))
ax=fig.subplots(1,2) #创建Axes对象
#分别设置图表标题
ax[0].set_title('按天分析销售收入')
ax[1].set_title('按月分析销售收入')
df_d.plot(ax=ax[0],color='r') #第一个图折线图
df_m.plot(kind='bar',ax=ax[1],color='g') #第二个图柱形图
#调整图表距上部和底部的空白
plt.subplots_adjust(top=0.95,bottom=0.15)
plt.show()
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8dcddb0f6ce56b602ce3bb7f519c5bc1.png)
12.5.4 销售收入与广告费相关性分析
- 在使用线性回归方法预测销售收入前,需要对相关数据进行分析。那么,单纯从数据的角度很难发现其中的趋势和联系,而将数据绘制成图表后,趋势和联系就会变得清晰起来。
- 下面通过折线图和散点图来看一下销售收入与广告费的相关性。
1.折线图
- 为了更清晰地对比广告费与销售收入这两组数据的变化和趋势,我们使用双y轴折线图,其中主y轴用来绘制广告费数据,次y轴用来绘制销售收入数据。通过折线图可以发现,广告费和销售收入两组数据的变化和趋势大致相同,从整体的趋势来看,广告费和销售收入两组数据都呈现增长趋势。从规律性来看广告费和销售收入数据每次的最低点都出现在同一个月。从细节来看,两组数据的短期趋势的变化也基本一致。
import pandas as pd
import matplotlib.pyplot as plt
df1= pd.read_excel('.\data\广告费.xlsx')
df2= pd.read_excel('.\data\销售表.xlsx')
print(df1.head())
print(df2.head())
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/93da57c9dd25c1e1b8c40a29baeb4236.png)
df1['投放日期'] = pd.to_datetime(df1['投放日期'])
df1= df1.set_index('投放日期',drop=True)
df2=df2[['日期','销售码洋']]
df2['日期'] = pd.to_datetime(df2['日期']) #日期数据转换,https://blog.csdn.net/Triumph19/article/details/125634597
df2= df2.set_index('日期',drop=True)
# 按月统计金额
df_x=df1.resample('M').sum().to_period('M')
df_y=df2.resample('M').sum().to_period('M')
#x为广告费,y为销售收入
y1=pd.DataFrame(df_x['支出'])
y2=pd.DataFrame(df_y['销售码洋'])
fig = plt.figure()
# 图表字体为黑体,字号为11
plt.rc('font', family='SimHei',size=11)
ax1 = fig.add_subplot(111) #添加子图
plt.title('京东电商销售收入与广告费分析折线图') #图表标题
#图表x轴标题
x=[0,1,2,3,4,5,6,7,8,9,10,11]
plt.xticks(x,['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'])
ax1.plot(x,y1,color='orangered',linewidth=2,linestyle='-',marker='o',mfc='w',label='广告费')
plt.legend(loc='upper left')
ax2 = ax1.twinx() #添加一条y轴坐标轴
ax2.plot(x,y2,color='b',linewidth=2,linestyle='-',marker='o',mfc='w',label='销售收入')
plt.subplots_adjust(right=0.85)
plt.legend(loc='upper center')
plt.show()
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/93a982b72977cad4a1fe0b47365f08a7.png)
2.散点图
- 对比折线图,散点图更加直观。散点图去除了时间维度的影响,只关注广告费和销售收入两组数据间的关系。在绘制散点图之前,我们将广告费设置为x,也就是自变量,将销售收入设置为y,也就是因变量。下面根据每个月销售收入和广告费数据绘制散点图,x轴是自变量广告费数据,y轴是因变量销售收入数据。从数据点的分布情况可以发现,自变量x和因变量y有着相同的变化趋势,当广告费增加后,销售收入也随之增加。
import pandas as pd
import matplotlib.pyplot as plt
df1= pd.read_excel('.\data\广告费.xlsx')
df2= pd.read_excel('.\data\销售表.xlsx')
df1['投放日期'] = pd.to_datetime(df1['投放日期'])
df1= df1.set_index('投放日期',drop=True)
df2=df2[['日期','销售码洋']]
df2['日期'] = pd.to_datetime(df2['日期'])
df2= df2.set_index('日期',drop=True)
# 按月统计金额
df_x=df1.resample('M').sum().to_period('M')
df_y=df2.resample('M').sum().to_period('M')
#x为广告费,y为销售收入
x=pd.DataFrame(df_x['支出'])
y=pd.DataFrame(df_y['销售码洋'])
# 图表字体为黑体,字号为11
plt.rc('font', family='SimHei',size=11)
plt.figure("京东电商销售收入与广告费分析散点图")
plt.scatter(x, y,color='r') #真实值散点图
plt.xlabel(u'广告费(元)')
plt.ylabel(u'销售收入(元)')
plt.subplots_adjust(left=0.15) #图表距画布右侧之间的空白
plt.show()
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/045c6b0abe6eef63fe72b8e68d64d23a.png)
- 通过折线图和散点图清晰地展示了广告费和销售收入两组数据,让我们直观地发现了数据之间隐藏的关系,为接下来的决策做出重要的引导。经过折线图和散点图分析后,就可以对销售收入进行预测,进而做出科学的决策,而不是模棱两可,大概差不多。
12.5.5 销售收入预测
import pandas as pd
from sklearn import linear_model
import matplotlib.pyplot as plt
import numpy as np
df1= pd.read_excel('.\data\广告费.xlsx')
df2= pd.read_excel('.\data\销售表.xlsx')
#数据处理
df1['投放日期'] = pd.to_datetime(df1['投放日期'])
df1= df1.set_index('投放日期',drop=True)
df2=df2[['日期','销售码洋']]
df2['日期'] = pd.to_datetime(df2['日期'])
df2= df2.set_index('日期',drop=True)
#按月统计金额
df_x=df1.resample('M').sum().to_period('M')
df_y=df2.resample('M').sum().to_period('M')
clf=linear_model.LinearRegression() #创建线性模型
#x为广告费,y为销售收入
x=pd.DataFrame(df_x['支出'])
y=pd.DataFrame(df_y['销售码洋'])
clf.fit(x,y) #拟合线性模型
k=clf.coef_ #获取回归系数
b=clf.intercept_ #获取截距
#未来6个月计划投入的广告费
x0=np.array([120000,130000,150000,180000,200000,250000])
x0=x0.reshape(6,1) #数组重塑
#预测未来6个月的销售收入(y0)
y0=clf.predict(x0)
print('预测销售收入:')
print(y0)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/49920c356cd8014585dacf71057fe7db.png)
#使用线性模型预测y值
y_pred =clf.predict(x)
# 图表字体为华文细黑,字号为10
plt.rc('font', family='SimHei',size=11)
plt.figure("京东电商销售数据分析与预测")
plt.scatter(x, y,color='r') #真实值散点图
plt.plot(x,y_pred, color='blue', linewidth=1.5) #预测回归线
plt.ylabel(u'销售收入(元)')
plt.xlabel(u'广告费(元)')
plt.subplots_adjust(left=0.2) #设置图表距画布左边的空白
plt.show()
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/80206c0b298312ed4286d7df4968372e.png)
12.5.6 预测评分
- 评分算法为准确率,准确率越高,说明销售预测的销售收入效果越好。
- 下面使用Skikit-Learn提供的评价指标函数metrics()实现回归模型的评估,主要包括以下四种方法。
- explained_variance_score:回归模型的方差得分,取值为0~1
- mean_absolute_error:平均绝对误差。
- mean_squared_error:均方差。
- r2_score:判定系数,解释回归模型的方差得分,取值为0~1
- 下面使用r2_score()方法评估回归模型,为预测结果评分。如果评分结果是0,则说明预测结果跟盲目猜测差不多;如果评分结果是1,则说明预测结果非常准;如果评分结果是0~1的数,则说明预测结果的好坏程度;如果结果是负数,则说明预测结果还不如盲目猜测,而导致这种情况的原因是数据没有线性关系。
- 假设为了6个月实际销售收入分别是360000,450000,600000,800000,920000,1300000,程序代码如下:
#预测评分
from sklearn.metrics import r2_score
y_true = [360000,450000,600000,800000,920000,1300000]# 真实值
score=r2_score(y_true,y0) # 预测评分
print(score)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a5308cdcd6065b33a3ad6950231e9f49.png)
12.6 小结
- 本章融入了数据处理、可视化图表、数据分析和机器学习相关知识。通过本章项目的实践,进一步巩固和加深了前面所学知识,并进行了综合应用。例如在掌握相关性分析和线性回归分析方法的结合,为数据预测提供了有效的依据。通过实际项目的应用,掌握了Scikit-Learn线性回归模型,为日后的数据分析工作奠定了坚实的基础。