编写基于 3σ 原则的异常值检验函数,并利用函数检测出“花萼宽度”中的 异常数据,打印其数量和值;并在同一张图中展示数据的直方图和核密度图 (提示:secondary_y)。
时间: 2024-10-21 15:11:56 浏览: 35
在Python中,我们可以使用NumPy库计算数据集的标准差(σ),然后基于3σ原则编写一个函数来检测异常值。这里我们将假设你已经有一个包含"花萼宽度"数据的数据框,例如`df['petal_width']`。首先,我们需要安装必要的库,如果你还没有安装,可以使用`pip install numpy pandas matplotlib seaborn`。
下面是一个简单的示例函数:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import norm
from seaborn.kdeplot import kdeplot
def detect_outliers(data, threshold=3):
mean = data.mean()
std_dev = data.std()
lower_threshold = mean - (threshold * std_dev)
upper_threshold = mean + (threshold * std_dev)
outliers = data[(data < lower_threshold) | (data > upper_threshold)]
return outliers, len(outliers), outliers.tolist()
# 假设df是你的DataFrame,其中包含了'petal_width'列
column_name = 'petal_width'
column_data = df[column_name]
outliers, num_outliers, outlier_values = detect_outliers(column_data)
print(f"发现 {num_outliers} 个异常值:{outlier_values}")
# 创建直方图和核密度图
plt.figure(figsize=(10, 6))
ax1 = plt.subplot(121)
ax1.hist(column_data, bins='auto', color='skyblue')
ax1.set_title('直方图')
kde = kdeplot(column_data, shade=True, ax=ax2, secondary_y=True)
ax2.set_title('核密度图')
ax2.axvline(np.mean(column_data), color='red', linestyle='--', label='平均值')
ax2.legend(['正常值分布', '均值线'])
for outlier in outlier_values:
plt.scatter([outlier], [0], marker="x", color="red")
plt.show()
```
这个函数会找到落在3σ范围之外的数据点,认为它们是异常值。然后,它会创建一个直方图显示原始分布,以及一个核密度估计图,其中异常值用红色的x标记出来。
阅读全文