第六章 样本相似性可视化课堂练习
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.1.1 图形观察和代码编写的心得体会
图形观察
整体模式:
Setosa品种(红色)在所有指标上与其他两个品种明显分离
Versicolor和Virginica有一定重叠但在花瓣尺寸上存在差异
特征关系:
花瓣长度和宽度呈现正相关趋势
花萼宽度在Setosa中表现突出
2.1.2 编程心得:
数据重塑技巧:
平行坐标图需要将宽数据转为长格式,
gather()/pivot_longer()是关键为每条观察添加唯一ID(
id)是连接各维度点的关键
可视化优化:
同时使用线条和点增强了图形可读性
图例位置和格式调整避免了遮挡数据
轴标签旋转解决了长标签重叠问题
2.2 雷达图
- 采用
ggiraphExtra::ggRadar绘图
2.2.1 图形观察和代码编写的心得体会
数据重塑的重要性:
平行坐标图需要将宽格式转为长格式,
gather()/pivot_longer()是关键保持变量顺序(
fct_inorder)对正确显示至关重要
图形元素控制:
group美学确保观测值正确连接点线结合增强可视化效果(线展示趋势,点标记具体值)
可读性优化:
调整图例位置避免遮挡数据
处理轴标签重叠问题(
n.dodge)简化图例(title=NULL)使图形更简洁
扩展思考:
对于大数据集可考虑透明度调整(alpha)避免过度绘制
可添加中位数线或分位区域展示整体分布
标准化处理可使不同量纲的变量更好比较
这种可视化方法非常适合比较多维数据中不同类别的特征模式,能清晰展示鸢尾花各物种在四个特征上的差异和相似性。代码结构清晰,展示了ggplot2的图层叠加思想和数据转换技巧。
3 星图和脸谱图
3.1 星图
采用
stars函数,对标准化数据绘制圆弧星图需要先将四个数值变量转化为矩阵,并将
Species作为矩阵的行名;设置图例在合适位置,能完整显示;将图形分为10行。
3.1.1 图形观察和代码编写的心得体会
适用场景:
星形图适合低维数据(变量数≤6),过多变量会导致图形难以解读。
强调个体观测的模式(如不同鸢尾花样本的特征分布)。
参数调优:
scale:是否标准化取决于分析目标(如关注相对模式 vs 绝对数值)。draw.segments:扇形填充增强视觉对比,但可能掩盖细节。key.loc和mar:需反复调试以避免图形元素重叠。
局限性:
变量顺序影响图形解读(建议按相关性或逻辑排序)。
大数据集时易产生视觉混乱(可抽样或聚合后绘制)。
改进方向:
添加标题和轴注释(如
main="鸢尾花特征星形图")。使用颜色区分物种(如
col=rainbow(3)[data$Species])。结合其他图表(如箱线图)补充统计信息。
3.2 脸谱图
- 采用
aplpack::faces函数,作Species三个类别的脸谱图 - 需要先将四个数值变量转化为矩阵,并将
Species作为矩阵的行名; - 设置图例在合适位置,能完整显示;将图形分为3列。
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 图形观察和代码编写的心得体会
变量映射到面部特征:
切尔诺夫脸谱图将不同的数值变量映射到不同的面部特征,例如:
眼睛大小可能对应
Sepal.Length。嘴巴弧度可能对应
Petal.Width。脸型宽度可能对应
Sepal.Width。
由于
face.type=1,具体的映射方式由aplpack内部决定,但通常较大的数值会使特征更突出(如更大的眼睛、更宽的嘴巴)。
标准化(
scale=TRUE)的影响:由于四个变量的量纲不同(如
Sepal.Length在厘米级别,Petal.Width在毫米级别),标准化使它们可比。如果不标准化,某些变量可能对脸谱形状影响过大。
脸谱风格(
face.type):face.type=1是较简单的风格,其他风格(如face.type=2)可能更夸张或抽象。
物种区分:
- 三个物种(
setosa、versicolor、virginica)的脸谱应有明显差异,尤其是setosa(通常花萼较宽、花瓣较短)与其他两个物种不同。
- 三个物种(
4 聚类图和热图
4.1 系统聚类树状图
- 采用
factoextra::fviz_dend函数,对标准化后数据作图; - 需要先将四个数值变量转化为矩阵,并将
Species作为矩阵的行名; - 要求分为3类,观察分类结果和
Species的差异;树状图的外观为圆形。
4.1.1 图形观察和代码编写的心得体会
图形观察
聚类效果分析:
Setosa分离明显:红色分支(通常对应Setosa)与其他两类完全分离,这与原始Species分类一致,表明Setosa的花型特征与其他两种鸢尾花差异显著。
Versicolor和Virginica部分重叠:绿色和蓝色分支(对应Versicolor和Virginica)在树状图中有交叉,说明这两个物种在某些样本上特征相似,可能源于花瓣尺寸的连续变异。
矩形框标记:三个彩色矩形框清晰标出了聚类边界,但Virginica的矩形框可能覆盖了部分本应属于Versicolor的样本。
与原始分类对比:
- 通过
table(cutree(hc, k=3), data$Species)可量化分类差异,预期Setosa的准确率接近100%,而Versicolor和Virginica可能存在约10-15%的误分。
- 通过
圆形布局优势:
- 150个样本的标签在圆形布局中径向排列,避免了传统树状图的标签重叠问题,但最内层标签仍可能因空间不足而显示不全。
4.1.2 代码编写心得体会
数据预处理关键步骤:
标准化必要性:
scale(mat)消除了不同特征(如花萼长度和花瓣宽度)的量纲差异,避免数值较大的特征主导距离计算。行名设置技巧:
rownames(mat) <- data[,5]将Species信息保留为行名,使得最终图形能直接显示样本类别,增强可解释性。
聚类方法选择:
Ward.D2算法的适用性:该方法最小化簇内方差,适合欧氏距离,能产生平衡的簇。对于鸢尾花这种类别大小相近的数据表现良好。
距离度量:欧氏距离直观反映多维空间中的样本差异,但对异常值敏感。若数据存在离群点,可尝试曼哈顿距离(
method = "manhattan")。
4.2 K-menas聚类主成分图
采用
factoextra::fviz_cluster函数,对标准化后数据作图;需要先将四个数值变量转化为矩阵,并将
1:150作为矩阵的行名;要求分为3类,类别轮廓为正态分布,观察哪些观察值比较异常。
=== 异常值(轮廓宽度<0)的样本ID ===
[1] 112 128
=== 聚类结果与真实类别的对比 ===
Species
Kmeans_Cluster setosa versicolor virginica
1 50 0 0
2 0 39 14
3 0 11 36
cluster size ave.sil.width
1 1 50 0.64
2 2 53 0.39
3 3 47 0.35
4.2.1 图形观察和代码编写的心得体会
4.2.2 图形观察结果
- 聚类分布特征:
三个类别在主成分空间中的分布呈现明显区隔
第一主成分(x轴)方向上的分离度最为显著
部分样本点位于聚类边界区域,可能是潜在异常值
- 正态轮廓解读:
每个聚类的椭圆轮廓反映了数据的分布密度
椭圆大小和方向显示了各类别的离散程度和相关特征
紧凑的椭圆表示内部样本特征高度一致
- 异常点识别:
位于聚类边界或重叠区域的点值得关注
远离所属聚类中心的样本可能需要进一步检查
4.2.3 代码编写心得体会
- 数据预处理:
标准化步骤确保各特征具有相同量纲
合理的行名设置便于后续结果追踪
- 聚类算法应用:
选择合适的聚类数量和初始化参数
多次运行确保结果稳定性
- 可视化技巧:
主成分降维有效展示高维数据
椭圆轮廓增强聚类边界识别
异常点突出标记便于观察
- 结果验证:
轮廓系数提供量化评估标准
与原始类别对比验证聚类效果
4.3 热图
采用
gplots::heatmap.2函数,对原始数据绘制热力图需要先将四个数值变量转化为矩阵,并将
Species作为矩阵的行名;要求横轴和纵轴均添加聚类树状图
4.3.1 图形观察和代码编写的心得体会
- 颜色映射的艺术:
使用
YlOrRd色系后,Setosa在花瓣特征上的低值区域(深橙色)与其他两类的高值区域(亮黄色)形成鲜明对比颜色渐变中每个色阶差异肉眼可辨,避免了原始方案中相邻值颜色跳跃不明显的问题
- 聚类树解读:
行聚类树清晰显示三个主要分支,对应三个物种
列聚类树中,花瓣长度和宽度首先合并,印证了这两个特征的高度相关性
花萼特征的聚类位置反映了其独立性
- 标准化效果验证:
通过
scale="row",每行特征值被压缩到相同范围,避免了个别大数值特征(如花萼宽度)主导颜色分布未标准化时(错误示范),整个热力图会被1-2个特征”染成”单一颜色带