第六章 样本相似性可视化课堂练习
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
)的调整可优化可视化效果。