数据变换、可视化
数据变换前的准备工作:字段过滤、数据探索、相关性分析、建模筛选
- 在数据变换前,我们需要先对字段进行筛选,然后对数据进行探索和相关性分析,接着是选择算法模型(这里暂时不需要进行模型计算),然后针对算法模型对数据的需求进行数据变换,从而完成数据挖掘前的准备工作。
数据变换通过数据平滑、数据聚集、数据概化和规范化等方式将数据转换成适用于数据挖掘的形式。
常见变换方法:
-
数据平滑:去除数据中的噪声,将连续数据离散化,可采用分箱、聚类和回归的方式进行数据平滑。
-
数据聚集:对数据进行汇总
-
数据概化:将数据由较低的概念抽象成为较高的概念,减少数据复杂度。
-
数据规范化:使属性数据按比例缩放,将原来的数值映射到一个新的特定区域中。常用方法:最小—最大规范化、Z—score 规范化、按小数定标规范化等。
-
Min-max 规范化:将原始数据变换到[0,1]的空间中。新数值=(原数值-极小值)/(极大值-极小值)。
scikit-learn中调用:preprocessing.MinMaxScaler()
-
Z-Score 规范化:新数值=(原数值-均值)/ 标准差
优点:算法简单、不受量纲影响、结果易于比较
缺点:需要数据整体平均值和方差、结果没有实际意义,仅用于比较
scikit-learn中的调用:preprocessing.scale()
-
小数定标规范化:通过移动小数点的位置来进行规范化。小数点移动多少位取决于属性A的取值中的最大绝对值。
numpy方法实现:j = np.ceil(np.log10(np.max(abs(x))))
scaled_x = x/(10**j)
-
-
属性构造:构造出新的属性并添加到属性集中。
数据可视化视图根据其目的可分为:
- 分布
- 时间相关
- 局部/整体
- 偏差
- 相关性
- 排名
- 量级
- 地图
- 流动
数据可视化工具:
- 商业智能分析软件
- Tableau
- PowerBI
- FineBI
- 可视化大屏
- DataV
- FineReport
- 前端可视化组件:基于web渲染的技术。典型的渲染技术:Canvas、SVG和WebGL。canvas和SVG是HTML5中主要的2D图形技术,WebGL是3D框架。
- canvas适用于位图。
- SVG指可缩放矢量图形,使用XML格式定义图形。相当于用点和线来描绘了图形,相比于位图来说文件比较小,而且任意缩放都不会失真。
- webGL是一种3D绘图协议,能在网页浏览器中呈现3D画面技术,并可交互。
- 常用的可视化组件: Echarts、D3、Three.js和AntV。
- 编程语言
- matplotlib
- seaborn
可视化视图按照数据间关系可分为比较、联系、构成和分布。
- 比较:比较数据间各类别的关系,或者是它们随着时间的变化趋势,比如折线图;
- 联系:查看两个或两个以上变量之间的关系,比如散点图;
- 构成:每个部分占整体的百分比,或者是随着时间的百分比变化,比如饼图;
- 分布:关注单个变量,或者多个变量的分布情况,比如直方图。
按照变量个数可分为单变量分析和多变量分析。
- 单变量分析指一次只关注一个变量。
- 多变量分析可在一张图上可以查看两个以上变量的关系。
常用视图:散点图、折线图、直方图、条形图、箱线图、饼图、热力图、蜘蛛图、二元变量分布和成对关系。
-
散点图:适合展现两个变量之间的关系。
import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 数据准备 N = 1000 x = np.random.randn(N) y = np.random.randn(N) # 用Matplotlib画散点图 plt.scatter(x, y,marker='x') plt.show() # 用Seaborn画散点图 df = pd.DataFrame({'x': x, 'y': y}) sns.jointplot(x="x", y="y", data=df, kind='scatter'); plt.show()
-
折线图:可表示数据随时间变化的趋势。
# 数据准备 x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019] y = [8, 13, 6, 20, 17, 16, 19, 3, 32, 35] # 使用Matplotlib画折线图 plt.plot(x, y) plt.show() # 使用Seaborn画折线图 df = pd.DataFrame({'x': x, 'y': y}) sns.lineplot(x="x", y="y", data=df) plt.show()
-
直方图:将横坐标等分成一定数量的小区间,纵坐标表示落在相应区间内y值的个数。
# 数据准备 a = np.random.randn(100) s = pd.Series(a) # 用Matplotlib画直方图 plt.hist(s) plt.show() # 用Seaborn画直方图 sns.distplot(s, kde=False) plt.show() sns.distplot(s, kde=True) plt.show()
-
条形图:可帮助查看类别特征。
# 数据准备 x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5'] y = [5, 4, 8, 12, 7] # 用Matplotlib画条形图 plt.bar(x, y) plt.show() # 用Seaborn画条形图 sns.barplot(x, y) plt.show()
-
箱线图:由最大值(max)、最小值(min)、中位数(median)和上下四分位数(Q3, Q1)五个数值点组成,可分析出数据差异性、离散程度和异常值等。
# 数据准备 # 生成0-1之间的10*4维度数据 data=np.random.normal(size=(10,4)) lables = ['A','B','C','D'] # 用Matplotlib画箱线图 plt.boxplot(data,labels=lables) plt.show() # 用Seaborn画箱线图 df = pd.DataFrame(data, columns=lables) sns.boxplot(data=df) plt.show()
-
饼图:可显示出每个部分的百分比。
# 数据准备 nums = [25, 37, 33, 37, 6] labels = ['High-school','Bachelor','Master','Ph.d', 'Others'] # 用Matplotlib画饼图 plt.pie(x = nums, labels=labels) plt.show()
-
热力图:一种矩阵表示方法,矩阵中的元素值用颜色来代表,不同的颜色代表不同大小的值。是一种非常直观的多元变量分析方法。
-
# 数据准备 flights = sns.load_dataset("flights") data=flights.pivot('year','month','passengers') # 用Seaborn画热力图 sns.heatmap(data) plt.show()
-
蜘蛛图:一种显示一对多关系的方法。
# 数据准备 labels=np.array([u"推进","KDA",u"生存",u"团战",u"发育",u"输出"]) stats=[83, 61, 95, 67, 76, 88] # 画图数据准备,角度、状态值 angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False) stats=np.concatenate((stats,[stats[0]])) angles=np.concatenate((angles,[angles[0]])) # 用Matplotlib画蜘蛛图 fig = plt.figure() ax = fig.add_subplot(111, polar=True) ax.plot(angles, stats, 'o-', linewidth=2) ax.fill(angles, stats, alpha=0.25) # 设置中文字体 font = FontProperties(fname=r"C:\Windows\Fonts\simhei.ttf", size=14) ax.set_thetagrids(angles * 180/np.pi, labels, FontProperties=font) plt.show()
-
二元变量分布:可查看两个变量之间的关系。
# 数据准备 tips = sns.load_dataset("tips") print(tips.head(10)) # 用Seaborn画二元变量分布图(散点图,核密度图,Hexbin图) sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter') sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde') sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex') plt.show()
-
成对关系:可显示多个成对双变量的分布。
# 数据准备 iris = sns.load_dataset('iris') # 用Seaborn画成对关系 sns.pairplot(iris) plt.show()