前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >day9.数据集成和转换

day9.数据集成和转换

作者头像
DataScience
发布2020-06-04 14:50:32
1.1K0
发布2020-06-04 14:50:32
举报
文章被收录于专栏:A2DataA2DataA2Data

今天的内容是数据的集成和变换,在做数据分析和挖掘时,百分之八十的时间可能要花在数据预处理部分,准备好相应的数据。数据集成是将多个数据源的数据整合在一起,数据集成建立在对业务的理解之上;数据变换主要是对数据进行规范化处理,转换成适当的形式。

数据集成

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

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

什么是现实世界的实体,这里用到的是E-R(Entity-Relationship Model)模型,一种数据建模的概念。简单的来说,如果我们通过要数据建模解决现实的问题,那么数据要与现实中的事件或者物体相对应,数据记录了实体的名称,属性以及实体间的联系,数据不仅仅是字面含义,含有其在现实世界中的映射,这个概念了解即可。

实体识别

比如对于一件物品,它可能被记录在表A采购单中和表B销售单中,此时我们要整合两张表进行利润分析,此时我们通过选择某一列也叫字段把两者表共有的实体连接起来,首先要识别出实体;

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

(1)同名异义

如数据源A中的属性ID和数据源B中的属性ID分别描述的是物品编号和订单编号,即描述的是不同的实体。

(2)异名同义

数据源A中的sales_dt和数据源B中的sales_date都是描述销售日期的, 如:A.sales_dt=B.sales_date。

(3)单位不统一

描述同一个实体分别用的是国际单位和中国传统的计量单位。

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

冗余属性识别

得到分析的实体之后,我们要对其属性进行分析,比如物品的金额、尺寸、重量等。数据集成实体的属性时的经常会出现数据冗余,如:

1)同一属性多次出现;

2)同一属性命名不一致导致重复。

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

如果对于属性是否冗余不够确定,有些冗余属性可以用相关分析检测。给定两个数值型的属性A和B,根据其属性值,用相关系数度量一个属性在多大程度上蕴含另一个属性,相关性分析这里不做介绍。

数据集成的过程ETL

什么是ETL呢? ETL是英文Extract、Transform和Load的缩写,包括了数据抽取、转换、加载三个过程。抽取是将数据从已有的数据源中提取出来,转换是对原始数据进行处理,例如将表输入1和 表输入2 进行连接形成一张新的表(加载)。

ETL一般是对数据库中的表进行处理,使用ETL工具,对数据进行集成后再存放在数据库中,存放到数据仓库直接用来数据分析和挖掘。

典型的商业ETL工具有: Informatica PowerCenter、IBM InfoSphere DataStage、Oracle Data Integrator、Microsoft SQL Server Integration Services等,每种数据库的提供商会同时配有ETL的工具,但是是收费的。

开源软件有:Kettle、Talend、Apatar、Scriptella、DataX、Sqoop等

这里推荐使用Kettle,它是一个基于Java语言的易于使用的,低成本的解决方案。这里推荐一个Kettle的网站http://www.kettle.net.cn ,在社区里http://www.kettle.org.cn/,可以进行交流。对于ETL工具的使用这里不做多的讲解,除了数据分析师之外,在大型的公司里,还有个工作职位叫ETL工程师,对数据进行清洗和管理。

除了kettle这种ETL工具可以对传统的商业数据库中的数据进行处理;大数据时代,可以使用Apache的Sqoop,它是在Hadoop生态系统中使用的,主要用来在Hadoop和关系型数据库中传递数据。通过Sqoop,可以方便地将数据从关系型数据库导入到HDFS 中,或者将数据从HDFS导出到关系型数据库中。Hadoop实现了一个分布式文件系统,即HDFS。Hadoop的框架最核心的设计就是HDFS MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。

数据变换

数据变换主要是对数据进行规范化处理,将数据转换成“适当的”形式,以适用于挖掘任务及算法的需要,有以下几种常见的方法,包括简单函数变换、数据规范化、连续属性离散化、属性构造等。

简单函数变换

简单函数变换是对原始数据进行某些数学函数变换,常用的变换包括平方、开方、取对数、差分运算等,即:

简单的函数变换常用来将不具有正态分布的数据变换成具有正态分布的数据。在时间序列分析中,有时简单的对数变换或者差分运算就可以将非平稳序列转换成平稳序列。在数据挖掘中,简单的函数变换可能更有必要,比如个人年收入的取值范围为10000元到10亿元,这是一个很大的区间,使用对数变换对其进行压缩是常用的一种变换处理方法。

规范化

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

(1)最小-最大规范化

最小-最大规范化也称为离差标准化,是对原始数据的线性变换,将数值值映射到[0,1]之间。x是矩阵、数组中的中每一个元素。

转换公式如下:

其中,max为样本数据的最大值,min为样本数据的最小值。max-min为极差。离差标准化保留了原来数据中存在的关系,是消除量纲和数据取值范围影响的最简单方法。缺点是若数值集中且某个数值很大,则规范化后各值会接近于0,并且将会相差不大。若将来遇到超过目前属性[min,max]取值范围的时候,会引起系统出错,需要重新确定min和max。

