数据分析--数据预处理!

数据分析及预处理(一) 文章目录前言一、数据分析和预处理要做什么二、实际操作1.读取数据2.数据分析3.数据预处理总结 前言 经过了好几天的摸鱼,面对老师丢给的任务迟迟也是没有进展。但是摸鱼不能白摸,读了好多博主的文章,也是总结出来一些东西,慢慢罗列起来。 一、数据分析和预处理要做什么 读取(txt、csv、xls等文件) 数据分析【质量分析(缺失值、异常值)、特征分析(分布、对比、统计量、周期性、相关性)】 数据预处理【数据清洗(缺失值、异常值)、数据集成(实体识别、属性冗余)】 数据集划分(训练集、测试集) 二、.. 阅读详情

包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取 100%免费!】

目录

  • 数据的质量评定
  • 数据处理步骤
    • 缺失值的处理
      • 标记缺失值
      • 删除缺失值
      • 填充缺失值
    • 重复值处理
    • 异常值的处理
    • 数据集合并
      • pandas.DataFrame.concat()方法合并:
      • pandas.DataFrame.merge() 方法合并:
      • pandas.DataFrame.join() 方法:
      • 数据映射 map()方法完成
    • 分组聚合
    • 数据转换
      • Z-Score 标准化
      • Min-Max 标准化
      • 独热编码
      • 数据离散化
    • 数据规约
      • 主成成分分析(Principal Components Analysis)
      • 线性判别分析
      • 皮尔逊相关系数
      • 卡方检验
    • 数据抽样

数据在进行建模和分析前,对其进行数据处理是必不可少的,这样做能帮助我们从根本上保证数据质量,提高数据的准确性和可靠性。主要包括数据清洗、数据转换、数据集成、数据降维等过程。

数据的质量评定

从五个维度来对数据质量进行评定

维度说明
有效性
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 应用数学与统计学领域中的异常值检测时,有一些比较深入的方法,包括概率方法,矩阵分解,以及神经网络等。下面是一些具体示例展示:

  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)
    
    
  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)
    
    
  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.inverse_transform(pca.transform(data))) ** 2, axis=1)
    
    # 设置异常值阈值
    threshold = 20  # 例如设置一个阈值
    
    # 使用矩阵分解方法检测异常值
    data['is_outlier'] = reconstruction_error > threshold
    print(data)
    
    
  4. 神经网络方法检测异常值:

    from sklearn.neighbors import LocalOutlierFactor
    
    # 创建一个示例数据集
    data = pd.DataFrame({'value': [1, 2, 3, 4, 5, 1000]})
    
    # 使用局部异常因子(Local Outlier Factor)进行异常值检测
    lof = LocalOutlierFactor(n_neighbors=2, contamination=0.1)  # 设置参数
    data['is_outlier'] = lof.fit_predict(data[['value']])
    
    print(data)
    
    
数据集合并

这里主要是用pandas中的常见方法进行数据集的连接合并。

pandas.DataFrame.concat()方法合并:
pandas.concat(
    objs,              # 接受一个列表或字典,表示要连接的 pandas 对象(Series 或 DataFrame)
    axis=0,            # 沿指定轴进行连接,0 表示沿第一个轴(行方向)连接,1 表示沿第二个轴(列方向)连接
    join='outer',      # 指定连接的方式,'outer'表示并集(union),'inner'表示交集(intersection)
    ignore_index=False,# 如果为 True,将忽略原始索引并生成一个新的整数索引
    keys=None,         # 创建层次化索引,用于识别每个片段
    levels=None,       # 指定多级索引的级别(通常自动推断)
    names=None,        # 指定多级索引的级别名称
    verify_integrity=False,  # 如果为 True,在连接操作之前验证轴是否包含重复项
    sort=False         # 如果为 True,对非连接轴上的索引进行排序
)


以下是对各个参数的详细解释:

  • objs:要连接的 pandas 对象列表。可接受一个列表(或字典),其中包含要连接的 DataFrame 或 Series 对象。
  • axis:指定连接的轴方向。0 表示在行方向上连接,1 表示在列方向上连接。
  • join:指定连接的方式。默认为 ‘outer’,表示取并集进行连接,也可以选择 ‘inner’,表示取交集进行连接。
  • ignore_index:如果为 True,将忽略原始索引并生成一个新的整数索引。
  • keys:当数组沿着连接轴堆叠时,可以用 keys 参数创建一个层次化索引(MultiIndex),以便识别每个片段。
  • levels:指定键的层次化级别,通常不需要手动指定,会根据 keys 推断。
  • names:指定多级索引的级别名称。
  • verify_integrity:如果为 True,在连接操作之前验证轴是否包含重复项,如果包含重复项则会抛出 ValueError 异常。
  • sort:如果为 True,在连接操作之后对非连接轴上的索引进行排序。

​

