- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
💡 作者: 韩信子 @ ShowMeAI 📘 Python3◉技能提升系列 : https://www.showmeai.tech/tutorials/56 📘 数据分析实战系列 : https://www.showmeai.tech/tutorials/40 📘 本文地址 : https://www.showmeai.tech/article-detail/336 📢 声明:版权所有,转载请联系平台与作者并注明出处 📢 收藏 ShowMeAI 查看更多精彩内容 。
异常值 是距离其他数据值太远的数据点,也被称为 离群点 。它可能是自然发生的,也可能是由于测量不准确、拼写错误或系统故障造成的。异常值也可能出现在倾斜数据中,这些类型的异常值被认为是自然异常值.
了解异常值检测与分析的基础知识,请查看 ShowMeAI]( https://www.showmeai.tech/ ) 这篇文章:
- 图解数据分析 | 数据清洗与预处理
异常值会影响数据的均值、标准差和四分位数值。如果我们在去除异常值之前和之后计算这些统计数据,可能会有比较大的差异.
去除异常值会带来数据集规模的减小,而且模型的适用性也会限制在输入值的度量范围内,丢弃自然异常值也可能导致模型不准确.
异常值不容易被『肉眼』检测到,但我们有一些可视化工具可以帮助完成这项任务。最常见的是箱线图和直方图。我们这里用 🏆 保险数据 来做一个讲解:
🏆 实战数据集下载(百度网盘) :公✦众✦号『ShowMeAI研究中心』回复『 实战 』,或者点击 这里 获取本文 [29]基于统计方法的异常值检测代码实战 『 insurance数据集 』 。
⭐ ShowMeAI官方GitHub : https://github.com/ShowMeAI-Hub 。
我们首先导入必要的库并加载数据集.
import numpy as np
import pandas as pd
import seaborn as sns
import statistics#Load dataset:
df = pd.read_csv('insurance.csv')
df
我们对变量『年龄』、『体重指数』和『费用』进行异常值检测分析.
第一种方法是使用箱线图 / Box-Plots 来绘制数据分布:
# age, bmi 和 expenses的箱线图绘图
sns.boxplot(y="age", data=df)
sns.boxplot(y="bmi", data=df)
sns.boxplot(y="expenses", data=df)
通过查看箱线图,我们可以看到变量 age 没有异常值,变量 bmi 在上限中有一些异常值,而变量 expense 在上限中有一系列异常值(表明存在偏态分布).
为了检查偏态分布,我们再使用直方图绘图:
# age, bmi 和 expenses的直方图
sns.histplot(df, x="age", kde=True)
sns.histplot(df, x="bmi", kde=True)
sns.histplot(df, x="expenses", kde=True)
通过直方图,我们可以看到变量『age』是近似均匀分布,『bmi』接近正态分布,而『expense/费用』则呈偏态分布.
对于年龄,我们无需做异常值剔除;对于 bmi,我们将剔除高于 47 的值;对于费用,我们将剔除高于 50000 的值.
#bmi 和 expenses 的异常值处理
df.drop(df[df['bmi'] >= 47].index, inplace = True)
df.drop(df[df['expenses'] >= 50000].index, inplace = True)
现在,如果我们再次检查箱线图和直方图:
检测异常值有两种主要的统计方法:使用 z 分数和使用四分位距.
Z 分数是一种数学变换,它根据每个观测值与平均值的距离对其进行分类。z-score 的计算公示为:
我们定义异常检测标准:如果 z-score 小于 -3或 z-score 大于 3.
我们将重新加载数据集,因为我们在前面的示例中对其进行了更改,加载后的数据上我们会把变量转换为 z 分数:
# 重新加载数据
df = pd.read_csv('insurance.csv')
# 为age计算均值和标准差
mean_age = statistics.mean(df['age'])
stdev_age = statistics.stdev(df['age'])
# 计算z值
age_z_score = (df['age']-mean_age)/stdev_age
# 添加z结果到原dataframe
df['age_z_score'] = age_z_score.tolist()
现在我们将检查高于 3SD 或低于 -3SD 的值:
# 检测小于-3SD的值:
df.sort_values(by=['age_z_score'], ascending=True)
我们可以看到 -3SD 以下没有值。我们现在将检查 3SD 以上的值:
# 检测+3SD以上的值:
df.sort_values(by=['age_z_score'], ascending=False)
我们可以看到没有高于 3SD 的值。变量年龄没有异常值.
现在我们将对变量 bmi 执行相同的操作:
# 为bmi计算均值和标准差
mean_bmi = statistics.mean(df['bmi'])
stdev_bmi = statistics.stdev(df['bmi'])
# 为bmi计算z-score
bmi_z_score = (df['bmi']-mean_bmi)/stdev_bmi
# 添加到原始dataframe
df['bmi_z_score'] = bmi_z_score.tolist()
# 检查低于-3SD的值
df.sort_values(by=['bmi_z_score'], ascending=True)
# 检查大于3SD的值
df.sort_values(by=['bmi_z_score'], ascending=False)
这次我们会发现一些高于 3SD 的值:
我们对它进行剔除:
# 异常值处理
df.drop(df[df[‘bmi_z_score’] >= 3].index, inplace = True)
我们将对『expense/费用』应用相同的技术:
# 为expenses计算均值和标准差
mean_expenses = statistics.mean(df['expenses'])
stdev_expenses = statistics.stdev(df['expenses'])
# 计算z-score
expenses_z_score = (df['expenses']-mean_expenses)/stdev_expenses
# 添加到原始dataframe
df['expenses_z_score'] = expenses_z_score.tolist()
# 检查低于-3SD的值
df.sort_values(by=['expenses_z_score'], ascending=True)
# 检查高于3SD的值
df.sort_values(by=['expenses_z_score'], ascending=False)
# 异常值处理
df.drop(df[df[‘expenses_z_score’] >= 3].index, inplace = True)
如果我们再次检查箱线图和直方图,我们将获得:
四分位间距将数据分为四个部分,从低到高排序,如下图所示,每个部分包含相同数量的样本。第一个四分位数(Q1)是边界中数据点的值。这同样适用于 Q2 和 Q3。 四分位距(IQR)是两个中间部分的数据点(代表 50% 的数据)。四分位距包含高于 Q1 和低于 Q3 的所有数据点。如果该点高于 Q3 + (1.5 x IQR),则存在较高的异常值,如果 Q1 - (1.5 x IQR),则存在较低的异常值.
代码实现如下:
# 重新加载数据
df = pd.read_csv('insurance.csv')
# 计算上下四分位数位置
q75_age, q25_age = np.percentile(df['age'], [75 ,25])
iqr_age = q75_age - q25_age
iqr_age
# 计算上下边界以用于异常检测
age_h_bound = q75_age+(1.5*iqr_age)
age_l_bound = q25_age-(1.5*iqr_age)
print(age_h_bound)
print(age_l_bound)
我们计算得到上边界 87 和下边界 -9:
# 排序
df.sort_values(by=['age'], ascending=True)
# 排序
df.sort_values(by=['age'], ascending=False)
我们看到没有异常值.
我们对变量 bmi 执行相同的操作:
# 计算上下四分位数位置
q75_bmi, q25_bmi = np.percentile(df['bmi'], [75 ,25])
iqr_bmi = q75_bmi - q25_bmi
iqr_bmi
# 计算上下边界以用于异常检测
bmi_h_bound = q75_bmi+(1.5*iqr_bmi)
bmi_l_bound = q25_bmi-(1.5*iqr_bmi)
print(bmi_h_bound)
print(bmi_l_bound)
# 排序
df.sort_values(by=['bmi'], ascending=True)
df.sort_values(by=['bmi'], ascending=False)
# 剔除异常值
df.drop(df[df['bmi'] >= 47.3].index, inplace = True)
df.drop(df[df['bmi'] <= 13.7].index, inplace = True)
我们只需要对可变费用做同样的事情,我们将获得以下箱线图和直方图:
最后此篇关于异常值检测!最佳统计方法实践(代码实现)!⛵的文章就讲到这里了,如果你想了解更多关于异常值检测!最佳统计方法实践(代码实现)!⛵的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!