(2)零-均值规范化

零-均值规范化也称标准差标准化(Z-score),化成标准正太分布,经过处理的数据的均值为0,标准差为1。

转化公式为:

其中 x-ba 为原始数据的均值,σ为原始数据的标准差,是当前用得最多的数据标准化方法

(3)小数定标规范化

通过移动属性值的小数位数,将属性值映射到[-1,1]之间,移动的小数位数取决于属性值的绝对值的最大值。如属性值的范围在[-986,917],那么绝对值的最大值是986,k=3。

转化公式为:

下面通过对一个矩阵使用上面3种规范化的方法处理,对比结果。代码如下:

数据获取请回复:DT13

#-*- coding: utf-8 -*-
#数据规范化
import pandas as pd
import numpy as np

datafile = 'DT13.xls' #参数初始化
data = pd.read_excel(datafile, header = None) #读取数据
print(data)
#最小-最大规范化
MinMax = (data - data.min())/(data.max() - data.min())
print(MinMax)
#零-均值规范化
Zscore = (data - data.mean())/data.std()
print(Zscore)
#小数定标规范化
decimal_scaling= data/10**np.ceil(np.log10(data.abs().max()))
print(decimal_scaling)

# 结果如下
'''
    0   1   2     3
0   78 521 602 2863
1 144 -600 -521 2245
2   95 -457 468 -1283
3   69 596 695 1054
4 190 527 691 2051
5 101 403 470 2487
6 146 413 435 2571

#MinMax [0,1]
        0         1         2         3
0 0.074380 0.937291 0.923520 1.000000
1 0.619835 0.000000 0.000000 0.850941
2 0.214876 0.119565 0.813322 0.000000
3 0.000000 1.000000 1.000000 0.563676
4 1.000000 0.942308 0.996711 0.804149
5 0.264463 0.838629 0.814967 0.909310
6 0.636364 0.846990 0.786184 0.929571

# Zscore X ~ N(0,1)
        0         1         2         3
0 -0.905383 0.635863 0.464531 0.798149
1 0.604678 -1.587675 -2.193167 0.369390
2 -0.516428 -1.304030 0.147406 -2.078279
3 -1.111301 0.784628 0.684625 -0.456906
4 1.657146 0.647765 0.675159 0.234796
5 -0.379150 0.401807 0.152139 0.537286
6 0.650438 0.421642 0.069308 0.595564

# Decimal Scaling [-1,1]
      0     1     2       3
0 0.078 0.521 0.602 0.2863
1 0.144 -0.600 -0.521 0.2245
2 0.095 -0.457 0.468 -0.1283
3 0.069 0.596 0.695 0.1054
4 0.190 0.527 0.691 0.2051
5 0.101 0.403 0.470 0.2487
6 0.146 0.413 0.435 0.2571

'''

连续属性数据的离散化

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

1.离散化的过程

连续属性的离散化就是在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。所以,离散化涉及两个子任务:确定分类数以及如何将连续属性值映射到这些分类值。

2.常用的离散化方法

常用的离散化方法有等宽法、等频法和(一维)聚类。

(1)等宽法

将属性的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定,或者由用户指定,类似于制作频率分布表。

(2)等频法

将相同数量的记录放进每个区间。

这两种方法简单,易于操作,但都需要人为地规定划分区间的个数。同时,等宽法的缺点在于它对离群点比较敏感,倾向于不均匀地把 属性值分布到各个区间。有些区间包含许多数据,而另外一些区间的数据极少,这样会严重损坏建立的决策模型。等频法虽然避免了上 述问题的产生,却可能将相同的数据值分到不同的区间以满足每个区间中固定的数据个数。

(3)基于聚类分析的方法

一维聚类的方法包括两个步骤,首先将连续属性的值用聚类算法(如K-Means算法)进行聚类,然后再将聚类得到的簇进行处理,合并到 一个簇的连续属性值并做同一标记。聚类分析的离散化方法也需要用户指定簇的个数,从而决定产生的区间数。

接下来使用上述3种离散化方法对“医学中中医证型的相关数据”进连续属性离散化的对比,该属性的示例数据如下表:

数据获取请回复:DT14

#-*- coding: utf-8 -*-
#数据规范化
import pandas as pd

datafile = 'DT14.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))


from sklearn.cluster import KMeans #引入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))

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

cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()

运行结果:将属性值分成0,1,2,3四类。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataScience 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据集成
    • 实体识别
      • 冗余属性识别
        • 数据集成的过程ETL
        • 数据变换
          • 简单函数变换
            • 规范化
              • 连续属性数据的离散化
              相关产品与服务
              数据集成
              数据集成(DataInLong)源于腾讯开源并孵化成功的 ASF 顶级项目 Apache InLong(应龙),依托 InLong 百万亿级别的数据接入和处理能力支持数据采集、汇聚、存储、分拣数据处理全流程,在跨云跨网环境下提供可靠、安全、敏捷的全场景异构数据源集成能力。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档