pandas.DataFrame.merge() 方法合并:
pandas.merge(
    left,                     # 左侧的 DataFrame 对象
    right,                    # 右侧的 DataFrame 对象
    how='inner',              # 合并方式,默认为 'inner',表示取两个 DataFrame 的交集
    on=None,                  # 指定列名或索引级别作为合并的键,默认为 None,表示自动根据列名的交集进行合并
    left_on=None,             # 指定左侧 DataFrame 中的列名或索引级别作为合并的键
    right_on=None,            # 指定右侧 DataFrame 中的列名或索引级别作为合并的键
    left_index=False,         # 如果为 True,在左侧 DataFrame 中使用索引作为合并键
    right_index=False,        # 如果为 True,在右侧 DataFrame 中使用索引作为合并键
    sort=False,               # 如果为 True,根据合并键对结果进行排序
    suffixes=('_left', '_right'),  # 如果列名冲突,为列名添加后缀来区分,默认为 '_left' 和 '_right'
    copy=True                 # 如果为 True,在执行合并操作时复制数据
)

以下是对各个参数的详细解释:

  • left:左侧的 DataFrame 对象。
  • right:右侧的 DataFrame 对象。
  • how:指定合并的方式,默认为 'inner',即取两个 DataFrame 的交集。还可以选择 'outer',表示取两个 DataFrame 的并集;'left',表示以左侧 DataFrame 的键为基准进行合并;'right',表示以右侧 DataFrame 的键为基准进行合并。
  • on:指定列名或索引级别作为合并的键。默认为 None,表示自动根据列名的交集进行合并。
  • left_on:指定左侧 DataFrame 中的列名或索引级别作为合并的键。
  • right_on:指定右侧 DataFrame 中的列名或索引级别作为合并的键。
  • left_index:如果为 True,在左侧 DataFrame 中使用索引作为合并键。
  • right_index:如果为 True,在右侧 DataFrame 中使用索引作为合并键。
  • sort:如果为 True,根据合并键对结果进行排序。
  • suffixes:如果列名冲突,为列名添加后缀来区分,默认为 ('_left', '_right')。
  • copy:如果为 True,在执行合并操作时复制数据。
pandas.DataFrame.join() 方法:
DataFrame.join(
    other,                     # 合并的另一个 DataFrame 对象
    on=None,                   # 指定列名或索引级别作为合并的键,默认为 None,表示根据索引进行合并
    how='left',                # 合并方式,默认为 'left',表示以左侧 DataFrame 为基准进行左外连接
    lsuffix='',                # 左侧 DataFrame 列名相同时的后缀,默认为 '',不添加任何后缀
    rsuffix='',                # 右侧 DataFrame 列名相同时的后缀,默认为 '',不添加任何后缀
    sort=False                 # 如果为 True,根据合并键对结果进行排序
)

以下是对各个参数的详细解释:

  • other:合并的另一个 DataFrame 对象。
  • on:指定列名或索引级别作为合并的键。默认为 None,表示根据索引进行合并。
  • how:指定合并的方式,默认为 'left',即以左侧 DataFrame 为基准进行左外连接。还可以选择 'inner',表示取两个 DataFrame 的交集;'outer',表示取两个 DataFrame 的并集;'right',表示以右侧 DataFrame 为基准进行右外连接。
  • lsuffix:表示左侧 DataFrame 中列名相同时的后缀,默认为 ‘’,即不添加任何后缀。
  • rsuffix:表示右侧 DataFrame 中列名相同时的后缀,默认为 ‘’,即不添加任何后缀。
  • sort:如果为 True,根据合并键对结果进行排序。
数据映射 map()方法完成
df = pd.DataFrame({'name': ['amy', 'david', 'jam'], 'age': [14, 13, 12]})
name_to_gender = {'amy': 'girl', 'david': 'boy', 'jam': 'boy'}  # 建立映射字典
df['gender'] = df['name'].map(name_to_gender)


分组聚合

pandas.DataFrame.groupby()对数据集进行分组聚合

df = pd.DataFrame({'key1': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'key2': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
                   'data': [1, 2, 3, 4, 5, 6]})
df.groupby(by='key1').sum()
df.groupby(by=['key1', 'key2']).mean() # 替换为count().mean()等其它函数



数据转换

不仅是数据格式或类型的转换,更多的是通过一些统计学方法对数据进行标准化或离散化处理。

特征工程:需要去设计数据特征,以帮助训练得到性能更加优异的模型。

标准化 Normalization(无量纲化)是数据预处理中的常用手段。标准化的目的主要是消除不同特征之间的量纲和取值范围不同造成的差异。这些差异,不仅会造成数据偏重不均,还会在可视化方面造成困扰

import numpy as np
import pandas as pd
%matplotlib inline

np.random.seed(10)  # 随机数种子
df = pd.DataFrame({'A': np.random.random(
    20), 'B': np.random.random(20) * 10000})
print(df.plot())  # 绘图


此时,B列数据太大,A列已经无法看出趋势,近似一条直线.

