您好,登录后才能下订单哦!
本篇内容介绍了“python数据分析的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
数据预处理一方面是要提高数据的质量,另一方面是要让 数据更好地适应特定的挖掘技术或工具。统计发现,在数据挖掘的过程中,数据预处理工作量占到了整个过程的60%。
数据清洗主要是删除原始数据集中的无关数 据、重复数据,平滑噪声数据,筛选掉与挖掘主 题无关的数据,处理缺失值、异常值等。
处理缺失值的方法可分为3类:删除记录、 数据插补和不处理。其中常用的数据插补方法
表4-1常用的插补方法
插补方法 | 方法描述 |
---|---|
均值/中位数/众数插补 | 根据属性值的类型,用该属性取值的平均数/中位数/众数进行插补 |
使用固定值 | 将缺失的属性值用一个常量替换。如广州一个工厂普通外来务工人员的“基本工资”属性的空缺值可以用2015年广州市普通外来务工人员工资标准1895元/月,该 方法就是使用固定值 |
最近临插补 | 在记录中找到与缺失样本最接近的样本的该属性值插补 |
回归方法 | 对带有缺失值的变量,根据已有数据和与其有关的其他变量(因变量)的数据建立拟合模型来预测缺失的属性值 |
插值法 | 插值法是利用已知点建立合适的插值函数f(x),未知值由对应点X,求出的函数值f(xi),近似代替 |
如果通过简单的删除小部分记录达到既定的目标,那么删除含有缺失值的记录的方法是最有效的。然而,这种方法却有很大的局限性。它是以减少历史数据来换取数据的完备,会造成资源的大量浪费,将丢弃了大量隐藏在这些记录中的信息。尤其在数据集本来就包含很少记录的情况下,删除少量记录可能会严重影响到分析结果的客观性和正确性。一些模型可以将缺失值视作一种特殊的取值,允许直接在含有缺失值的数据上进行建模。
本节重点介绍拉格朗日插值法和牛顿插值法。其他的插值方法还有Hermite插值、分段插值、样条插值法等。
牛顿插值法也是多项式插值,但采用了另一种构造插值多项式的方法,与拉格朗日插值相比,具有承袭性和易于变动节点的特点。从本质上来说,两者给出的结果是一样的(相同 次数、相同系数的多项式),只不过表示的形式不同。因此,在Python的Scipy库中,只提 供了拉格朗日插值法的函数(因为实现上比较容易),如果需要牛顿插值法,则需要自行编写
代码清单4-1,用拉格朗日法进行插补
# -*- coding:utf-8 -*- #拉格朗日插值代码 import pandas as pd #导入数据分析库Pandas from scipy.interpolate import lagrange #导入拉格朗日插值函数 inputfile = '../data/catering_sale.xls' #销量数据路径 outputfile = '../tmp/sales.xls' #输出数据路径 data = pd.read_excel(inputfile) #读入数据 data[u'销量'][(data[u'销量'] < 400) | (data[u'销量'] > 5000)] = None #过滤异常值,将其变为空值 #自定义列向量插值函数 #s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5 def ployinterp_column(s, n, k=5): y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数 y = y[y.notnull()] #剔除空值 return lagrange(y.index, list(y))(n) #插值并返回插值结果 #逐个元素判断是否需要插值 for i in data.columns: for j in range(len(data)): if (data[i].isnull())[j]: #如果为空即插值。 data[i][j] = ployinterp_column(data[i], j) data.to_excel(outputfile) #输出结果,写入文件
在数据预处理时,异常值是否剔除,需视具体情况而定,因为有些异常值可能蕴含着有 用的信息。异常值处理常用方法见表4-3。
表4-3异常值处理常用方法
异常值处理方法 | 方法描述 |
---|---|
删除含有异常值的记录 | 直接将含有异常值的记录删除 |
视为缺失值 | 将异常值视为缺失值,利用缺失值处理的方法进行处理 |
平均值修正 | 可用前后两个观测值的平均值修正该异常值 |
不处理 | 直接在具有异常值的数据集上进行挖掘建模 |
数据挖掘需要的数据往往分布在不同的数据源中,数据集成就是将多个数据源合并存放 在一个一致的数据存储(如数据仓库)中的过程。
在数据集成时,来自多个数据源的现实世界实体的表达形式是不一样的,有可能不匹配,要考虑实体识别问题和属性冗余问题,从而将源数据在最低层上加以转换、提炼和集成。
实体识别是指从不同数据源识别出现实世界的实体,它的任务是统一不同源数据的矛盾之处,常见形式如下。
(1 )同名异义
数据源A中的属性ID和数据源B中的属性ID分别描述的是菜品编号和订单编号,即 描述的是不同的实体。
(2) 异名同义
数据源A中的sales_dt和数据源B中的sales_date都是描述销售日期的,即A. sales_dt= B. sales_date。
(3 )单位不统一
描述同一个实体分别用的是国际单位和中国传统的计量单位。
检测和解决这些冲突就是实体识别的任务。
数据集成往往导致数据冗余,例如,
同一属性多次出现;
同一属性命名不一致导致重复。
数据变换主要是对数据进行规范化处理,将数据转换成“适当的”形式,以适用于挖掘任务及算法的需要。
简单函数变换是对原始数据进行某些数学函数变换,常用的变换包括平方、开方、取对数、差分运算等。
简单的函数变换常用来将不具有正态分布的数据变换成具有正态分布的数据。
数据规范化(归一化)处理是数据挖掘的一项基础工作。不同评价指标往往具有不同的量纲,数值间的差别可能很大,不进行处理可能会影响到数据分析的结果。为了消除指标之间的量纲和取值范围差异的影响,需要进行标准化处理,将数据按照比例进行缩放,使之落 入一个特定的区域,便于进行综合分析。如将工资收入属性值映射到[-1,1]或者[0,1]内。
数据规范化对于基于距离的挖掘算法尤为重要。
(1)最小-最大规范化
最小-最大规范化也称为离差标准化,是对原始数据的线性变换,将数值值映射到[0,1]之间。
(2 )零-均值规范化
零-均值规范化也称标准差标准化,经过处理的数据的均值为0,标准差为1。是当前用得最多的数据标准化方法。
(3) 小数定标规范化
通过移动属性值的小数位数,将属性值映射到[-1,1]之间,移动的小数位数取决于属性值绝对值的最大值。
代码清单4-2数据规范化代码
#-*- coding: utf-8 -*- #数据规范化 import pandas as pd import numpy as np datafile = '../data/normalization_data.xls' #参数初始化 data = pd.read_excel(datafile, header = None) #读取数据 (data - data.min())/(data.max() - data.min()) #最小-最大规范化 (data - data.mean())/data.std() #零-均值规范化 data/10**np.ceil(np.log10(data.abs().max())) #小数定标规范化
一些数据挖掘算法,特别是某些分类算法(如ID3算法、Apriori算法等),要求数据是 分类属性形式。这样,常常需要将连续属性变换成分类属性,即连续属性离散化。
离散化的过程
连续属性的离散化就是在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。所以, 离散化涉及两个子任务:确定分类数以及如何将连续属性值映射到这些分类值。
常用的离散化方法
常用的离散化方法有等宽法、等频法和(一维)聚类。
(1 )等宽法
将属性的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定,或者由用 户指定,类似于制作频率分布表。
(2 )等频法
将相同数量的记录放进每个区间。
这两种方法简单,易于操作,但都需要人为地规定划分区间的个数。同时,等宽法的缺点在于它对离群点比较敏感,倾向于不均匀地把属性值分布到各个区间。有些区间包含许多数据,而另外一些区间的数据极少,这样会严重损坏建立的决策模型。等频法虽然避免了上述问题的产生,却可能将相同的数据值分到不同的区间以满足每个区间中固定的数据个数。
(3)基于聚类分析的方法
一维聚类的方法包括两个步骤,首先将连续属性的值用聚类算法(如K-Means算法)进 行聚类,然后再将聚类得到的簇进行处理,合并到一个簇的连续属性值并做同一标记。聚类分析的离散化方法也需要用户指定簇的个数,从而决定产生的区间数。
代码清单4-3数据离散化
#-*- coding: utf-8 -*- #数据规范化 import pandas as pd datafile = '../data/discretization_data.xls' #参数初始化 data = pd.read_excel(datafile) #读取数据 data = data[u'肝气郁结证型系数'].copy() k = 4 d1 = pd.cut(data, k, labels = range(k)) #等宽离散化,各个类比依次命名为0,1,2,3 #等频率离散化 w = [1.0*i/k for i in range(k+1)] w = data.describe(percentiles = w)[4:4+k+1] #使用describe函数自动计算分位数 w[0] = w[0]*(1-1e-10) d2 = pd.cut(data, w, labels = range(k)) def cluster_plot(d, k): #自定义作图函数来显示聚类结果 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号 plt.figure(figsize = (8, 3)) for j in range(0, k): plt.plot(data[d==j], [j for i in d[d==j]], 'o') plt.ylim(-0.5, k-0.5) return plt if __name__=='__main__': from sklearn.cluster import KMeans # 引入KMeans kmodel = KMeans(n_clusters=k, n_jobs=4) # 建立模型,n_jobs是并行数,一般等于CPU数较好 kmodel.fit(data.values.reshape((len(data), 1))) # 训练模型 c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0) # 输出聚类中心,并且排序(默认是随机序的) w = c.rolling(2).mean().iloc[1:] # 相邻两项求中点,作为边界点 w = [0] + list(w[0]) + [data.max()] # 把首末边界点加上 d3 = pd.cut(data, w, labels=range(k)) cluster_plot(d1, k).show() cluster_plot(d2, k).show() cluster_plot(d3, k).show()
等宽离散化结果
等频离散化结果
(一维)聚类离散化结果
在数据挖掘的过程中,为了提取更有用的信息,挖掘更深层次的模式,提高挖掘结果的 精度,我们需要利用已有的属性集构造出新的属性,并加入到现有的属性集合中。
代码清单4-4线损率属性构造
#-*- coding: utf-8 -*- #线损率属性构造 import pandas as pd #参数初始化 inputfile= '../data/electricity_data.xls' #供入供出电量数据 outputfile = '../tmp/electricity_data.xls' #属性构造后数据文件 data = pd.read_excel(inputfile) #读入数据 data[u'线损率'] = (data[u'供入电量'] - data[u'供出电量'])/data[u'供入电量'] data.to_excel(outputfile, index = False) #保存结果
小波变换的同是一种新型的数据分析工具,是近年来兴起的信号分析手段。小波分析的理论和方法在信号处理、图像处理、语音处理、模式识别、量子物理等领域得到越来越广泛的应用,它被认为是近年来在工具及方法上的重大突破。小波变换具有多分辨率的特点,在 时域和频域都具有表征信号局部特征的能力,通过伸缩和平移等运算过程对信号进行多尺度 聚焦分析,提供了一种非平稳信号的时频分析手段,可以由粗及细地逐步观察信号,从中提取有用信息。
能够刻画某个问题的特征量往往是隐含在一个信号中的某个或者某些分量中,小波变换 可以把非平稳信号分解为表达不同层次、不同频带信息的数据序列,即小波系数。选取适当的小波系数,即完成了信号的特征提取。下面将介绍基于小波变换的信号特征提取方法。
(1)基于小波变换的特征提取方法
基于小波变换的特征提取方法主要有:基于小波变换的多尺度空间能量分布特征提取、 基于小波变换的多尺度空间的模极大值特征提取、基于小波包变换的特征提取、基于适应性小波神经网络的特征提取,详见表4-5。
表4-5基于小波变换的特征提取方法
基于小波变换的特征提取方法 | 方法描述 |
---|---|
基于小波变换的多尺度空间 能量分布特征提取方法 | 各尺度空间内的平滑信号和细节信号能提供原始信号的时频局域信息,特别 是能提供不同频段上信号的构成信息。把不同分解尺度上信号的能量求解出来, 就可以将这些能量尺度顺序排列,形成特征向量供识别用 |
基于小波变换的多尺度空间 的模极大值特征提取方法 | 利用小波变换的信号局域化分析能力,求解小波变换的模极大值特性来检测 信号的局部奇异性,将小波变换模极大值的尺度参数S、平移参数,及其幅值作 为目标的特征量 |
基于小波包变换的特征提取 方法 | 利用小波分解,可将时域随机信号序列映射为尺度域各子空间内的随机系数 序列,按小波包分解得到的最佳子空间内随机系数序列的不确定性程度最低, 将最佳子空间的嫡值及最佳子空间在完整二叉树中的位置参数作为特征量,可 以用于目标识别 |
基于适应性小波神经网络的 特征提取方法 | 基于适应性小波神经网络的特征提取方法可以把信号通过分析小波拟合表示, 进行特征提取 |
利用小波变换可以对声波信号进行特征提取,提取出可以代表声波信号的向量数据,即完成从声波信号到特征向量数据的变换。
在Python中,Scipy本身提供了一些信号处理函数,但不够全面, 而更好的信号处理库是PyWavelets (pywt)。
代码清单4-5,小波变换特征提取代码
#-*- coding: utf-8 -*- #利用小波分析进行特征分析 #参数初始化 inputfile= '../data/leleccum.mat' #提取自Matlab的信号文件 from scipy.io import loadmat #mat是MATLAB专用格式,需要用loadmat读取它 mat = loadmat(inputfile) signal = mat['leleccum'][0] import pywt #导入PyWavelets coeffs = pywt.wavedec(signal, 'bior3.7', level = 5) #返回结果为level+1个数字,第一个数组为逼近系数数组,后面的依次是细节系数数组
在大数据集上进行复杂的数据分析和挖掘需要很长的时间,数据规约产生更小但保持原数据完整性的新数据集。在规约后的数据集上进行分析和挖掘将更有效率。
数据规约的意义在于:
降低无效、错误数据对建模的影响,提高建模的准确性;
少量且具代表性的数据将大幅缩减数据挖掘所需的时间;
降低储存数据的成本。
属性规约通过属性合并来创建新属性维数,或者直接通过删除不相关的属性(维)来减少数据维数,从而提高数据挖掘的效率、降低计算成本。属性规约的目标是寻找出最小的属性子集并确保新数据子集的概率分布尽可能地接近原来数据集的概率分布。
逐步向前选择、逐步向后删除和决策树归纳是属于直接删除不相关属性(维)方法。主成分分析是一种用于连续属性的数据降维方法,它构造了原始数据的一个正交变换,新空间的基底去除了原始空间基底下数据的相关性,只需使用少数新变量就能够解释原始数据中的 大部分变异。在应用中,通常是选出比原始变量个数少,能解释大部分数据中的变量的几个新变量,即所谓主成分,来代替原始变量进行建模。
计算主成分:
在Python中,主成分分析的函数位于Scikit-Leam下:
sklearn.decomposition.PCA(n_components = None,copy = True,whiten = False)
参数说明:
(1) n_components
意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n。
类型:int或者string,缺省时默认为None,所有成分被保留。赋值为int,比如n_components =1将把原始数据降到一个维度。赋值为string,比如n_components =‘mle’,将自动选取特征个数n,使得满足所要求的方差百分比。
(2 ) copy
类型:bool, True或者False,缺省时默认为True。
意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA 算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;若为 False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。
(3 ) whiten
类型:bool,缺省时默认为False。
意义:白化,使得每个特征具有相同的方差。
使用主成分分析降维的程序如代码清单4-6所示。
代码清单4-6,主成分分析降维代码
#-*- coding: utf-8 -*- #主成分分析 降维 import pandas as pd #参数初始化 inputfile = '../data/principal_component.xls' outputfile = '../tmp/dimention_reducted.xls' #降维后的数据 data = pd.read_excel(inputfile, header = None) #读入数据 from sklearn.decomposition import PCA pca = PCA() pca.fit(data) print(pca.components_ )#返回模型的各个特征向量 print(pca.explained_variance_ratio_) #返回各个成分各自的方差百分比(贡献率) ''' 方差百分比越大,说明向量的权 重越大 当选取前4个主成分时,累计贡献率已达到97.37%,说明选取前3个主成分进行计算已经相当不错了, 因此可以重新建立PCA模型,设置n_components=3,计算出成分结果。 ''' pca = PCA(n_components=3) pca.fit(data) low_d = pca.transform(data) #用它来降低维度 print(low_d) pd.DataFrame(low_d).to_excel(outputfile) #保存结果 pca.inverse_transform(low_d) #必要时可inverse_transform()函数来复原数据
数值规约指通过选择替代的、较小的数据来减少数据量,包括有参数方法和无参数方法两类。有参数方法是使用一个模型来评估数据,只需存放参数,而不需要存放实际数据,例如回归(线性回归和多元回归)和对数线性模型(近似离散属性集中的多维概率分布)。无参数方法就需要存放实际数据,例如直方图、聚类、抽样(采样)。
表4-7 Python主要数据预处理函数
函数名 | 函数功能 | 所属扩展库 |
---|---|---|
interpolate | 一维、高维数据插值 | Scipy |
unique | 去除数据中的重复元素,得到单值元素列表,它是对象的方法名 | Pandas/Numpy |
isnull | 判断是否空值 | Pandas |
notnull | 判断是否非空值 | Pandas |
PCA | 对指标变量矩阵进行主成分分析 | Scikit-Leam |
random | 生成随机矩阵 | Numpy |
(1 ) interpolate
1 ) 功能:interpolate是Scipy的一个子库,包含了大量的插值函数,如拉格朗日插值、 样条插值、高维插值等。使用前需要用from scipy.interpolate import *
引入相应的插值函数, 读者应该根据需要到官网查找对应的函数名。
2 ) 使用格式:f = scipy.interpolate.lagrange(x, y)
。这里仅仅展示了一维数据的拉格朗日插值的命令,其中x,y为对应的自变量和因变量数据。插值完成后,可以通过f(a)计算新的 插值结果。类似的还有样条插值、多维数据插值等,此处不一一展示。
(2) unique
1 ) 功能:去除数据中的重复元素,得到单值元素列表。它既是Numpy库的一个函数 (np.unique()),也是Series对象的一个方法。
2 ) 使用格式:
np.unique(D), D 是一维数据,可以是 list、array、Series;
D.unique(), D 是 Pandas 的 Series 对象。
3 ) 实例:求向量A中的单值元素,并返回相关索引。
> D = pd.Series ([1, 1, 2, 3, 5]) > D.unique () array([1, 2, 3, 5], dtype=int64) > np.unique (D) array([1, 2, 3, 5], dtype=int64)
(3) isnull/ notnull
1 ) 功能:判断每个元素是否空值/非空值。
2 ) 使用格式:D.isnull()/ D.notnull()。这里的D要求是Series对象,返回一个布尔 Series。可以通过D[D.isnull()]或D[D.notnull()]找出D中的空值/非空值。
(4) random
1 ) 功能:random是Numpy的一个子库(Python本身也自带了 random,但Numpy的更加强大),可以用该库下的各种函数生成服从特定分布的随机矩阵,抽样时可使用。
2 ) 使用格式:
np.random.rand(k, m, n,…)生成一个k x m x n x…随机矩阵,其元素均匀分布在区 间(0,1)上;
np.random.randn(k, m, n,…)生成一个k x m x n x …随机矩阵,其元素服从标准正态分布。
(5) PCA
1 ) 功能:对指标变量矩阵进行主成分分析。使用前需要用from skleam.decomposition import PCA
引入该函数。
2 ) 使用格式:model = PCA()。注意,Scikit-Leam下的PCA是一个建模式的对象,也 就是说,一般的流程是建模,然后是训练model.fit(D), D为要进行主成分分析的数据矩阵, 训练结束后获取模型的参数,如.components_
获取特征向量,以及.explained_variance_ratio_
获取各个属性的贡献率等。
3 ) 实例:使用PCA()对一个10x4维的随机矩阵进行主成分分析。
from sklearn.decomposition import PCA D = np.random.rand(10,4) pca = PCA() pca.fit (D) PCA(copy=True, n_components=None, whiten=False) pca. components_ #返回模型的各个特征向量 pca.explained_variance_ratio_ #返回各个成分各自的方差百分比
“python数据分析的知识点有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。