数据可视化期末报告

Author

221527126何隆基

1 报告要求

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

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

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

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

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

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

  • 评分标准:

    • 每章节图形各20分

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

    • 数据独特性强10%

    • 图形个性化强15%

#数据解释

该数据来自CSMAR希施玛数据库,数据为2024年底全国各省市银行的基础数据,包括注册资本,在职员工总数,本科及以上员工人数,研究生及以上员工人数,基于此数据完成图形1-4.

library(DT)  # 加载 DT 包
df<-read.csv("E:/11.csv", stringsAsFactors = FALSE)
datatable(df,rownames = FALSE)

2 类别数据可视化

2.1 案例数据解释与展示

  • 该数据基于原始数据汇总了各省份银行的数量以及它们各自的占比,基于此完成了添加了频数和百分比标签的条形图
# 读取数据

df1<-read.csv("E:/11.csv", stringsAsFactors = FALSE)|>  
  select(省份)|> 
  group_by(省份) |> 
  summarise(数量=n()) |> 
  mutate(百分比 = round(数量 * 100 / sum(数量), 2))

datatable(df1,rownames = FALSE)

2.2 图形1——

# 绘制条形图
# 生成足够多的颜色(与省份数量相同)
province_count <- nrow(df1)
palette <- colorRampPalette(brewer.pal(8, "Set2"))(province_count)

p1 <- ggplot(df1, aes(x = reorder(省份, 数量), y = 数量)) +
  geom_bar(stat = "identity", width = 0.8, fill = palette) +
  geom_text(aes(label = 数量), vjust = -0.5) +
  ylim(0, 1.1 * max(df1$数量)) +
  labs(title = "(a) 添加频数标签", x = "省份") +
  coord_flip()  # 添加横向显示更清晰

p2 <- ggplot(df1, aes(x = reorder(省份, 数量), y = 数量)) +
  geom_col(width = 0.8, fill = palette) +
  geom_text(aes(label = paste0(百分比, "%")), vjust = 0,size = 2) +
  ylim(0, 1.1 * max(df1$数量)) +
  labs(title = "(b) 添加频数百分比标签", x = "省份") +
  coord_flip()

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

  • 图形解读:

  • 2.2.0.1 一、整体分布特征

    1. 区域集中度高

      • 第一梯队(5省占主导)
        福建、江苏、浙江、广东、安徽五省银行数量显著领先,合计占比可能超过50%(需具体数据验证),反映长三角、珠三角及东南沿海的经济金融活跃度。

      • 尾部省份差异小
        宁夏、甘肃、内蒙古等省份银行数量最少,与经济发展水平正相关。

    2. 东西部差距明显

      • 东部沿海省份银行数量普遍多于中西部,与区域经济发达程度一致。

      • 北京、上海作为金融中心,银行数量虽未进前五,但单体机构规模(如总行)可能更大。

        3.业务启示:

      • 市场拓展

        • 重点区域:福建、江苏等高密度省份竞争激烈,需差异化服务(如科技金融)。

        • 潜力区域:安徽、四川等中游省份存在渗透空间。

      • 风险管控

        • 银行数量多的省份可能伴随同质化竞争,需关注资产质量。

        • 边疆省份(如新疆、内蒙古)网点成本高,需评估效益。

3 数据分布可视化

3.1 案例数据解释与展示

  • 该数据基于原始数据做了数据缺失处理,并进行数据标准化
df2 <- df %>% filter(!is.na(在职员工总数), !is.na(研究生及以上员工人数))
df2 <- df2 %>% mutate(across(c(在职员工总数, `研究生及以上员工人数`), scale))
datatable(df2,rownames = FALSE)

3.2 图形2——

p1<-ggplot(df2,aes(x=x))+
   geom_density(aes(x=在职员工总数,y=..density..),fill="red",alpha=0.3)+ # 绘制在职员工总数的核密度图(上图)
   geom_label(aes(x=0.2,y=2),label="在职员工总数",color="red")+  # 添加标签
   geom_density(aes(x=研究生及以上员工人数,y=-..density..),fill="blue",alpha=0.3)+ # 绘制研究生及以上员工人数的核密度图(下图)
   geom_label(aes(x=0.3,y=-2),label="研究生及以上员工人数",color="blue")+
   xlab("指标值")+ggtitle("(a) 在职员工总数和研究生及以上员工人数的镜像核密度图")