Z-Score 标准化

Z-Score 标准化 是常用的标准化手段之一,其公式为:

\[z = \frac{x - \mu}{\sigma} \]

其中, 𝜇

为样本数据的均值, 𝜎

为样本数据的标准差。Z-Score 标准化之后的数据的均值为 0,方差为 1。

通过Z-Score 标准化,可以使不同数据集之间的数据具有可比性,同时可以减小异常值对数据分析和模型建立的影响。

# 使用Z-Score标准化对上面的DataFrame进行标准化处理并绘图
df_z_score = (df - df.mean()) / df.std()  # Z-Score 标准化
df_z_score.plot()

Z-Score 标准化方法在 Scipy 中有一个对应的APIscipy.stats.zscore 可以使用

from scipy import stats
stats.zscore(df)

也可以将 DataFrame 处理从 NumPy 数组再运算

(df.values - df.values.mean(axis=0)) / df.values.std(axis=0)  #  NumPy 数组运算

除了 SciPy,scikit-learn 也提供了 Z-Score 标准化API sklearn.preprocessing.StandardScaler()

Min-Max 标准化

该方法可以将数据转化到一个特定的区间范围内,通常是[0, 1]或者[-1, 1]之间。这种标准化方法适用于以下场景:

  1. 数据需要落入特定区间范围内:例如神经网络的输入层,很多情况下都要求输入数据的范围在[0, 1]或者[-1, 1]之间。

  2. 需要保留原始数据的相对性质:Min-Max 标准化会保持原始数据中不同数值之间的相对大小关系,不会改变数据的分布形态。

  3. 异常值较少:Min-Max 标准化对异常值比较敏感,如果数据中存在较多的异常值,可能会导致标准化后的数据集不够均衡。

公式为:

\[\hat x=\frac{x-x_{min}}{x_{max}-x_{min}} \]

其中, 𝑥𝑚𝑎𝑥为样本数据的最大值, 𝑥𝑚𝑖𝑛为样本数据的最小值, 𝑥𝑚𝑎𝑥−𝑥𝑚𝑖𝑛为极差。

# 使用Min-Max标准化对上面的DataFrame进行标准化处理
df_min_max = (df - df.min()) / (df.max() - df.min())  # Min-Max 标准化
df_min_max.plot()

同样,scikit-learn 也提供了 Min-Max 标准化的 API sklearn.preprocessing.MinMaxScaler(),使用方法如下:

from sklearn.preprocessing import MinMaxScaler
MinMaxScaler().fit_transform(df)

独热编码

在对数据的预处理过程中,我们会遇到有一些特征列中的样本并不是连续存在的,而是以分类形式存在的情况。例如,某一装置的状态有三种情况,分别为:正常、机械故障、电路故障。如果我们要将这些数据运用到后续的预测分析中,就需要对文字状态进行转换。一般情况下,可以用 0 表示正常,1 代表机械故障,2 代表电路故障。

所以,对于以分类形式存在的特征变量,我们会采用一种叫 独热编码 One-Hot Encoding 的方式将其转换成二元特征编码,进一步对特征进行了稀疏处理。独热编码采用位状态寄存器来对个状态进行编码,每个状态都由它独立的寄存器位,并且在任意时候只有一位有效。

# Pandas 中,可以使用 get_dummies 很方便地完成独热编码。
df = pd.DataFrame({'fruits': ['apple', 'banana', 'pineapple']*2})  # 示例装置状态表
pd.get_dummies(df)  # 独热编码

数据离散化

数据离散化有时候是为了算法实施需要,也有可能离散数据更适合数据的信息表达。当我们对连续数据进行按区间离散化时,你可以通过编写代码实现。不过,这里介绍 Pandas 中一个非常方便的区间离散化方法 pd.cut(适用于等宽离散化)

# 将数组等间距分割为3部分
pd.cut(np.array([1, 2, 7, 8, 5, 4, 12, 6, 3]), bins=3)  # bins 指定划分数量

此时,如果我们按照 3 个区间对数据添加类别标签 “small”, “medium”, “large”,只需要指定 labels= 参数即可

pd.cut(np.array([1, 2, 7, 8, 5, 4, 12, 6, 3]),
       bins=3, labels=["small", "medium", "large"])

一般情况下,区间返回会以最大值为准,向最小值方向扩展 0.1% 以保证元素被有效分割。所以上面的区间不是以最小值 1 开始,而是 0.989。其中

\[1 - 0.989 = (12 - 1) * 0.1\% \]

当然,也可以自行指定划分区间:

pd.cut(np.array([1, 2, 7, 8, 5, 4, 12, 6, 3]), 
       bins=[0, 5, 10, 15], labels=["small", "medium", "large"])

数据规约
主成成分分析(Principal Components Analysis)

通过对协方差矩阵进行特征分解,从而得出主成分(特征向量)与对应的权值(特征值)。然后剔除那些较小特征值(较小权值)对应的特征,从而达到降低数据维数的目的。

