移除数据集6个最大值后Gaussian曲线几乎无变化,是否正常?
问题:移除异常值后高斯拟合曲线几乎无变化是否正常?
我编写了一段Python程序,将126个数据绘制成柱状图并拟合高斯曲线,代码如下:
from matplotlib.pyplot import * from numpy import * from scipy.stats import norm f=open("data.txt") items=[] for i in range(0, 500000, 20000): items.append(0) arr=f.readlines() for i in range(len(arr)): arr[i] = int(arr[i]) for i in range(len(arr)): for j in range(0, 500000, 20000): if arr[i] < j: items[j//20000] += 1 break yticks(range(32), fontsize = 5) xticks(list(range(len(items))), list(range(0, 500, 20)), fontsize = 5) xlabel("Стоимость, тыс. руб") ylabel("Количество квартир") bar(list(range(25)), items, 1, edgecolor = "black") t_mean = mean(items) t_variance = var(items) t_sigma = t_variance ** 0.5 t_x = linspace(-5, 25,50) plot(t_x,norm.pdf(t_x,t_mean,t_sigma) *500) show()
运行后得到结果图:
随后我移除了数据集中的6个最大值,得到新的结果图:
可见柱状图中的异常值已消失,但高斯曲线几乎没有变化(仅将两图并排对比时能看到细微差异)。请问该现象是否正常?
附data.txt内容:
450000 325000 325000 320000 315000 300000 170000 160000 152000 150000 150000 148000 145000 130000 130000 129000 125000 125000 125000 115000 111000 110000 108000 105000 105000 103000 100000 100000 100000 100000 100000 100000 100000 100000 100000 100000 100000 100000 100000 95000 94000 90000 90000 90000 90000 80000 79000 78000 77000 77000 75000 75000 75000 75000 75000 75000 75000 75000 75000 75000 74000 72000 70000 70000 70000 60000 60000 60000 60000 60000 55000 55000 55000 55000 54000 54000 53000 50000 50000 50000 50000 50000 50000 50000 50000 50000 50000 49000 48000 47000 45000 45000 45000 45000 45000 40000 40000 40000 40000 40000 38000 38000 37000 35000 35000 35000 32000 32000 32000 30000 30000 30000 30000 30000 30000 30000 28000 28000 25000 23000 23000 21000 18500 18500 18500 18000
解答
这个现象完全正常,核心原因是你拟合高斯曲线的统计量计算对象出错了:
你用分组后的频数数组
items计算均值和方差,而非原始数据
你的代码里,t_mean = mean(items)和t_variance = var(items)是对分组后的频数统计数组求的统计量,不是针对原始126个房价数据。移除6个最大值只会让items最后几个分组的频数各减1(总共减6),但items有25个元素,大部分分组的频数毫无变化,所以整个数组的均值、方差变化微乎其微,反映到高斯曲线上自然看不出明显差异。异常值占比低,影响有限
原始样本共126个,移除的6个仅占总样本的不到5%,且集中在少数分组,对整体频数分布的统计特征影响极小。正确做法:基于原始数据拟合高斯曲线
如果你想让高斯曲线真实反映原始数据分布的变化,应该对原始的arr数组计算统计量,调整后的代码片段如下:# 替换原参数计算部分 t_mean = mean(arr) t_variance = var(arr) t_sigma = t_variance ** 0.5 # 匹配原始数据的x轴范围 t_x = linspace(min(arr), max(arr), 100) # 调整缩放系数让曲线与柱状图匹配 plot(t_x, norm.pdf(t_x, t_mean, t_sigma) * len(arr) * 20000)这样修改后,移除6个最大值会明显改变均值和方差,高斯曲线的位置和形状也会出现直观变化。
内容的提问来源于stack exchange,提问作者warmike_1
相关产品推荐
相关产品推荐

