Python数据分析与数据化运营(第2版)
上QQ阅读APP看书,第一时间看更新

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万条,如何进行数据归约?

❑ 回归模型除了案例中的评估指标外,还有哪些指标可以做效果评估?