数据可视化期末报告

Author

221527138李旺仔

1 报告要求

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

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

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

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

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

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

  • 评分标准:

    • 每章节图形各20分

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

    • 数据独特性强10%

    • 图形个性化强15%

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)

2 类别数据可视化

2.1 数据解释与展示

  • 这张表格展示了一组数据,包含年龄、职业、收入、生活方式、是否关注及是否开始等变量。

    • 年龄 (岁):分布在 18-25 岁和 26-35 岁

    • 职业 (工):主要为企业员工 (企业职员) 和学生 (学生)。

    • 收入 (入):大部分为 3000元以下 (3000元以下),少数为 8000元 (8000元)。

library(readxl)


data1 <- read_excel("data1.xlsx")

DT::datatable(data1,rownames = FALSE)

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)


data2 <- read_excel("data2.xlsx")
data2$日期 <- as.Date(data2$日期, format = "%Y/%m/%d")


DT::datatable(data2,rownames = FALSE)

3.2 图形2——股价相关指标及标准化箱线图

# 选择要分析的数值列
vars <- c("万科收盘价", "人民币元对美元汇率", "无风险利率", "日最高价", "日最低价")

# 将数据从宽格式转成长格式
df <- pivot_longer(data2, cols = all_of(vars), names_to = "指标", values_to = "指标值")

# 标准化变换(Z-score)
df <- df %>%
  group_by(指标) %>%
  mutate(
    标准化值 = scale(指标值)[,1],        # Z-score
    log值 = log10(指标值)                # 对数变换
  ) %>%
  ungroup()

# 设置调色板
palette <- RColorBrewer::brewer.pal(5, "Set2")

# 画图1:对数变换
p1 <- ggplot(df, aes(x = 指标, y = log值)) +
  geom_boxplot(fill = palette, outlier.size = 0.8) +
  scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
  ylab("log10(指标值)") +
  ggtitle("(a) 对数变换") +
  theme_minimal()

# 画图2:标准化变换
p2 <- ggplot(df, aes(x = 指标, y = 标准化值)) +
  geom_boxplot(fill = palette, outlier.size = 0.8) +
  scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
  ylab("标准化值 (Z-score)") +
  ggtitle("(b) 标准化变换") +
  theme_minimal()

# 组合图
gridExtra::grid.arrange(p1, p2, ncol = 2)

  • 图形解读:

    1. 利率的绝对值最小

    2. 人民币汇率波动范围的绝对值最小

    3. 标准化后汇率波动较明显

    4. 股价数据存在离群值说明市场非理性可能性高

4 变量关系可视化

4.1 案例数据解释与展示

  • 广州二手房均价相关数据包含租金比、出让面积、可支配收入等,数据时间从2016到2025
library(readxl)

data3 <- read.csv("data3.csv", stringsAsFactors = FALSE)


DT::datatable(data3,rownames = FALSE)

4.2 图形3——广州房价及相关指标散点图矩阵

library(GGally)
df <- data3

ggpairs(df,columns=2:8)+                    # 选择图变量
  theme(axis.title=element_text(size=8))+         # 设置坐标轴标签字体大小
  theme(axis.text=element_text(size=6))           # 设置坐标轴刻度字体大小

  • 图形解读:

    1. 强相关:CPI (人均可支配收入)与年平均人数 (0.996) 高度正相关,房价租金比与CPI (人均可支配收入) (0.981) 也强相关。

    2. 弱相关:其他变量对之间相关性较低,部分为负相关(如二手房价与人均可支配收入0.235)。

5 样本相似性可视化

5.1 案例数据解释与展示

  • LifeCycleSavings 是 R 语言中自带的一个数据集,包含了50个国家或地区的生命周期储蓄数据。以下是对其变量含义的解读:

    • pop15:15岁以下人口比例(%)。表示一个国家或地区中15岁以下人口占总人口的百分比,反映了人口年龄结构。

    • pop75:75岁以上人口比例(%)。表示75岁及以上人口占总人口的百分比,反映老年人口比例。

    • dpi:人均可支配收入(美元)。表示每个人的可支配收入水平,是衡量经济状况的重要指标。

    • ddpi:人均可支配收入的增长率(%)。表示可支配收入的年增长率,反映经济动态。

    • sr:个人储蓄率(%)。表示个人储蓄占可支配收入的百分比,是研究生命周期储蓄行为的核心变量。

# 载入数据
data("LifeCycleSavings")
df <- LifeCycleSavings

DT::datatable(df,rownames = FALSE)

5.2 图形4——不同国家根据储蓄聚类图

# 如果想保留国家名作为标注,可以设置 rownames
# 此数据集 rownames 本身就是国家名
mat <- scale(df)  # 对变量标准化,避免量纲影响

# K-means 聚类(分成4类)
set.seed(123)  # 设置随机种子,保证结果可复现
km <- kmeans(mat, centers = 3)

# 聚类可视化
fviz_cluster(km, data = mat,
             repel = TRUE,              # 避免标签重叠
             ellipse.type = "norm",     # 添加正态置信椭圆
             labelsize = 9,             # 标签字体大小
             pointsize = 2,             # 点的大小
             main = "K-means聚类(分成3类)")

  • 图形解读:
    1. 维度

      • Dim1 (66.4%):第一主成分,解释了数据的 66.4% 方差。

      • Dim2 (25.1%):第二主成分,解释了数据的 25.1% 方差。

    2. 聚类数:分为 3 个簇(cluster 1、2、3),用不同颜色表示:

      • 红色 (cluster 1):包括巴西、智利、哥伦比亚等。

      • 绿色 (cluster 2):包括美国、加拿大、德国等。

      • 蓝色 (cluster 3):包括日本、利比亚、赞比亚等。

    3. 聚类解读

      • Cluster 1 (红色)

        • 主要包括拉丁美洲和部分亚洲国家(如巴西、智利、菲律宾)。

        • 可能代表发展中国家或经济特性相似的地区,分布在 Dim1 的正向和 Dim2 的负向区域。

      • Cluster 2 (绿色)

        • 包括北美、欧洲和部分大洋洲国家(如美国、德国、澳大利亚)

        • 可能代表发达国家,集中在 Dim1 的中性到正向和 Dim2 的正向区域。

      • Cluster 3 (蓝色)

        • 包括日本、利比亚、赞比亚等,分布较分散。

        • 可能反映经济或人口结构差异较大的国家,集中在 Dim1 的负向区域。

6 时间序列可视化

6.1 案例数据解释与展示

  • 展示万科股价最高、最低、开盘、收盘价
# 读取 Excel 文件中的第一个工作表
data5 <- read_excel("data5.xlsx")
data5$日期 <- as.Date(data5$日期, format = "%Y/%m/%d")
library(zoo)


DT::datatable(data5,rownames = FALSE)
# 添加日期索引列
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_filtered <- data5 %>%
  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轴)
p1 <- ggplot(data5_filtered, aes(x = date_index)) + 
  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

  • 图形解读:
    1. 股价范围:从约 20 元下降至 5 元以下,总体呈下降趋势。

    2. 时间段:假设左端为 2023 年初,右端为 2024 年末,横轴反映约两年的数据。

    3. K 线:显示开盘价、收盘价、最高价和最低价,红色和绿色矩形分别表示阳线和阴线。

    4. 移动平均线:图中可见多条平滑曲线(包括 MA5、MA10、MA20 等),颜色为紫色、橙色和蓝色,反映不同周期的趋势。