数据分析 -- NumPy①

举报
十八岁讨厌编程 发表于 2022/08/05 23:57:01 2022/08/05
【摘要】 目录 我们为什么要学习数据分析?数据分析的步骤数据分析模块多维数组多维数组的加减乘除索引分片描述统计学的数据指标集中趋势离中趋势 numpy的通用方法 我们为什么要学习数据分析? 我们...

我们为什么要学习数据分析?

我们并不是为了分析数据,而去分析数据。我们去学习他,是因为它能帮我们更好的去决策
决策的过程由信息搜集、处理分析,最后作出判断、得出结论构成。没有数据思维的决策往往只依赖于决策者的经验和直觉,导致决策的结果有偏差,有很大的概率会造成失误。而数据思维能帮助我们做出更精准的决策,找到解决问题的最优解,同时还能发现蕴藏在数据背后的奥秘,从而发挥巨大的价值。

越来越多的公司在推行数据驱动决策,各行各业都需要具有数据思维的人。拥有数据分析技能之后,能让你在工作和生活中做出更佳的决策。
在这里插入图片描述

数据分析的步骤

数据分析是一个完整的过程,从一开始的明确需求到最后的结果呈现,一般分为如下五个步骤:
在这里插入图片描述

  • 第一步,分析需求,明确目标。我们要确定进行数据分析任务要解决什么问题,这个目标非常重要,因为它是我们整个过程的导向。然后进行问题拆解,包括我们从哪些角度来分析这个问题,采用哪些方法和数据指标;
  • 第二步,采集第一步确定的数据,常用的数据获取方法包括从公开数据库、自有数据库中获取,以及使用爬虫来爬取各种网站上的数据;
  • 第三步,整理数据,也就是数据清洗。把上一步获取的杂乱无章的数据按照我们需要的维度进行整理。数据是数据分析过程里的证据,所以数据的获取和清洗非常重要;
  • 第四步,分析数据,采用数学方法、统计方法等对数据进行分析操作;
  • 第五步,数据可视化,将分析结果以直观的形式进行展示。

数据分析模块

在这里插入图片描述
前面讲的数据分析五大步骤里,除了前两个步骤,后面三个都将借助 Python 数据分析模块来帮我们完成。
NumPy 是一个用于数值运算的 Python 库,专门对数值运算进行优化,最大的优势是运行高效。
Matplotlib 是常用的数据可视化的工具包,用来绘制各种图表,更好地展示数据。
Pandas 是 Python 重要的数据分析工具包,也是目前非常流行的 Python 数据分析工具。最初它被作为金融数据分析工具由全球资产管理公司 AQR 在 2008 年 4 月开发,最终在 2009 年底开源出来。Pandas 的底层数据结构采用 NumPy 来实现,我们也可以把 pandas 理解成是对 NumPy 的封装,从而让数据分析的一些功能的实现变得更轻松方便。

多维数组

NumPy,全称是 Numerical Python,它是目前 Python 数值计算中最重要的基础模块。NumPy 是针对多维数组的一个科学计算模块,这个模块封装了很多数组类型的常用操作。
NumPy 中最重要的对象是多维数组(ndarray),ndarray 是 N-dimensional array,即 N 维数组。
在这里插入图片描述
数组是一系列 相同类型 数据的集合,它其实和列表很相似,只是列表中的元素类型可以是任意的。
要创建一个多维数组很简单,将一个列表作为参数传入 numpy 中的 array() 方法即可:

np.array(list)
创建一个多维数组

例如:

import numpy as np

data = np.array([1, 2, 3])
print(data)
# 输出:[1 2 3]
print(type(data))
# 输出:<class 'numpy.ndarray'>

注意:一般我们使用 import numpy as np 来简写 numpy!

可以看到,打印出来的多维数组和列表也很像,只是少了分隔的逗号。通过 type() 函数可以看到,data 确实是 numpy 中的 ndarray 类型。
在这里插入图片描述
除了使用 np.array() 方法来创建一个多维数组,numpy 还提供了两个实用的方法:

np.ones(x)
生成元素全为1的多维数组
np.zeros(x)
生成元素全为0的数组
参数用于指定生成的多维数组里有多少个元素

例如:

ones = np.ones(3)
print(ones)
# 输出:[1. 1. 1.]

zeros = np.zeros(3)
print(zeros)
# 输出:[0. 0. 0.]

在这里插入图片描述
注意
生成出来的不是 1 和 0,而是 1. 和 0.。这是因为默认生成的是浮点数,numpy 会省略小数点后的 0,因此 1.0 和 0.0 变成了 1. 和 0.。
如果我们想要生成整数的话,可以传入 dtype 参数来指定类型。

ones = np.ones(3, dtype='int')
print(ones)
# 输出:[1 1 1]
zeros = np.zeros(3, dtype='int')
print(zeros)
# 输出:[0 0 0]

多维数组的加减乘除

列表间只有加法操作,作用是将两个列表的元素合并在一起。而多维数组间可以进行加减乘除的四则运算(这也是为什么有了列表类型 ,numpy 还要创造一个 ndarray 类型),运算规则也很简单:将两个数组中对应位置的元素一一进行运算。

小贴士:两个多维数组的形状必须一致才能进行四则运算.

例如:

data = np.array([1, 2])
ones = np.ones(2)
print(data + ones)
# 输出:[2. 3.]

在这里插入图片描述
剩下的减法、乘法和除法的运算规则也同样如此,图解如下:
在这里插入图片描述
除了多维数组间的四则运算,多维数组直接和数字进行计算的方式也很常用,举个例子:

data = np.array([1, 2])
print(data + 1)
# 输出:[2 3]

