Python机器学习算法与实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 可视化分析数据关系

数据可视化技术是数据探索的利器,在观察数据的时候,有效地利用数据可视化技术往往能够得到事半功倍的效果,尤其是在海量的数据面前。面对密密麻麻的数据集,观察图像通常能得到更多的有用信息,而且能够更加直观全面地把握数据。俗话说“一图胜千言”,相对于文本、数字等内容,人类非常善于从图像中获取信息。

本节将会根据不同的数据类型,使用合适的数据可视化方法,对数据进行分析。针对不同的可视化图像,会尽可能地使用相对简单的可视化方式进行数据可视化。在进行数据可视化时,将会用到Matplotlib、seaborn、Altair、Plotly、pandas、WordCloud、NetworkX等Python可视化库。在可视化数据时,分为连续变量间关系可视化分析、分类变量间关系可视化、连续变量和分类变量间关系可视化分析,以及其他类型数据可视化分析。

2.3.1 连续变量间关系可视化分析

当待分析的数据均为连续变量时,由于数据变量的数目不同和想要从数据中获取信息的目的不同,可以使用不同的可视化方法。下面以鸢尾花数据集为例,对不同情况下的数据可视化进行介绍,先准备好待使用的数据,程序如下:

1.两个连续变量之间的可视化

对于两个连续数值变量之间的可视化方式,最直观的就是使用散点图进行可视化分析。对于变量SepalLengthCm和变量SepalWidthCm,可以使用下面的程序得到散点图,程序运行后的结果如图2-14所示。

图2-14 两个连续变量的散点图可视化

从图2-14中的2D散点图中很容易分析两个变量之间的变化趋势,如果想要分析两个变量在空间中的分布情况,可以使用2D密度曲线图进行可视化分析。2D密度曲线图会在分布较密集的区域使用较深的颜色表示,可视化变量SepalLengthCm和变量SepalWidthCm的2D密度曲线图,可以使用下面的程序,程序运行后的结果如图2-15所示。

图2-15 2D密度曲线图

在图2-15的2D密度曲线图中不同位置,数据分布的密度是不一样的,该数据有两个样本较多的密集区域,同时在图的上方和右侧,分别可视化出了两个变量的一维密度曲线,用于帮助分析数据的分布情况。

针对两个数值变量,如果想要分析两者在各自的一维空间上分布情况的差异,可以使用分组直方图可视化出两组数据在同一坐标系下的分布情况,例如使用下面的程序,可视化出变量SepalLengthCm和变量SepalWidthCm的直方图,程序运行后的结果如图2-16所示。

图2-16 两个连续变量的分组直方图

从图2-16中可以发现,两个变量的数据分布位置和范围都很容易比较,而且还可以发现两者数据聚集情况的差异,其中变量SepalLengthCm的取值范围比变量SepalWidthCm大,位置也更集中,但是变量SepalWidthCm的分布更加聚集。

2.多个连续变量之间的可视化

针对多个连续变量之间的数据可视化,通常会使用气泡图、小提琴图、蒸汽图等对数据进行可视化分析,并且从不同的可视化图像中可以分析出数据传达的不同信息。

气泡图通常用于3个变量的可视化,其中两个变量表示点所在的位置,另一个变量使用点的大小反映数据取值的大小,从而可以在二维空间中分析3个变量之间的关系,使用下面的程序可以获得如图2-17所示的气泡图。

图2-17 数据的气泡图

在图2-17中,变量PetalWidthCm和变量SepalWidthCm用于指定点在空间中的位置,而气泡的大小使用变量SepalLengthCm表示。从图中可以发现,PetalWidthCm和SepalWidthCm的取值越大,所对应的气泡也越大。

如果想要分析多个变量之间数据分布趋势的差异,则可以使用小提琴图进行分析,在小提琴图中可以获取数据的取值范围、集中位置、离散情况等,并且还可以同时将多个变量的小提琴图可视化在一幅图中,用于分析多个变量的分布差异等内容。对于鸢尾花的4个连续变量,可以使用下面的程序获得如图2-18所示的小提琴图。

图2-18 数据的小提琴图

从图2-18中可以发现,数据的离散程度从小到大依次是:SpealWidthCm、PetalWidthCm、SpealLengthCm、PetalLengthCm;而且数据中PetalLengthCm变量和PetalWidthCm变量的分布为双峰分布。

