什么是分位数
分位数(Quantile)是一个统计学概念,用于描述一个数据集中的位置特性。在一个有序的数据集中,第 q q q 分位数是一个值,使得数据集中至少有 q × 100 % q \times 100\% q×100% 的数据点小于或等于这个值,并且至少有 ( 1 − q ) × 100 % (1-q) \times 100\% (1−q)×100% 的数据点大于或等于这个值。
当你在 NumPy 中使用 np.quantile
函数并设置 axis=0
,函数将按列计算分位数。具体地,它会在每一列中找到相应的
q
q
q 分位数。
关于你的问题“为什么不在原 array 里面”,这是因为分位数是根据数据的分布计算出来的,不一定是数据集中实际出现的值。分位数可能是数据集中的一个值,也可能是两个(或多个)相邻值的平均值。
让我们通过一个例子来说明。假设我们有以下数组:
arr =
[[0.77395605, 0.43887844, 0.85859792, 0.69736803],
[0.09417735, 0.97562235, 0.7611397, 0.78606431],
[0.12811363, 0.45038594, 0.37079802, 0.92676499]]
我们可以使用 NumPy 的 np.quantile
函数来找到每一列的
1
/
4
1/4
1/4 分位数。
计算得到的 1 / 4 1/4 1/4 分位数(按列)为:
[0.11114549, 0.44463219, 0.56596886, 0.74171617]
这意味着:
-
第一列中,至少有 25 25\\% 25 的数据小于或等于 0.11114549 0.11114549 0.11114549,并且至少有 75 75\\% 75 的数据大于或等于 0.11114549 0.11114549 0.11114549。
-
第二列中,至少有 25 25\\% 25 的数据小于或等于 0.44463219 0.44463219 0.44463219,并且至少有 75 75\\% 75 的数据大于或等于 0.44463219 0.44463219 0.44463219。
-
第三列中,至少有 25 25\\% 25 的数据小于或等于 0.56596886 0.56596886 0.56596886,并且至少有 75 75\\% 75 的数据大于或等于 0.56596886 0.56596886 0.56596886。
-
第四列中,至少有 25 25\\% 25 的数据小于或等于 0.74171617 0.74171617 0.74171617,并且至少有 75 75\\% 75 的数据大于或等于 0.74171617 0.74171617 0.74171617。
注意,这些分位数值可能不在原始数组中。它们是根据数据分布计算出来的,可能是两个相邻数据点的中值或者插值。这也是为什么分位数可能不在原数组中的原因。
代码:
import numpy as np
# Given array
arr = np.array([
[0.77395605, 0.43887844, 0.85859792, 0.69736803],
[0.09417735, 0.97562235, 0.7611397 , 0.78606431],
[0.12811363, 0.45038594, 0.37079802, 0.92676499]
])
# Calculate the 1/4 quantile for each column
quantile_25 = np.quantile(arr, q=0.25, axis=0)
quantile_25
怎么求出中位数
计算分位数的方法有多种,但一种常用的方法是以下几个步骤:
-
排序数据:首先,将数据排序(升序或降序均可,但通常是升序)。
-
计算位置参数:使用以下公式计算 q q q 分位数的位置参数(索引):
i = q × ( N − 1 ) + 1 i = q \times (N - 1) + 1 i=q×(N−1)+1
其中 N N N 是数据点的数量, q q q 是所求的分位数(例如,对于 1 / 4 1/4 1/4 分位数, q = 0.25 q = 0.25 q=0.25)。
- 找到分位数:
-
整数索引:如果 i i i 是整数,那么 i i i 索引处的数据值就是 q q q 分位数。
-
非整数索引:如果 i i i 不是整数,那么通常会使用线性插值来找到分位数。这通常是通过以下公式完成的:
Quantile = ( 1 − α ) × Value ⌊ i ⌋ + α × Value ⌈ i ⌉ \text{Quantile} = (1 - \alpha) \times \text{Value}_{\lfloor i \rfloor} + \alpha \times \text{Value}_{\lceil i \rceil} Quantile=(1−α)×Value⌊i⌋+α×Value⌈i⌉
其中 ⌊ i ⌋ \lfloor i \rfloor ⌊i⌋ 和 ⌈ i ⌉ \lceil i \rceil ⌈i⌉ 分别是 i i i 的向下和向上取整, α = i − ⌊ i ⌋ \alpha = i - \lfloor i \rfloor α=i−⌊i⌋。
让我们通过一个具体的例子来解释这个过程。我们可以使用 NumPy 数组的第一列([0.77395605, 0.09417735, 0.12811363])来计算 1 / 4 1/4 1/4 分位数。
对第一列的数据([0.77395605, 0.09417735, 0.12811363])进行排序后,我们得到:
排序后的数据 = [0.09417735, 0.12811363, 0.77395605]
计算 1 / 4 1/4 1/4 分位数的位置参数 i i i(基于 1 的索引):
i = 0.25 × ( 3 − 1 ) + 1 = 1.5 i = 0.25 \times (3 - 1) + 1 = 1.5 i=0.25×(3−1)+1=1.5
因为 i i i 不是整数( i = 1.5 i = 1.5 i=1.5),我们需要使用线性插值来找到分位数。我们使用下面的公式:
Quantile = ( 1 − α ) × Value ⌊ i ⌋ + α × Value ⌈ i ⌉ \text{Quantile} = (1 - \alpha) \times \text{Value}_{\lfloor i \rfloor} + \alpha \times \text{Value}_{\lceil i \rceil} Quantile=(1−α)×Value⌊i⌋+α×Value⌈i⌉
在这个例子中, Value ⌊ i ⌋ = 0.09417735 \text{Value}_{\lfloor i \rfloor} = 0.09417735 Value⌊i⌋=0.09417735, Value ⌈ i ⌉ = 0.12811363 \text{Value}_{\lceil i \rceil} = 0.12811363 Value⌈i⌉=0.12811363, α = 1.5 − 1 = 0.5 \alpha = 1.5 - 1 = 0.5 α=1.5−1=0.5。
所以,
Quantile = ( 1 − 0.5 ) × 0.09417735 + 0.5 × 0.12811363 = 0.11114549 \text{Quantile} = (1 - 0.5) \times 0.09417735 + 0.5 \times 0.12811363 = 0.11114549 Quantile=(1−0.5)×0.09417735+0.5×0.12811363=0.11114549
这正是我们用 NumPy 得到的结果。这样,你可以更好地理解分位数是如何计算的,以及为什么它可能不在原始数据集中。
代码:
# Extract the first column from the array
first_column = arr[:, 0]
# Sort the data
sorted_data = np.sort(first_column)
# Number of data points
N = len(sorted_data)
# Quantile to calculate (1/4)
q = 0.25
# Calculate index parameter (1-based index)
i = q * (N - 1) + 1
# Calculate quantile
if i.is_integer():
quantile_value = sorted_data[int(i) - 1]
else:
lower_value = sorted_data[int(np.floor(i)) - 1]
upper_value = sorted_data[int(np.ceil(i)) - 1]
alpha = i - np.floor(i)
quantile_value = (1 - alpha) * lower_value + alpha * upper_value
sorted_data, i, quantile_value