多维数组和数字的四则运算会作用在数组中的每个元素上,这在 numpy 中被称为 Broadcasting。Broadcasting 的本义为“大范围传播、投射”。用在媒体中,就是我们熟知的“广播”(广泛将信息传播给大众),用在数组运算中,就是“大范围地将运算应用到全部元素”的意思。

因为 Broadcasting 规则,[1 2] + 1 相当于 [1 2] + [1 1],因此结果为 [2 3]。
在这里插入图片描述
剩下的减法、乘法和除法的运算规则也同样如此,图解如下:
在这里插入图片描述
上述效果用列表来实现也是可以的,一般我们会这样写:

data = []
for i in [1, 2]:
  data.append(i + 1)
print(data)
# 输出:[2, 3]

用列表就必须用到循环,而 numpy 中这种不用编写循环就可以对数据进行批量运算的方式叫做 矢量化。numpy 中的矢量化操作把内部循环委托给高度优化的 C 和 Fortran 函数,从而实现更清晰,更快速的 Python 代码。

索引

numpy 中多维数组的索引也是从 0 开始,以多维数组的长度减 1 结束。写法也和列表索引一样:

data = np.array([1, 2, 3])
print(data[0])
# 输出:1

列表中很实用的反向索引在多维数组中也同样适用,我们可以直接使用 data[-1] 获取数组中的最后一个元素。
在这里插入图片描述

分片

多维数组的分片和列表的分片也是基本类似的,形如 data[m:n]。分片是左闭右开区间,即包含 m 不包含 n,也就是获取索引为 m 到 n-1 之间的元素(包含 m 和 n-1)。

data = np.array([1, 2, 3])
print(data[0:2])  # 获取索引为 0 和 1 的元素
# 输出:[1 2]

当然,多维数组也同样支持反向索引分片,使用 data[-3:-1] 也同样能得到 [1 2]。
几个例子:

data = np.array([1, 2, 3])
# 获取前 2 个元素
print(data[:2])
# 输出:[1 2]

# 获取后 2 个元素
print(data[-2:])
# 输出:[2 3]

# 获取所有元素
print(data[:])
# 输出:[1 2 3]

在这里插入图片描述
同样的数组的分片也支持第三个参数 – 步长。

data = np.array([1, 2, 3, 4, 5, 6])
print(data[::2])  # 省略前两个参数
# 输出:[1 3 5]

当步长为负数时,会将顺序反转。我们可以利用这个特性来实现列表或多维数组的快速反转。
例如:

data = np.array([1, 2, 3, 4, 5, 6])
print(data[::-1])  # 省略前两个参数
# 输出:[6 5 4 3 2 1]

注意
这里需要注意的是,列表分片是将分片后的数据复制了一份,而多维数组的分片则是返回原数据其中的一块,并没有复制数据。因此,对列表分片后的数据进行更改不会影响原数据,但对多维数组分片后的数据进行更改会影响到原数据。

# 列表
lst_data = [1, 2, 3]
lst_data2 = lst_data[:]
lst_data2[0] = 6
print(lst_data)
# 输出:[1, 2, 3]

# 多维数组
arr_data = np.array([1, 2, 3])
arr_data2 = arr_data[:]
arr_data2[0] = 6
print(arr_data)
# 输出:[6 2 3]

之所以这样是为了性能。numpy 设计的目的是处理大数据,所以你可以想象一下,在处理几百万甚至几千万条数据时,每进行一次分片操作就将数据复制一遍将会产生何等的性能和内存问题。
所以,numpy 中的切片默认不会复制一份副本,而是返回原数据中的一块,被称为视图(View)
如果你确实想要得到一份副本,则需要手动调用 copy() 方法进行复制,例如:arr_data[:].copy()。

copy()
完成对数组的复制

描述统计学的数据指标

在描述统计学中有很多数据指标,主要分为两类:集中趋势离中趋势

集中趋势

集中趋势所反映的是一组数据所具有的共同趋势,它代表了一组数据的总体水平。其常用指标有 平均数、中位数 和 众数。

求平均数很简单,就是把所有数据加起来,再除以这些数据的个数。但平均数对异常数值并不敏感,容易得到误导性的结论。比如,你和马云的身价求平均,你也是亿万富翁。

所以不能只看平均数,还有中位数和众数。中位数是指数据排序后处于中间的那个数。众数是指一组数据中出现次数最多的数。

离中趋势

离中趋势是指一组数据中各数据值以不同程度的距离偏离其中心(平均数)的趋势。其常用指标有 极差、方差 和标准差。

极差是一组数据的最大值减去最小值得到的,反应了数据变动的最大范围。

方差的计算方式是:将一组数据中的每个数减去这组数据的平均数,然后将得到的结果进行平方求和,最后再除以数据的个数。

而方差的平方根则是标准差。因为方差是对数据进行平方得到的,所以量纲(单位)和原数据不一致。对方差进行开根号后得到的标准差量纲和原数据一致,使用起来更方便。

方差和标准差都能反映数据的离散程度,也就是数据的波动程度。方差和标准差的值越小,说明数据越稳定。

除了众数则需要我们自己动手写代码计算,numpy 中没有直接计算的方法之外,其他的指标在 numpy 中都有对应的方法进行计算,对应的方法如下图所示:

numpy的通用方法

在这里插入图片描述
这些方法有两种使用方式,一种是直接在多维数组上调用,如 data.std();另一种是在 numpy 上调用并传入数据,如:np.std(data)。
需要注意的是,求中位数的 median() 方法只有 numpy 上有,只能使用 np.median(data) 来求中位数。

在这里插入图片描述

文章来源: blog.csdn.net,作者:十八岁讨厌编程,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/zyb18507175502/article/details/122691917

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200