library(tidyverse)
library(readr)
library(DT)
library(knitr)
library(dplyr)
library(ggiraphExtra)
library(gridExtra)
library(e1071)
library(scatterpie)
library(lubridate)
library("moments")
library(GGally)
library(ggplot2)
library(factoextra)
library(plotrix)
library(dygraphs)
library(xts)
library(reshape2)
数据可视化期末报告
1 报告要求
期末实验报告由5章节5个图形组成,每个章节需要作一个图形。
每个章节选择作什么图自主选择,作图前补充完整图形标题名称,例如:图形1——多变量条形图。
案例数据自主收集,不同章节可以公用一个数据集。但同学间不允许使用相同数据集。
每个章节的数据集合需要通过
datatable
函数展示,并简要解释数据来源和变量意义。每个输出图形后需要对图形作简要解读,最少需针对图形提出一个观点。
渲染html文件保留代码展示,6月22日前将发布网址提交至共享文档
“8、期末报告”
列中。评分标准:
每章节图形各20分
能有效输出图形和合理解释75%
数据独特性强10%
图形个性化强15%
2 类别数据可视化
2.1 案例数据解释与展示
此数据集从Kaggle下载包含 2025 年数据科学、AI 和机器学习工作角色的详细薪资信息。一共12列926行,每行代表一个工作条目,包括职位、薪酬、位置、经验水平和其他上下文元数据。
2.1.1 列描述:
work_year
报告薪金的年份。所有条目均反映 2025 年的数据。job_title
特定角色或职称,例如数据科学家、机器学习工程师、AI 研究员等。job_category
工作的更广泛类别或专业化(例如,数据工程、NLP、计算机视觉等)。salary_currency
支付工资的原始货币(例如,美元、欧元、印度卢比)。薪水
以原始货币计算的年薪(换算前)。salary_in_usd
年薪使用 2025 年平均汇率换算成美元,以便进行全球比较。employee_residence
员工居住或主要工作的国家/地区。experience_level
该职位所需或持有的专业经验水平。共同价值观:初级、中级、高级、高级。employment_type
雇佣合同的类型。示例:全职、兼职、合同、自由职业者。work_setting
指定作业是远程、混合还是现场。company_location
雇主的总部或主要办事处所在的国家/地区。company_size
雇主组织的规模,分类为:小型 (1-50 名员工)
中型(51-500 名员工)
大型 (500+ 名员工)
<- read_csv("C:/Users/peach/Desktop/数据可视化/期末报告/期末报告/DataScience_Salaries.csv")
data::datatable(data,rownames = FALSE) DT
变量名 | 类型 | 单位 | 含义 | 示例值 |
---|---|---|---|---|
work_year | 数值型 | 年 | 记录薪资数据的年份 | 2025 |
job_title | 字符型 | - | 具体的职位名称 | Data Scientist |
job_category | 字符型 | - | 职位所属的主要类别 | Data Science |
salary_currency | 字符型 | - | 薪资使用的货币类型 | USD |
salary | 数值型 | 当地货币 | 以当地货币计算的薪资金额 | 152000 |
salary_in_usd | 数值型 | 美元 | 转换为美元后的薪资金额 | 152000 |
employee_residence | 字符型 | 国家 | 员工居住的国家 | United States |
experience_level | 字符型 | - | 职业经验水平 | Entry |
employment_type | 字符型 | - | 就业类型(全职、兼职等) | Full-time |
work_setting | 字符型 | - | 工作环境设置 | Remote |
company_location | 字符型 | 城市, 国家 | 公司所在的城市和国家 | San Francisco, CA |
company_size | 字符型 | - | 公司规模大小 | Large |
2.2 图形1——矩形热力图和极坐标热图
# 数据已处理使用echo = FALSE 隐藏
<- ggHeatmap(
p1 data = df,
aes(x = job_category, y = experience_level, fill = avg_salary),
addlabel = TRUE,
label.size = 0.8,
label.round = 0,
palette = "Reds"
+
) ggtitle("职位平均薪资矩阵热图 ") +
labs(x = "职位类别", y = "经验水平", fill = "平均薪资") +
theme(
axis.text.x = element_text(angle = 45, hjust = 1)
)
<- ggHeatmap(
p2 data = df,
aes(x = job_category, y = experience_level, fill = avg_salary),
polar = T,
label.size = 0.4,
label.round = 0,
addlabel = F,
palette = "Blues",
+
) ggtitle("薪资极坐标热图") +
labs(fill = "平均薪资") +
theme(
axis.text.x = element_text(size = 5,angle = 30, hjust = 0.5)
)
grid.arrange(p1,p2)
- 图形解读:薪资与经验和选择的职位类别挂钩,且优势明显,Data Science初级经验就比其他职位的中级经验赚得多,而且经验越丰富薪资涨幅越大,所以选择职位也是很重要的
3 数据分布可视化
3.1 案例数据解释与展示
此数据集从Kaggle下载预测患者是否患有:肌痛性脑脊髓炎/慢性疲劳综合征 (ME/CFS) 和抑郁症之间——
ME/CFS、Depression
或两者兼而有之 间(Both
),基于行为、临床和症状特征。共16列1000条数据3.1.1 列描述:
age
患者年龄gender
性别 (男 / 女 / 其他)fatigue_severity_scale_score
疲劳严重程度量表 (FSS),0-10depression_phq9_score
PHQ-9 抑郁评分,0-27pem_present
是否存在劳累后不适 (PEM)(是/否或 1/0)pem_duration_hours
PEM 的持续时间(小时)sleep_quality_index
睡眠质量(1-10 分)brain_fog_level
脑雾等级 (1–10)physical_pain_score
身体疼痛强度 (1-10)stress_level
应力水平 (1–10)work_status
工作状态: 工作中 / 部分工作 / 未工作social_activity_level
社交活动: 非常低 – 非常高exercise_frequency
运动频率: 从不 – 每天meditation_or_mindfulness
患者是否练习正念或冥想?是/否hours_of_sleep_per_night
每晚平均睡眠时长diagnosis
目标变量:ME/CFSDepressionBoth
<- read_csv("C:/Users/peach/Desktop/数据可视化/期末报告/期末报告/me_cfs_vs_depression_dataset.csv")
data::datatable(data,rownames = FALSE) DT
变量名 | 类型 | 单位 | 含义 | 示例值 |
---|---|---|---|---|
age | 数值型 | - | 年龄 | 56 |
gender | 字符型 | - | 性别 | Male |
sleep_quality_index | 数值型 | 分(0-10) | 睡眠质量指数(0-10分,分数越高睡眠质量越差) | 8.7 |
brain_fog_level | 数值型 | 分(0-10) | 脑雾程度(0-10分,分数越高脑雾越严重) | 3.9 |
physical_pain_score | 数值型 | 分(0-10) | 身体疼痛评分(0-10分,分数越高疼痛越剧烈) | 9.2 |
stress_level | 数值型 | 分(0-10) | 压力水平(0-10分,分数越高压力越大) | 8.1 |
depression_phq9_score | 数值型 | 分(0-27) | 抑郁PHQ-9评分(0-27分,分数越高抑郁程度越严重) | 10.0 |
fatigue_severity_scale_score | 数值型 | 分(0-10) | 疲劳严重程度量表评分(0-10分,分数越高疲劳感越强) | 6.5 |
pem_duration_hours | 数值型 | 小时 | 运动后不适(PEM)持续时间 | 9.0 |
hours_of_sleep_per_night | 数值型 | 小时 | 每晚睡眠时间 | 7.7 |
pem_present | 数值型 | 0/1 | PEM是否存在(0=不存在,1=存在) | 0 |
work_status | 字符型 | - | 工作状态 | Working |
social_activity_level | 字符型 | - | 社交活动水平 | Low |
exercise_frequency | 字符型 | - | 锻炼频率 | Daily |
meditation_or_mindfulness | 字符型 | - | 是否进行冥想或正念练习 | Yes |
diagnosis | 字符型 | - | 诊断结果 | Depression |
3.2 图形2——分面直方图
# 此数据处理没有用echo = FALSE 隐藏
<- read_csv("me_cfs_vs_depression_dataset.csv")
df <- c("sleep_quality_index", "brain_fog_level",
selected_vars "stress_level", "depression_phq9_score",
"hours_of_sleep_per_night")
<- df %>%
plot_data select(all_of(selected_vars)) %>%
gather(key = "指标", value = "指标值") %>%
mutate(指标 = fct_inorder(指标))
# 计算偏度系数
<- plot_data %>%
skew_labels group_by(指标) %>%
summarise(偏度 = skewness(指标值, na.rm = TRUE)) %>%
mutate(偏度标签 = sprintf("偏度 = %.2f", 偏度))
# 绘制分面直方图
ggplot(plot_data, aes(x = 指标值)) +
geom_histogram(fill="green",color="gray") +
geom_text(data = skew_labels,
aes(x = Inf, y = Inf, label = 偏度标签),
hjust = 1.1, vjust = 1.5, size = 2.5, color = "red") +scale_fill_brewer(palette="Set3")+
facet_wrap(~指标, scales = "free", ncol = 3) +
labs(title = "健康指标分布与偏度分析",
x = "指标值",
y = "频数")+
guides(fill="none")
- 图形解读:慢性病群体中,绝大多数人症状中等,如最后一张图,睡眠时间图,分布比较均衡,总体还是可以分成三类人:睡得特别少,正常睡眠,睡得特别多。
4 变量关系可视化
4.1 案例数据解释与展示
此数据集从Kaggle下载包含 2025 年 6 月的全面股票市场数据,其中包含多个行业的每日交易信息。该数据集包括 14 个关键财务指标和指标,1762行信息。
4.1.1 列描述:
日期
:YYYY-MM-DD 格式的交易日期Ticker
:股票代码标识符开盘价
:交易日的开盘价收盘价
:交易日收盘价最高价
:当天达到的最高价最低价
:当天达到的最低价交易量
:交易的股票数量市值
: 总市值市盈率
:用于估值分析的市盈率股息收益率
:年度股息占股票价格的百分比EPS
:每股收益52 周最高价
:过去 52 周内的最高价52 周最低价
:过去 52 周的最低价行业
: 行业分类(技术、医疗保健、能源、金融等)
<- read_csv("C:/Users/peach/Desktop/数据可视化/期末报告/期末报告/stock_market_june2025.csv")
data::datatable(data,rownames = FALSE) DT
变量名 | 类型 | 单位 | 含义 | 示例值 |
---|---|---|---|---|
Date | 字符型 | - | 交易日期 | 01-06-2025 |
Ticker | 字符型 | - | 股票代码 | SLH |
Open Price | 数值型 | 货币单位 | 开盘价格 | 34.92 |
Close Price | 数值型 | 货币单位 | 收盘价格 | 34.53 |
High Price | 数值型 | 货币单位 | 当日最高价格 | 35.22 |
Low Price | 数值型 | 货币单位 | 当日最低价格 | 34.38 |
Volume Traded | 数值型 | 股 | 交易量 | 2966611 |
Market Cap | 数值型 | 货币单位 | 市值 | 57381363838.88288 |
PE Ratio | 数值型 | - | 市盈率 | 29.63 |
Dividend Yield | 数值型 | % | 股息收益率 | 2.85 |
EPS | 数值型 | - | 每股收益 | 1.17 |
52 Week High | 数值型 | 货币单位 | 52周最高价格 | 39.39 |
52 Week Low | 数值型 | 货币单位 | 52周最低价格 | 28.44 |
Sector | 字符型 | - | 所属行业 | Industrials |
4.2 图形3——散点图矩阵
# 数据已处理使用echo = FALSE 隐藏
# 创建散点图矩阵
ggpairs(
data = plot_data,
upper = list(continuous = "density"),
lower = list(continuous = "points"),
diag = list(continuous = "densityDiag")
+
) theme_bw() +
theme(
axis.text = element_text(size = 6),
axis.title = element_text(size = 6),
strip.text = element_text(size = 6))
- 图形解读:开盘、收盘、高低价之间存在良好的线性关系,但交易量:Volume.Traded与这些价格变量及市值:Market.Cap,呈现非线性关系,可以初步推测:市值是决定交易量规模的关键因素。
5 样本相似性可视化
5.1 案例数据解释与展示
此数据集从Kaggle下载包含有关一组水果的各种属性的信息,从而提供对其特征的见解。共9列111条数据。
5.1.1 列描述
A_id
:每个水果的唯一标识符Size
: 水果的大小Weight
: 水果的重量Sweetness
(甜度):水果的甜度松脆度
:表示水果松脆度的质地juiciness
:水果的多汁程度成熟度
:水果的成熟阶段酸度
:水果的酸度水平质量
:水果的整体质量
<- read_csv("C:/Users/peach/Desktop/数据可视化/期末报告/期末报告/apple_quality.csv")
data::datatable(data,rownames = FALSE) DT
变量名 | 类型 | 单位 | 含义 | 示例值 |
---|---|---|---|---|
A_id | 数值型 | - | 苹果样本编号 | 1 |
Size | 数值型 | 标准化单位 | 果实大小 | -3.97 |
Weight | 数值型 | 标准化单位 | 果实重量 | -2.51 |
Sweetness | 数值型 | 标准化单位 | 甜度 | 5.35 |
Crunchiness | 数值型 | 标准化单位 | 脆度 | -1.01 |
Juiciness | 数值型 | 标准化单位 | 多汁度 | 1.84 |
Ripeness | 数值型 | 标准化单位 | 成熟度 | 0.33 |
Acidity | 数值型 | 标准化单位 | 酸度 | -0.49 |
Quality | 字符型 | - | 品质等级(好/坏) | good |
5.2 图形4——系统聚类树状图和K-menas聚类主成分图
# 数据已处理使用echo = FALSE 隐藏
# 创建圆形树状图(分成4类)
<- fviz_dend(
p1
hc,k = 4, # 分成4类
cex = 0.5, # 设置数据标签的总体大小
horiz = FALSE, # 垂直摆放图形
color_labels_by_k = TRUE, # 自动设置数据标签颜色
lwd = 0.6, # 设置分支和矩形的线宽
type = "circular", # 设置绘图类型为矩形
rect = TRUE, # 使用不同的颜色矩形标记类别
rect_lty = 1,
rect_fill = TRUE # 设置标记框的线型和填充颜色
+
) ggtitle("系统聚类树状图 (4类)") +
theme(plot.title = element_text(hjust = 0.5, size = 10))
# K-means聚类(分成3类)
set.seed(123) # 设置随机种子保证结果可重现
<- kmeans(mat, centers = 3, nstart = 25)
km
# 创建聚类分布图
<- fviz_cluster(
p2
km,data = mat,
ellipse.type = "convex",
repel = TRUE,
star.plot = FALSE,
labelsize = 8,
ggtheme = theme_minimal(),
main = "K-means聚类分布 (3类)"
+
) theme(plot.title = element_text(hjust = 0.5))
grid.arrange(p1, p2)
- 图形解读:K-means的聚类中心分布:1蓝:均衡型代表”标准品质”苹果(各项指标接近均值),2红:风味强烈型,可能对应”低糖高酸”群体,3绿:口感突出型脆爽,鲜食优选
6 时间序列可视化
6.1 案例数据解释与展示
该数据集从Kaggle下载,收集了万科近些年月销售快报数据。共5列98行数据。
6.1.1 列描述
date
:日期(YYYY_MM)sale_area
:合同销售面积(单位:万平方米)sale_amount
:合同销售金额(单位:亿元)cul_sale_area
:本年度N月份公司累计合同销售面积(单位:万平方米)cul_sale_amount
:本年度N月累计合同销售金额(单位:亿元)
<- read_csv("C:/Users/peach/Desktop/数据可视化/期末报告/期末报告/vanke_sale.csv")
data::datatable(data,rownames = FALSE) DT
变量名 | 类型 | 单位 | 含义 | 示例值 |
---|---|---|---|---|
date | 字符型 | - | 销售日期(年月格式) | 2020_12 |
sale_area | 数值型 | 万平方米 | 单月销售面积 | 642.2 |
sale_amount | 数值型 | 亿元 | 单月销售金额 | 1015.4 |
cul_sale_area | 数值型 | 万平方米 | 累计销售面积 | 4667.5 |
cul_sale_amount | 数值型 | 亿元 | 累计销售金额 | 7041.5 |
6.2 图形5——时间序列风筝图和动态交互图
# 数据已处理使用echo = FALSE 隐藏
# 创建风筝图
kiteChart(t(mat_data),
varscale = FALSE,
timex=TRUE, # 时间放在水平的x轴
normalize=TRUE, # 将每行值缩放为最大宽度为1
shownorm=FALSE, # 不显示归一化乘数
xlab="时间",ylab="指标",main="风筝图归一化",
lwd = 1.5,mar=c(6,6,4,6)) # 设置边距
legend(
"topright",
inset = c(-0.25, 0),
legend = c("销售面积", "销售金额", "累计面积", "累计金额"),
col = c("#1F77B4", "#FF7F0E", "#2CA02C", "#D62728"),
lty = 1, lwd = 2, cex = 0.8, bty = "n",
xpd = TRUE)
#时间序列交互动态图
dygraph(ts_data, main = "万科月度销售金额趋势 (亿元)") %>%
dySeries("sale_amount", label = "销售金额") %>%
dyAxis("y", label = "金额 (亿元)") %>%
dyAxis("x", label = "日期") %>%
dyOptions(strokeWidth = 2,
fillGraph = TRUE,
fillAlpha = 0.2) %>%
dyRangeSelector(height = 20, dateWindow = range(vanke_data$date))
- 图形解读:图1明显看出每年6月、12月出现销售高峰,可能与房企年中和年末业绩冲刺有关;图2看出2021年前销售金额呈上升趋势,2021年后持续下滑,可能与疫情所带来的行业形势不好有关。