当前位置:   article > 正文

Python数据分析之数据预处理_python zscore

python zscore


在这里插入图片描述

前言

本文主要是个人的学习笔记总结,数据预处理的基本思路和方法,包括一些方法的使用示例和参数解释,具体的数据预处理案例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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 空值也有不同类型

    数值型空值 :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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
填充缺失值
  • 固定值填充:人为指定,使用行/列均值、中位数等

    # 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()))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 临近值填充:使用缺失值相临近的数值填充

    # 使用后一个临近的数据向前填充
    print(df.fillna(method='bfill'))
    # 使用前一个临近的数据向后填充
    print(df.fillna(method='ffill'))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 数字填充:使用函数插值填充

    数据缺失但能看出数据的变化趋势,更好的缺失值填充方法时是使用数据方法进行插值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))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
重复值处理
# 示例数据
df = pd.DataFrame({'name': ['amy', 'david'] * 3 +
                   ['jam'], 'class': [2, 2, 2, 4, 3, 2, 4]})

  • 1
  • 2
  • 3
  • 4
  • duplicated() 判断是否存在重复值

    print(df.duplicated()) # 判断重复值 存在则返回True
    print(df.duplicated().sum()) # 统计判断重复值
    
    
    • 1
    • 2
    • 3
  • dropduplicates() 去除重复值

df.drop_duplicatep() #去除全部重复值
df.drop_duplicates(['name']) #去除name列的重复值
df.drop_duplicates(keep='last') # 默认保留重复项前面的值,而去除后面的值,‘last’则为保留最后一个

  • 1
  • 2
  • 3
  • 4
异常值的处理

当涉及 Pandas 应用数学与统计学领域中的异常值检测时,有一些比较深入的方法,包括概率方法,矩阵分解,以及神经网络等。下面是一些具体示例展示:

  1. 概率方法 - 一元正态分布检测异常值:

    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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  2. 概率方法 - 多元高斯方法检测异常值:

    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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  3. 矩阵分解方法检测异常值:

    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.i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/798155
推荐阅读
相关标签
  

闽ICP备14008679号