分位数,又叫做 “分位点” ,它是使用概率来将一组数据分为几个等份。常用的分位数有:二分位数、四分位数、百分位数。其中二分位数也叫做 “中位数” 。
对于分位数来说,它具有以下性质:
- 分位数会将数据分为若干等份。
- 分位数不受极端值的影响。
- 常用的分位数有中位数(50% 分位数)、四分位数(25% 和 75% 分位数)等。
分位数是数据分析中常用的一个统计量,比如老师经常会这样说: “这么简单的考试,竟然有 20% 的同学不及格!” 这句话就体现了分位数的应用。
在 NumPy 中,用于计算分位数的函数有 2 种:
percentile():计算数组的百分位数(0~100)。quantile():计算数组的分位数(0~1)。
percentile() 和 quantile() 这 2 个函数底层实现是一样的,区别在于参数 q 的尺度不同。它们之间满足下面关系:
quantile(q) ≡ percentile(q*100)numpy.percentile() 求百分位数
在 NumPy 中,我们可以使用 percentile() 函数来计算数组的 “百分位数” 。
语法:
numpy.percentile(
arr,
q,
axis=None,
out=None,
overwrite_input=False,
method='linear',
keepdims=False
)说明:
percentile() 函数可以接收以下参数。
arr(必选):是一个数组。q(必选):要计算的百分位数或百分位数序列,取值范围为 [0, 100]。比如要计算中位数(50%),可以将 q 设置为 50。要计算多个百分位数,例如 25% 和 75%,可以将 q 设置为 [25, 75]。axis(可选,默认:None):表示沿着哪个轴计算百分位数。- 如果为整数,则表示沿指定的轴进行计算。比如对于一个二维数组来说,其中,axis=0 表示计算每一列的百分位数(沿行方向)。axis=1 表示计算每一行的百分位数(沿列方向)。
- 默认值为 None,表示将数组展平后,再计算整个数组的百分位数。
out(可选,默认:None):指定一个已有数组来存放结果,避免额外创建新数组,从而提高性能。overwrite_input(可选,默认:False):如果设置为 True,则允许函数临时对输入数组进行排序以计算百分位数,这可以节省内存。请注意,这会修改原始的输入数组。只有在不需要保留原始数组时才使用。method(可选,默认:'linear'):用于指定计算百分位数时使用的插值方法。可用的方法包括:'linear':线性插值(默认)。'lower':返回小于或等于分位点的最近值。'higher':返回大于或等于百分位数的最近值。'midpoint':返回两个最近数据点的平均值。'nearest':返回最近的一个数据点。
keepdims(可选,默认:False):表示是否在结果中保留原始数组的维度。- 当取值为 True 时,表示保留维度,结果的形状中,计算的轴会变成大小为 1。
- 当取值为 False 时,结果会降维。
示例 1:percentile() 基本用法
import numpy as np
arr = np.array([3, 1, 4, 2, 5])
result1 = np.percentile(arr, 50) # 计算 50% 分位数(中位数)
result2 = np.percentile(arr, 25) # 计算 25% 分位数
print('50% 分位数:', result1)
print('25% 分位数:', result2)运行结果如下。
50% 分位数:3.0
25% 分位数:2.0分析:
numpy.percentile(arr, 50) 计算了数组 arr 的 50% 分位数(中位数),numpy.percentile(arr, 25) 计算了数组 arr 的 25% 分位数。
numpy.quantile() 求分位数
在 NumPy 中,我们还可以使用 quantile() 函数来计算数组的 “分位数” 。
语法:
numpy.quantile(
arr,
q,
axis=None,
out=None,
overwrite_input=False,
method='linear',
keepdims=False
)说明:
numpy.quantile() 函数接收以下参数。
arr(必选):需要计算分位数的数组。q(必选):要计算的分位数或分位数序列,取值范围为 [0, 1]。例如,要计算中位数(对应于 50% 的分位数),可以将 q 设置为 0.5。axis(可选,默认:None):指定沿着哪个轴计算分位数。- 如果为整数,则表示沿指定的轴进行计算。比如对于一个二维数组来说,axis = 0:计算每一列的分位数(沿行方向)。axis = 1:计算每一行的分位数(沿列方向)。
- 默认值为 None,表示将数组展平后计算整个数组的分位数。
out(可选,默认:None):指定一个已有数组来存放结果,避免额外创建新数组,从而提高性能。overwrite_input(可选,默认:False):如果设置为 True,则允许函数临时对输入数组进行排序以计算分位数,这可以节省内存。请注意,这会修改原始的输入数组。只有在不需要保留原始数组时才使用。method(可选,默认:'linear'):用于指定计算分位数时使用的插值方法。可用的方法包括:'linear':线性插值(默认)。'lower':返回小于或等于分位点的最近值。'higher':返回大于或等于百分位数的最近值。'midpoint':返回两个最近数据点的平均值。'nearest':返回最近的一个数据点。
keepdims(可选,默认:False):表示是否在结果中保留原始数组的维度。- 当取值为 True 时,表示保留维度,结果的形状中,计算的轴会变成大小为 1。
- 当取值为 False 时,结果会降维。
示例 2:quantile() 基本用法
import numpy as np
arr = np.array([3, 1, 4, 2, 5])
result1 = np.quantile (arr, 0.5) # 计算 50% 分位数(中位数)
result2 = np.quantile(arr, 0.25) # 计算 25% 分位数
print('50% 分位数:', result1)
print('25% 分位数:', result2)运行结果如下。
50% 分位数:3.0
25% 分位数:2.0分析:
numpy.quantile(arr, 0.5) 计算了数组 arr 的 0.5 分位数(中位数),numpy.quantile(arr, 0.25) 计算了数组 arr 的 0.25 分位数。
示例 3:多维计算
import numpy as np
arr = np.array([[1, 3, 5], [2, 4, 6]])
# 计算每列的中位数(axis=0)
result1 = np.quantile(arr, 0.5, axis=0)
print(result1)
# 保留维度计算行 75% 分位数
result2 = np.quantile(arr, 0.75, axis=1, keepdims=True)
print(result2)运行结果如下。
[1.5 3.5 5.5]
[[4.]
[5.]]分析:
对于 np.quantile(arr, 0.5, axis=0) 来说,axis=0 表示沿列方向计算,即对每一列单独计算 50% 分位数(即中位数):
- 第一列 [1, 2] 的中位数为 (1 + 2) / 2 = 1.5。
- 第二列 [3, 4] 的中位数为 (3 + 4) / 2 = 3.5。
- 第三列 [5, 6] 的中位数为 (5 + 6) / 2 = 5.5。
- 结果:[1.5, 3.5, 5.5],表示每列的中位数。
对于 np.quantile(arr, 0.75, axis=1, keepdims=True) 来说,axis=1 表示沿行方向计算,即对每一行单独计算 75% 分位数。
- 对于第一行 [1, 3, 5],75% 分位数是 4。
- 对于第二行 [2, 4, 6],75% 分位数是 5。
keepdims=True 表示保留原始数组的维度,因此输出结果是一个形状为 (2, 1) 的二维数组。
常见问题
1. 为什么 [1, 3, 5] 的 75% 分位数是 4?
这是因为 75% 的位置正好落在数字 “3” 和数字 “5” 的正中间。由于我们默认使用了 method='linear'(线性插值),因此NumPy 会自动取 3 和 5 的中间值,即 3 + (5 - 3) * 0.5 = 4.0。
