数据科学中异常值的处理与分析

数据科学领域,特征工程是一个至关重要的环节,尤其是在处理大量特征时。特征的数量对模型的影响巨大,因此,特征工程成为了数据科学生命周期中的一个重要任务。在特征工程的家族中,异常值处理是一个既有趣又易于理解的话题。异常值是指在给定数据集中,与其他值相比,距离异常远的数据点。例如,在年龄数据集中,18,22,45,67,89,125,30,其中125就是一个异常值。异常值可能是由于测量错误或数据收集错误造成的。

处理异常值的方法有很多,它们可以是错误,也可以是数据的自然变异。如果发现异常值是由于错误造成的,可以选择忽略它们。如果异常值是由于数据的自然变异,则需要对这些数据进行处理。在分析苹果的图片时,可以轻易地找出异常值。然而,在面对.csv文件中大量特征/列时,肉眼识别异常值是一项挑战。

发现异常值的最佳方法之一是可视化。异常值的可能性包括数据输入错误、数据集中的缺失值、数据并非来自预期样本、实验中的错误以及非错误的异常值,它们可能比正常值极端得多。对于数据分析、数据挖掘和数据科学爱好者来说,异常值是一个值得深入探讨的话题。异常值告诉数据集中的观察值如何显著不同于整体视角,简单来说,就是“与众不同”。这可能是数据收集过程中的错误。

通常,异常值会影响统计结果。例如,在探索性数据分析(EDA)过程中,异常值可能会误导数据集的平均值和众数,使数据值看起来比实际高。相关系数对异常值非常敏感,因为它衡量的是两个变量之间的线性关系的强度。相关系数是一个非稳健的度量,受异常值的影响很大。

相关系数的正负关系可以通过其值来判断:当相关系数接近1时,表示正相关;接近-1时,表示负相关;接近0时,表示X和Y独立。可以通过分析异常值及其观察结果来了解数据收集过程。分析它们是如何发生的,以及如何在未来的数据收集指南中最小化并设置过程。尽管异常值会增加数据集在分析过程中的不一致结果,并对统计影响产生显著影响,但在某些情况下,去除它们会带来挑战和障碍。

在决定是否去除异常值之前,必须分析包含和不包含异常值的数据集,并更好地理解结果的影响。如果观察到异常值显然是由于输入错误或测量错误造成的,那么可以确定去除异常值。如果发现异常值影响假设,可以直接去除异常值,前提是结果没有变化。如果异常值影响假设和结果,毫无疑问,直接去除异常值并继续后续步骤。

已经讨论了什么是异常值,它如何影响给定的数据集,以及否可以去除它们。现在,让看看如何在给定的数据集中找到它们。准备好了吗!将从简单的方法开始,包括单变量和多变量分析。

单变量方法:相信对单变量分析很熟悉,它涉及数据集中的一个变量/特征。在这里,为了识别异常值,将应用箱线图来理解异常值的性质以及它确切的位置。以下是一些样本代码。以泰坦尼克号.csv为例进行分析,这里考虑的是年龄。

plt.figure(figsize=(5,5)) sns.boxplot(y='age',data=df_titanic)

可以看到,在箱线图的顶部部分,异常值以点的形式直观地显示。多变量方法:以泰坦尼克号.csv为例进行分析,这里考虑的是年龄和乘客等级。

plt.figure(figsize=(8,5)) sns.boxplot(x='pclass',y='age',data=df_titanic)

可以使用直方图和散点图可视化技术来识别异常值。此外,还可以使用数学方法来找到异常值,如下所示。

Z-Score方法:在这种方法中,数据的分布以均值为0,标准差(SD)为1的正态分布格式呈现。让考虑下面的儿童年龄组,这是在数据科学生命周期的第一阶段收集的,然后进行分析。在进一步分析之前,数据科学家想要去除异常值。看看代码和输出,可以理解使用Z分数方法找到异常值的本质。

import numpy as np kids_age = [1, 2, 4, 8, 3, 8, 11, 15, 12, 6, 6, 3, 6, 7, 12,9,5,5,7,10,10,11,13,14,14] mean = np.mean(kids_age) std = np.std(kids_age) print('Mean of the kid's age in the given series :', mean) print('STD Deviation of kid's age in the given series :', std) threshold = 3 outlier = [] for i in kids_age: z = (i-mean)/std if z > threshold: outlier.append(i) print('Outlier in the dataset is (Teen agers):', outlier)

输出结果:

Mean of the kid’s age in the given series: 2.6666666666666665 STD Deviation of kids age in the given series: 3.3598941782277745 The outlier in the dataset is (Teenagers): [15] import numpy as np import seaborn as sns jr_boxing_weight_categories = [25,30,35,40,45,50,45,35,50,60,120,150] Q1 = np.percentile(jr_boxing_weight_categories, 25, interpolation = 'midpoint') Q2 = np.percentile(jr_boxing_weight_categories, 50, interpolation = 'midpoint') Q3 = np.percentile(jr_boxing_weight_categories, 75, interpolation = 'midpoint') IQR = Q3 - Q1 print('Interquartile range is', IQR) low_lim = Q1 - 1.5 * IQR up_lim = Q3 + 1.5 * IQR print('low_limit is', low_lim) print('up_limit is', up_lim) outlier =[] for x in jr_boxing_weight_categories: if ((x> up_lim) or (x Interquartile range is 20.0 low_limit is 5.0 up_limit is 85.0 the outlier in the dataset is [120, 150]
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485