编写基于 3σ 原则的异常值检验函数,并利用函数检测出“花萼宽度”中的 异常数据,打印其数量和值;并在同一张图中展示数据的直方图和核密度图 (提示:secondary_y)。
时间: 2024-10-21 17:09:04 浏览: 10
异常值检测之3σ原则和IQR原则
5星 · 资源好评率100%
要编写一个基于3σ原则的异常值检测函数,我们可以使用Python的NumPy和Matplotlib库。在这个例子中,我们将计算每个数值与均值之差的绝对值,如果这个值大于平均值加减3倍标准差,那么就认为它是异常值。以下是相应的函数和示例:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import iqr
def detect_outliers(data_column, threshold=3):
mean = np.mean(data_column)
std_dev = np.std(data_column)
q1 = np.percentile(data_column, 25)
q3 = np.percentile(data_column, 75)
iqr_value = iqr(data_column)
lower_bound = q1 - (threshold * iqr_value)
upper_bound = q3 + (threshold * iqr_value)
outliers = [x for x in data_column if (x < lower_bound or x > upper_bound)]
return outliers, len(outliers), mean, std_dev
# 使用花萼宽度数据
sepal_width = iris.data[:, 2] # 选取第3个特征(即花萼宽度)
outliers, outlier_count, mean, std_dev = detect_outliers(sepal_width)
print(f"异常值的数量: {outlier_count}")
print(f"异常值的值: {outliers}")
# 创建直方图和核密度图
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 4))
axs[0].hist(sepal_width, bins='auto', edgecolor='black')
axs[0].set_title('直方图')
# 利用secondary_y绘制核密度估计图
axs[1].hist(sepal_width, bins='auto', density=True, alpha=0.6, color='g')
axs[1].plot(sepal_width, np.ones_like(sepal_width), 'r', linewidth=2, label='核密度估计')
axs[1].vlines(mean, 0, 1, color='k', linestyle='--', label=f'均值 ({mean:.2f})')
axs[1].vlines([lower_bound, upper_bound], 0, 1, colors=['orange', 'orange'], linestyles='--', label=f'3σ范围 ({lower_bound:.2f}, {upper_bound:.2f})')
axs[1].legend(loc='upper right')
axs[1].set_ylabel('密度', color='g')
axs[1].yaxis.ticks_right()
axs[1].yaxis.tick_left()
plt.tight_layout()
plt.show()
阅读全文