对于多个连续变量,也可以使用蒸汽图分析随着样本量的增加(或者时间的增长),数据取值的变化情况。蒸汽图的可视化可以使用Python中的Altair库来完成,Altair库是用来统计可视化的常用库,功能强大。针对鸢尾花数据,可以使用下面的程序获得蒸汽图。

在上面的程序中,在使用鸢尾花数据Iris之前,先对其使用melt()方法,将宽数据转化为长数据,因此在获得长数据Irislong中,变量Measurement_type表明了使用的特征名,value对应着原始特征的相应取值,因此在可视化蒸汽图时,利用mark_area()方法可快速获取蒸汽图,程序运行后的结果如图2-19所示。

图2-19 数据的蒸汽图

在蒸汽图中,4个变量使用了4种不同的颜色来表示,其中数据的波动表明了随着Id的变化,相应特征的取值变化情况。

2.3.2 分类变量间关系可视化分析

分类变量也是数据分析与挖掘过程中经常用到的数据类型,因此本节将会介绍一些该类数据的可视化分析方法。首先导入待分析的泰坦尼克号数据,程序如下:

导入的数据包含多个分类变量,针对分类变量数量的不同,可以使用不同的可视化方法进行数据分析。

1.两个分类变量

以Titanic数据中的变量Embarked和Survived为例,可以使用数据列联表查看每种组合下的样本数量,也可以使用卡方检验分析两个变量是否独立,这些分析可以使用下面的Python程序进行。

从上面的输出结果中可以发现,卡方检验的P值远小于0.05,说明两个变量不是独立的,即有些相关性。针对两个变量之间的相关性情况,可以使用马赛克图进行可视化分析,程序如下,可视化结果如图2-20所示。

从图2-20中可以发现,当变量Embarked的取值为S或者Q时,Survived取值为1所占的比例就更低。

图2-20 两个分类变量的马赛克图

2.多个分类变量

针对多个分类变量的关系,可以使用树图进行可视化分析,树图使用矩形来表示数量的多少,用户可以对数据进行逐层分组可视化,使用下面的程序后结果如图2-21所示。

图2-21 泰坦尼克号数据的树图可视化

从图2-21所示的可视化结果中可以发现,遇难者明显多于幸存者;票价(Fare)低的乘客更容易遇难;在遇难的人员中,男性远远多于女性;在幸存的人员中,女性远远多于男性。使用Plotly包获得的图像是可交互的图像,用户可以通过单击对图像进行更多查看和对比分析。单击图2-21所示的某部分放大局部,如图2-22所示。

图2-22 交互后放大局部显示结果

2.3.3 连续变量和分类变量间关系可视化分析

在数据分析过程中,很少会有只包含连续变量或者分类变量的情况,通常待分析的数据会同时包含连续变量和分类变量。前面变换得到的鸢尾花长型数据Irislong,就包含多个分类变量和连续变量。下面使用该数据集展示如何对数据进行可视化。

1.一个分类变量和一个连续变量

如果要分析长型鸢尾花数据中的一个分类变量和一个连续变量之间的关系,可以使用箱线图。它可以分析在不同分类变量下,连续变量的分布情况。对于Irislong数据表,使用箱线图可视化变量Species和变量value之间关系的程序如下,程序运行后的结果如图2-23所示。

从图2-23中可以发现,三者的取值极差相近,但是数据的集中位置在逐次升高。

图2-23 一个分类变量和一个连续变量的箱线图

一个分类变量和一个连续变量,还可以使用分面密度曲线图查看数据的分布。以长型鸢尾花数据为例,可以使用Measurement_type变量进行分面,分析value变量的数据分布情况。可以使用下面的程序进行可视化,程序运行后的结果如图2-24所示。通过图2-24可以发现,针对该数据集,在不同的Measurement_type分组下,数据的分布情况有很大的差异,而且取值范围也不尽相同。

图2-24 分面密度曲线图

2.两个分类变量的一个连续变量

对于数据中包含两个分类变量和一个连续变量的情况,可以使用分组箱线图对数据进行可视化,即一个分组变量作为箱线图的横坐标变量,另一个变量作为对应x轴坐标的再次分割变量。针对长型鸢尾花数据,可以使用下面的程序获得分组箱线图(见图2-25)。从图2-25中可以发现,value的分布不仅受Measurement_type取值的影响,而且变量Species的取值也对数据value的分布有较大的影响。

图2-25 分组箱线图

3.两个分类变量和两个连续变量

