文章目录
前言
本文主要是个人的学习笔记总结,数据预处理的基本思路和方法,包括一些方法的使用示例和参数解释,具体的数据预处理案例case详见其他文章。如有错误之处还请指正!
数据在进行建模和分析前,对其进行数据处理是必不可少的, 这样做能帮助我们从根本上保证数据质量,提高数据的准确性和可靠性。主要包括数据清洗、数据转换、数据集成、数据降维等过程。
数据的质量评定
从五个维度来对数据质量进行评定
维度 | 说明 |
---|---|
有效性Validity | 数据的有效性源于统计学概念,即符合数据收集时所制定的规则及约束条件的数据。 |
精确度 Accuracy | 精确度是衡量数据质量的另一个重要条件。 一般情况下,通过数据清理很难改善数据的准确度,这就对数据源质量提出了较高的要求。 |
完整度 Completeness | 如果在采集数据的过程中造成了数据丢失,也就影响了其完整程度。 不完整的数据,势必会对分析结论造成影响,这需要进一步采取措施来改善这种情况。 |
一致性 Consistency | 原始数据中,数据可能会存在不一致性。 例如:客户在两个不同的系统中提供了两个不一样的家庭地址,而正确的地址只有一个。 那么,就需要我们来判断并消除这种不一致性。 |
均匀度 Uniformity | 数据的均匀度可能来源于度量单位的不一致,这就需要我们通过换算来解决,使得最终数据统一均匀。 |
数据处理步骤
数据处理的常见四个步骤:
序号 | 步骤 | 说明 |
---|---|---|
1 | 数据清理 Data Cleansing | 数据清理大致包括对空缺键值进行填充操作, 对噪声数据进行相应的平滑处理,对孤立点和异常点进行删除处理等。 |
2 | 数据集成 Data Integration | 将多个数据库或者数据文件里面包含的数据进行集成处理。 |
3 | 数据转换 Data Transformation | 将数据进行聚集或者规范化处理,从一种形式转换成另外一种我们需要的形式。 |
4 | 数据规约 Data Reduction | 对庞大的数据集进行压缩处理,且尽量保证最终预测结果的一致性。 |
下面将详细介绍常用的数据处理方法:
缺失值的处理
标记缺失值
# 生成包含缺数据的示例
import numpy as np
import pandas as pd
null_data = {'A': [10, np.nan, 25, np.nan, 42, np.nan],
'B': [12, 15, np.nan, 14, 17, np.nan],
'C': [10, 13, 27, 13, 19, 40]}
df = pd.DataFrame(null_data)
-
空值也有不同类型
数值型空值 :NaN (not a number)
空字符串 :None
-
定位缺失数据:
- 使用 isnUll() 返回 True 代表缺失值
- notnull()则与之相反
删除缺失值
- 直接删除
- 缺失数据占全部数据比例非常低,可忽略不计且删除后不会对整体数据分布产生影响
- 缺失数据因为本身特性无法填充,比如对于某些检测指标,填充数值会对结果产生影响的宁愿删除也不要进行处理
# 删除缺失值
import pandas as pd
# 创建一个示例数据框
data = {'A': [1, 2, None, 4],
'B': [5, None, 7, 8],
'C': [None, 10, None, 12]}
df = pd.DataFrame(data)
# 删除包含缺失值的行
cleaned_df1 = df.dropna() # 默认删除包含缺失值的行
cleaned_df2 = df.dropna(axis=1) # 删除包含缺失值的列
cleaned_df3 = df.dropna(how='all') # 当所有值为缺失值时删除行
cleaned_df4 = df.dropna(thresh=2) # 至少要有 2 个非缺失值才保留行
cleaned_df5 = df.dropna(subset=['B', 'C']) # 只有在 'B' 和 'C' 列中同时存在空值的情况下,对应的行才会被删除
print(cleaned_df1)
print(cleaned_df2)
print(cleaned_df3)
print(cleaned_df4)
print(cleaned_df5)
填充缺失值
-
固定值填充:人为指定,使用行/列均值、中位数等
# Pandas 提供的 replace t填充固定值 print(df.replace(np.nan,0)) # 缺失值填充为0 # 专门用于填充缺失值的函数 fillna() print(df.fillna(0)) # 使用各列的平均值填充 print(df.fillna(df.mean())) # 使用格列中位数填充 print(df.fillna(df.median()))
-
临近值填充:使用缺失值相临近的数值填充
# 使用后一个临近的数据向前填充 print(df.fillna(method='bfill')) # 使用前一个临近的数据向后填充 print(df.fillna(method='ffill'))
-
数字填充:使用函数插值填充
数据缺失但能看出数据的变化趋势,更好的缺失值填充方法时是使用数据方法进行插值Pandas中的
interpolate()
可以快速应用一些常用的插值函数sample_data = {'A': [1, np.nan, 3, np.nan, 5, 6], 'B': [1, 4, np.nan, np.nan, 25, 36]} df = pd.DataFrame(sample_data) # 线性插值 print(df.interpolate(method='linear')) # 2次函数插值 print(df.interpolate(method='polynomial', order=2))
重复值处理
# 示例数据
df = pd.DataFrame({'name': ['amy', 'david'] * 3 +
['jam'], 'class': [2, 2, 2, 4, 3, 2, 4]})
-
duplicated()
判断是否存在重复值print(df.duplicated()) # 判断重复值 存在则返回True print(df.duplicated().sum()) # 统计判断重复值
-
dropduplicates()
去除重复值
df.drop_duplicatep() #去除全部重复值
df.drop_duplicates(['name']) #去除name列的重复值
df.drop_duplicates(keep='last') # 默认保留重复项前面的值,而去除后面的值,‘last’则为保留最后一个
异常值的处理
当涉及 Pandas 应用数学与统计学领域中的异常值检测时,有一些比较深入的方法,包括概率方法,矩阵分解,以及神经网络等。下面是一些具体示例展示:
-
概率方法 - 一元正态分布检测异常值:
import pandas as pd import numpy as np # 创建一个示例数据集 data = pd.DataFrame({'value': [1, 2, 3, 4, 5, 1000]}) # 计算均值和标准差 mean = data['value'].mean() std = data['value'].std() # 设置异常值阈值,例如均值加减3倍标准差 threshold = 3 * std # 使用一元正态分布方法检测异常值 data['is_outlier'] = np.abs(data['value'] - mean) > threshold print(data)
-
概率方法 - 多元高斯方法检测异常值:
from scipy import stats # 创建一个示例数据集 data = pd.DataFrame({ 'feature1': [1, 2, 3, 4, 5], 'feature2': [2, 4, 6, 8, 10] }) # 计算多元高斯分布概率密度 multivariate_dist = stats.multivariate_normal(mean=data.mean(), cov=data.cov()) # 设置异常值阈值 threshold = 0.01 # 例如设置一个较小的阈值 # 使用多元高斯方法检测异常值 data['is_outlier'] = multivariate_dist.pdf(data) < threshold print(data)
-
矩阵分解方法检测异常值:
from sklearn.decomposition import PCA # 创建一个示例数据集 data = pd.DataFrame({ 'feature1': [1, 2, 3, 4, 5], 'feature2': [2, 4, 6, 8, 100] }) # 使用主成分分析(PCA)进行矩阵分解 pca = PCA(n_components=2) pca.fit(data) # 计算重构误差 reconstruction_error = np.sum((data - pca.inverse_transform(pca