第六章 样本相似性可视化课堂练习

Author

221527213余语彤

1 案例数据

1.1 iris:鸢尾花数据集

  • R语言内置的 iris 数据集(鸢尾花数据集)是统计学和机器学习领域最经典的案例数据集之一,由英国统计学家 Ronald Fisher 在1936年首次提出。它包含了3种鸢尾花的测量数据,每个类别有50个样本,共150行数据。
变量名 数据类型 单位 说明
Sepal.Length numeric cm 花萼(萼片)长度,即花朵最外层绿色叶状结构的长度
Sepal.Width numeric cm 花萼(萼片)宽度
Petal.Length numeric cm 花瓣长度,即花朵内部彩色叶状结构的长度
Petal.Width numeric cm 花瓣宽度
Species factor - 鸢尾花种类(分类标签),包含3个水平:
setosa山鸢尾
versicolor变色鸢尾
virginica维吉尼亚鸢尾
  • setosa 类的花通常较小,花瓣短而宽,与其他两类差异明显;versicolorvirginica 在部分特征上有重叠,分类难度更高。

2 平行坐标图和雷达图

2.1 平行坐标图

  • ggplot(group=id)+geom_line+geom_point 绘图
  • Species 映射为颜色

2.1.1 图形观察和代码编写的心得体会

  • 图形区别观察:平行坐标图通过多条平行轴线展示多维数据,不同颜色的折线代表不同鸢尾花种类,可直观比较各指标(花萼/花瓣长宽)的分布差异及跨指标关联性。

  • 代码编写心得:通过 gather() 整理数据为长格式,利用 geom_line() + geom_point() 组合增强可视化层次;图例和标签的精细调整(如换行、颜色、位置)。

2.2 雷达图

  • 采用ggiraphExtra::ggRadar 绘图

2.2.1 图形观察和代码编写的心得体会

  • 图形区别观察:雷达图通过多边形放射状轴线展示不同鸢尾花种类(Species)在各指标上的分布,便于对比组间差异,而平行坐标图侧重跨指标的趋势追踪。

  • 代码编写心得ggRadar() 需关闭 rescale 保持原始数值范围,通过 alphasize 调整图形透明度与线条粗细;自定义主题(mytheme)统一了坐标轴与图例风格。

3 星图和脸谱图

3.1 星图

  • 采用stars 函数,对标准化数据绘制圆弧星图

  • 需要先将四个数值变量转化为矩阵,并将Species 作为矩阵的行名;

  • 设置图例在合适位置,能完整显示;将图形分为10行。

3.1.1 图形观察和代码编写的心得体会

  • 图形区别观察:星形图(stars plot)通过放射状线段或扇形区块(draw.segments=TRUE)直观呈现不同鸢尾花种类在各指标上的数值分布,与雷达图类似但更强调局部占比,适合快速对比多变量比例关系。

  • 代码编写心得:数据需转换为矩阵并标准化(scale=TRUE),通过 draw.segments 切换线段/扇形模式;调整 key.loc 和图边距(mar)优化布局,避免元素重叠。

3.2 脸谱图

  • 采用aplpack::faces 函数,作Species 三个类别的脸谱图
  • 需要先将四个数值变量转化为矩阵,并将Species 作为矩阵的行名;
  • 设置图例在合适位置,能完整显示;将图形分为12列。

effect of variables:
 modified item       Var           
 "height of face   " "Sepal.Length"
 "width of face    " "Sepal.Width" 
 "structure of face" "Petal.Length"
 "height of mouth  " "Petal.Width" 
 "width of mouth   " "Sepal.Length"
 "smiling          " "Sepal.Width" 
 "height of eyes   " "Petal.Length"
 "width of eyes    " "Petal.Width" 
 "height of hair   " "Sepal.Length"
 "width of hair   "  "Sepal.Width" 
 "style of hair   "  "Petal.Length"
 "height of nose  "  "Petal.Width" 
 "width of nose   "  "Sepal.Length"
 "width of ear    "  "Sepal.Width" 
 "height of ear   "  "Petal.Length"

3.2.1 图形观察和代码编写的心得体会

  • 图形区别观察:脸谱图(Chernoff Faces)通过面部特征(如眼睛大小、嘴型等)编码多维数据均值,不同鸢尾花种类(Species)的差异以拟人化方式呈现,相比传统图表更生动但需适应抽象映射。

  • 代码编写心得:需预先按组计算均值并转为矩阵face.type控制风格,ncol.plot调整布局;数据标准化(scale=TRUE)确保特征比例一致,但需注意面部特征与变量的对应关系可能不直观。

4 聚类图和热图

4.1 系统聚类树状图

  • 采用factoextra::fviz_dend 函数,对标准化后数据作图;
  • 需要先将四个数值变量转化为矩阵,并将Species 作为矩阵的行名;
  • 要求分为3类,观察分类结果和Species 的差异;树状图的外观为圆形。

4.1.1 图形观察和代码编写的心得体会

  • 图形区别观察:层次聚类树状图(Dendrogram)通过分支高度和颜色区块rect=TRUE展示样本间欧式距离method="euclidean")和聚类结果(3类),圆形布局(type="circular")增强空间利用率,适合观察样本层次关系。

  • 代码编写心得:数据需标准化scale(mat))并计算距离矩阵,ward.D2方法优化类间距离;通过fviz_dendk_colorsrect参数增强可读性,但圆形布局可能降低高度差异的直观性

4.2 K-menas聚类主成分图

  • 采用factoextra::fviz_cluster 函数,对标准化后数据作图;

  • 需要先将四个数值变量转化为矩阵,并将1:150 作为矩阵的行名;

  • 要求分为3类,类别轮廓为正态分布,观察哪些观察值比较异常。

4.2.1 图形观察和代码编写的心得体会

  • 图形区别观察:K-means聚类图通过散点分布和置信椭圆(ellipse.type="norm"直观展示3个聚类中心的划分结果,相比层次聚类更强调全局分组边界,适合非层次结构的硬聚类分析。

    异常观察值:42号,61号,118号,132号

  • 代码编写心得:数据标准化(scale())是关键步骤;repel=TRUE避免标签重叠,ellipse.type增强组间区分度,但需注意初始中心点随机性可能导致结果波动。

4.3 热图

  • 采用gplots::heatmap.2 函数,对原始数据绘制热力图

  • 需要先将四个数值变量转化为矩阵,并将Species 作为矩阵的行名;

  • 要求横轴和纵轴均添加聚类树状图

4.3.1 图形观察和代码编写的心得体会

  • 图形区别观察:热图通过颜色梯度(col=rainbow(256))直观展示不同鸢尾花种类(行)在各指标(列)上的数值分布,结合行列聚类树状图dendrogram="both")揭示数据层次结构,适合快速识别高/低值区域与模式关联。

  • 代码编写心得:需关闭默认标准化scale="none")保持原始值,tracecol添加辅助线增强可读性;调整边距(margins)和标签角度(srtCol)优化布局,但色阶选择(如彩虹色)可能影响数值对比精度。