数据可视化期末报告

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年后持续下滑,可能与疫情所带来的行业形势不好有关。