前言
本文讲解了从零开始学习Python数据科学的全过程,涵盖各种工具和方法
你将会学习到如何使用python做基本的数据分析
你还可以了解机器学习算法的原理和使用
说明
先说一段题外话。我是一名数据工程师,在用SAS做分析超过5年后,决定走出舒适区,寻找其它有效的数据分析工具,很快我发现了Python!
我非常喜欢编程,这是我真正喜欢做的事情。事实证明,编程并没有想象中的那么难。
我在一周之内学习了Python的基本语法,接着我一方面继续深入探索Python,另一方面帮助其他人学习这门语言。Python最初是一门简单的脚本语言,但随着Python社区的不断发展壮大,越来越多的开发者参与到Python工具库开发中来,所以Python拥有极其丰富的数据科学第三方库。
内容目录
1、Python数据分析的基本概况
为何使用Python做数据分析?
Python2.7还是Python3.7?
如何安装Python?
使用Python运行一段简单的代码
如何使用Jupyter notebook
2、Python数据结构和库
Python数据结构
Python循环结构和判断语句
Python库
3、使用Pandas做探索性分析
Series和DataFrame数据结构介绍
具体数据集案例分析
4、Numpy基本概念
Numpy常见函数使用
5、使用Pandas和numpy做数据清洗
处理数据集中的空值
如何使用apply方法?
6、使用Matplotlib绘制图表
Matplotlib介绍
使用Matplotlib绘制简单的柱状图
7、使用Scikit-learn建立预测模型
逻辑回归算法
决策树算法
随机森林算法
1、Python数据分析的基本概况
为何使用Python做数据分析?
最近几年,Python用作数据分析语言引起了非常多的关注,一度超越R成为最受欢迎的数据科学工具。作为Python的使用者,我支持Python作为数据分析工具有以下理由:
开源-免费安装使用
语言简洁,是一门真正的强大的编程语言
非常强大的在线社区
学习门槛低
极其丰富的第三方数据科学库
但它也有一些缺点:
Python是一种解释性语言而非编译性,速度相对比较慢。但是考虑到在学习和代码上节省的时间,Python依然是不二的选择。
Python 2.7还是Python 3.7?
很多初学者还在纠结选择Python 2.7还是Python 3.7?这两个版本有非常大的差异,简直就是两种语言。它们各有各的优缺点,取决于你使用的需求。
为什么Python 2.7
绝对优势的社区支持!Python 2.x诞生于2000年,已经被使用快20年,许多公司依然在使用Python 2.7
丰富的第三方库!目前绝大部分第三方库都是建立在Python 2.x基础上的,很多库并不支持Python 3.x版本。如果你将Python用于特定的应用程序,如高度依赖外部模块的web开发,那么建议使用Python 2.7
为什么Python 3.7
语法更加简洁和快速。Python开发人员改进了Python 2.x的缺点,Python 3.x代表了Python未来发展的方向
Python 2.7 只维护到2020年
Python官方建议直接学习Python 3.x
如果将Python作为数据科学工具,我建议使用Python 3.x,因为基本上所有的数据科学第三方库都已经支持Python 3.x。当然选择哪一个版本不是目的,应当专注的是如何使用Python更好地服务于数据科学。
如何安装Python?
这里两种安装方法可供参考:
直接去Python官网下载Python3.7安装包,再选择安装自己需要的第三方库和编辑器
或者,你不想这么麻烦,你可以选择安装Anaconda,这是一个开源的Python发行版本,其预装了180多个第三方库和依赖包
第二种方法包含了数据科学用到的大部分工具包,为你省去很多安装时间。这也是本教程建议初学者使用的安装方法 。
选择Python开发环境
一旦你安装好了python,就需要选择开发环境用于Python编程,这里有四个常用选择:
终端交互模式
IDLE(默认环境)
其它IDE,如pycharm
Jupyter notebook(ipython)
IDLE(默认环境)
这里不对它们作具体比较,读者可自行上网查询,选择什么样的开发环境取决于你的需求。
我建议初学者使用Jupyter notebook(ipython)作为Python数据分析的开发环境。Jupyter Notebook 是一个交互式笔记本,本质是一个 Web 应用程序,便于创建和共享程序文档,支持实时代码,数学方程,可视化和markdown。 用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等。数据挖掘领域中最热门的比赛 Kaggle 里的资料都是Jupyter 格式。
本教程也是使用Jupyter Notebook 作为代码环境。
Jupyter Notebook编程界面
使用Python运行一段简单的代码
如何使用Jupyter Notebook
Anaconda预装了Jupyter Notebook库,所以安装Anaconda后就可以直接使用Jupyter Notebook。
启动Jupyter Notebook有两种方法,你可以在命令行中键入jupyter notebook再按enter键,便可以进入Jupyter Notebook环境,记住不要关闭命令行窗口,否则Jupyter环境会失效。
命令行键入jupyter notebook
还可以在开始菜单Anaconda文件夹中直接双击Jupyter Notebook
然后进入Jupyter Notebook主界面,点击New新建,点击Python 3,就可以开始愉快的编程了。
Jupyter Notebook主界面
notebook界面
你可以修改该notebook的名字,添加或删除代码编辑框,使用“Shift + Enter” 或者“Ctrl + Enter”快捷键运行代码。具体功能快捷键这里不做赘述,可以去Jupyter Notebook 快捷键 查看。
2、Python数据结构和库
Python数据结构
接下来要讲到Python的数据结构,你应该尽可能熟悉它,因为在接下来的数据分析代码中会经常用到这些数据结构。
字符串
Python 可以操作字符串。字符串有多种形式,可以使用单引号('……'),双引号("……")都可以获得同样的结果2。反斜杠\可以用来转义:
字符串示例
列表
Python 中可以通过组合一些值得到多种复合数据类型。其中最常用的列表,可以通过方括号括起、逗号分隔的一组值得到。一个列表可以包含不同类型的元素,但通常使用时各个元素类型相同:
列表示例
元组
可以看到列表和字符串有很多共同特性,例如索引和切片操作。Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
元组示例
字典
另一个非常有用的 Python 內置数据类型是字典。字典在其他语言里可能会被叫做 联合内存 或 联合数组。与以连续整数为索引的序列不同,字典是以 关键字 为索引的,关键字可以是任意不可变类型,通常是字符串或数字。如果一个元组只包含字符串、数字或元组,那么这个元组也可以用作关键字。但如果元组直接或间接地包含了可变对象,那么它就不能用作关键字。列表不能用作关键字,因为列表可以通过索引、切片或 append() 和 extend() 之类的方法来改变。
理解字典的最好方式,就是将它看做是一个 键: 值 对的集合,键必须是唯一的(在一个字典中)。一对花括号可以创建一个空字典:{} 。另一种初始化字典的方式是在一对花括号里放置一些以逗号分隔的键值对,而这也是字典输出的方式。
以下是使用字典的一些简单示例:
字典示例
Python循环结构和判断语句
for循环
和大多数编程语言一样,Python也有for循环结构,其被广泛使用在迭代方法中。
Python 中的for语句与你在 C 或 Pascal 中可能用到的有所不同。 Python 中的for语句并不总是对算术递增的数值进行迭代(如同 Pascal),或是给予用户定义迭代步骤和暂停条件的能力(如同 C),而是对任意序列进行迭代(例如列表或字符串),条目的迭代顺序与它们在序列中出现的顺序一致。
如果在循环内需要修改序列中的值(比如重复某些选中的元素),推荐你先拷贝一份副本。对序列进行循环不代表制作了一个副本进行操作。切片操作使这件事非常简单:
如果写成for w in words:,这个示例就会创建无限长的列表,一次又一次重复地插入defenestrate。
range函数
如果你确实需要遍历一个数字序列,内置函数range()会派上用场。它生成算术级数:
if判断语句
可能最为人所熟知的编程语句就是if语句了,这是python中的判断语句。
使用形式为if ... elif ... else ...
可以有零个或多个elif部分,以及一个可选的else部分。 关键字 'elif' 是 'else if' 的缩写,适合用于避免过多的缩进。 一个if...elif...elif... 序列可以看作是其他语言中的switch或case语句的替代。
现在你熟悉了Python中的循环结构和判断语句,可以更进一步去学习更多的语法知识。
如果每做一件事都需要从头开始写代码,那么这将是一场噩梦,比如你想要对一个列表里数字进行加法运算,难道还要一个一个数字加起来吗?这样的话,你肯定不想学习python了。庆幸的是,python有很多工具库,可以帮助我们更加直接有效地解决问题。
例如,求数学中的阶乘,你可以很简单的导入math模块,使用已经编译好的阶乘函数:
当然在使用函数之前,你必须要导入库和函数。话不多说,一起来探索更多的Python库吧!
Python库
在学习更酷炫实用的Python库之前,第一步要知道什么是Python库。
Python库是一个相关功能模块的集合,里面包含各种函数方法,用来解决复杂的问题。
这些库分为两类:标准库和第三方库,标准库是Python内置库,无需再安装,如math、range;第三方库需要另外安装,如jupyter、pandas、numpy
安装第三方库
安装第三方库有两种方法,第一种是pip方法,pip是Python包管理工具,自带无需安装,提供了对Python 库的查找、下载、安装、卸载的功能。
如果想安装pandas库,你可以在命令行输入:
pip install pandas
接下来等待自行下载安装。
第二种是手动安装,在python库集合里下载相关库文件并安装。
导入库和库函数
使用库之前,需要将其导入Python环境。同样有两种方法可以做到(以math库为例):
import math
或者
from math import *
第一种方法,导入整个库,如果你需要使用库中的某个函数,比如阶乘函数factorial,那么,需要用math.factorial()形式。
第二种方法直接导入了math库的所有方法和函数,直接factorial()就可以了。
建议使用第一种方法,用什么导入什么,不浪费。
最常用的数据科学库列表
numpy:它是一个由多维数组对象和用于处理数组的例程集合组成的库,里面包含了大量的计算函数,可以很轻松的进行科学计算。
scipy:科学计算的另一个核心库是 SciPy。它基于 NumPy,其功能也因此得到了扩展。SciPy 主数据结构又是一个多维数组,由 Numpy 实现。这个软件包包含了帮助解决线性代数、概率论、积分计算和许多其他任务的工具。此外,SciPy 还封装了许多新的 BLAS 和 LAPACK 函数。
pandas:是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的,具备强大的数据展示功能。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
matplotlib:是一个Python 2D绘图库,可以生成各种硬拷贝格式和跨平台交互式环境的出版物质量数据。Matplotlib可用于Python脚本,Python和IPython shell,Jupyter笔记本,Web应用程序服务器和四个图形用户界面工具包。只需几行代码即可生成绘图,直方图,功率谱,条形图,误差图,散点图等。
scikit-learn:是一个机器学习库,可以对数据进行分类,回归,无监督,数据降维,数据预处理等等,包含了常见的大部分机器学习方法。
StatsModels:Statsmodels 是一个 Python 模块,它为统计数据分析提供了许多机会,例如统计模型估计、执行统计测试等。在它的帮助下,你可以实现许多机器学习方法并探索不同的绘图可能性。
Seaborn:Seaborn 本质上是一个基于 matplotlib 库的高级 API。它包含更适合处理图表的默认设置。此外,还有丰富的可视化库,包括一些复杂类型,如时间序列、联合分布图(jointplots)和小提琴图(violin diagrams)。
Plotly:Plotly 是一个交互可视化库,它可以让你轻松构建复杂的图形。该软件包适用于交互式 Web 应用程,可实现轮廓图、三元图和三维图等视觉效果。
Bokeh:Bokeh 库使用 JavaScript 小部件在浏览器中创建交互式和可缩放的可视化。该库提供了多种图表集合,样式可能性(styling possibilities),链接图、添加小部件和定义回调等形式的交互能力,以及许多更有用的特性。
Scrapy:Scrapy 是一个用来创建网络爬虫,扫描网页和收集结构化数据的库。此外,Scrapy 可以从 API 中提取数据。由于该库的可扩展性和可移植性,使得它用起来非常方便。
TensorFlow:TensorFlow 是一个流行的深度学习和机器学习框架,由 Google Brain 开发。它提供了使用具有多个数据集的人工神经网络的能力。在最流行的 TensorFlow应用中有目标识别、语音识别等。在常规的 TensorFlow 上也有不同的 leyer-helper,如 tflearn、tf-slim、skflow 等。
Keras:Keras 是一个用于处理神经网络的高级库,运行在 TensorFlow、Theano 之上,现在由于新版本的发布,还可以使用 CNTK 和 MxNet 作为后端。它简化了许多特定的任务,并且大大减少了单调代码的数量。然而,它可能不适合某些复杂的任务。
requests:requests库是一个常用的用于http请求的模块,它使用python语言编写,可以方便的对网页进行爬取,是学习python爬虫的较好的http请求模块。
Blaze:Blaze生态系统为python用户对大数据提供了高效计算的高层接口,Blaze整合了包括Python的Pandas、NumPy及SQL、Mongo、Spark在内的多种技术,使用Blaze能够非常容易地与一个新技术进行交互。
现在你熟悉了Python了Python数据结构和库的使用,接下来要用这些知识去解决一些简单的问题。比如说利用pandas去做数据探索,用matplotlib可视化图表等等。
3、使用Pandas做探索性分析
为了更好地探索数据中的奥秘,接下来要介绍一位重量级嘉宾-Pandas
哈哈,开个玩笑。这里的pandas不是国宝大熊猫,而是python的一个国宝级第三方数据科学库。就像前面介绍过的,pandas具备强大的数据展示功能, 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。是pandas的出现奠定了python在数据科学领域霸主的地位。
接下来,我们要使用pandas读取数据集,然后进行数据探索性分析(EDA),就是研究数据各个变量或变量之间的统计学关系。
pandas的数据结构
pandas有两种数据结构,Series和DataFrame。
Series类似一维数组(只有一列),由数据和索引组成,可以保存任何数据类型(整数,字符串,浮点数,Python对象等)。
DataFrame则类似二维数组,像excel表格,有一个或多个变量(多列)。
当我们用pandas读取数据集的时候,数据会以DataFrame的格式保存在内存里,你可以对数据的行和列进行各种函数操作(如分组、聚合、拼接、运算)。类似SQL能做的,pandas都能做,SQL不能做的,pandas也能做。
数据集
这里数据集就用经典的titanic(泰坦尼克)数据集,在这里 下载。
该数据集规格为891*12,也就是891行,12列。这12个变量包括乘客年龄、性别、姓名、是否存活等等,了解即可。
读取数据
来看看数据集长什么样
import pandas as pd #导入pandas库
data = pd.read_csv(r'train.csv') #读取数据
data.head(10) #查看前10行数据
数据DataFrame格式
数据统计学描述
数据描述有两个函数(info和describe)来做,通常这是数据探索的开始!
data.info() #查看数据集每个变量的非空长度、类型,以及整个数据集的大小
info函数对数据的描述
data.describe()#数据统计学描述函数,查看每一个变量的统计学情况,包括最大值、标准差等
describe函数对数据的描述
取数据列
如果我想拎出数据集的某一列或几列怎么办
data['Age'] # 取出age这一列数据
data[['Age','Name']] # 取出age和name两列
绘制图表
因为需要在notebook上绘制图表并显示,所以需要在代码行添加魔法命令使得notebook上显示图像:
%matplotlib inline
pandas库自带绘图功能,你可以绘制简单的统计学图表,比如我想绘制age的分布直方图:
data['Age'].hist(bins=10) # hist为直方图函数,bins是参数,可以调节年龄分多少段数
age字段直方图
未完待续!