如果想要可视化两个分类变量和两个连续变量之间的关系,可以使用分面散点图,其中两个分类变量将可视化界面切分为网格,然后在对应的网格下面可视化出两个连续变量的散点图,从而对数据进行对比分析。例如,可以使用下面的程序对泰坦尼克号数据中的两个分类变量和两个连续变量进行可视化,程序运行后的结果如图2-26所示。

图2-26 分面散点图

4.一个分类变量和多个连续变量

对于一个分类变量和多个连续变量的数据可视化方法,最常用的就是使用平行坐标图,其中每个连续变量是横轴中的一个坐标点,其取值大小则标记在对应的竖直线上,可以使用颜色为分组变量中的每条平行线进行分组编码。对于鸢尾花数据集的4个连续变量和一个分类变量,使用下面的程序可获得平行坐标图,如图2-27所示。从图中可以发现,3种不同的花在PetalLengthCm变量上的差异性最大,而在SepalWidthCm变量上的差异性最小。

图2-27 平行坐标图

对于一个分类变量和多个连续变量的数据,如果想要分析不同分类变量下,连续变量之间的关系,可以使用矩阵散点图进行数据可视化。针对鸢尾花数据使用矩阵散点图进行数据可视化的程序如下,程序运行后的结果如图2-28所示。在图中可以分析任意两个数值变量之间的关系,以及分类变量对数据之间关系的影响。

图2-28 矩阵散点图

气泡图可以可视化3个数值变量之间的关系,如果添加一个分类变量,对数据进行可视化,可以获得分组气泡图,也可以用于分析分组数据对其他数值之间关系的影响。使用下面的程序可获得一个分组气泡图,如图2-29所示。在该图中,使用了不同的颜色对气泡进行分组,用于发现不同组内的数据关系和组间的数据差异。

图2-29 分组气泡图

前面介绍了针对不同的数据情况,常用的数据可视化方法,但是这些可视化方法描述的数据通常是表格数据,对于其他类型的数据也有一些特有的数据可视化方法,下一节将会进行相关介绍。

2.3.4 其他类型数据可视化分析

本节将会介绍对时间序列数据、文本数据、社交网络数据等的可视化方法。

1.时间序列数据

对于时间序列数据,可以使用散点图和折线图等进行可视化,但是需要注意的是,时间序列数据的可视化图像中,x轴通常表示时间的变化,而且有顺序,所以位置不能随意变化,否则将不具有其原有的数据含义。

在上面的程序中,在读取时间序列成为数据表opsd后,直接使用其plot()方法绘制折线图,程序运行后的结果如图2-30所示。

图2-30 时间序列曲线

2.文本数据

文本数据是常见的非结构化数据,其常用的数据可视化方法是词云,利用词云来描述词语出现的频繁程度。下面以《三国演义》的文本内容为例,统计出每个词语出现的频次,然后使用词云进行可视化,运行下面的程序即可获得对应的词云图,如图2-31所示。

图2-31 《三国演义》词云图

图2-31即为使用WordCloud得到的《三国演义》词云图,因图中显示中文,所以需要使用font_path参数指定合适的字体,使用generate_from_frequencies方法传入准备好的字典。其他参数width、height用来指定图像的大小,max_words指定最多显示多少个词语,max_font_size指定词语最大的尺寸。通过词云图能够更准确、一目了然地把握文本的主要内容。

3.社交网络数据

可以使用图可视化社交网络数据。图由边和节点组成,每条边表示其所连接的两个节点之间的联系,针对图数据可以使用NetworkX库可视化,下面先导入空手道俱乐部的社交网络数据,程序如下:

在karate数据中,From和to两个变量表示两个节点的一条边,weight变量表示两个节点之间的权重,可以使用下面的程序将数据可视化为图。

在上面的程序中,先使用G=nx.Graph()定义一个图,并使用G.add_edge()增加有关联的成员之间的边,分别指定边的起点、终点和权重;根据权重将成员之间的边分为两种类型(elarge和esmall),较大的权重(大于3.5)用实线显示,较小的权重(小于3.5)用虚线表示;用nx.draw_networkx_nodes()函数绘制图的节点,并且指定节点图像的大小等性质;用nx.draw_networkx_edges()函数绘制图的边,可以指定边的线宽、颜色、线形等属性;用nx.draw_networkx_labels()函数为节点添加标签。可视化结果如图2-32所示。

图2-32 使用图可视化人物之间的联系