数据可视化期末报告

Author

221572216程子桃

1 报告要求

  • 期末实验报告由5章节5个图形组成,每个章节需要作一个图形。

  • 每个章节选择作什么图自主选择,作图前补充完整图形标题名称,例如:图形1——多变量条形图。

  • 案例数据自主收集,不同章节可以公用一个数据集。但同学间不允许使用相同数据集。

  • 每个章节的数据集合需要通过datatable 函数展示,并简要解释数据来源和变量意义。

  • 每个输出图形后需要对图形作简要解读,最少需针对图形提出一个观点。

  • 渲染html文件保留代码展示,6月22日前将发布网址提交至共享文档“8、期末报告” 列中。

  • 评分标准:

    • 每章节图形各20分

    • 能有效输出图形和合理解释75%

    • 数据独特性强10%

    • 图形个性化强15%

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)

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+ 名员工)

data<- read_csv("C:/Users/peach/Desktop/数据可视化/期末报告/期末报告/DataScience_Salaries.csv")
DT::datatable(data,rownames = FALSE)
数据科学薪资数据集变量说明
变量名 类型 单位 含义 示例值
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 隐藏
p1 <- ggHeatmap(
  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)
  )

p2 <- ggHeatmap(
  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-10

    • depression_phq9_score PHQ-9 抑郁评分,0-27

    • pem_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

data<- read_csv("C:/Users/peach/Desktop/数据可视化/期末报告/期末报告/me_cfs_vs_depression_dataset.csv")
DT::datatable(data,rownames = FALSE)
ME/CFS与抑郁症数据集变量说明
变量名 类型 单位 含义 示例值
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 隐藏
df <- read_csv("me_cfs_vs_depression_dataset.csv")
  selected_vars <- c("sleep_quality_index", "brain_fog_level", 
                  "stress_level", "depression_phq9_score", 
                  "hours_of_sleep_per_night")

plot_data <- df %>%
  select(all_of(selected_vars)) %>%
  gather(key = "指标", value = "指标值") %>%
  mutate(指标 = fct_inorder(指标))

# 计算偏度系数
skew_labels <- plot_data %>%
  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 周的最低价

    • 行业: 行业分类(技术、医疗保健、能源、金融等)

data<- read_csv("C:/Users/peach/Desktop/数据可视化/期末报告/期末报告/stock_market_june2025.csv")
DT::datatable(data,rownames = FALSE)
2025年6月股票市场数据集变量说明
变量名 类型 单位 含义 示例值
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水果的多汁程度

    • 成熟度水果的成熟阶段

    • 酸度水果的酸度水平

    • 质量水果的整体质量

data<- read_csv("C:/Users/peach/Desktop/数据可视化/期末报告/期末报告/apple_quality.csv")
DT::datatable(data,rownames = FALSE)
苹果品质数据集变量说明
变量名 类型 单位 含义 示例值
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类)
p1 <- fviz_dend(
  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)  # 设置随机种子保证结果可重现
km <- kmeans(mat, centers = 3, nstart = 25)

# 创建聚类分布图
p2 <- fviz_cluster(
  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月累计合同销售金额(单位:亿元)

data<- read_csv("C:/Users/peach/Desktop/数据可视化/期末报告/期末报告/vanke_sale.csv")
DT::datatable(data,rownames = FALSE)
万科销售数据集变量说明
变量名 类型 单位 含义 示例值
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年后持续下滑,可能与疫情所带来的行业形势不好有关。