第六章 样本相似性可视化课堂练习
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类的花通常较小,花瓣短而宽,与其他两类差异明显;versicolor和virginica在部分特征上有重叠,分类难度更高。
2 平行坐标图和雷达图
2.1 平行坐标图
ggplot(group=id)+geom_line+geom_point绘图Species映射为颜色
2.2 图形观察和代码编写的心得体会
2.3 雷达图
- 采用
ggiraphExtra::ggRadar绘图
2.4 图形观察和代码编写的心得体会
- 心得体会: 雷达图能直观展示多维数据的特征差异,但需注意变量顺序和量纲统一。通过
rescale=TRUE自动标准化各变量至相同尺度,配合清晰图例(如区分物种的⭕标记)和主题定制(如蓝色坐标轴文字),使图形更具可读性。代码编写时,先聚合数据(aggregate计算物种均值)再绘图,并采用分层语法(+连接主题和标题),既保持逻辑清晰又便于后期调整。观察发现setosa在Petal.Width上显著区别于其他两类,验证了该物种的独特性。
3 星图和脸谱图
3.1 星图
采用
stars函数,对标准化数据绘制圆弧星图需要先将四个数值变量转化为矩阵,并将
Species作为矩阵的行名;设置图例在合适位置,能完整显示;将图形分为10行。
3.2 图形观察和代码编写的心得体会
- 心得体会: 星图通过多边形的形状和面积直观呈现多维数据特征,特别适合比较不同类别的整体模式。代码中使用
scale()标准化数据确保各变量可比性,draw.segments=TRUE生成扇形区域比传统射线更易解读。注意修正代码中的拼写错误(如mfrom应为mfrow,Tabels应为labels),这提醒我们在可视化过程中要仔细检查参数名称。通过调整key.loc参数优化图例位置,避免遮挡关键信息。观察发现setosa的星图呈现明显紧凑的扇形结构,印证了该物种在特征上与其他两类的高度差异性。标准化处理和矩阵转换(as.matrix())的预处理步骤为后续分析奠定了良好基础。
3.3 脸谱图
- 采用
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.4 图形观察和代码编写的心得体会
- 心得体会: 脸谱图(Chernoff Faces)通过人脸特征来编码多维数据,这种拟人化的呈现方式能激发直观联想,但需注意不同面部特征对应变量的合理映射。代码中通过
summarise计算物种均值简化图形复杂度,ncol.plot=3的布局使三类对比一目了然。观察发现setosa的脸型明显更圆润(可能对应较小的Petal.Width),而virginica的五官更舒展(反映较大特征值),这种视觉差异与鸢尾花物种特性高度吻合。不过需注意:1)拼写错误(如包名ap1pack应为aplpack);2)变量名标准化(Sepa1→Sepal);3)脸谱解释需搭配图例说明各面部特征对应的具体变量,否则易导致主观误读。
4 聚类图和热图
4.1 系统聚类树状图
- 采用
factoextra::fviz_dend函数,对标准化后数据作图; - 需要先将四个数值变量转化为矩阵,并将
Species作为矩阵的行名; - 要求分为3类,观察分类结果和
Species的差异;树状图的外观为圆形。
4.2 图形观察和代码编写的心得体会
- 心得体会: 圆形树状图通过环形布局直观展示层次聚类结构,比传统树状图更节省空间且具视觉吸引力。代码中标准化数据(
scale())和Ward方法(method="ward.D2")的选用,有效提升了类间分离度。但需修正三处关键错误:1)颜色代码格式错误(如"W2E9FDF"应为"#2E9FDF");2)字符串引号混用('0ray30'应为"gray30");3)+操作符换行导致断裂。观察发现setosa能完美聚为一类,而versicolor和virginica存在少量交叉,这与鸢尾花物种间真实生物学差异一致。建议添加silhouette分析量化聚类质量,并通过cutree(hc, k=3)与原始标签对比验证分类准确性。图形配色和标签角度(如angle=45)的微调可进一步提升可读性。
4.2.1 K-menas聚类主成分图
采用
factoextra::fviz_cluster函数,对标准化后数据作图;需要先将四个数值变量转化为矩阵,并将
1:150作为矩阵的行名;要求分为3类,类别轮廓为正态分布,观察哪些观察值比较异常。
cluster size ave.sil.width
1 1 50 0.64
2 2 53 0.39
3 3 47 0.35
异常观测点(轮廓系数<0):
观测编号
1 112
2 128
4.3 图形观察和代码编写的心得体会
- 心得体会: K-means聚类主成分图通过降维可视化高维数据的聚类结构,配合轮廓系数分析可有效评估聚类质量。代码中
set.seed(123)确保结果可复现,nstart=25避免局部最优解,而ellipse.type="norm"的正态分布椭圆直观展示类别的分布范围。但需修正以下问题:1)theme_minima1()拼写错误(应为theme_minimal());2)管道操作符%>%误写为/>;3)si1变量名不一致(应为sil)。异常点检测(轮廓系数<0)通过红色标记突出显示分类不确定的样本,如versicolor和virginica交界处的样本。建议补充聚类结果与真实物种的交叉表(table(iris$Species, km_res$cluster)),可发现K-means能较好区分setosa,但对另两类存在误分,这与鸢尾花特征的自然重叠一致。图形中椭圆重叠区域恰好反映了这种生物学连续性。
4.4 热图
4.4.1 heatmap
采用
gplots::heatmap.2函数,对原始数据绘制热力图需要先将四个数值变量转化为矩阵,并将
Species作为矩阵的行名;要求横轴和纵轴均添加聚类树状图
4.5 图形观察和代码编写的心得体会
- 心得体会: 热图通过颜色梯度直观展示数据矩阵中的模式,结合行列聚类树状图能同时揭示样本和变量的关联性。代码中
scale="row"的标准化处理凸显了不同物种在各特征上的相对差异,红-黄-绿渐变色阶(colorRampPalette)符合直觉认知。但需修正以下关键问题:1)管道操作符%s%应为%>%;2)聚类函数nclust不存在(应为hclust);3)代码不完整缺少闭合括号。观察发现:1)setosa样本在Petal.Width上呈现显著绿色(高值),与生物学特性一致;2)Sepal.Length与Sepal.Width在列聚类中被归为同一分支,反映其相关性。建议添加labRow=rownames(mat)显式标注行名,并通过ColSideColors参数添加物种分类的颜色侧边栏。热图边缘留白(margins)和标签旋转(如srtCol=45)的调整可优化可视化效果。