[Python从零到壹] 十一.数据分析之NumpyPandasMatplotlib和Sklearn入门知识万字详解
Posted Eastmount
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python从零到壹] 十一.数据分析之NumpyPandasMatplotlib和Sklearn入门知识万字详解相关的知识,希望对你有一定的参考价值。
欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。
前一篇文章讲述了Selenium基础技术,通过三个基于Selenium技术的爬虫,爬取Wikipedia、百度百科和互动百科消息盒的例子,从实际应用出发来学习网络爬虫。本文将进入数据分析部分,主要普及网络数据分析的基本概念,讲述数据分析流程和相关技术,同时详细讲解Python提供的若干第三方数据分析库,包括Numpy、Pandas、Matplotlib、Sklearn等。基础文章,希望对您有所帮助。
Web数据分析是一门多学科融合的学科,它涉及统计学、数据挖掘、机器学习、数据科学、知识图谱等领域。数据分析是指用适当的统计方法对所收集数据进行分析,通过可视化手段或某种模型对其进行理解分析,从而最大化挖掘数据的价值,形成有效的结论。
文章目录
下载地址:
前文赏析:
第一部分 基础语法
- [Python从零到壹] 一.为什么我们要学Python及基础语法详解
- [Python从零到壹] 二.语法基础之条件语句、循环语句和函数
- [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
第二部分 网络爬虫
- [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例
- [Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解
- [Python从零到壹] 六.网络爬虫之BeautifulSoup爬取豆瓣TOP250电影详解
- [Python从零到壹] 七.网络爬虫之Requests爬取豆瓣电影TOP250及CSV存储
- [Python从零到壹] 八.数据库之MySQL基础知识及操作万字详解
- [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)
- [Python从零到壹] 十.网络爬虫之Selenium爬取在线百科知识万字详解(NLP语料构造必备技能)
第三部分 数据分析
- [Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解(1)
作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。
一.数据分析
什么是数据分析?
网络数据分析(Web Data Analysis)是指采用合适的统计分析方法,建立正确的分析模型,对Web网络数据进行分析,提取有价值的信息和结论,挖掘出数据的价值,从而造福社会和人类。数据分析可以帮助人们做出预测和提前判断,以便采取适当行动解决问题。
数据分析的目的是从海量数据或无规则数据集中把有价值的信息挖掘出来,把隐藏的信息提炼出来,并总结出所研究数据的内在规律,从而帮助用户进行决策、预测和判断。数据分析通常包括前期准备、数据爬取、数据预处理、数据分析、可视化绘图及分析评估六个步骤,如图1所示。
- 前期准备。在获取数据之前,先要决定本次数据分析的目标,这些目标需要进行大量的数据收集和前期准备,判断整个实验是否能向着正确的方向前进。
- 数据爬取。读者可以利用Python爬取所需的数据集,定义相关的特征,采用前文讲述的爬虫知识进行爬取。也可以针对常见的数据集进行简单的数据分析。
- 数据预处理。如果想要提高数据质量,纠正错误数据或处理缺失值,就需要进行数据预处理操作,包括数据清洗、数据转化、数据提取、数据计算等。注意,文本语料比较特殊,需要经过中文分词、数据清洗、特征提取、权重计算,将文本内容转换为向量的形式预处理操作,才能进行后面的数据分析。
- 数据分析。读者根据所研究的内容,构建合理的算法模型,训练模型并预测业务结构。数据科学家需要拥有良好的数学、机器学习、编程背景知识,常见数据分析的方法包括回归分析、聚类分析、分类分析、关联规则挖掘、主题模型等。
- 可视化绘图。经过数据分析后的数据通常需要进行可视化绘图操作,包括绘制散点图、拟合图形等,通过可视化操作让用户直观的感受数据分析的结果。
- 分析评估。最后需要对模型实验的结果进行评估,同时需要优化算法、优化结果,重复以前业务流程,从而更好利用数据的价值,造福整个社会。
Python数据分析的核心流程是什么?
下图是数据分析的核心模型,主要划分为训练和预测两部分内容。
- 训练。输入历史数据进行训练,得到分析模型。
- 预测。输入新数据集,采用训练得模型进行预测操作,并绘制相关图形和评估结果。
选择Python作为数据分析的编程语言,主要原因有以下四个方面:
- Python简单易学,容易上手。不像其他语言需要掌握大量的数据结构和语法知识才能进行实例操作,并且Python可以通过极少的代码实现一些数据分析案例,提升开发人员的学习兴趣,破解新手的心理障碍。
- Python语言支持开源。丰富强大的第三方库让我们做数据分析更得心应手,科学计算、数据预处理、数据读取、数据分析、数据可视化、深度学习等各个领域都有对应的库支撑,并且各个库可以相互调用,常见数据分析库包括Numpy、Pandas、Matplotlib、Sklearn等。
- Python是一门脚本语言,可以进行快速开发。开发时间效率相对较高,比如第一部分介绍的Python数据爬取内容,通过Java代码去实现,就需要大量的代码,而Python的代码量更小,写代码和学习效率更高。
- Python语言随着深度学习、人工智能的浪潮,也在不断变强、拥有更丰富的扩展包。而在学习深度学习知识之前,我们需要了解Python数据分析及机器学习的基础知识。
同时,在开始Python数据分析之前,我们需要提到另一个与它紧密相关的概念,即数据挖掘。那它们之间究竟存在什么区别呢?
- 数据分析和数据挖掘的侧重点不同,数据分析主要侧重于通过对历史数据进行统计分析,从而挖掘出深层次的价值,并将结果的有效信息呈现出来;
- 数据挖掘是从数据中发现知识规则,并对未知数据进行预测分析的过程。
- 数据分析和数据挖掘两者是紧密关联的,数据分析结果需要进一步数据挖掘才能指导决策,而数据挖掘进行价值评估过程也需要调整先验约束而再次进行数据分析。但相同的地方是二者都需要有数据作为支撑,都需要掌握相关的统计学、计算科学、机器学习、可视化绘图工具等知识,都需要挖掘出数据的价值供用户、社会使用,提出正确的解决方案并进行预测决策,因此数据分析师和数据挖掘师并没有明显的界限。
二.常用库
在使用Python做数据分析时,常常需要用到各种扩展包,常见的包括Numpy、Scipy、Pandas、Sklearn、Matplotlib、Networkx、Gensim等,如下所示。
- NumPy
提供数值计算的扩展包,拥有高效的处理函数和数值编程工具,用于数组、矩阵和矢量化等科学计算操作。很多扩展包都依赖于它。
import numpy as np
np.array([2, 0, 1, 5, 8, 3])
#生成数组
- SciPy
SciPy是一个开源的数学、科学和工程计算包,提供矩阵支持,以及矩阵相关的数值计算模块。它是一款方便、易于使用、专为科学和工程设计的Python工具包,包括统计、优化、整合、线性代数模块、傅里叶变换、信号和图像处理、常微分方程求解器等。
from scipy import linalg
linalg.det(arr)
#计算矩阵行列式
- Pandas
它是Python强大的数据分析和探索数据的工具包,旨在简单直观地处理“标记”和“关系”数据。它设计用于快速简便的数据处理,聚合和可视化,支持类似于SQL语句的模型,支持时间序列分析,能够灵活的处理分析数据。
import pandas as pd
pd.read_csv('test.csv')
#读取数据
- SKlearn
Scikit-Learn为常见的机器学习算法提供了一个简洁而规范的分析流程,包含多种机器学习算法。该库结合了高质量的代码和良好的文档,使用起来非常方便,并且代码性能很好,其实就是用Python进行机器学习的行业标准。
from sklearn import linear_model
linear_model.LinearRegression()
#调用线性回归模型
- Matplotlib
它是Python强大的数据可视化工具、2D绘图库,可以轻松生成简单而强大的可视化图形,可以绘制散点图、折线图、饼状图等图形。但其库本身过于复杂,绘制的图需要大量的调整才能变精致。
import matplotlib.pyplot as plt
plt.plot(x,y,'o')
#绘制散点图
- Seaborn
Seaborn是由斯坦福大学提供的一个python绘图库,绘制的图表更加赏心悦目,它更关注统计模型的可视化,如热图。Seaborn能理解Pandas的DataFrame类型,所以它们一起可以很好地工作。
import seaborn as sns
sns.distplot(births['a'], kde=False)
#绘制直方图
- Networkx
NetworkX是一个用来创建、操作、研究复杂网络结构、动态和功能的Python扩展包。NetworkX库支持图的快速创建,可以生成经典图、随机图和综合网络,其节点和边都能存储数据、权重,是一个非常实用的、支持图算法的复杂网络库。
import networkx as nx
DG = nx.DiGraph()
#导入库并创建无多重边有向图
- Gensim
Gensim是一个从非结构的文本中挖掘文档语义结构的扩展包,它无监督地学习到文本隐层的主题向量表达。Gensim实现了潜在语义分析(LSA)、LDA模型、TF-IDF、Word2vec等在内的多种主题模型算法,并提供了诸如相似度计算等API接口。
from gensim import models
tfidf = models.TfidfModel(data)
#调用TF-IDF模型
- NLTK
NLTK是自然语言工具包(Natural Language Toolkit),用于符号和统计自然语言处理的常见任务。 旨在促进自然语言处理及其相关领域的教学和研究。常见功能包括文本标记、实体识别、提取词干、语义推理等。
from nltk.book import *
text1.concordance("monstrous")
#搜索文本功能
- Statsmodels
Statsmodels是一个包含统计模型、统计测试和统计数据挖掘的Python模块,用户通过它的各种统计模型估计方法来进行统计分析,包括线性回归模型、广义线性模型、时间序列分析模型、各种估计量等算法。
import statsmodels.api as sm
results = sm.OLS(y, X).fit()
#回归模型
- TensorFlow
TensorFlow是一个开源的数据流图计算库,是Google公司2015年11月开源的第二代深度学习框架。它使用数据流图进行数值分析,TensorFlow使用有向图表示一个计算任务,图的节点表示对数据的处理,图的边Flow描述数据的流向,tensor(意为张量)表示数据,它的多层节点系统可以在大型数据集上快速训练人工神经网络。其他常见的深度学习框架或库是Theano、Keras。
import tensorflow as tf
x = tf.constant(1.0)
#输入一个常量
接下来作者将对其中比较重要常用的四个扩展包(Numpy、Pandas、Matplotlib、Sklearn)进行简单的介绍,这些包更多的实例应用将在后面章节实例中讲解。
注意:本文数据分析部分推荐读者使用Anaconda或PyCharm中的集成环境,它已经集成安装了所使用的数据分析扩展包,安装后可以直接调用。
三.Numpy
NumPy(Numeric Python)是Python提供的数值计算扩展包,拥有高效的处理函数和数值编程工具,专为进行严格的数字处理而产生,用于科学计算。比如:矩阵数据类型、线性代数、矢量处理等。这个库的前身是1995年就开始开发的一个用于数组运算的库,经过长时间的发展,基本成了绝大部分Python科学计算的基础包,当然也包括提供给Python接口的深度学习框架。
由于Python没有提供数组,列表(List)可以完成数组操作,但不是真正意义上的数组,当数据量增大时,其速度很慢,所以提供了Numpy扩展包完成数组操作,很多高级扩展包也依赖于它,比如Scipy、Matplotlib、Pandas等。
1.Array用法
Array是数组,它是Numpy库中最基础的数据结构,Numpy可以很方便地创建各种不同类型的多维数组,并且执行一些基础操作。一维数组常见操作代码如下所示。
#coding=utf-8
#By:Eastmount CSDN 2021-06-28
#导入包并重命名np
import numpy as np
#定义一维数组
a = np.array([2, 0, 1, 5, 8, 3])
print('原始数据:', a)
#输出最大、最小值及形状
print('最小值:', a.min())
print('最大值:', a.max())
print('形状', a.shape)
输出如下所示:
代码通过np.array定义了一个数组[2, 0, 1, 5, 8, 3],其中min计算最小值,max计算最大值,shape表示数组的形状,因为是一维数组,故行为为6L(6个数字)。
同时,Numpy库最重要的一个知识点是数组的切片操作。数据分析过程中,通常会对数据集进行划分,比如将训练集和测试集分割为“80%-20%”或“70%-30%”的比例,通常采用的方法就是切片。
#coding=utf-8
#By:Eastmount CSDN 2021-06-28
#导入包并重命名np
import numpy as np
#定义一维数组
a = np.array([2, 0, 1, 5, 8, 3])
print('原始数据:', a)
#输出最大、最小值及形状
print('最小值:', a.min())
print('最大值:', a.max())
print('形状', a.shape)
#数据切片
print('切片操作:')
print(a[:-2])
print(a[-2:])
print(a[:1])
输出结果如下图所示:
- a[:-2]表示从头开始获取,“-2”表示后面两个值不取,结果:[2 0 1 5]。
- a[-2:]表示起始位置从后往前数两个数字,获取数字至结尾,即获取最后两个值[8 3]。
- a[:1]表示从头开始获取,获取1个数字,即[2]。
下面输出Array数组的类型,即numpy.ndarray,并调用sort()函数排序,代码如下:
#coding=utf-8
#By:Eastmount CSDN 2021-06-28
#导入包并重命名np
import numpy as np
#定义一维数组
a = np.array([2, 0, 1, 5, 8, 3])
print('原始数据:', a)
#输出最大、最小值及形状
print('最小值:', a.min())
print('最大值:', a.max())
print('形状', a.shape)
#数据切片
print('切片操作:')
print(a[:-2])
print(a[-2:])
print(a[:1])
#排序
print(type(a))
a.sort()
print('排序后:', a)
# <type 'numpy.ndarray'>
# 排序后: [0 1 2 3 5 8]
输出结果如下图所示:
2.二维数组操作
Array定义二维数组如[[1,2,3],[4,5,6]],下图表示二维数组的常见操作,定义了数组6*6的矩阵。
- a[0, 3:5]表示获取第1行,第4和5列的两个值,即[3, 4]。注意数组下标a[0]表示获取第一个值,同样,a[3]是获取第4个值。
- a[4:, 4:]表示从第5行开始,获取后面所有行,同时列也是从第5列开始,获取到后面所有列的数据,输出结果为[[44,45],[54,55]]。
- a[2::2,::2]表示从第3行开始获取,每次空一行,则获取第3、5行数据,列从头开始获取,也是各一列获取一个值,则获取第1、3、5列,结果为:[[20,22,24],[40,42,44]]。
基础代码如下:
#coding=utf-8
#By:Eastmount CSDN 2021-06-28
#定义二维数组
import numpy as np
c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])
print('形状:', c.shape)
print('获取值:', c[1][0])
print('获取某行:')
print(c[1][:])
print('获取某行并切片:')
print(c[0][:-1])
print(c[0][-1:])
输出结果如下:
获取某个值c[1][0],其结果为第2行,第一列,即为4;获取某一行的所有值,则为c[1][:],其结果为[4,5,6,7];获取某行并进行切片操作,c[0][:-1]获取第一行,从第一列到倒数第一列,结果为[1,2,3];c[0][-1:]获取第一行,从倒数第一列到结束,即为4。
同时如果想获取矩阵中的某一列数据怎么实现呢?因为在进行数据分析时,通常需要获取某一列特征进行分析,或者作为可视化绘图的x或y轴数据。
[[1, 2, 3, 4],
[4, 5, 6, 7],
[7, 8, 9,10]]
比如需要获取第3列数据[3, 6, 9],代码如下:
#获取具体某列值
print('获取第3列:')
print(c[:,np.newaxis, 2])
# 获取第3列:
# [[3]
# [6]
# [9]]
其他操作,包括调用函数,定义数组等。
#coding=utf-8
#By:Eastmount CSDN 2021-06-28
import numpy as np
#调用sin函数和2的3次方
print(np.sin(np.pi/6))
print(type(np.sin(0.5)))
f = np.power(2, 3)
print(f)
#范围定义
print(np.arange(0,4))
print(type(np.arange(0,4)))
#调用求和函数、平均值函数、标准差函数
print(np.sum([1, 2, 3, 4]))
print(np.mean([4, 5, 6, 7]))
print(np.std([1, 2, 3, 2, 1, 3, 2, 0]))
输出如下所示:
0.49999999999999994
<class 'numpy.float64'>
8
[0 1 2 3]
<class 'numpy.ndarray'>
10
5.5
0.9682458365518543
同时,Numpy扩展包的线性代数模块(Linalg)和随机模块(Random)也是非常重要的模块,后续的数据分析主要利用数组和矩阵进行,也推荐读者自行阅读了解。
3.NumPy思维导图
熟悉作者的读者都知道,2021年初我和CSDN许老师完成了一份《Python成长路线图》,这里也给出NumPy的思维导图。许老师是非常谦逊又有才华的前辈,值得我们每个人学习。很愉快的一次合作,同时感谢CSDN和周老师,也欢迎大家继续补充和指正,后续文章会详细介绍NumPy应用。
-
科学计算基础软件包NumPy
NumPy概述、安装配置、创建数组、操作数组、常用函数、掩码数组、矩阵对象、随机抽样子模块 -
NumPy概述
NumPy的前世今生、NumPy数组 vs Python列表、NumPy数组类型和属性、维轴秩、广播和矢量化 -
安装配置
-
创建数组
- 操作数组
索引、切片、改变数组结构、合并和拆分、复制、排序、查找、筛选、数组IO
- 常用函数
np.nan和np.inf、函数命名空间、数学函数、统计函数、插值函数、多项式拟合函数、自定义广播函数
- 掩码数组
创建掩码数组、访问掩码数组
- 矩阵对象
创建矩阵、矩阵特有属性、矩阵乘法
- 随机抽样子模块
随机数、随机抽样、正态分布、伪随机数的深度思考
四.Pandas
Pandas是面板数据(Panel Data)的简写。它是Python最强大的数据分析和探索工具之一,因金融数据分析工具而开发,支持类似于SQL语句的模型,可以对数据进行增删改查等操作,支持时间序列分析,也能够灵活的处理缺失的数据。首先声明该扩展包的功能非常强大,作者只是讲述了它的基础部分内容,后面随着学习深入会讲述更多它的用法,同时也建议读者自行学习。下一篇文章将详细介绍Pandas可视化绘图方法。
1.基础用法
Pandas可以进行统计特征函数计算,包括均值、方差、标准差、分位数、相关系数和协方差等,这些统计特征能反映出数据的整体分布。
- sum():该函数用于计算数据样本的总和
- mean():该函数用于计算数据样本的算数平均值
- std():该函数用于计算数据样本的标准差
- Cov():该函数用于计算数据样本的协方差矩阵
- var():该函数用于计算数据样本的方差
- describe():该函数用于描述数据样本的基本情况,包括均值、标准差等
Pandas最重要的是Series和DataFrame子类,其导入方法如下:
from pandas import Series, DataFrame
import pandas as pd
下面从读写文件、Series和DataFrame的用法分别讲解,其中利用Pandas读写CSV、Excel文件是数据分析非常重要的基础手段。
2.读写文件
读写文件常用的方法如下,包括读写Excel文件、CSV文件和HDF5文件等。
#将数据写入excel文件,文件名为foo.xlsx
df.to_excel('foo.xlsx', sheet_name='Sheet1')
#从excel文件中读取数据
pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
#将数据写入csv文件,文件名为foo.csv
df.to_csv('foo.csv')
#从csv文件中读取数据
pd.read_csv('foo.csv')
#将数据写入HDF5文件存储
df.to_hdf('foo.h5','df')
#从HDF5存储中读取数据
pd.read_hdf('foo.h5','df')
下面通过一个具体的实例数据来讲解Pandas的用法,数据集共包含3列数据,分别是用户A、用户B、用户C的消费数据,共10行,对应十天的消费情况,并且包含缺失值。
Pandas读取数据的简易代码如下:
#coding=utf-8
#By:Eastmount CSDN 2021-06-28
import pandas as pd
#读取数据,其中参数header设置Excel无标题头
data = pd.read_excel("data.xls", header=None)
print(data)
#计算数据长度
print('行数', len(data))
#计算用户A\\B\\C消费求和
print(data.sum())
#计算用户A\\B\\C消费算术平均数
mm = data.sum()
print(mm)
#输出预览前5行数据
print('预览前5行数据')
print(data.head())
调用Pandas扩展包的read_excel()函数读取“test15.xls”表格文件,参数Header=None表示不读取标题头,然后输出data数据。data.sum()表示对三个用户的消费数据求和,data.head()表示预览输出前5行数据。输出数据如下,NaN表示空值(Not a Number)。
同时,Pandas提供了describe()函数输出数据的基本信息,包括count()、mean()、std()、min()、max()等函数。
#输出数据基本统计量
print('输出数据基本统计量')
print(data.describe())
输出数据基本统计量
0 1 2 3
count 10.00000 9.000000 9.000000 8.000000
mean 5.50000 237.167778 335.235556 493.886875
std 3.02765 1.021161 65.198685 28.565643
min 1.00000 235.830000 206.430000 435.350000
25% 3.25000 236.270000 324.030000 484.147500
50% 5.50000 237.410000 328.080000 501.282500
75% 7.75000 238.030000 388.020000 515.645000
max 10.00000 238.650000 404.040000 517.090000
>>>
更多Pandas可视化画图操作参考下一篇文章。
3.Series
Series是一维标记数组,可以存储任意数据类型,包括整型、字符串、浮点型和Python对象等,轴标一般指索引。
首先,通过传递一个List对象来创建一个Series,其默认创建整型索引。
#coding=utf-8
#By:Eastmount CSDN 2021-06-28
from pandas import Series, DataFrame
a = Series([4, 7, -5, 3])
print('创建S以上是关于[Python从零到壹] 十一.数据分析之NumpyPandasMatplotlib和Sklearn入门知识万字详解的主要内容,如果未能解决你的问题,请参考以下文章
[Python从零到壹] 五十一.图像增强及运算篇之图像灰度直方图对比分析万字详解
[Python从零到壹] 六十一.图像识别及经典案例篇之基于纹理背景和聚类算法的图像分割
[Python从零到壹] 六十一.图像识别及经典案例篇之基于纹理背景和聚类算法的图像分割
[Python从零到壹] 十八.可视化分析之Basemap地图包入门详解