发布时间:2024-03-07 11:01
先上数据集与完整代码:
https://pan.baidu.com/s/1lZu3IuJSrLVLXEK74iotKw
提取码:bmpe
数据有两个,一个是投放费用的广告费用表
有一个是销售数据表
'''
销售数据(按天)(按月)统计分析
'''
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_d=df1.resample("D").sum().to_period('D')
df1_m=df1.resample("M").sum().to_period('M')
#生成结果文件
df1_d.to_excel("result1.xlsx")
df1_m.to_excel('result1.xlsx')
# #——————————————————————————————————----数据可视化————————————————————————————————-----
# #图表字体为黑体,字号为10
plt.rc('font', family='SimHei',size=10)
fig=plt.figure(figsize=(9,5))
#表示1行2列的子图,共1*2个图
ax=fig.subplots(1,2)
ax[0].set_title('按月分析销售收入')
ax[1].set_title('按日分析销售收入')
#画图,当只有两列的dataframe时,可以直接调用plot函数,默认是折线图
df1_m.plot(ax=ax[0],kind='bar',color='g')
df1_d.plot(ax=ax[1],color='r')
#调整图表距上部和底部的空白
plt.subplots_adjust(top=0.95,bottom=0.15)
plt.show()
后面我们研究投放的广告费用是否与销量存在相关关系,如果有相关关系的话,我们可以利用投放的广告费用来预测销售量
'''
分析广告费用与销售收入按月份的趋势图
'''
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)
#按月份进行重采样
df1_x=df1.resample('M').sum().to_period('M')
df2_x=df2.resample('M').sum().to_period('M')
#把纵坐标需要的数据整理出来
y1=pd.DataFrame(df1_x['支出'])
y2=pd.DataFrame(df2_x['销售码洋'])
#生成画布
fig=plt.figure()
# 图表字体为黑体,字号为11
plt.rc('font', family='SimHei',size=11)
#添加子图对象
ax=fig.add_subplot(111)
plt.title('京东投放广告与销售量每月趋势图')
#画x轴的刻度
x=[1,2,3,4,5,6,7,8,9,10,11,12]
plt.xticks(x,['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'])
ax.plot(x,y1,color='orangered',linewidth=2,linestyle='-',marker='o',mfc='w',label='广告费')
#图例
plt.legend(loc='upper left')
#添加一个坐标轴
ax2=ax.twinx()
ax2.plot(x,y2,color='b',linewidth=2,linestyle='-',marker='o',mfc='w',label='销售收入')
#图例
plt.legend(loc='upper center')
#调整图表距上部和底部的空白
plt.subplots_adjust(right=0.85)
plt.show()
我们从上图中,惊讶的发现两者线条的走势基本相同。我们还可以做广告费用与销量的散点图来验证这一点:
'''
画出广告与收入之间的散点图
'''
import pandas as pd
import matplotlib.pyplot as plt
df1=pd.read_excel('.\data\销售表.xlsx')
df2=pd.read_excel('.\data\广告费.xlsx')
#把他们转换时间格式类型
print(df1.head())
df1=df1[['日期','销售码洋']]
df2['投放日期']=pd.to_datetime(df2['投放日期'])
df1['日期']=pd.to_datetime(df1['日期'])
df1=df1.set_index('日期',drop=True)
df2=df2.set_index('投放日期',drop=True)
#对月份重采样
df1_X=df1.resample("M").sum().to_period('M')
df2_X=df2.resample("M").sum().to_period("M")
x=pd.DataFrame(df1_X)
y=pd.DataFrame(df2_X)
plt.figure()
#设置中文黑体,11号
plt.rc('font', family='SimHei',size=11)
plt.title('广告与收入散点图')
plt.scatter(x,y,color='r')
plt.xlabel('销售收入')
plt.ylabel('广告费用')
#图表距画布右侧之间的空白
plt.subplots_adjust(left=0.15)
plt.show()
我们发现,两者的确在一个线条区域上,可以基本判别两者存在相关关系。
然后我们可以利用线性回归方程通过投放的广告费用来预测销售量
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')
#x为广告费,y为销售收入
x=pd.DataFrame(df_x['支出'])
y=pd.DataFrame(df_y['销售码洋'])
#——————————————————————————————————————————线性预测————————————————————————————————
clf=linear_model.LinearRegression() #创建线性模型
clf.fit(x,y)
#K值(回归系数)
k=clf.coef_
#截距项
b=clf.intercept_
print('K=',k)
print('b=',b)
#未来6个月计划投入的广告费
x0=np.array([120000,130000,150000,180000,200000,250000])
# 数组重塑
x0=x0.reshape(6,1)
'''
[[120000]
# [130000]
# [150000]
# [180000]
# [200000]
# [250000]]
'''
#用未来6个月的广告费用预测未来的销售量
y0=clf.predict(x0)
print('销售收入:')
print(y0)
# 使用线性模型预测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()
#预测评分
from sklearn.metrics import r2_score
y_true = [360000,450000,600000,800000,920000,1300000]# 真实值
score=r2_score(y_true,y0) # 预测评分
print(score)
回归方程的K与截距项:
K= [[6.92235616]]
b= [-487521.71147034]
未来6个月的投入广告费是:
[120000,130000,150000,180000,200000,250000]
那么预计的销售量是:
[[ 343161.02820353]
[ 412384.58984301]
[ 550831.71312199]
[ 758502.39804046]
[ 896949.52131943]
[1243067.32951688]]
最后我们还要对算法进行检验,验证该算法的有效性
利用带标签的数据,与回归方程的预测值作比较
常用的损失函数为:MSE(误差平方和)
最后得分为
0.9839200886906198(得分,也可做准确率)
说明这回归方程还是预测效果很好的。