library(tidyverse)
library(DT)
library(sjPlot) # 社会统计数据可视化
library(epade) # 3d数据图
library(ggiraphExtra)
library(gridExtra) # 为使用图形组合函数grid.arrange
library(treemap) # 树状图
library(vcd)
library(ggpubr)
library(RColorBrewer)
library(d3r) # 为了使用d3_nest函数
library(sunburstR)
library(readxl)
library(ggplot2)
library(tidyr)
library(DT)
library(factoextra)
library(readxl)
数据可视化期末报告
1 报告要求
期末实验报告由5章节5个图形组成,每个章节需要作一个图形。
每个章节选择作什么图自主选择,作图前补充完整图形标题名称,例如:图形1——多变量条形图。
案例数据自主收集,不同章节可以公用一个数据集。但同学间不允许使用相同数据集。
每个章节的数据集合需要通过
datatable
函数展示,并简要解释数据来源和变量意义。每个输出图形后需要对图形作简要解读,最少需针对图形提出一个观点。
渲染html文件保留代码展示,6月22日前将发布网址提交至共享文档
“8、期末报告”
列中。评分标准:
每章节图形各20分
能有效输出图形和合理解释75%
数据独特性强10%
图形个性化强15%
2 类别数据可视化
2.1 数据解释与展示
这张表格展示了一组数据,包含年龄、职业、收入、生活方式、是否关注及是否开始等变量。
年龄 (岁):分布在 18-25 岁和 26-35 岁
职业 (工):主要为企业员工 (企业职员) 和学生 (学生)。
收入 (入):大部分为 3000元以下 (3000元以下),少数为 8000元 (8000元)。
library(readxl)
<- read_excel("data1.xlsx")
data1
::datatable(data1,rownames = FALSE) DT
2.2 图形1——性别-是否开始养生-生活压力大小(比例关系条形图)
ggSpine(
data = data1,
aes(x = 是否开始养生, fill = 生活压力大小, facet = 性别),
palette = "Reds",
labelsize = 3,
reverse = TRUE
+
) theme(
axis.text.x = element_text(size = 10), # x轴文字大小
axis.text.y = element_text(size = 10) # y轴文字大小
)
- 女性在问卷中占比高
- 生活压力大小与是否养生存在相关性
- 男女之间生活压力也存在较明显差异
3 数据分布可视化
3.1 案例数据解释与展示
- 数据为从2000年到25年的万科股价数据和利率汇率
library(readxl)
<- read_excel("data2.xlsx")
data2 $日期 <- as.Date(data2$日期, format = "%Y/%m/%d")
data2
::datatable(data2,rownames = FALSE) DT
3.2 图形2——股价相关指标及标准化箱线图
# 选择要分析的数值列
<- c("万科收盘价", "人民币元对美元汇率", "无风险利率", "日最高价", "日最低价")
vars
# 将数据从宽格式转成长格式
<- pivot_longer(data2, cols = all_of(vars), names_to = "指标", values_to = "指标值")
df
# 标准化变换(Z-score)
<- df %>%
df group_by(指标) %>%
mutate(
= scale(指标值)[,1], # Z-score
标准化值 = log10(指标值) # 对数变换
log值 %>%
) ungroup()
# 设置调色板
<- RColorBrewer::brewer.pal(5, "Set2")
palette
# 画图1:对数变换
<- ggplot(df, aes(x = 指标, y = log值)) +
p1 geom_boxplot(fill = palette, outlier.size = 0.8) +
scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
ylab("log10(指标值)") +
ggtitle("(a) 对数变换") +
theme_minimal()
# 画图2:标准化变换
<- ggplot(df, aes(x = 指标, y = 标准化值)) +
p2 geom_boxplot(fill = palette, outlier.size = 0.8) +
scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
ylab("标准化值 (Z-score)") +
ggtitle("(b) 标准化变换") +
theme_minimal()
# 组合图
::grid.arrange(p1, p2, ncol = 2) gridExtra
图形解读:
利率的绝对值最小
人民币汇率波动范围的绝对值最小
标准化后汇率波动较明显
股价数据存在离群值说明市场非理性可能性高
4 变量关系可视化
4.1 案例数据解释与展示
- 广州二手房均价相关数据包含租金比、出让面积、可支配收入等,数据时间从2016到2025
library(readxl)
<- read.csv("data3.csv", stringsAsFactors = FALSE)
data3
::datatable(data3,rownames = FALSE) DT
4.2 图形3——广州房价及相关指标散点图矩阵
library(GGally)
<- data3
df
ggpairs(df,columns=2:8)+ # 选择图变量
theme(axis.title=element_text(size=8))+ # 设置坐标轴标签字体大小
theme(axis.text=element_text(size=6)) # 设置坐标轴刻度字体大小
图形解读:
强相关:CPI (人均可支配收入)与年平均人数 (0.996) 高度正相关,房价租金比与CPI (人均可支配收入) (0.981) 也强相关。
弱相关:其他变量对之间相关性较低,部分为负相关(如二手房价与人均可支配收入0.235)。
5 样本相似性可视化
5.1 案例数据解释与展示
LifeCycleSavings 是 R 语言中自带的一个数据集,包含了50个国家或地区的生命周期储蓄数据。以下是对其变量含义的解读:
pop15:15岁以下人口比例(%)。表示一个国家或地区中15岁以下人口占总人口的百分比,反映了人口年龄结构。
pop75:75岁以上人口比例(%)。表示75岁及以上人口占总人口的百分比,反映老年人口比例。
dpi:人均可支配收入(美元)。表示每个人的可支配收入水平,是衡量经济状况的重要指标。
ddpi:人均可支配收入的增长率(%)。表示可支配收入的年增长率,反映经济动态。
sr:个人储蓄率(%)。表示个人储蓄占可支配收入的百分比,是研究生命周期储蓄行为的核心变量。
# 载入数据
data("LifeCycleSavings")
<- LifeCycleSavings
df
::datatable(df,rownames = FALSE) DT
5.2 图形4——不同国家根据储蓄聚类图
# 如果想保留国家名作为标注,可以设置 rownames
# 此数据集 rownames 本身就是国家名
<- scale(df) # 对变量标准化,避免量纲影响
mat
# K-means 聚类(分成4类)
set.seed(123) # 设置随机种子,保证结果可复现
<- kmeans(mat, centers = 3)
km
# 聚类可视化
fviz_cluster(km, data = mat,
repel = TRUE, # 避免标签重叠
ellipse.type = "norm", # 添加正态置信椭圆
labelsize = 9, # 标签字体大小
pointsize = 2, # 点的大小
main = "K-means聚类(分成3类)")
- 图形解读:
维度:
Dim1 (66.4%):第一主成分,解释了数据的 66.4% 方差。
Dim2 (25.1%):第二主成分,解释了数据的 25.1% 方差。
聚类数:分为 3 个簇(cluster 1、2、3),用不同颜色表示:
红色 (cluster 1):包括巴西、智利、哥伦比亚等。
绿色 (cluster 2):包括美国、加拿大、德国等。
蓝色 (cluster 3):包括日本、利比亚、赞比亚等。
聚类解读
Cluster 1 (红色):
主要包括拉丁美洲和部分亚洲国家(如巴西、智利、菲律宾)。
可能代表发展中国家或经济特性相似的地区,分布在 Dim1 的正向和 Dim2 的负向区域。
Cluster 2 (绿色):
包括北美、欧洲和部分大洋洲国家(如美国、德国、澳大利亚)
可能代表发达国家,集中在 Dim1 的中性到正向和 Dim2 的正向区域。
Cluster 3 (蓝色):
包括日本、利比亚、赞比亚等,分布较分散。
可能反映经济或人口结构差异较大的国家,集中在 Dim1 的负向区域。
6 时间序列可视化
6.1 案例数据解释与展示
- 展示万科股价最高、最低、开盘、收盘价
# 读取 Excel 文件中的第一个工作表
<- read_excel("data5.xlsx")
data5 $日期 <- as.Date(data5$日期, format = "%Y/%m/%d")
data5library(zoo)
::datatable(data5,rownames = FALSE) DT
# 添加日期索引列
<- data5 %>%
data5 mutate(
date_index = 1:n(),
ma5 = rollmean(收盘价, 5, fill = NA, align = "right"),
ma10 = rollmean(收盘价, 10, fill = NA, align = "right"),
ma20 = rollmean(收盘价, 20, fill = NA, align = "right")
)
6.2 图形5——万科股票23-24年末股价K线图
library(readxl)
library(dplyr)
library(zoo)
library(ggplot2)
# 假设你已经读取了 data5 并格式化了日期
# data5 <- read_excel("data5.xlsx")
# data5$日期 <- as.Date(data5$日期, format = "%Y/%m/%d")
# 筛选 2020~2024 年的数据
<- data5 %>%
data5_filtered filter(format(日期, "%Y") >= 2023 & format(日期, "%Y") <= 2024) %>%
mutate(
date_index = 1:n(),
ma5 = rollmean(收盘价, 5, fill = NA, align = "right"),
ma10 = rollmean(收盘价, 10, fill = NA, align = "right"),
ma20 = rollmean(收盘价, 20, fill = NA, align = "right")
)
# 画 K 线图(带y轴)
<- ggplot(data5_filtered, aes(x = date_index)) +
p1 geom_segment(aes(xend = date_index, y = 日最低价, yend = 日最高价)) +
geom_rect(aes(
xmin = date_index - 0.4, xmax = date_index + 0.4,
ymin = pmin(开盘价, 收盘价), ymax = pmax(开盘价, 收盘价),
fill = 收盘价 > 开盘价
+
)) geom_line(aes(y = ma5, color = "MA5"), size = 0.8, alpha = 0.3) +
geom_line(aes(y = ma10, color = "MA10"), size = 0.8, alpha = 0.3) +
geom_line(aes(y = ma20, color = "MA20"), size = 0.8, alpha = 0.3) +
scale_fill_manual(values = c("TRUE" = "red", "FALSE" = "green")) +
scale_color_manual(values = c("MA5" = "blue", "MA10" = "orange", "MA20" = "purple")) +
scale_x_continuous(
breaks = data5_filtered$date_index,
labels = format(data5_filtered$日期, "%Y-%m-%d"),
expand = c(0, 0)
+
) theme_minimal() +
guides(fill = "none") +
theme(
legend.position = "top",
axis.title = element_blank(), # 移除轴标题
axis.text.x = element_blank(), # 只移除x轴文字
axis.ticks.x = element_blank(), # 只移除x轴刻度
plot.margin = margin(b = 10)
+
) labs(title = "K线图(2023~2024)", color = "移动平均线")
# 展示图形
p1
- 图形解读:
股价范围:从约 20 元下降至 5 元以下,总体呈下降趋势。
时间段:假设左端为 2023 年初,右端为 2024 年末,横轴反映约两年的数据。
K 线:显示开盘价、收盘价、最高价和最低价,红色和绿色矩形分别表示阳线和阴线。
移动平均线:图中可见多条平滑曲线(包括 MA5、MA10、MA20 等),颜色为紫色、橙色和蓝色,反映不同周期的趋势。