PCA最便捷方式通过scikit-learn完成

下面以常见的鸢尾花示例数据集作为示例:

# 加载鸢尾花实例数据集
import pandas as pd
from sklearn.datasets import load_iris
from matplotlib import pyplot as plt
%matplotlib inline

iris = load_iris()  # 加载原始数据
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)  # 处理为 DataFrame

数据集包含有4列,代表鸢尾花的4个特征。若想将上面的数据绘制成数据点图(平面散点图),就无法实现,此时就需要对数据进行降维处理

介绍以下 sklearn.decomposition.PCA 方法中的几个参数:

  • n_components= 表示需要保留主成分(特征)的数量。
  • copy= 表示针对原始数据降维还是针对原始数据副本降维。当参数为 False 时,降维后的原始数据会发生改变,这里默认为 True。
  • whiten= 白化表示将特征之间的相关性降低,并使得每个特征具有相同的方差。
  • svd_solver= 表示奇异值分解 SVD 的方法。有 4 参数,分别是:auto, full, arpack, randomized。
# 续上段代码, 进行PCA
iris_pca = PCA(n_components=2).fit_transform(iris_df)  # PCA 降 2 维
iris_pca = pd.DataFrame(iris_pca, columns=['pca_x', 'pca_y'])  # 整理 DataFrame
iris_pca.plot.scatter(x='pca_x', y='pca_y')  # 绘制数据点
iris_pca.plot.scatter(x='pca_x', y='pca_y',
                      c=iris.target, cmap='plasma')  # 数据点着色

PCA在很多情况下是非常有用的, 上述是从可视化角度进行,以下是常见使用:

  1. 降低数据维度:高维数据集会增加分析数据的复杂性,而PCA可以将高维数据投影到低维空间中,同时保留了大部分数据的变异性。这有助于简化数据集、减少存储空间和计算成本。

  2. 消除数据间的相关性:在许多数据集中,不同特征之间存在相关性。PCA可以消除或减轻这些特征之间的相关性,从而更好地反映数据之间的独立性,减少重复信息。

  3. 提高模型的性能:在一些机器学习任务中,高维数据可能会导致过拟合,而PCA可以有效减少数据的维度,帮助改善模型的泛化能力,并提高预测的准确性。

  4. 数据可视化:通过PCA技术,可以将高维数据转换为二维或三维,从而更好地将数据可视化展现,以便更好地理解数据的结构和特征。

  5. 去除噪声:在某些数据集中可能会存在噪声或不重要的信息,而PCA可以帮助排除这些噪声,提取出数据中最重要的信号和特征。

  6. 特征提取:PCA可以帮助识别和提取主要的特征,从而更好地描述数据的内在结构,有助于模式识别、数据挖掘和预测任务。

线性判别分析

线性判别分析(Linear Discriminant Analysis,英文:LDA)同样可以用于特征降维。LDA 本来是一种分类模型,它试图找到两类物体或事件的特征的一个线性组合,以便能够特征化或区分它们。

LDA 和 PCA 的本质相似,都会将原始的样本映射到维度更低的样本空间中。不过,PCA 映射后的样本具有更大的发散性,而 LDA 映射后的样本具有更明显的类别区分。

scikit-learn 同样提供了可以用于 LDA 处理的 API:sklearn.discriminant_analysis.LinearDiscriminantAnalysis,使用方法如下:

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

iris_lda = LinearDiscriminantAnalysis(
    n_components=2).fit_transform(iris_df, iris.target)  # lda 降 2 维

iris_lda = pd.DataFrame(iris_lda, columns=['lda_x', 'lda_y'])  # 整理 DataFrame

通过绘制子图来对比PCA和LDA两种方法降维之后的数据分布:

fig, axes = plt.subplots(ncols=2, nrows=1, figsize=(12, 3))
iris_lda.plot.scatter(x='lda_x', y='lda_y', c=iris.target,
                        cmap='plasma', ax=axes[0])  # 数据点着色
iris_pca.plot.scatter(x='pca_x', y='pca_y', c=iris.target,
                        cmap='plasma', ax=axes[1])  # 数据点着色

可以从上图看出二者的区别。PCA 和 LDA 是两种不同的降维方法,没有方法的好坏之说。一般情况下,PCA 会使用多一些,你可以看到 LDA 需要输入目标值,而 PCA 则无需这一点

皮尔逊相关系数

在统计学中, 皮尔逊积矩相关系数(英语:Pearson product-moment correlation coefficient)用于度量两个变量 𝑋 和 𝑌 之间的相关(线性相关),其值介于 -1 与 1 之间。在自然科学领域中,该系数广泛用于度量两个变量之间的相关程度。它是由卡尔·皮尔逊从弗朗西斯·高尔顿在 19 世纪 80 年代提出的一个相似却又稍有不同的想法演变而来。这个相关系数也称作「皮尔逊相关系数」。

