library(DT) # 加载 DT 包
<-read.csv("E:/11.csv", stringsAsFactors = FALSE)
dfdatatable(df,rownames = FALSE)
数据可视化期末报告
1 报告要求
期末实验报告由5章节5个图形组成,每个章节需要作一个图形。
每个章节选择作什么图自主选择,作图前补充完整图形标题名称,例如:图形1——多变量条形图。
案例数据自主收集,不同章节可以公用一个数据集。但同学间不允许使用相同数据集。
每个章节的数据集合需要通过
datatable
函数展示,并简要解释数据来源和变量意义。每个输出图形后需要对图形作简要解读,最少需针对图形提出一个观点。
渲染html文件保留代码展示,6月22日前将发布网址提交至共享文档
“8、期末报告”
列中。评分标准:
每章节图形各20分
能有效输出图形和合理解释75%
数据独特性强10%
图形个性化强15%
#数据解释
该数据来自CSMAR希施玛数据库,数据为2024年底全国各省市银行的基础数据,包括注册资本,在职员工总数,本科及以上员工人数,研究生及以上员工人数,基于此数据完成图形1-4.
2 类别数据可视化
2.1 案例数据解释与展示
- 该数据基于原始数据汇总了各省份银行的数量以及它们各自的占比,基于此完成了添加了频数和百分比标签的条形图
# 读取数据
<-read.csv("E:/11.csv", stringsAsFactors = FALSE)|>
df1select(省份)|>
group_by(省份) |>
summarise(数量=n()) |>
mutate(百分比 = round(数量 * 100 / sum(数量), 2))
datatable(df1,rownames = FALSE)
2.2 图形1——
# 绘制条形图
# 生成足够多的颜色(与省份数量相同)
<- nrow(df1)
province_count <- colorRampPalette(brewer.pal(8, "Set2"))(province_count)
palette
<- ggplot(df1, aes(x = reorder(省份, 数量), y = 数量)) +
p1 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() # 添加横向显示更清晰
<- ggplot(df1, aes(x = reorder(省份, 数量), y = 数量)) +
p2 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 一、整体分布特征
区域集中度高
第一梯队(5省占主导):
福建、江苏、浙江、广东、安徽五省银行数量显著领先,合计占比可能超过50%(需具体数据验证),反映长三角、珠三角及东南沿海的经济金融活跃度。尾部省份差异小:
宁夏、甘肃、内蒙古等省份银行数量最少,与经济发展水平正相关。
东西部差距明显
东部沿海省份银行数量普遍多于中西部,与区域经济发达程度一致。
北京、上海作为金融中心,银行数量虽未进前五,但单体机构规模(如总行)可能更大。
3.业务启示:
市场拓展
重点区域:福建、江苏等高密度省份竞争激烈,需差异化服务(如科技金融)。
潜力区域:安徽、四川等中游省份存在渗透空间。
风险管控
银行数量多的省份可能伴随同质化竞争,需关注资产质量。
边疆省份(如新疆、内蒙古)网点成本高,需评估效益。
3 数据分布可视化
3.1 案例数据解释与展示
- 该数据基于原始数据做了数据缺失处理,并进行数据标准化
<- df %>% filter(!is.na(在职员工总数), !is.na(研究生及以上员工人数))
df2 <- df2 %>% mutate(across(c(在职员工总数, `研究生及以上员工人数`), scale))
df2 datatable(df2,rownames = FALSE)
3.2 图形2——
<-ggplot(df2,aes(x=x))+
p1geom_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 案例数据解释与展示
- 该数据直接使用原始数据,选择本科及研究生员工人数这两个变量绘制散点图+地毯图+线性拟合
<- df
df3 datatable(df3,rownames = FALSE)
4.2 图形3——
<- ggplot(data = df3, aes(x = 本科及以上员工人数, y = 研究生及以上员工人数)) +
p1 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) 散点图+地毯图+线性拟合")
<-p1 + coord_cartesian(
p2xlim = 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) # 热图绘制
# 读取数据
<- df
df4
# 数据预处理
# 选择数值型变量并去除缺失值过多的列
<- c("注册资本", "在职员工总数", "本科及以上员工人数", "研究生及以上员工人数")
num_vars <- df4 %>%
df_num select(all_of(num_vars)) %>%
mutate(across(everything(), ~as.numeric(.))) %>%
na.omit()
# 标准化数据
<- scale(df_num)
df_scaled rownames(df_scaled) <- df$银行简称[complete.cases(df[num_vars])]
5.2 图形4——
# 计算相关性矩阵
<- cor(df_num, use = "complete.obs")
cor_matrix
# 绘制热图
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交互表格
<-read.csv("E:/22.csv")
data<- data |> select(date:close) |>
df 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交互表格
<- df |> ggplot(aes(x = date_index)) +
p1 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
图形解读:
全年走势
震荡上行:股价从年初6.5元附近起步,经历多次回调后,年末收于8.79元,年涨幅约35%,表现强于大盘。
关键突破点:
7月:突破7.5元压力位,开启主升浪。
9月底:短暂回调后,10月初放量突破8元。
12月:加速上涨,最高触及9.02元,创年内新高。
阶段划分
1-3月(6.5-7.0元):缓慢爬升,消化获利盘。
4-6月(7.0-7.4元):横盘整理,构筑支撑平台。
7-9月(7.4-8.0元):突破前高,量价配合。
10-12月(8.0-8.8元):加速上涨,波动加大。