1、箱型图-四分位数
- 箱型图过滤异常数据,需要先计算上四分位数和下四分位数,然后再计算最小min、最大值max,获得判断异常值的阈值范围[min, max]。
- 四分位数是通过3个点(Q1,Q2,Q3)将全部数据等分为4部分,其中每部分包含25%的数据。
- 很显然,中间的四分位数Q2就是中位数。
- 通常,称Q1为下四分位数,即从小到大排列后第25%的数;称Q3为上四分位数,即即从小到大排列后第75%的数。
- 异常值阈值范围的最小、最大值计算公式:
min=Q1-1.5*(Q3-Q1)
、max=Q3+1.5*(Q3-Q1)
2、代码实现
实现逻辑:
- 先获取总样本的中位数Q2及其索引;
- 然后用Q2的索引把总样本等分称两部分;
- 然后以相同的逻辑来获取被等分后的两部分的中位数,即Q1和Q3;
- 最终返回 Q1,Q2,Q3;
- 我们可以根据Q1,Q3计算获得最小min、最大值max。
import numpy as np
import math
def do_cal_min_max(q1, q3):
"""计算最小、最大值"""
min = q1 - 1.5 * (q3 - q1)
max = q3 + 1.5 * (q3 - q1)
return min, max
def get_mid_idx(data):
"""获取中位数的索引,如果是偶数个,则是最中间两个数的索引的平均值"""
length = len(data)
if length % 2 == 0:
idx1 = length / 2 - 1
idx2 = idx1 + 1
idx = np.mean([idx1, idx2])
else:
idx = math.ceil(length / 2)
return idx
def do_cal_quarter(data):
"""计算四分位数:四分位数是通过3个点(Q1,Q2, Q3)将全部数据等分为4部分,其中每部分包含25%的数据。
Q1:下四分位数,等于该样本中所有数值由小到大排列后第25%的数;
Q2:中位数,等于该样本中所有数值由小到大排列后第50%的数;
Q3:上四分位数,等于该样本中所有数值由小到大排列后第75%的数。
"""
# 先从小到大排序
data.sort()
# 先获取中位数索引和中位数
idx = get_mid_idx(data)
q2 = np.median(data)
# 被中位数索引等分的两部分
part1 = [v for i, v in enumerate(data) if i < idx]
part2 = [v for i, v in enumerate(data) if i > idx]
# 获取下四分位数
q1 = np.median(part1)
# 获取上四分位数
q3 = np.median(part2)
return q1, q2, q3
def main():
"""主函数"""
data = [-1, -2, -3, -4, -5]
# 获取Q1,Q2,Q3
q1, q2, q3 = do_cal_quarter(data)
print(q1, q2, q3)
# 获取最小min、最大值max
min, max = do_cal_min_max(q1, q3)
print(min, max)
if __name__ == '__main__':
main()