说明:本文是《Python数据分析与数据化运营》中的“1.4 第一个用Python实现的数据化运营分析实例-销售预测”。
1. 案例概述
本节通过一个简单的案例,来介绍下如何使用Python进行数据化运营分析。
案例场景:每个销售型公司都有一定的促销费用,促销费用可以带来销售量的显著提升;当给出一定的促销费用时,预计会带来多大的商品销售量? 在“附件-chapter1”中data.txt存储了建模所需的原始数据,get_started_example.py是案例完整代码。以下是原始数据概况:
- 来源:生成的模拟数据,非真实数据
- 用途:用来做第一个销售预测案例
- 维度数量:1
- 记录数:100
- 字段变量:第一列是促销费用,第二列是商品销售量
- 数据类型:全部是浮点数值型
- 是否有缺失值:否
2. 案例过程
下面逐步解析整个分析和实践过程。
第一步 导入库
本案例中,我们会使用四个库:
- re:正则表达式,程序中通过该库来实现字符串分割。
- numpy:数组操作和处理库,程序中用来做格式转换和预处理。
- sklearn:算法模型库,程序中使用了线性回归方法linear_model。
- matplotlib:图形展示库,用来在建模前做多个字段关系分析。
代码如下:
import re
import numpy
from sklearn import linear_model
from matplotlib import pyplot as plt
相关知识点:Python导入库
Python导入库有两种方式:
- 第一种是导入直接导入库,方法是:import [库名],例如
import numpy
;对于某些库名比较长的库,我们会使用as方法命名别名以方便后续使用,例如import numpy as np
。 - 第二种是导入库中的指定函数,方法是:from [库名] import [函数名],例如
from sklearn import linear_model
;这种情况下也可以使用as命名别名方便后续使用,例如from matplotlib import pyplot as plt
。
第二步 导入数据
本案例中的数据为txt文件,我们使用Python默认的读取文件的方法。代码如下:
fn = open('data.txt','r')
all_data = fn.readlines()
fn.close()
第一段代码fn = open('data.txt','r')的作用是打开名为“data.txt”的文件,文件模式是只读,并创建一个名为fn的文件对象,后续所有关于该文件的操作都通过fn执行。
由于程序文件和数据文件处于同一个目录下,因此无需指定路径;也可以通过相对路径和绝对路径来设置完整路径。
- 指定相对路径:'../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 常用转义字符列表
转义字符 | 描述 |
---|---|
\(行尾时) | 续行符,表示一行没有结束 |
\\ | 反斜杠符号 |
\' | 单引号 |
\" | 双引号 |
\a | 响铃符,发出系统响铃声 |
\b | 退格符(Backspace) |
\e | 转义符 |
\000 | 终止符,\000后的字符串全部忽略 |
\n | 换行符 |
\v | 垂直制表符 |
\t | 水平制表符 |
\r | 回车符 |
\f | 换页符 |
\o | 八进制数代表的字符 |
\x | 十六进制数代表的字符 |
\other | 其它的字符以普通格式输出 |
第二段代码all_data =fn.readlines()的意思是从fn中读取所有的行记录,并保存到一个名为all_data的列表中。
我们可以通过all_data[0]来查看该列表的第一个数据,Python中的数据索引都是从0开始,第0个索引值对应是第一个值。
In[3]: all_data[0]
Out[3]: '28192.0\t68980.0\n'
通过查看第一个数据,我们了解了数据的基本情况,这是一个由数字、水平制表符和回车符组成的字符串,两个数字之间使用\t水平制表符分割,每个字符串以\n回车符结尾。该信息会为后续做数据预处理提供思路。
第三段代码fn.close()的意思是关闭文件对象的占用。当文件读写完成后,都需要及时关闭资源占用。
提示 不仅是文件对象,包括数据库游标、数据库连接等资源,在使用完成后需要及时关闭,这样能减少对资源的无效占用。同时,这还能防止当其他功能模块对该对象进行重命名、删除、移动等操作时,不会由于文件对象的占用而报错。
第三步 数据预处理
在本阶段,主要实现对读取的列表数据进行清洗转换,以满足数据分析展示和数据建模的需要。代码如下:
x = []
y = []
for single_data in all_data:
tmp_data = re.split('\t|\n',single_data)
x.append(float(tmp_data[0]))
y.append(float(tmp_data[1]))
x = numpy.array(x).reshape([-1,1]) # 转换为N行一列的矩阵
y = numpy.array(y).reshape([-1,1]) # 转换为N行一列的矩阵
- 代码x = []和y = []的意思是创建两个空列表,目的是用来存放自变量和因变量数据。
- 代码for single_data in all_data的意思是通过一个for循环来每次从列表all_data中读取一条数据,并赋值给single_data。
- 代码tmp_data = re.split('\t|\n',single_data)的意思是,分别使用\t和\n作为分割符,将single_data进行数据分割,分割结果赋值为tmp_data。
- 代码x.append(float(tmp_data[0]))和y.append(float(tmp_data[1]))的意思是将tmp_data的第一个值追加到列表x中,将tmp_data的第二个值追加到列表y中。在追加之前,我们先将每个数据通过float方法为浮点型(数值型)。
- 代码x = numpy.array(x).reshape([-1,1])和y =numpy.array(y).reshape([-1,1])的意思是将x和y由列表类型转换为数组类型,同时数组的形状是N行1列。在这里并没有具体制定行数,行数据为根据原始数据的记录数自动确定。
提示 在使用reshape做矩阵单行或单列的转换时,可直接使用reshape([-1,1])转换为一列或使用reshape([1,-1])转换为一行,而不必具体指定或行记录的数量。
第四步 数据分析
到现在止我们已经拥有了格式化的数据,但到底对这两列数据集应该使用哪种模型还未可知。因此先通过散点图来观察一下。代码如下:
plt.scatter(x,y)
plt.show()
代码plt.scatter(x,y)的意思是用一个散点图来展示x和y,plt.show()的作用是展示图形。
通过散点图发现,x和y的关系呈现明显的线性关系:当x增大时,y增大;当x减小时,y减小。初步判断可以选择线性回归进行模型拟合。
第五步数据建模
建模阶段我们使用sklearn中的线性回归模块实现,代码如下:
model = linear_model.LinearRegression()
model.fit(x, y)
- 代码model = linear_model.LinearRegression()的作用是创建一个模型对象,后续所有的模型操作都基于该对象产生。
- 代码model.fit(x, y)的作用是将x和y分别作为自变量和因变量输入模型进行训练。
第六步 模型评估
模型已经创建完成,本阶段进行模型拟合的校验和模型评估,代码如下:
model_coef = model.coef_
model_intercept = model.intercept_
r2 = model.score(x,y)
- 代码model_coef = model.coef_的作用是获取模型的自变量的系数并赋值为model_coef,
- 代码model_intercept =model.intercept_的作用是获取模型的截距并赋值为model_intercept,
- 代码r2 =model.score(x,y)获取模型的决定系数R的平方。
通过上述步骤我们可以获得线性回归方程y = model_coefx +model_intercept,即y=2.09463661x+13175.36904199。该回归方程的决定系数R的平方是0.78764146847589545,整体拟合效果不错。
第七步 销售预测
我们已经拥有了一个可以预测的模型,现在我们给定促销费用(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)的作用是打印输出销售预测值。
代码执行后,会输出[[190402.57234225]],这就是预测的销售量。为了符合实际销量必须是整数的特点,后续可以对该数据做四舍五入,使用round(pre_y)获得预测的整数销量。
相关知识点:如何执行Python代码 对稍微有些经验的程序员或Python工程师来讲这当然不是什么问题,但对第一次接触Python的读者来讲,这也许是一个需要补充的必要知识点。
Python代码的执行既可以只执行特定代码行/段,也可以执行整个代码文件。
场景1:执行特定代码行/段
这种方式通常是以调试的方式,逐行/模块运行代码,大多应用在单功能、模块的开发、调试和测试。执行方式如下:
- 在Python命令行中执行:在打开系统终端命令行窗口,输入python进入python命令行界面,然后逐行或模块输入上述Python代码即可。
- 在IPython命令行中执行:在打开系统命令行窗口,输入ipython进入ipython命令行界面,然后逐行或模块输入上述Python代码即可。
- 在PyCharm中执行:PyCharm是本书推荐使用的Python IDE,笔者推荐使用这种方式进行代码功能开发和测试。
打开PyCharm程序,第一次需要新建一个项目用来存储和管理所有即将开发的Python资源,Location(位置)指向本书的“附件”根目录,然后点击Create(创建)。如图1-10。 图1-10 在PyCharm中新建Python项目
创建完成后的PyCharm界面如图1-11所示,除了顶部菜单栏外,下面的内容区分为4部分,从①到④依次是项目/结构区、代码区、调试区、智能提示区。 图1-11 PyCharm项目界面概览
- 项目/结构区:项目方式展示本项目所有文件、外部连接库,结构方式展示当前文件下所有的函数、变量等详细信息。
- 代码区:展示所有程序代码、注释的区域。
- 调试区:分为TODO、Console、Terminal三个模块,分别用于提供注释的TODO列表、调试和终端功能。
- 智能提示区:所有代码中可能存在的格式、引用、语法等方面的错误、警告信息的提示。
在代码区,用鼠标选中要调试的程序,直接输入快捷组合键ALT+Shift+E,然后在调试区可以看到该代码执行的状态。如图1-12是程序调试执行结果: 图1-12程序调试执行结果
场景2:执行整个代码文件
这种方式通常将Python文件作为一个整体运行代码,一般在单个功能或模块开发完成之后,做整体或多功能模块的测试、集成或程序间调用时使用。
在系统终端命令行中调用Python命令执行:在打开系统命令行窗口,输入python +[python文件名称].py
。
如图1-13为运行本章案例的Python程序文件,执行结果将先显示一个图形文件,关闭图形之后会继续运行显示预测结果: 图1-13通过系统终端命令行中调用Python命令执行
在IPython命令行中执行:在打开系统命令行窗口,输入ipython进入ipython命令行界面,然后在交互命令窗口输入run +[python文件名称].py,如图1-14。 图1-14在IPython中执行Python文件
在PyCharm中执行:在PyCharm中新建项目后,双击左侧项目/结构区要执行的Python文件,右侧会显示对应Python文件的代码内容。
输入组合快捷键Alt+Shift+F10或通过顶部菜单栏“Run-Run”,在弹出的窗口中选择要执行的Python文件。如图1-15,程序文件执行后,会在底部调试窗口显示执行结果: 图1-15在PyCharm中执行Python文件
在PyCharm中已经集成了IPython命令行和系统终端窗口功能,点击“Python Console”后的调试界面,默认调用的是IPython库; 点击“Terminal”后的调试界面正是系统终端的命令行界面。
读者可直接在此直接操作上述命令,实际上,这也是笔者着重推荐使用PyCharm作为IDE的主要原因之一,在一个工具里面可以直接实现不同的调试场景:
- 安装第三方库时使用pip命令或需要从终端调用命令时,可直接点击“Terminal”操作;
- 想要使用IPython的友好开发交互和提示功能,可直接在“Python Console”中完成;
- 想要完整的查看Python项目资源并进行管理,尤其是代码审查等方面,PyCharm又可以完美胜任。
3. 案例小结
本案例看似篇幅很长,其实代码本身只用了40多行,实现了从导入库、获取数据、数据预处理、数据展示分析、数据建模、模型评估和销售预测7个关键步骤,麻雀虽小五脏俱全。 案例场景虽然简单,但完整的演示了如何从输入数据到输出结果的整个过程,其中,我们用到了以下基础知识:
- Python文件的读取
- Python基本操作:列表(新建、追加)、for循环、变量赋值、字符串分割、数值转换
- Numpy数组操作:列表转数组、重新设置数组形状
- 使用Matplotlib进行散点图展示
- 使用sklearn进行线性回归的训练和预测
- 使用print输出指定数据
这是本书的第一个完整案例,目的是引导读者快速进入使用Python进行数据化运营的场景中来;因此,笔者并不希望让读者陷入复杂的逻辑和太多知识当中,以下内容仅做拓展思考之用:
- 通过散点图初步判断线性回归是比较好的拟合模型,是否有其他回归方法会得到更好的效果?例如广义线性回归、SVR(SVM中的回归)、CART(分类回归树)等。
- 通过图形法观察数据模型,只适合用于二维数据,如果数据输入的维度超过2个或2个以上呢?
- 本案例中的数据量比较小,如果数据量比较大,假如有1000万条,如何进行数据归约?
- 回归模型除了案例中的评估指标外,还有哪些指标可以做效果评估?
txt文件在哪里呢
这个案例是《Python数据分析与数据化运营》里面的第一章的案例,具体数据和代码可以在 下载图书资源 下载哈。
都在这里面下载哈。下载图书资源