浅谈分位数

在Coursera看Ng的视频时,因为不想用MATLAB和Octave,改用了Python实现,由于用到了pandas这个模块(moudle)中的.describe()方法,对它输出值(见下面代码段)中的分位数(25%,50%,75%)没太弄懂,再查阅各种资料之后,做一个简单的总结。

1
2
3
4
5
6
7
8
9
10
11
>>> s = pd.Series([1, 2, 3])
>>> s.describe()
count 3.0
mean 2.0
std 1.0
min 1.0
25% 1.5
50% 2.0
75% 2.5
max 3.0
dtype: float64

中位数

首先需要把数据集从小到大排列(从大到小也行,取决于实际需求)。

1、若样本个数n为奇数,那么只需要取中间值(第n/2个)就是数据集的中位数。

e.g.数据集[1,2,3],则中位数为2

2、若n为偶数,则取中间两个数的平均值作为中位数

e.g.[1,2,3,4],则中位数为(3+2)/2=2.5

中位数相对简单且好理解,其往往运用在数据集中某个样本出现明显异常值时。比如[1,2,3,4,1000000],这时候如果去中位数是3,但如果取平均数,就会产生巨大误差。

四分位数(25%,50%,75%)

四分位数是作为中位数的拓展,关于如何计算四分位数我发现了两种不同的计算方法,得出的数值会存在差异。wiki上说对于该值的选取仍然存在争议,但是无论用那种方法,都能够将数据集划分,从而进一步分析数据变量的趋势。

解法一:分步法(自己取的)

这个方法很简单,就是先排序然后取中位数(50%),然后以中位数为分界线,把数据集切分为两部分再分别取中位值(25%,75%)

1、若样本个数n为奇数

比如[1,2,3]

50%分位:(1+3)/2=2;

25%分位:(1+2)/2=1.5;

75%分位:(2+3)/2=2.5;

这个例子举的有点不好,带小数点了,但是意思理解就行,就是取中位数—划分—取中位数

2、若样本个数n为偶数

[1,2,3,4,5,6,7,8]

50%分位:(4+5)/2=4.5;

25%分位:(2+3)/2=2.5;

75%分位:(6+7)/2=6.5;

而在pandas中也是用这种方法计算的,wiki词条中的例子也是。

解法二:

这个方法有点麻烦。

1、若样本个数n为奇数

首先确定四分位的位置。

设置下四分位数、中位数和上四分位数,记为Q1、Q2、Q3

Q1位置=(n+1)/4 (25%分位)

Q2位置=2(n+1)/4 (50%分位)

Q3位置=3(n+1)/4 (75%分位)

e.g.[13、13.5、13.8、13.9、14、14.6、14.8、15、15.2、15.4、15.7]

Q1位置=(11+1)/4=3

Q2位置=2(11+1)/4=6

Q3位置=3(11+1)/4=9

对应的分位值这分别为13.8、14.6、15.2

2、若样本个数n为偶数

依然先确定位置Q1、Q2、Q3,这里直接用一个例子来说明,[14、15、16,16、17、18、18、19、19、20、2l,21、22、22、23、24、24、25、26、26],例子中n=20。

Q1位置=(20+1)/4=5.25,这里可以看到位于[5]、[6]位置是17和18,则Q1=17+(18-17)*(5.25-5)=17.25

同理可得:

Q2位置=2(20+1)/4=10.5,则Q2=20+(21-20)*(10.5-10)=20.5

Q3位置=3(20+1)/4=15.75,则Q3=23+(24-23)*(15.75-15)=23.75

参考资料

1、维基百科

2、MBA百科

-------------End-------------
梦想总是要有的,万一有人有钱呢?