在数据分析中,缺失值和异常值都是常见的问题,需要进行有效的处理才能得到准确的分析结果。
下面分别针对缺失值和异常值进行详细讲解。
缺失值是指数据集中某些观测值没有收集到或者遗漏了。在不同的数据集中,缺失值可能表现为不同的形式,比如空值、NaN、-1等等。
在数据分析中,缺失值可能会对结果造成影响,导致结果不准确或者出现偏差。因此,需要对缺失值进行处理。
删除缺失值:可以直接将包含缺失值的行或者列删掉。这个方法适用于缺失值比例比较少的情况,但是会导致数据量减少,进而影响分析结果。
用均值、中位数等代替:可以用整个数据集的均值或中位数来代替缺失值。但是,这个方法只适用于少量的缺失值,并且可能会导致数据分布变化。
使用插值法:可以利用其他数据的变化趋势等特征,来推断缺失值。这个方法可以填充少量的缺失值或者连续的缺失值。
分别对待:可以针对每个含缺失值的特征,采用不同的处理方法。
上述方法的选择要根据数据类型、问题需求等方面综合考虑。下面给出两个缺失值处理的示例。
1.使用均值代替缺失值
import pandas as pd
import numpy as np
# 读入数据
df = pd.read_csv('data.csv')
# 统计缺失值
missing_count = df.isnull().sum()
# 给含缺失值的列用均值填充
for col in missing_count.index:
if missing_count[col] > 0:
col_mean = np.mean(df[col])
df[col].fillna(col_mean, inplace=True)
# 输出结果
df.head()
2.使用插值法填充缺失值
import pandas as pd
from scipy.interpolate import interp1d
# 读入数据
df = pd.read_csv('data.csv')
# 插值函数
f = interp1d(df.index[df['col'].notna()], df['col'][df['col'].notna()], kind='linear')
# 填充缺失值
df['col'].fillna(f(df.index), inplace=True)
# 输出结果
df.head()
异常值是指数据集中与大部分值明显不同的观测值。异常值可能是由错误测量或者数据录入错误引起的,也可能是真实存在的离群值。
异常值可能会对统计判断产生显著的影响,会导致均值、标准差等统计量失真。
筛选法:将所有观测值都按从小到大或从大到小排序,然后找到最小的5%或者最大的5%的观测值,就可以将他们视为异常值。
平均数加减两倍标准差:可以将数据按某特征的中心度和离散程度(平均数和标准差)来散点图表示,然后在该图中通过观察得出某些点可能是异常值,这种方法可以处理一些数值特别集中的非正态分布数据。
使用统计模型:可以通过一些有明确数学模型的分布,如 t 分布等,将数据预测分析后,然后用此模型检验该集合。
下面给出两个异常值处理的示例。
1.利用IQR方法剔除异常值
import pandas as pd
# 读入数据
df = pd.read_csv('data.csv')
# 计算IQR
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
# 根据IQR来判断异常值
df_out = df[~((df < (Q1 - 1.5 * IQR)) |(df > (Q3 + 1.5 * IQR))).any(axis=1)]
# 输出结果
df_out.head()
2.利用主成分分析(PCA)方法
import pandas as pd
from sklearn.decomposition import PCA
# 读入数据
df = pd.read_csv('data.csv')
# 使用PCA进行异常值检测
pca = PCA(n_components=2)
pca.fit(df)
distances = pca.transform(df)
threshold = 10
outlier_idx = distances[distances[:,1] > threshold].flatten()
# 删除异常值行
df_out = df.drop(df.index[outlier_idx])
# 输出结果
df_out.head()
综上所述,缺失值和异常值的处理是数据分析中不可避免的问题,需要根据实际情况采用不同的处理方法,使结果更准确,更可靠。
本文链接:http://task.lmcjl.com/news/16339.html