p1

  • 图形解读:
  • 分布形状比较
    • “在职员工总数”的分布比”研究生及以上员工人数”更宽,说明银行员工规模差异较大

    • 研究生人数的分布更集中,可能表明高学历员工比例相对稳定

  • 峰值位置
    • 主峰位置反映最普遍的员工规模区间

    • 研究生人数峰值相对于总人数的位置可显示高学历员工占比

  • 分布对称性
    • 右偏分布(右侧拖尾)可能表示少数银行(四大国有银行)有异常多的员工
  • 多峰现象
    • 多峰可能反映银行规模存在明显的分类(如大型银行vs中小型银行)
  • 分布重叠区域
    • 重叠区域显示两种指标在特定区间的关联性

4 变量关系可视化

4.1 案例数据解释与展示

  • 该数据直接使用原始数据,选择本科及研究生员工人数这两个变量绘制散点图+地毯图+线性拟合
df3 <- df
datatable(df3,rownames = FALSE)

4.2 图形3——

p1 <- ggplot(data = df3, aes(x = 本科及以上员工人数, y = 研究生及以上员工人数)) +
    geom_point(shape = 21, size = 1.5, fill = "deepskyblue") +  # 散点图:形状、大小、填充色
    geom_rug(color = "steelblue") +                             # 地毯图
    stat_smooth(method = "lm", color = "red", fill = "blue", linewidth = 0.8) +  # 线性拟合(改用 linewidth)
    geom_point(
    aes(x = mean(本科及以上员工人数, na.rm = TRUE), 
        y = mean(研究生及以上员工人数, na.rm = TRUE)),
    shape = 21, fill = "yellow", size = 4
) +  # 均值点
    ggtitle("(a) 散点图+地毯图+线性拟合")
p2<-p1 + coord_cartesian(
    xlim = c(0, quantile(df3$本科及以上员工人数, 0.9, na.rm = TRUE)),  # 限制x轴范围(排除极端值)
    ylim = c(0, quantile(df3$研究生及以上员工人数, 0.9, na.rm = TRUE))  # 限制y轴范围
)
grid.arrange(p2) # 按2列组合图形p1和p2

  • 图形解读:
  • 散点图主体
    • X轴:本科及以上员工人数(范围约0-10,000)

    • Y轴:研究生及以上员工人数(范围约0-5,000)

    • 每个点代表一家银行的两种员工人数数据

  • 地毯图(Rug Plot)
    • 在坐标轴边缘显示的短竖线

    • 显示每个变量在单变量维度上的分布密度

    • 可以直观看出数据的集中区间和异常值

  • 线性拟合线
    • 穿过散点图的直线,表示两个变量间的线性关系趋势

    • 斜率和截距反映了关系的强度和方向

  • 整体趋势
    • 从图形描述看,研究生人数随本科人数增加而增加(正向关系)

    • 拟合线斜率为正,表明两者存在正相关关系

  • 关系强度
    • 点围绕拟合线分布分散,则关系较弱
  • 分布特征
    • 本科人数集中在较低区间(左侧地毯图密集)

    • 研究生人数也集中在较低区间(下方地毯图密集)

    • 因为存在少数异常值(高员工数的银行)

5 样本相似性可视化

5.1 案例数据解释与展示

  • 该图数据依然选择原始数据,绘制银行数据特征的相关性热图
# 加载必要的包
library(ggplot2)
library(dplyr)
library(tidyr)
library(ggrepel) # 避免标签重叠
library(pheatmap) # 热图绘制

# 读取数据
df4 <- df

# 数据预处理
# 选择数值型变量并去除缺失值过多的列
num_vars <- c("注册资本", "在职员工总数", "本科及以上员工人数", "研究生及以上员工人数")
df_num <- df4 %>% 
  select(all_of(num_vars)) %>% 
  mutate(across(everything(), ~as.numeric(.))) %>% 
  na.omit()

# 标准化数据
df_scaled <- scale(df_num)
rownames(df_scaled) <- df$银行简称[complete.cases(df[num_vars])]

5.2 图形4——

# 计算相关性矩阵
cor_matrix <- cor(df_num, use = "complete.obs")