两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商:

\[{\displaystyle \rho _{X,Y}={\mathrm {cov} (X,Y) \over \sigma _{X}\sigma _{Y}}={E[(X-\mu _{X})(Y-\mu _{Y})] \over \sigma _{X}\sigma _{Y}}} \]

有了皮尔逊相关性系数,我们就可以评估不同特征与目标值直接的相关性,从而剔除那些相关性弱的特征,达到特征压缩的目的。接下来,我们使用 SciPy 提供的皮尔逊相关性系数计算方法 scipy.stats.pearsonr 来求解 iris 示例数据集各特征与目标值之间的相关系数。

from scipy.stats import pearsonr

for i in range(4):
    p = pearsonr(iris_df.iloc[:, i], iris.target)[0]  # 求解每个特征与目标值的相关性
    print("{}: {}".format(iris.feature_names[i], p))  # 输出

上文说过,**皮尔逊相关系数介于 -1 与 1 之间,越接近 1 则代表越正相关。**所以,iris 示例数据集中与目标值更为相关的特征是 sepal length,petal length 和 petal width。

这里再补充一种计算数据集特征和目标之间皮尔逊相关性系数的方法,你可以直接在 DataFrame 后添加 corr() 属性获得。更为常用的是通过 Seaborn 可视化工具绘制热图。

import seaborn as sns

# 得到特征和目标拼合后的 DataFrame
iris_full_df = pd.concat([pd.DataFrame(iris.data, columns=iris.feature_names),
                            pd.DataFrame(iris.target, columns=['iris_target'])], axis=1)

sns.heatmap(iris_full_df.corr(), square=True, annot=True)  # corr() 函数计算皮尔逊相关系数

区别于手动计算各特征和目标之间的相关系数,上方热图还计算了特征之间的相关系数。观察热图最后一行,不难发现与通过 scipy.stats.pearsonr 计算的结果一致。

卡方检验

在 1900 年,皮尔逊发表了著名的关于 卡方检验( Chi-Squared Test)的文章,该文章被认为是现代统计学的基石之一。简单来讲,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小。若卡方值越小,代表偏差越小,越趋于符合。

scikit-learn 提供了 sklearn.feature_selection.SelectKBest 可以返回 k 个最佳特征,不过我们需要使用 sklearn.feature_selection.chi2 来计算卡方值。接下来,同样使用 iris 数据集来进行卡方检验。

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

kafang = SelectKBest(score_func=chi2, k=3)  # 保留 3 个最佳特征,并使用卡方检验
kafang.fit_transform(iris_df, iris.target)

transformer 输出了需要保留的最佳特征,与 iris_df 对比后你会发现,它保留了与皮尔逊相关系数结果一致的 sepal length,petal length 和 petal width 特征。你可以通过 scores_ 属性输出卡方值的计算结果。

kafang.scores_  # 各特征与目标值之间的卡方值

这里要补充一点是,实际使用中卡方检验和皮尔逊相关系数的评估结果并不会都像 IRIS 数据集上一致,往往会得到不同的结果。这其实也就反映出选取最好的特征往往取决于评估指标,而没有唯一答案。

上面我们介绍依据皮尔逊相关系数和卡方检验进行特征选择的方法在特征工程中又被归类于 Filter 过滤法,它主要侧重于单个特征跟目标变量的相关性。这种方法的优点在于计算速度快,且有较高的鲁棒性。但是,Filter 方法的缺点在于不考虑特征之间的相关性。因为,有可能某一个特征自身不具备代表性,但是它和某些其它特征组合起来会使得模型会得到不错的效果。这一点就是 Filter 方法无法考虑到的了。

除此之外,从特征工程的角度来讲,还可以使用 Wrapper 封装法和 Embeded 集成方法来完成特征选择。

数据抽样

数据抽样是通过减少样本而非特征的数据来达到数据规约的效果。数据抽样通过从原始数据集中随机采集样本构成子集,从而降低数据规模。

最简单的抽样当然就是「随机抽样」了,我们可以生成一组随机索引,然后从数据集中抽取到相应的数据。这里,我们使用上方的 IRIS 数据集来完成。

import numpy as np

chosen_idx = np.random.choice(
    len(iris_df), replace=False, size=10)  # 从 IRIS 数据集中抽取 10 条数据
iris_df.iloc[chosen_idx]  # 抽取相应索引的数据

还可以直接使用 Pandas 提供的 pandas.DataFrame.sample 方法完成随机抽样过程,其中只需要指定抽样数目即可。

iris_df.sample(n=10) 

**注意:**数据抽样虽然在这里被归入数据规约,但实际上更多用于前面的环节中。一般情况下,会从清洗后的数据中抽样,使用抽样数据来完成特征工程和建模,以探索方法实施的可能性。最终再使用完整数据集进行建模分析

最后,如果你是准备学习Python或者正在学习(想通过Python兼职),下面这些你应该能用得上:
包括:Python安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
在这里插入图片描述

EEGLAB数据分析:预处理与后续处理 来源:http://blog.sina.com.cn/s/blog_13171a73d0102v4zx.html 数据预处理主要包括数据导入、电极定位、电极返回、滤波、去除伪迹、重建参考、分段、叠加平均等步骤。只有经过预处理的数据,才能进行特征值提取以进一步进行方差分析等操作。EEGLAB对数据处理的优点无需赘述。很多情况下,后续被试的预处理与第一个被试的处理过程是一样的。在这种情况下就可以采用... 阅读详情

相关推荐

Python数据分析:数据预处理全流程指南

数据预处理是数据分析和机器学习项目中的关键步骤,它直接影响到后续分析和模型的准确性。指数据分析之前,对数据进行加工处理,使数据在后续的分析方法中更加的准确、有效。数据预处理是数据分析和机器学习项目中的重要环节,它确保了数据的质量和准确性。通过使用`pandas`库,我们可以轻松地进行数据合并、清洗和转换。本文通过具体的代码示例,展示了如何在Python中实现这些步骤。掌握这些技能,将有助于你更有效地进行数据分析和模型构建。在实际应用中,数据预处理可能更加复杂,需要根据具体的数据集和业务需求进行调整。

2401_85789975的博客 2346

Python数据分析与挖掘进阶篇4——数据预处理中的数据违约以及主要预处理函数(附实例!)

初探Python数据分析day5    自我介绍一下,我是一名大四应届毕业生对数据挖掘方面很感兴趣,最近开始着手系统学习,在这里与大家分享我的学习笔记与心得,如果不足或错误请大家指出,感谢。 4、数据违约 ​    在大数据集上进行复杂的数据分析和挖掘需要很长的时间,数据规约产生更小但保持原数据完整性的新数据集。在规约后的数据集上进行分析...

别看我只是一只羊 935

Python数据分析之数据预处理

本文主要是个人的学习笔记总结,数据预处理的基本思路和方法,包括一些方法的使用示例和参数解释,具体的数据预处理案例case详见其他文章。如有错误之处还请指正!数据在进行建模和分析前,对其进行数据处理是必不可少的,这样做能帮助我们从根本上保证数据质量,提高数据的准确性和可靠性。主要包括数据清洗、数据转换、数据集成、数据降维等过程。

python03011的博客 1313

Python数据分析与挖掘进阶篇3——数据的预处理(清洗、集成、变换)附实例!

初探Python数据分析day4    自我介绍一下,我是一名大四应届毕业生对数据挖掘方面很感兴趣,最近开始着手系统学习,在这里与大家分享我的学习笔记与心得,如果不足或错误请大家指出,感谢。 一、数据的预处理 ​    在数据挖掘中,海量的原始数据中存在着大量不完整(有缺失值)、不一致、有异常的数据,严重影响到数据挖掘建模的执行效率,甚至...

别看我只是一只羊 4178

数据分析类论文通过stata进行数据预处理(一)

数据分析类论文通过stata进行数据预处理(一)

eeee~~的博客 2860

DPABI详细使用教材——数据准备、预处理流程、数据分析流程

严老师的官方教程:官网 DPABI(用于脑成像的数据处理和分析的工具箱)的下载和安装步骤,请参阅博客: 安装教材 DPABI版本:V4.3_200401 MATLAB版本:2018a 目录 一、数据准备 二、预处理 三、数据分析 四、关于预处理流程 五、其他设置 一、数据准备 (1)如果是数据的DICOM格式,整理成以下格式(注意文件夹的命名方式): 如果觉得不是很清楚,可以在官网下载Demo数据(http://rfmri.org/DemoData),参照里面的文件格式进行整理即可。 (2)如果数据是.

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 5万+

Python数据分析真的不难学,实战来了:大佬级别数据预处理方式!

这次我们专门挑了一份烂大街的数据集Titanic,写了一点关于数据预处理部分,但是代码风格却是大(zhuang)佬(bi)级别。很明显,我不是大佬,不过是有幸被培训过。 说到预处理,一般就是需要: 数字型缺失值处理 类别型缺失值处理 数字型标准化 类别型特征变成dummy变量 Pipeline 思想 在做数据处理以及机器学习的过程中,最后你会发现每个项目似乎都存在“套路”。所有的项目处理过程都会存在一个“套路”: 预处理 建模 训练 预测 对于预处理,其实也是一个套路,不过我们不用p

爬遍所有网站 361

数据分析 —— 数据预处理

数据预处理是数据分析和机器学习中的关键步骤,旨在将原始数据转换为高质量、适合分析或建模的形式。其主要步骤包括数据清洗、数据集成、数据变换和数据归约。数据清洗涉及处理缺失值、噪声数据和不一致数据;数据集成解决多数据源的冗余和冲突;数据变换包括标准化、归一化、离散化和特征编码;数据归约通过特征选择和降维减少数据规模。预处理的目的是提高数据质量、优化模型性能、减少计算成本并适配算法需求。此外,数据检测、缺失值处理、重复值处理、异常值处理、数据合并和数据重塑也是预处理的重要环节。通过这些步骤,数据科学家可以确保数据

小白 3166

Python数据分析与挖掘入门篇——挖掘工具与库的介绍、数据取样、探索、预处理等(附实例!)

初探Python数据分析day1    自我介绍一下,我是一名大四应届毕业生~信息与计算科学专业,对数据挖掘方面很感兴趣,最近开始着手系统学习,在这里与大家分享我的学习笔记与心得,如果不足或错误请大家指出,感谢。 一、数据取样: 1、资料完整无缺,各类指标项齐全 2、数据准确无误,反映的都是正常状态下的水平 对获取到的数据可以在从中进行抽样操作: ​ ①随机抽样 ​ ...

别看我只是一只羊 1919

R语言WGCNA实战:从基因表达矩阵到模块可视化全流程(附避坑指南)

本文详细介绍了使用R语言进行WGCNA(加权基因共表达网络分析)的完整实战流程,涵盖从基因表达矩阵预处理、软阈值选择、网络构建与模块识别,到模块与表型关联分析及结果可视化的关键步骤。文章重点解析了代码实现,并提供了针对数据质量检查、参数调整等常见问题的避坑指南,帮助生物信息学研究者高效挖掘基因共表达模块的生物学意义。

weixin_29062823的博客 580

N5105核显直通PVE:从黑屏到HDMI输出的完整指南

PCI直通能让虚拟机独占物理设备,但核显直通远没有独显那么轻松。Intel核显与CPU、显示输出链路的强耦合使UEFI引导、GOP驱动、驱动签名等环节都成了黑屏陷阱。在PVE虚拟化环境中,通过IOMMU开启、vfio-pci绑定、OVMF固件和Q35机型配合,可以绕过KVM检测,让Windows虚拟机正确驱动核显,从HDMI口输出画面,并解锁Intel Quick Sync硬解能力。这种方案尤其适合N5105等低功耗迷你主机,可作为客厅HTPC、本地视频硬解或依赖硬件加速的轻量工作台。本文基于N5105平台

weixin_31082403的博客 375

python数据分析系统_Python数据分析,系统步骤介绍!

原标题:Python数据分析,系统步骤介绍!摘要在用Python做数据分析的过程中,有一些操作步骤和逻辑框架是很固定的,只需要记住其用法即可。本节内容介绍Pandas模块在数据分析中的常用方法。内容目录1、数据的生成与导入2、数据信息查看2.1、查看整体数据信息2.2、查看数据维度、列名称、数据格式2.3、查看数据特殊值和数值2.3.1、查看空值2.3.2、查看唯一值2.3.3、查看数值2.3.4...

weixin_39539807的博客 409

java 二维码生成及其标签打印

本文主要内容 二维码生成 二维码标签预览及打印 二维码生成 笔者此次的二维码是通过调用第三方接口生成的,具体流程如下: 根据规范要求调用第三方接口,返回二维码下载地址及二维码图片的属性值(图片大小等) 根据返回的值获取二维码下载地址,根据地址下载二维码图片,保存至本地磁盘及记录数据信息 扫描二维码跳转相应地址,显示资产的基本信息 最终生成的二维码如下图所示: 预览并批量打印二维码标签 先...

孙小牟的博客 4942

数据分析之数据预处理、分析建模、可视化

概述:简介、思路、发展历程、应用领域、开发流程; 数据类型:结构化与非结构化、定性与定量、截面数据与时间序列数据; 数据来源:外部来源、内部来源; 数据预处理:数据清洗、数据集成、数据规约、数据变换; 数据分析模型:对比分析、漏斗分析、留存分析、A/B测试、用户行为路径分析、用户分群、用户画像分析等; 数据分析方法:描述统计、假设检验、信度分析、相关分析、方差分析、回归分析、聚类分析、判别分析、主成分分析、因子分析、时间序列分析等; 数据可视化:Excel、PowerBI、Tableau、Python;

若如初见 11万+

MPU6050运动中断唤醒STM32低功耗休眠模式实战

本文详细介绍了如何使用MPU6050运动中断唤醒STM32低功耗休眠模式的实战方案。通过配置MPU6050的运动检测中断作为STM32的唤醒源,实现设备在静止时进入低功耗Stop模式,运动时快速唤醒,大幅延长电池续航。涵盖硬件连接、软件配置、参数调试等关键步骤,并提供实际应用案例和优化建议。

rgv23456789的博客 703

从HAL库SPI状态机机制剖析:为什么你的DMA发送会卡在BUSY状态?

本文深入剖析了STM32 HAL库中SPI状态机机制导致DMA发送卡在BUSY状态的常见问题。通过分析状态机设计原理,揭示了混合使用阻塞方式和DMA方式时状态切换冲突的根源,并提供了三种实战解决方案:正确配置SPI中断、使用HAL_SPI_Abort()函数以及手动管理状态机,帮助开发者实现稳定流畅的SPI DMA通信。

bush的博客 268

python数据分析——数据预处理

数据预处理是数据分析过程中不可或缺的一环,它的目的是为了使原始数据更加规整、清晰,以便于后续的数据分析和建模工作。在Python数据分析中,数据预处理通常包括数据清洗、数据转换和数据特征工程等步骤。数据清洗是数据预处理的第一步,主要是为了解决数据中的缺失值、异常值、重复值等问题。Python提供了丰富的库和工具来处理这些问题,如pandas库可以帮助我们方便地处理数据框(DataFrame)中的缺失值和重复值。对于异常值,我们可以通过统计分析、可视化等方法来识别和处理。

qq_74013365的博客 1万+

IEEE ACCESS Please note that all author names should be listed in English.(所有作者名需用英文名列出)

很奇怪哈,我明明手稿和提交页面作者都是用的英文,但是为什么还是会提示我没用英文呢?后来给编辑发消息,回的很快,他给我发了一个截图,确实是出现中文,但是我还是不知道为啥会出现中文。直到晚上回寝室洗澡的时候忽然想起来了是不是orcid的原因,因为它会强制作者绑定一个orcid账号,而我的orcid账号的名字刚好是中文的。当然这个只是我的一个猜想,但是我觉得可能性很大。我的第二篇论文已经投稿了快三个月了,效果非常的不好,所以我打算转投IEEE ACCESS了,希望这里可以给我一点好的建议。

kuyecsl的博客 3310

SPSSPRO数据分析之——CSI指纹数据分析(预处理、降维等)

SPSSPRO是一款全新的在线数据分析平台,可以用于科研数据的分析、数学建模等,对于那些不会编程或者刚进入科研的新人来说,这款工具再合适不过了。当然本人只是很早之前建模用过,所以有点关公面前武大刀的嫌疑。

静水流深,沧笙踏歌 8962

从零开始:用7353张VOC/YOLO格式混凝土缺陷数据集训练你的第一个检测模型

本文详细介绍了如何使用7353张VOC/YOLO格式的混凝土缺陷数据集训练首个目标检测模型。从环境配置、数据解析到YOLOv5模型训练与优化,提供了完整的实战指南,特别针对数据不平衡问题给出了解决方案,助力开发者快速掌握混凝土缺陷识别技术。

weixin_42651281的博客 256

一文搞懂LDO !

Start-up 时间是 IC 做死的,如果想要延时启动,最简单的办法是在 EN 上接一个大一些的电容到地,构成一个简单的 RC 电路。电容太小,电压跌落大,响应快。输出电流高,功率大;外围器件少,电路简单,成本低,负载响应快,输出纹波小;将采集的电压输入到比较器反向输入端,与正向输入端的基准电压(期望输出的电压)进行比较,再将比较结果进行放大;是指在给定负载变化下的输出电压的变化,这里的负载变化通常是从无负载到满负载。芯片的静态电流大小与其他性能成反关系,如低噪声,高电源电压抑制比,静态电流大。

weixin_46969363的博客 4384

用Python进行数据分析:从数据预处理到模型评估

文内将带您了解如何使用Python进行数据分析,涵盖数据预处理、探索性数据分析(EDA)、特征工程、模型构建与评估等方面,帮助您快速入门并深入理解这一领域的核心概念和技术。

2301_78217634的博客 1468

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SPSS数据分析 | 数据预处理1

数据预处理在数据分析中是至关重要的步骤,它包括清理、转换和整理原始数据,以确保数据质量和可用性。在数据预处理的过程中包含以下几种处理方式,包含了具体操作步骤以及各个步骤的解释。具体包括10个步骤:数据的排序、查找重复个案、变量计算、个案选取、个案内值的计数、分类汇总、数据分组、数据转置、加权处理、数据拆分。

weixin_44121778的博客 3108

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数据分析系列之数据预处理

在数据挖掘过程中,海量的原始数据存在大量的不一致,有缺失的数据,严重影响到数据挖掘的效率和准确率,数据清洗尤为重要,数据清洗之后进行或同时进行数据集成,转换,规约等一系列过程,该过程就是数据预处理.数据预处理一方面提高数据质量,另一方面使数据更好地适应特定的数据挖掘或者工具. 1. 数据清洗 数据清洗就是删除掉原始数据集中的无关数据,重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值和...

Rcvisual的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数据预处理

介绍了数据预处理的基本概念,缺失值,异常值,重复值的处理方法,以及数据转换的方法,数据预处理常用的一些类库

JasonH2021的博客 1万+
上一篇: Python提取word文档中的文本和图片!
下一篇: Python爬虫入门--urllib和urllib2!
Python_trys
博客等级 码龄2年 4370粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值