1.4 第1个用Python实现的数据化运营分析实例、销售预测
1.4.1 案例概述
本节通过一个简单的案例,来介绍如何使用Python进行数据化运营分析。
案例场景:每个销售型公司都有一定的促销费用,促销费用可以带来销售量的显著提升。当给出一定的促销费用时,预计会带来多大的商品销售量?
在“附件-chapter1”中的data.txt文档中存储了建模所需的原始数据及chapter1.ipynb中案例完整代码。以下是原始数据概况。
❑ 来源:生成的模拟数据,非真实数据。
❑ 用途:用来做第1个销售预测案例。
❑ 维度数量:1。
❑ 记录数:100。
❑ 字段变量:第1列是促销费用money,第2列是商品销售量amount。
❑ 数据类型:全部是浮点型。
❑ 是否有缺失值:否。
1.4.2 案例过程
下面逐步解析整个分析和实践过程。
第1步导入库
本案例中,我们使用以下几个库。
❑ Pandas:读取数据和基本处理。
❑ sklearn:线性回归方法库,包含linear_model和MSE/R2两个检验库。。
❑ matplotlib:图形展示库,用来在建模前做多个字段关系分析,以确认建模思路。代码如下:
import pandas as pd from matplotlib import pyplot as plt from sklearn import linear_model from sklearn.metrics import mean_squared_error, r2_score
相关知识点:Python导入库
Python导入库有两种方式:
第1种是直接导入库,方法是import[库名]。例如,import numpy。对于某些库名比较长的库,我们会使用as方法命名别名,以方便后续使用,例如,import numpy as np。
第2种是导入库中的指定函数,方法是from[库名]import[函数名]。例如from sklearn import linear_model。这种情况下也可以使用as命名别名方便后续使用,例如,from matplotlib import pyplot as plt。
第2步读取数据
本案例中的数据为txt文件,我们使用Python默认的读取文件的方法。代码如下:
raw_data = pd.read_csv('data.txt')
本示例没有使用传统的open方法,而是用了Pandas自带的读取csv数据库。事实上,对于数据文件的读取,一般都不会用原生的open方法,类似于Pandas、Numpy等带很多可以读取多种格式数据文件的方法。由于程序文件和数据文件处于同一个目录下,因此无须指定路径;也可以通过相对路径和绝对路径来设置完整路径。
❑ 指定相对路径:'../data/data.txt',含义是“data.txt”位于当前Python工作目录的父级目录中的data文件夹中。
❑ 指定绝对路径:'d:/python_data/data/data.txt',该方式中的绝对路径需要注意使用正斜杠/,而不是Windows默认的反斜杠\;如果一定要使用反斜杠,那么需要写成’d:\\python_data\\data\\data.txt',用转义字符表示。
相关知识点:转义字符
在Python中反斜杠作为转义字符存在,使用\\的意思是这是一个反斜杠符号。表1-1列出了Python常用的转义字符列表。
表1-1 常用转义字符列表
第3步数据预处理
在本阶段,主要实现对读取的列表数据进行清洗转换,以满足数据分析展示和数据建模的需要。代码如下:
num = int(raw_data.shape[0]*0.7) x, y = raw_data[['money']], raw_data[['amount']] x_train, x_test = x[:num], x[num:] y_train, y_test = y[:num], y[num:]
第1行的目的是设置一个用于确认数据交叉检验比例的阈值条件,默认是用70%的数据做训练,用剩余30%的数据做测试。
第2行是设置建模用的x(促销费用money)和y(商品销售量amount)。
第3行和第4行分别用于按照第1行设置的记录数将训练集和测试集区分开。具体原理后续我们会讲到。
第4步探索性数据分析
到现在为止我们已经拥有了格式化的数据,但到底对这两列数据集应该使用哪种模型还未知,因此先通过散点图来观察一下。代码如下:
plt.scatter(x_train, y_train)
代码的意思是用一个散点图来展示x_train和y_train。代码执行后会出现如图1-29所示的散点图。
图1-29 散点关系图
通过散点图发现,x_train与y_train的关系呈现明显的线性关系:当x_train增大时,y_train增大;当x_train减小时,y_train减小。初步判断可以选择线性回归进行模型拟合。
第5步数据建模
建模阶段我们使用sklearn中的线性回归模块实现,代码如下:
model = linear_model.LinearRegression() model.fit(x_train, y_train)
代码model = linear_model.LinearRegression()的作用是创建一个模型对象,后续所有的模型操作都基于该对象产生。
代码model.fit(x_train, y_train)的作用是将x_train和y_train分别作为自变量和因变量输入模型进行训练。
第6步模型评估
模型已经创建完成,本阶段进行模型拟合的校验和模型评估,代码如下:
predict_test_y = model.predict(x_test) print("Mean squared error: %.0f"% mean_squared_error(y_test, predict_test_y)) print('Variance score: %.2f' % r2_score(y_test, predict_test_y))
模型的评估基于简单的交叉检验方法进行,即先用训练集的数据做训练,然后用测试集的x_test预测得到的值与真实的y_test做对比。检验中用到了两个指标,MSE和R2,有关这些指标的具体用法后续会陆续提到。
Mean squared error: 65823229 Variance score: 0.72
上述的结果反映了当前的模型情况,由于该模型没有经过细致调参以及多次检验来做更多优化,因此初步得到的结果来看还算可以。
第7步线性回归参数
由于模型是线性回归,因此我们可以试着把线性回归的方程写出来,便于理解和应用。
model_coef = model.coef_ model_intercept = model.intercept_ print('coef is: ', model_coef) print('intercept is: ', model_intercept)
代码model_coef = model.coef_的作用是获取模型的自变量的系数并赋值为model_coef,代码model_intercept = model.intercept_的作用是获取模型的截距并赋值为model_intercept。输出结果如下:
coef is: [[2.20734937]] intercept is: [9301.37803984]
通过上述步骤我们可以获得线性回归方程y = model_coef*x + model_intercept,即y= 2.20734937*x+ 9301.37803984。
第8步销售预测应用
我们已经拥有了一个可以预测的模型,现在我们给定促销费用(x)为84610,销售预测代码如下:
new_x = 84610 pre_y = model.predict([[new_x]]) print(pre_y)
代码new_x = 84610的作用是创建促销费用常量,用来做预测时的输入。代码pre_y =model.predict(new_x)的作用是将促销费用常量new_x输入模型进行预测,将预测结果赋值为pre_y。代码print(pre_y)的作用是打印输出销售预测值。
代码执行后,会输出[[196065.20852406]],这就是预测的销售量。为了符合实际销量必须是整数的特点,后续可以对该数据做四舍五入。
1.4.3 案例小结
本案例看似篇幅很长,其实代码本身只用了20多行,实现了导入库、获取数据、数据预处理、数据展示分析、数据建模、模型评估和销售预测的完整步骤,麻雀虽小五脏俱全。
案例场景虽然简单,但完整地演示了如何从输入数据到输出结果的整个过程。其中,我们用到了以下基础知识:
❑ 使用Pandas读取数据文件。
❑ 使用Pandas做切片等数据预处理工作。
❑ 使用Matplotlib进行散点图展示。
❑ 使用sklearn进行线性回归的训练和预测。
❑ 使用交叉检验配合mean_squared_error和r2_score做模型效果评估。
❑ 使用print打印输出结果。
这是本书的第1个完整案例,目的是引导读者快速进入使用Python进行数据化运营的场景中来。笔者并不希望让读者陷入复杂的逻辑和太多知识当中,以下内容仅做拓展思考之用:
❑ 通过散点图初步判断线性回归是比较好的拟合模型,是否有其他回归方法会得到更好的效果?例如广义线性回归、SVR(SVM中的回归)、CART(分类回归树)等。
❑ 通过图形法观察数据模型,只适合用于二维数据,如果数据输入的维度超过2个呢?
❑ 本案例中的数据量比较小,如果数据量比较大,假如有1000万条,如何进行数据归约?
❑ 回归模型除了案例中的评估指标外,还有哪些指标可以做效果评估?