# 绘制热图
pheatmap(cor_matrix,
         main = "银行数据特征相关性热图",
         color = colorRampPalette(c("blue", "white", "red"))(100),
         display_numbers = TRUE,
         number_color = "black",
         fontsize_number = 10)

  • 图形解读:

    • 1. 热图基本结构解读

    • 坐标轴:横纵轴均为数值型变量(注册资本、员工人数等),每个方格表示两个变量的相关系数。

    • 颜色梯度

      • 红色(1.0):强正相关

      • 白色(0):无相关性

      • 蓝色(-1.0):强负相关

    • 数值标签:方格中的数字为具体的相关系数(Pearson相关系数),范围从-1到1。

    • 2. 关键相关性观察

    • 本科及以上员工人数 vs 研究生及以上员工人数

      • 相关系数:0.89(红色)

      • 解读:高学历员工比例呈现高度一致性,说明银行在招聘时倾向于同步增加本科和研究生学历员工,或研究生学历员工多从本科员工中晋升。

      • 注册资本 vs 员工人数相关指标

        • 相关系数:0.34

        • 解读:注册资本与员工规模的关联性较弱,说明银行资本规模不直接决定员工数量,可能受分支机构数量、业务类型影响。但注册资本与研究生的相关系数(0.51)比注册资本与本科的相关系数(0.36)大,故注册资本与学历高低有一定的相关性。

6 时间序列可视化

6.1 案例数据解释与展示

  • 该数据为2024年建设银行(证券代码601939)交易数据,包括交易日期,日开盘价,日最高价,日最低价,日收盘价

  • 该数据中data为为日期变量,但该日期变量不规则(不连续),周末和公众假期没有交易数据

  • 利用数据作K线图

library(zoo)
library(ggplot2)
library(dplyr)
library(DT)   # 用于datatable交互表格
data<-read.csv("E:/22.csv")
df <- data  |>  select(date:close) |> 
  mutate(ma5 = rollmean(close, k = 5, fill = NA, align = "right"),
         ma10 = rollmean(close, k = 10, fill = NA, align = "right"),
         ma20 = rollmean(close, k = 20, fill = NA, align = "right"),
         date_index = seq_along(date)
         )
df <- df |> 
  mutate(date = as.Date(date))  # 或 as.POSIXct(date) 如果含时间
datatable(df)

6.2 图形5——

library(ggplot2)
library(dplyr)
library(zoo)  # 用于rollmean函数
library(DT)   # 用于datatable交互表格

p1 <- df |> ggplot(aes(x = date_index)) +
  geom_segment(aes(x = date_index, xend = date_index, y = low, yend = high)) +
  geom_rect(aes(xmin = date_index - 0.4, xmax = date_index + 0.4,
                ymin = pmin(open, close), ymax = pmax(open, close),
                fill = close > open)) +
  geom_line(aes(y = ma5, color = "MA5"), size = 0.8) +
  geom_line(aes(y = ma10, color = "MA10"), size = 0.8) +
  geom_line(aes(y = ma20, color = "MA20"), size = 0.8) +
  scale_fill_manual(values = c("TRUE" = "red", "FALSE" = "green")) +
  scale_color_manual(values = c("MA5" = "blue", "MA10" = "orange", "MA20" = "purple")) +
  scale_x_continuous(breaks = seq(1, nrow(df), by = 20), labels = format(df$date[seq(1, nrow(df), by = 20)], "%Y-%m-%d")) +
  theme_minimal() + guides(fill="none")+
  theme(legend.position = "top",
        axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        plot.margin = margin(b = 0)) +
  labs(x = "", y = "", title = "上证指数K线图", color = "移动平均线")
p1

  • 图形解读:

    1. 全年走势

      • 震荡上行:股价从年初6.5元附近起步,经历多次回调后,年末收于8.79元,年涨幅约35%,表现强于大盘。

      • 关键突破点

        • 7月:突破7.5元压力位,开启主升浪。

        • 9月底:短暂回调后,10月初放量突破8元。

        • 12月:加速上涨,最高触及9.02元,创年内新高。

    2. 阶段划分

      • 1-3月(6.5-7.0元):缓慢爬升,消化获利盘。

      • 4-6月(7.0-7.4元):横盘整理,构筑支撑平台。

      • 7-9月(7.4-8.0元):突破前高,量价配合。

      • 10-12月(8.0-8.8元):加速上涨,波动加大。