5、集中趋势:分位数
1)分位数的概念
分位数:将数据从小到大排列,通过n-1个分位数将数据分为n个区间,使得每个区间的数值的个数相等(近似相等)。
以四分位数为例,通过3个分位数,将数据划分为4个区间。(十分位数含义相同)
第一个分位数成为1/4分位数(下四分位数),数据中有1/4的数据小于该分位数。
第二个分位数成为2/4分位数(中四分位数,也叫中位数),数据中有2/4的数据小于该分位数。
第三个分位数成为3/4分位数(下四分位数),数据中有3/4的数据小于该分位数。
2)怎么求分位数
给定一组数据(存放在数组中),我们要如何计算其四分位值呢?首先要明确一点,四分位值未必一定等同于数组中的某个元素。
在Python中,四分位值的计算方式如下:
① 首先计算四分位的位置。
q1_index=1+(n-1)*0.25
q2_index=1+(n-1)*0.5
q3_index=1+(n-l)*0.75
其中,位置index从1开始,n为数组中元素的个数。
② 根据位置计算四分位值。
如果index为整数(小数点后为0),四分位的值就是数组中索引为index的元素(注意位置索引从1开始)。
如果index不是整数,则四分位位置介于ceil(index)与floor(index)之间,根据这两个位置的元素确定四分位值。
3)分位数是数组中的元素的情况
x = np.arange(10,19) n = len(x) # 计算每个分位数的位置,这个位置是从1开始的。但是数组元素索引从0开始的 q1_index=1+(n-1)*0.25 q2_index=1+(n-1)*0.5 q3_index=1+(n-1)*0.75 # 这里计算出来的数字是浮点类型,需要转化为小数,才能当作索引 q1_index,q2_index,q3_index # 计算分位数 index = np.array([q1_index,q2_index,q3_index]).astype(np.int32) index -= 1 q = x[index]
结果如下:
绘制图形:
plt.figure(figsize=(15,4)) plt.xticks(x) plt.plot(x,np.zeros(len(x)),ls="",marker="D",ms=15,label="元素值") plt.plot(x[index],np.zeros(len(index)),ls="",marker="X",ms=15,label="四分位值") plt.legend()
结果如下:
4)分位数不是数组中的元素的情况
x = np.arange(10,20) n = len(x) # 计算每个分位数的位置,这个位置是从1开始的。但是数组元素索引从0开始的 q1_index=1+(n-1)*0.25 q2_index=1+(n-1)*0.5 q3_index=1+(n-1)*0.75 q1_index,q2_index,q3_index # 计算分位数 index = np.array([q1_index,q2_index,q3_index]) index left = np.floor(index).astype(np.int32) left right = np.ceil(index).astype(np.int32) right weight = np.modf(index)[0] weight q = x[left] + (x[right] - x[left]) *weight q
结果如下:
绘制图形:
plt.figure(figsize=(15,4)) plt.xticks(x) plt.plot(x,np.zeros(len(x)),ls="",marker="D",ms=15,label="元素值") plt.plot(q,np.zeros(len(q)),ls="",marker="X",ms=15,label="四分位值") plt.legend() for v in q: plt.text(v,0.01,v,fontsize=15) plt.legend()
结果如下:
5)numpy中计算分位数的函数:quantile()
x = np.arange(10,19) np.quantile(x,[0.25,0.5,0.75]) x = np.arange(10,20) np.quantile(x,[0.25,0.5,0.75])
结果如下:
从结果中可以看到:上述我们自己计算的分位数结果,和使用该函数计算的分位数的结果,是一样的。
6)pandas中计算分位数的函数:describe()
x = pd.Series(np.arange(10,19)) x.describe() x = pd.Series(np.arange(10,20)) x.describe()
结果如下: