Python数据分析之数据预处理

mport pandas as pd
import numpy as np
import random as rnd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt  
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

  在数据挖掘中,海量的原始数据中存在着大量不完整(有缺失值)、不--致、有异常的数据,严重影响到数据挖掘建模的执行效率,甚至可能导致挖掘结果的偏差,所以进行数据清洗就显得尤为重要,数据清洗完成后接着进行或者同时进行数据集成、转换、规约等--系列的处理,该过程就是数据预处理。

  数据预处理的目的:

  • 提高数据的质量
  • 让数据更好地适应特定的挖掘技术或工具。

  数据预处理的主要内容包括数据清洗、数据集成、数据变换和数据规约。

 

数据清洗

  数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值、异常值等。

缺失值处理

  对缺失值的处理主要包括三类方法:删除缺失记录、数据插补、不处理

常用的插补方法

  • 均值/中位数/众数插补:根据属性类型,取该属性的均值/中位数/众数进行插补。
  • 固定值插补:将缺失的属性值用一-个常量替换。如广州一个工厂普通外来务工人员的“基本工资”属性的空缺值可以用广州市普通外来务工人员工资标准1895元/月。
  • 最近邻插补:在记录中找到与缺失样本最接近的样本的该属性值插补。
  • 回归方法:对带有缺失值的属性使用已有数据进行回归预测,使用模型预测值来插补缺失值。
  • 插值法:利用样本点建立插值函数$f(x)$,未知值由对应的$f(x)$给出。

拉格朗日插值法

  由泰勒定理,任意函数可用足够高阶的多项式和近似,即f(x)=\sum_{i=0}^n a_ix^if(x)=i=0∑n​ai​xi

  插值法就是使用某一自变量(通常是index或者序数)计算另一属性的缺失值y_j=f(x_j)yj​=f(xj​)

  因此,需要求解插值函数$f(x)$的表达式,即求解$a_i,i=0,1,...,n$,这需要$n+1$个样本点$(x_j,y_j),j=1,2,...,n+1$,将样本点代入上述方程a_0+a_1x_1+a_2x_1^2+...+a_nx_1^n=y_1a0​+a1​x1​+a2​x12​+...+an​x1n​=y1​a_0+a_1x_2+a_2x_2^2+...+a_nx_2^n=y_2a0​+a1​x2​+a2​x22​+...+an​x2n​=y2​......a_0+a_1x_{n+1}+a_2x_{n+1}^2+...+a_nx_{n+1}^n=y_{n+1}a0​+a1​xn+1​+a2​xn+12​+...+an​xn+1n​=yn+1​

  显然以上线性方程组的系数矩阵为范德蒙矩阵,因此,有唯一解,即有唯一$f(x)$,在实际计算中,直接求解上述矩阵比较复杂。拉格朗日插值法应运而生,拉格朗日插值法实际上是一种求$f(x)$的计算方法:f(x)=\sum_{i=1}^{n+1} y_i\prod_{j\neq i}\frac{(x-x_j)}{(x_i-x_j)}f(x)=i=1∑n+1​yi​j=i∏​(xi​−xj​)(x−xj​)​

  观察上式可以发现,这是一个x的n阶多项式,且过点所有$(x_m,y_m)$,即上式即为所求。

插值实例

df = pd.read_excel('Python数据分析与挖掘实战/chapter3/demo/data/catering_sale.xls')
df.head(3)
日期销量
02015-03-0151.0
12015-02-282618.2
22015-02-272608.4
df.isnull().sum()
日期    0
销量    1
dtype: int64

  可以看出,销量存在缺失值,使用拉格朗日法对缺失值进行插补,首先将异常值过滤为缺失值,然后对每一列的缺失值进行插值,插值的自变量为缺失值的前后k个数据的index。

from scipy.interpolate import lagrange

df['销量'][(df['销量'] < 400) | (df['销量'] > 5000)] = None  # 过滤异常值,将其变为空值

def lagrange_(s,n,k=4):
    """
    s:需要插值的列
    n:缺失值的index
    k:插值使用前后k个数据
    """
    l = list(range(n-k,n)) + list(range(n+1,n+1+k))
    y = s[[i for i in l if i >=0]] #取出前后k项数据的值
    y = y[y.notnull()] #剔除空值
    return lagrange(y.index, list(y))(j)

#对整个datafram进行插值
for i in df.columns:
    for j in range(len(df)):
        if df[i].isnull()[j]:
            df[i][j]=lagrange_(df[i],j)
df.to_excel('outputfile.xlsx')

异常值处理

异常值处理方法方法描述
删除含有异常值的记录直接将含有异常值的记录删除
视为缺失值将异常值视为缺失值,利用缺失值处理的方法进行处理
平均值修正可用前后两个观测值的平均值修正该异常值
不处理直接在具有异常值的数据集.上进行挖掘建模

数据集成

  • 数据集成:将多个数据源合并存放在一个一致的数据存储(如数据仓库)中的过程。

  数据挖掘需要的数据往往分布在不同的数据源中,这时需要进行数据集成。在数据集成时,来自多个数据源的现实世界实体的表达形式是不一样的,有可能不匹配,要考虑实体识别问题和属性冗余问题,从而将源数据在最低层上加以转换、提炼和集成。

实体识别

  • 实体识别:从不同数据源识别出现实世界的实体,它的任务是统一不同源数据的矛盾之处,常见形式如下:

    1. 同名异义:数据源A中的属性ID和数据源B中的属性ID分别描述的是菜品编号和订单编号,即描述的是不同的实体。
    2. 异名同义:数据源A中的sales__dt和数据源B中的sales_date都是描述销售日期的,即A.sales__dt=B.sales_date。
    3. 单位不统一:描述同一个实体分别用的是国际单位和中国传统的计量单位。

  检测和解决这些冲突就是实体识别的任务。

冗余属性识别

  数据集成往往导致数据冗余,例如:

  • 同一属性多次出现;
  • 同--属性命名不一致导致重复。

  仔细整合不同源数据能减少甚至避免数据冗余与不一致,从而提高数据挖掘的速度和质量。对于冗余属性要先分析,检测到后再将其删除。

  有些冗余属性可以用相关分析检测。给定两个数值型的属性A和B,根据其属性值,用相关系数度量一个属性在多大程度上蕴含另一一个属性。

数据变换

  数据变换主要是对数据进行规范化处理,将数据转换成“适当的”形式,以适用于挖掘任务及算法的需要。

简单函数变换

  简单函数变换是对原始数据进行某些数学函数变换,常用的变换包括平方、开方、取对数、差分运算等,即:
x'=x^2x′=x2x'=\sqrt xx′=x​x'=log xx′=logxx'=f(x_{k+1})-f(x_{k})x′=f(xk+1​)−f(xk​)

规范化

  • 数据规范化(归一化):对数据进行标准化处理,将数据按照比例进行缩放,使之落入一个特定的区域,便于进行综合分析。

  归一化处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲,数值间的差别可能很大,不进行处理可能会影响到数据分析的结果。为了消除指标之间的量纲和取值范围差异的影响,需要进行归一化。如将工资收入属性值映射到[-1,1]或者[0,1]内。数据规范化对于基于距离的挖掘算法尤为重要。

  • 最小-最大规范化(MinMaxScaler)

x'=\frac{x-x_{min}}{x_{max}-x_{min}}x′=xmax​−xmin​x−xmin​​

from sklearn.preprocessing import MinMaxScaler

data = pd.read_excel('Python数据分析与挖掘实战/chapter4/demo/data/normalization_data.xls',header=None)
data
0123
0785216022863
1144-600-5212245
295-457468-1283
3695966951054
41905276912051
51014034702487
61464134352571
scaler = MinMaxScaler().fit(data)
pd.DataFrame(scaler.transform(data))
0123
00.0743800.9372910.9235201.000000
10.6198350.0000000.0000000.850941
20.2148760.1195650.8133220.000000
30.0000001.0000001.0000000.563676
41.0000000.9423080.9967110.804149
50.2644630.8386290.8149670.909310
60.6363640.8469900.7861840.929571
  • 零均值规范化(StandardScaler)

x'=\frac{x-\mu}{\sigma}x′=σx−μ​

  依然使用上述数据:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler().fit(data)
pd.DataFrame(scaler.transform(data))
0123
0-0.9779260.6868110.5017510.862099
10.653127-1.714885-2.3688910.398987
2-0.557806-1.4085130.159216-2.244798
3-1.2003420.8474950.739480-0.493515
41.7899220.6996660.7292550.253609
5-0.4095290.4340010.1643290.580335
60.7025530.4554250.0748610.643283

连续变量离散化

  一些数据挖掘算法,特别是某些分类算法( 如ID3算法、Apriori 算法等),要求数据是分类属性形式。这样,常常需要将连续变量变换成分类变量,即连续变量离散化。

离散化的基本方法

  离散化的基本方法就是将连续变量的值区间划分为若干个区间,用不同符号代表不同区间中的值。

常用离散化的方法

  • 等宽分组:将值域划分为宽度相等的区间,区间个数由用户指定,类似于制作频率分布表。

  下面将“肝气郁结证型系数”数据划分为4个不同的类。

data = pd.read_excel('Python数据分析与挖掘实战/chapter4/demo/data/discretization_data.xls')
data.head(3)
肝气郁结证型系数
00.056
10.488
20.107
k=4
r = pd.cut(data['肝气郁结证型系数'],k,labels=range(k))
for i in range(4):
    plt.plot(data[r==i],[i]*(data[r==i].count()['肝气郁结证型系数']),'o')
p = plt.title('等宽分组结果')

  • 等频分组:分组后每个区间数据量相同。
r = pd.qcut(data['肝气郁结证型系数'],k,labels=range(k))
for i in range(k):
    plt.plot(data[r==i],[i]*(data[r==i].count()['肝气郁结证型系数']),'o')
p = plt.title('等频分组结果')

 

  • 聚类分组:使用聚类算法进行分组。
from sklearn.cluster import KMeans

KM = KMeans(n_clusters=k).fit(data['肝气郁结证型系数'].values.reshape(len(data['肝气郁结证型系数'].values),1))
r = KM.labels_
for i in range(k):
    plt.plot(data[r==i],[i]*(data[r==i].count()['肝气郁结证型系数']),'o')
p = plt.title('等频分组结果')

 

属性构造

  在数据挖掘的过程中,为了提取更有用的信息,挖掘更深层次的模式,提高挖掘结果的精度,我们需要利用已有的属性集构造出新的属性,并加入到现有的属性集合中。比如,进行防窃漏电诊断建模时,已有的属性包括供入电量、供出电量(线路上各大用户用电量之和)。理论上供入电量和供出电量应该是相等的,但是由于在传输过程中存在电能损耗,使得供入电量略大于供出电量,如果该条线路上的一个或多个大用户存在窃漏电行为,会使得供入电量明显大于供出电量。
  为了判断是否有大用户存在窃漏电行为,可以构造出一个新的指标——线损率,该过程就是构造属性。新构造的属性线损率按如下公式计算。线损率=\frac{供入电量-供出电量}{供入电量}\times100\%线损率=供入电量供入电量−供出电量​×100%线损率的正常范围一般在3%~15%,如果远远超过该范围,就可以认为该条线路的大用户很可能存在窃漏电等用电异常行为。

数据规约

  在大数据集上进行复杂的数据分析和挖掘需要很长的时间,数据规约产生更小但保持原数据完整性的新数据集。在规约后的数据集上进行分析和挖掘将更有效率。数据规约的意义在于:

  • 降低无效、错误数据对建模的影响,提高建模的准确性;
  • 少量且具代表性的数据将大幅缩减数据挖掘所需的时间;
  • 降低储存数据的成本。

特征规约

  特征规约通过特征合并来创建新特征,或者直接通过删除不相关的特征(维)来减少数据维数,从而提高数据挖掘的效率、降低计算成本。特征规约的目标是寻找出最小的特征子集并确保新数据子集的概率分布尽可能地接近原来数据集的概率分布。特征规约有合并特征、向前选择、向后删除、主成分分析等方法。

  简单来说,特征规约就是减少数据列数。

  • 主成分分析的python实现

  逐步向前选择、逐步向后删除和决策树归纳是属于直接删除不相关属性(维)方法。主成分分析是一种用于连续属性的数据降维方法,它构造了原始数据的-一个正交变换,新空间的基底去除了原始空间基底下数据的相关性,只需使用少数新变量就能够解释原始数据中的大部分变异。在应用中,通常是选出比原始变量个数少,能解释大部分数据中的变量的几个新变量,即所谓主成分,来代替原始变量进行建模。

data = pd.read_excel('Python数据分析与挖掘实战/chapter4/demo/data/principal_component.xls',header=None)
data.head(3)
01234567
040.424.77.26.18.38.72.44220.0
125.012.711.211.012.920.23.5429.1
213.23.33.94.34.45.50.5783.6
data.shape
(14, 8)
from sklearn.decomposition import PCA

pca = PCA(n_components=3).fit(data)
data_pca = pca.transform(data)
data_pca,pca.explained_variance_ratio_.sum()
(array([[  8.19133694,  16.90402785,   3.90991029],
        [  0.28527403,  -6.48074989,  -4.62870368],
        [-23.70739074,  -2.85245701,  -0.4965231 ],
        [-14.43202637,   2.29917325,  -1.50272151],
        [  5.4304568 ,  10.00704077,   9.52086923],
        [ 24.15955898,  -9.36428589,   0.72657857],
        [ -3.66134607,  -7.60198615,  -2.36439873],
        [ 13.96761214,  13.89123979,  -6.44917778],
        [ 40.88093588, -13.25685287,   4.16539368],
        [ -1.74887665,  -4.23112299,  -0.58980995],
        [-21.94321959,  -2.36645883,   1.33203832],
        [-36.70868069,  -6.00536554,   3.97183515],
        [  3.28750663,   4.86380886,   1.00424688],
        [  5.99885871,   4.19398863,  -8.59953736]]),
 0.9737201283709646)

  可以看出原始数据从8维降到3维,并包含了原数据97%的信息。

数值规约

  数值规约指通过选择替代的、较小的数据来减少数据量,包括有参数方法和无参数方法两类。有参数方法是使用一个模型来评估数据,只需存放参数,而不需要存放实际数据,例如回归(线性回归和多元回归)和对数线性模型(近似离散属性集中的多维概率分布)。无参数方法就需要存放实际数据,例如直方图、聚类、抽样(采样)。

  例如,抽样、分箱等都属于数值规约方法。``

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Pandas是一个Python库,用于数据处理和分析。在数据分析中,预处理是非常重要的一步,因为它可以帮助我们清洗和转换数据,使其更适合进行分析。Pandas提供了一些强大的预处理功能,包括数据清洗、数据转换、数据重塑和数据合并等。在使用Pandas进行数据分析时,预处理是必不可少的一步。 ### 回答2: 在数据分析中,数据的预处理是一个必要的过程。它的主要目的是清洗数据,准备数据,以便后续分析。在Python中,pandas是一种广泛使用的数据处理库。pandas可以通过其高效的数据结构和操作方法来清洗和处理数据。在本文中,将介绍pandas预处理的一些常见技术。 一、读取数据 在pandas中,使用read_csv()函数读取CSV格式的数据文件,read_excel()函数读取Excel格式的数据文件。它们都有很多选项,可以根据具体文件的格式进行设置。 二、查看数据 在pandas中,使用以下函数来查看数据: 1. head() - 显示数据框的前几行; 2. tail() - 显示数据框的后几行; 3. columns - 显示数据框的列名; 4. shape - 显示数据框的行列数; 5. info() - 显示数据框的基本信息,包括每列的名称、非空值数量和数据类型。 三、数据清洗 在数据清洗中,有以下一些常见的技术: 1. 删除重复行:使用drop_duplicates()函数; 2. 替换空值:使用fillna()函数; 3. 删除空值:使用dropna()函数; 4. 更改数据类型:使用astype()函数。 四、数据准备 在数据准备中,有以下一些常见的技术: 1. 数据合并:使用merge()函数; 2. 数据筛选:使用loc()函数或者iloc()函数; 3. 数据分组:使用groupby()函数; 4. 数据排序:使用sort_values()函数。 五、数据分析数据分析中,有以下一些常见的技术: 1. 数据聚合:使用agg()函数; 2. 统计描述:使用describe()函数; 3. 数据可视化:使用matplotlib或者seaborn库。 综上所述,pandas预处理是数据分析中必不可少的一步。通过使用pandas提供的函数和方法,可以方便地清理和处理数据,使其更容易被分析。 ### 回答3: Pandas是Python中最强大的数据处理库之一,它提供了DataFrame和Series这两种数据结构,可以快速便捷地处理数据。在数据分析过程中,我们往往需要先对数据进行预处理,以便后续的分析。Pandas提供了一系列的方法和函数,可以帮助我们进行数据的预处理。 首先,在进行数据分析之前,我们需要了解自己所面对的数据类型和数据结构。Pandas中的DataFrame结构就是类似于表格的结构,每一行代表一个样本,每一列代表一个属性。Series则是一维的数组结构。通过pandas.read_csv(),我们可以读取CSV格式的数据,并转化为DataFrame结构。 接下来,我们要对数据进行一些基本的处理,例如数据清洗、数据去重、缺失值处理、异常值处理等。在数据清洗过程中,我们往往需要对数据进行一些特殊的处理,例如字符串的分割、合并、替换等操作,Pandas提供了一系列能够对文本进行操作的函数。在数据去重方面,我们可以使用drop_duplicates()函数,它可以去除DataFrame中的重复记录。在处理缺失值时,Pandas提供了一系列的函数,如fillna()函数、dropna()函数,可以方便地将NaN值变为其他有意义的值,或者删除缺失值的行或列。在异常值处理方面,我们可以使用isoutlier()函数来找到数据中的异常值,并进行处理。 在数据预处理完成后,我们可以对数据进行一些统计分析,例如计算小计、计算总计、分位数、极差、方差、标准差等统计指标。我们可以使用describe()函数来获得数据的统计描述,还可以使用groupby()函数来对数据分组,使用agg()函数对每组进行计算统计指标。此外,我们还可以对数据进行排序、丢弃、合并等操作。 总之,Pandas是一个非常强大的Python库,可以轻松处理数据预处理和数据处理方面的任务。Pandas作为数据分析和数据处理的基础库,使用熟练后可以在数据分析中发挥更大的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值