进入21世纪以来,伴随着网络信息技术与云计算技术的高速发展,网络数据爆发性的增长,我们每天都身处在庞大的数据世界中。毋庸置疑,我们已经进入大数据时代。在大数据环境下,能够从海量的数据里发现并挖掘有价值的信息越来越重要,因此数据分析技术应运而生。1.2什么是数据分析
数据分析:数据(Data)+分析(Analysis)
数据:就是数值,是我们在观察、实验或计算的基础上得出的结果。数据可以是数字、文字、图像、声音等。数据可以用于科学研究、设计、验证等诸多领域。
分析:就是将研究对象的整体分为各个部分、方面、因素和层次,并分别加以考察的认识活动。分析的目的在于谨慎地寻找能够解决问题的主线,并以此为根据解决问题。数据分析具体用来做什么?
描述性数据分析是从一组数据中可以摘要并且描述这份数据的集中和离散情形,使用的技术主要有基于数据仓库的报表、多维联机分析处理等,通过各种查询了解业务中发生了什么,寻找数据中的存在模式。1.2.1数据分析分类1.2.1数据分析分类(2)预测性数据分析
指导性数据分析告诉用户应该做什么来得到最优的结果,也叫决策分析。它主要指采用运筹科学的方法,即运用数学模型或智能优化算法,对企业应该采取的最优行动给出建议。1.2.2典型的数据分析方法(1)描述性统计分析
描述性统计分析是用来概括、表述事物整体状况以及事物间关联、类属关系的统计方法。通过统计处理可以简单地用几个统计值来表示一组数据的集中趋势、离散程度以及分布形状。1.2.2典型的数据分析方法(2)验证性统计分析
验证性统计分析是对数据模型和研究假设的验证,参数估计、假设检验以及方差分析是验证性统计分析中常用的方法。所谓参数估计就是用样本统计量去估计总体的参数。假设检验与参数估计类似,但角度不同,参数估计是利用样本信息推断未知的总体参数,而假设检验是对总体参数提出一个假设值,然后利用样本信息判断这一假设是否成立。1.2.2典型的数据分析方法(3)探索性数据分析
探索性数据分析是指对已有数据在尽量少的先验假设下通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。探索性数据分析则是一种更加贴合实际情况的分析方法,它强调让数据自身“说话”,通过探索性数据分析可以真实、直接地观察到数据的结构和特征。1.3数据分析的基本流程
数据分析是基于商业目的,有目的地进行收集、整理、加工和分析数据,提炼出有价值的信息的一个过程。一个完整的数据分析项目可以分为5步问题定义收集数据数据展现数据分析数据处理1.3.1问题定义
(1)企业数据库/数据仓库。大多数企业的数据都可以直接从自己的数据库获取。例如,可以根据需要提取某年的销售数据、提取当年销量前20位商品的数据、提取北京及浙江地区用户的消费数据等。通过结构化查询语言SQL命令,我们可以高效完成这些工作。1.3.2收集数据
(2)外部公开数据集。一些科研机构、企业、政府都会开放一些数据。开放政府数据更是成为近年的热潮。截至2021年,已经有60多个地市开放了平台,开放了约15个领域的数据,包括教育科技、民生服务、道路交通、健康卫生、资源环境、文化休闲、机构团体、公共安全、经济发展、农业农村、社会保障、劳动就业、企业服务、城市建设、地图服务。1.3.2收集数据
(3)爬虫。在大数据时代利用爬虫去收集互联网上的数据是经常被使用的数据获取方式。例如,爬取京东上的商品信息;通过爬虫获取视频网站某一类视频的信息;爬取58同城网站上某城市的卖房信息等。1.3.2收集数据
(4)实验。想要判断新的应用界面是否会提高用户转化率,可以通过实验方式来实现,这就是A/B测试。针对不同的问题设计不同的实验来获取相应的数据。1.3.3数据处理
数据处理是指对收集到的数据进行清洗、加工、整理,以便开展数据分析,它是数据分析前必不可少的阶段。这个过程是数据分析整个过程中是最耗时的,也在一定程度上保证了分析数据的质量。数据处理的基本目的是从海量的、可能杂乱无章的、难以理解的数据中抽取并推导出对解决问题有价值、有意义的数据。如果数据本身存在错误,那么即使采用最先进的数据分析方法,得到的结果也是错误的,不具备任何参考价值,甚至还会做出错误的决策。1.3.3数据处理
数据处理主要包括数据清洗、数据转化、数据抽取、数据合并、数据计算等处理方法。一般的数据都需要进行一定的处理才能用于后续的数据分析工作。现实中的数据大部分上都是不完整、不一致的数据,无法直接用于数据分析,或分析结果不尽如人意。数据预处理有多种方法:数据清理、数据集成、数据变换、数据归约等。把这些数据处理好,才能获得相对精确的数据分析结果。1.3.4数据分析
数据分析是指通过分析手段、方法和技巧对准备好的数据进行探索、分析,从中发现因果关系、内部联系和业务规划,为商业提供决策参考。进人数据分析阶段,应切忌滥用和误用统计分析方法。滥用和误用统计分析方法主要是由于对方法能解决哪类问题、方法适用的前提、方法对数据的要求等不清造成的。选择几种统计分析方法对数据进行探索性的反复分析也是非常重要的。每一种统计分析方法都有自己的特点和局限,因此,一般需要选择几种方法反复印证分析,仅依据一种分析方法的结果就断然下结论是不科学的。1.3.4数据分析
通过数据分析,数据内部的关系和规律会呈现出来,通常数据是通过表格和图形的方式来展现出这些关系和规律的,即用图表说话。常用的数据图表包括饼图、柱状图、条形图、折线图、散点图、雷达图等,还可以对这些图表进一步处理,使之变为我们所需要金字塔图、矩阵图、瀑布图、漏斗图、帕累托图等。一般情况人们更乐于接受图形这种展现数据的方式,因为它可以更加直观地让数据分析师表述想要呈现的信息、观点和建议。1.3.5数据展现
数据分析的结果最终以报告的形式呈现出来,这就对数据分析师的能力有很高的要求。数据分析师要具备数据沟通能力、业务推动能力和项目工作能力。深人浅出的数据报告、言简意赅的数据结论更容易被理解和接受。在理解业务数据的基础上,推动业务落地实现数据建议。通常从业务最重要、最紧急、最能产生效果的环节开始,同时需要考虑业务落地的客观环境,即好的数据结论需要具备客观落地条件。一个数据项目工作是循序渐进的过程,无论是数据分析项目还是数据产品项目,都需要数据分析师具备高水平的项目工作能力。1.4为什么选择PythonPython的以下几点优势:(1)代码简洁,容易理解。
比起其他编程语言,Python的语法非常简单,代码的可读性很高,非常有利于初学者的学习。例如,在处理数据的时候,如果希望将用户性别数据数值化,也就是变成计算机可以运算的数字形式,这时便可以直接用一行列表推导式完成,十分简洁。1.4为什么选择Python(2)快速开发。
Python在数据分析、探索性计算、数据可视化等方面都有非常成熟的库和活跃的社区,这使得Python成为数据处理的重要解决方案。在科学计算方面,Python拥有Numpy、Pandas、Matplotlib、Scikit-leam、IPython等一系列非常优秀的库和工具,这些库提供了大量的基础实现,数据分析人员在编码的过程中,可以方便地使用这些库,从而避免了大量代码编写过程。1.4为什么选择Python(3)拥有强大的通用编程能力。
Python拥有强大的通用编程能力,有别于R语言,Python不仅在数据分析方面能力强大,在爬虫、WEB、自动化运维甚至于游戏等领域都有非常不错的作用,公司只需要使用一种技术就可以完成全部服务,有利于业务融合,也可以提高工作效率。1.4为什么选择Python(4)人工智能时代的通用语言
Python是人工智能首选的编程语言,在人工智能时代,Python成为最受欢迎的编程语言。这主要得益于其语法简洁、具有丰富的库和社区,使得大部分深度学习框架都优先支持Python语言编程。1.4为什么选择Python(5)方便对接其他语言
Python是一种“胶水语言”,顾名思义就是“粘合”的意思,Python在设计初期就面向科研人员,以降低编程难度,提高编程效率为目的。Python之所以在科学计算领域能够功成名就,这和它能够轻松地集成C、C++以及Fortran代码有不可分割原因。大部分现代计算环境都利用了Fortran和C库来实现线性代数、积分、傅里叶变换等诸多算法。1.5下载与安装Anaconda
本章首先介绍了数据分析的背景、用途、流程以及为什么选择Python做数据分析;接着引领读者学习了一个新的Python环境Anaconda,及如何安装和管理Python包。
单元2NumPy基础2.1NumPy数组对象ndarry2.2数组的访问与变换2.3矩阵与通用函数2.4统计方法和文件存取2.5随机函数2.6
案例——利用NumPy库求值2.1NumPy数组对象ndarry
NumPy最重要的一个特点就是N维数组对象,即ndarray,这是一个快速而灵活的大数据容器。可以利用这种数组对整块数据执行一些数学运算。ndarray是一个通用的同构数据多维容器,其中所有元素必须是相同类型。每个数组都有一个shape和一个dtype,分别表示各维度的大小元组和数组数据类型的对象。接下来将要介绍NumPy数组的基本用法。2.1.1创建数组对象
NumPy提供了一个名为ndarray的多维数组对象,NumPy数组具有固定大小的类型化数组。数组由两部分组成,分别是存储在连续的内存中的实际数据和描述实际数据的元数据。为了更好地理解数组,先要了解数组的属性。2.1.1创建数组对象编号函数功能1ndim返回数组的维数,类型为int2dtype返回数组的元素类型,类型为data-type3shape返回各维度大小的一个元组,类型为tuple4size返回数组元素的总个数,类型为int5itemsize返回数组每个元素的大小,类型为int数组的属性2.1.1创建数组对象array函数的主要参数编号函数功能1object一个python对象,表示想要创建的数组2dtype表示数组所需的数据类型3ndmin指定生成数组该具有的最小维数2.1.1创建数组对象(1)创建一维数组
创建数组最简单的办法是使用array函数,它接受一切序列型的对象,然后产生一个含有数据的NumPy数组。
点击“开始”,找到“Windows系统”,点击“命令提示符”,在DOS提示符输入IPython,回车,打开IPythonShell。输入代码,如案例2-1所示:2.1.1创建数组对象案例2-1:创建一维数组In[1]:importnumpyasnp#导入Numpy库In[2]:data1=[1,2,3,4]#第一个含有四个元素的列表In[3]:arr1=np.array(data1)#将列表转换为数组In[4]:arr1Out[4]:array([1,2,3,4])2.1.1创建数组对象案例2-1:创建一维数组In[5]:arr1.ndim#显示数组的维度Out[5]:1In[6]:arr1.shape#显示数组的形状Out[6]:(4,)2.1.1创建数组对象
上述代码中,In[1]importnumpyasnp导入NumPy库,在In[2]定义了一个列表,含有四个元素,In[3]使用array()函数将列表转换为一维数组。array()创建数组时,需要接收一个对象,同时这个对象必须是数组类型的,像本例中给出的Python列表。Out[4]用于显示In[4]的输出结果。In[5]语句中的arr1.ndim表示数组的维度,结果为1,In[6]语句表示数组的大小。因此,该数组有4个元素,它们的值分别是1,2,3,4.数组是一元数组。2.1.1创建数组对象
可以使用Python内置函数range的数组版arange生成一维数组。如案例2-2所示,一般通过指定开始值、终值和步长来创建一维数组,创建的数组不含终值。In[9]中的print屏幕输出语句。而在In[10]中的linspace也是指定开始值、终值和步长来创建一维数组,但创建的数组包含终值。In[11]中logspace,它创建的是一个等比数列,分别生成100,101,102,~109。2.1.1创建数组对象案例:2-2使用arrange函数创建一维数组In[7]:np.arange(15)Out[7]:array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])In[8]:np.arange(0,1,0.1)Out[8]:array([0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9])In[9]:print(np.arange(0,1,0.1))2.1.1创建数组对象案例:2-2使用arrange函数创建一维数组[0.0.10.20.30.40.50.60.70.80.9]In[10]:print(np.linspace(0,9,10))[0.1.2.3.4.5.6.7.8.9.]In[11]:print(np.logspace(0,9,10))[1.e+001.e+011.e+021.e+031.e+041.e+051.e+061.e+071.e+081.e+09]2.1.1创建数组对象(2)创建二维数组
对数组arr2有2行4列修改为4行2列,可以对其属性赋值为2行4列,而保持数组个数不变。如案例2-7所示。注意的是,属性修改之后并非是矩阵的转置,而是重新组合,元素排列顺序没有变化。2.1.2属性与数据类型案例:2-7数组属性的设置In[27]:arr2Out[27]:array([[1,3,5,7],[2,4,6,8]])In[28]:arr2.shapeOut[28]:(2,4)In[29]:arr2.shape=4.22.1.2属性与数据类型案例:2-7数组属性的设置In[30]:arr2Out[30]:array([[1,3],[5,7],[2,4],[6,8]])2.1.2属性与数据类型(2)数据类型
数组的访问是通过索引实现的,NumPy通过索引高效率访问数组。另外在对数组操作时,经常改变数组的维度,NumPy提供了大量的函数实现数组的分割、合并等操作。2.2.1索引和切片
1234
12345678
5678
56789101112
9101112
9101112arr2d[:2]
arr2d[:2,1:]
arr2d[:2,2:]
arr2d[:,:1]2.2.1索引和切片
在对数组操作时,常使用reshape函数改变数组的维度,其参数是一个正整数元组,分别指定每个维度的大小。案例2-27通过参数设置数组的形状。注意到,数组的形状发生变化但是原始的值不受影响。另外reshape的参数个数是可变的,可以指定三元组、四元组等更高维度,前提是各维度之积等于元素个数。2.2.2数组的变换与组合案例:2-27一维改变为多维In[1]:importnumpyasnp#导入numpyIn[2]:arr=np.arange(15)#创建一维数组In[3]:arr#显示数组arrOut[3]:array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])In[4]:arr.reshape(3,5)#设置数组形状Out[4]:#查看数组arrarray([[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]])In[5]:arr.reshape(5,3)#设置数组形状Out[5]:#查看数组arr2.2.2数组的变换与组合array([[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14]])In[6]:arr=np.arange(12)
#创建一维数组In[7]:arr.reshape(2,3,2)
#设置数组形状Out[7]:
NumPy不仅提供了大量数组运算的函数,而且提供了的矩阵运算函数。接下来介绍NumPy矩阵的创建方法及计算以及通用函数,并进行线性代数运算。2.3.1创建矩阵
使用mat()创建矩阵,行间用分号隔开,同行数据用空格隔开。使用matrix()创建矩阵时行和单个元素均用逗号隔开,每行用中括号括起来。如案例2-35所示。2.3.1创建矩阵案例:2-35创建矩阵In[1]:importnumpyasnp#导入NumPy库In[2]:mat1=np.mat("1234;5678")#使用mat()创建矩阵In[3]:mat1Out[3]:matrix([[1,2,3,4],[5,6,7,8]])2.3.1创建矩阵In[4]:mat2=np.matrix([[1,2],[3,4],[5,6],[7,8]])#使用matrix()创建矩阵In[5]:mat2Out[5]:matrix([[1,2],[3,4],[5,6],[7,8]])2.3.1创建矩阵
在矩阵运算过程中,有时需要将几个小矩阵组成一个大矩阵,使用bmat()函数可实现此项功能。如案例2-36所示,将mat1与两个mat2组合成一个新矩阵。其中mat1组合为新矩阵前两行,两个mat2横向组合作为新矩阵后四行。2.3.1创建矩阵案例:2-36块矩阵组合In[6]:mat3=np.bmat("mat1;mat2mat2")#使用bmat组合新矩阵In[7]:mat3Out[7]:matrix([[1,2,3,4],[5,6,7,8],[1,2,1,2],[3,