数据集来源
数据集一:广东各高校基本信息
数据来源:中国教育在线掌上高考网https://www.gaokao.cn
数据集二:2023全国高校论文发表情况
数据来源:CnOpenData中国高校统计数据网https://www.cnopendata.com/data
数据分析
中国各高校基本信息(取前几行说明)
观察数据集,主要包括八个特征,分别为序号、学校代码、学校名称、建校日期、所在地、主管部门、录取批次、颁授的学衔。其中需要注意的是,“学校代码”并不是一个完整的数值型数字,中间有逗号隔开,因此在进行数据处理的时候需要按逗号将其合并转换为一个数值型数字;在“所在地”一列,每个高校可能包含多个所在地(多个校区),他们之间是用顿号隔开的,所以在统计高校的所在地的时候,要以逗号为基准将单元格拆开为多个数据去统计,在所在地的每个单元格中,前后都有一个空格,且在下面的数据中,存在部分学校所在地信息确实问题,要进行填充。本次项目主要使用其中的学校名称和所在地两列,进行广东高校所在地分布的热力图分析。
2023全国高校论文发表情况(取前几行说明)
观察数据集,主要包括9个部分,论文名次、学校名称、合计、Nature、Science、Cell、2023综合排名、星级、办学层次。其中合计指的是一所高校这一年总共发的顶刊数量,后面的Nature、Science、Cell则是发这些分期刊的数量,需要注意的是,在办学层次这一栏存在部分缺失值和错字问题,如果有需要则要进行修正。本实验主要通过学校名称、合计、2023综合排名三列,展示前65所高校的论文发表数量和他们对应的综合排名,旨在反映一个学校综合排名和其发的论文的关系。然后通过使用nature和science这两列的数据,分别展示这些高校的Nature和Science的论文数量比较。
代码及代码流程
代码1:展示广东省各直辖市的高校数量
主要是通过hchinamap包加载广东省地图,然后使用dplyr包进行数据处理,将存在多个校区地点的学校的地区数据按照“、”拆分为多个地点,使用count分别计算每个市的地点数量。这里只展示了各市本科学校的数量
# 安装和加载所需的包
library(readxl)
library(dplyr)
library(tidyr)
library(hchinamap)
# 读取Excel文件
data <- read_excel("D:/RWorkPlace/RVersionFinal/广东高校.xlsx")
data <- head(data, 56)
# 处理数据
result <- data %>%
# 选择第五列“所在地”
select(所在地) %>%
# 将包含多个地名的单元格拆分成多行
separate_rows(所在地, sep = "、") %>%
# 去除首尾空格
mutate(所在地 = trimws(所在地)) %>%
# 去除空值
filter(所在地 != "") %>%
# 统计各地名的出现次数
count(所在地, name = "出现次数") %>%
# 按出现次数降序排序
arrange(desc(出现次数))
hchinamap(
name = result$所在地,
value = result$出现次数,
width = "100%",
height = "500px",
title = "Map of GuangDong",
region = "Guangdong",
minColor = "#FFEFD5",
maxColor = "#FF3030")
代码2:展示中国大学综合排名前十名和后十名,通过柱状图可视化
代码主要通过group_by函数根据地区统计每个地区的高校数量,然后进行排序后通过ggplot绘制前十名和后十名的柱状图
library(readxl)
library(dplyr)
library(ggplot2)
# 读取数据
data <- read_excel("D:/RWorkPlace/RVersionFinal/中国大学综合排名2023.xlsx")
# 创建包含学校和地区的数据框
school_data <- data.frame(school_name = data$`学校名称`, region = data$`地区`)
# 使用dplyr包进行数据处理
school_count_by_region <- school_data %>%
group_by(region) %>%
summarise(school_count = n())
# 创建学校数量排行的数据框
school_count_ranked <- school_count_by_region %>%
arrange(desc(school_count)) # 按学校数量降序排列
# 绘制前十名的柱状图
top_10_plot <- ggplot(head(school_count_ranked, 10), aes(x = reorder(region, -school_count), y = school_count)) +
geom_bar(stat = "identity", fill = "skyblue", color = "black") +
labs(title = "前十名省份高校数量排行",
x = "省份",
y = "高校数量") +
theme_minimal()
# 绘制后十名的柱状图
bottom_10_plot <- ggplot(tail(school_count_ranked, 10), aes(x = reorder(region, school_count), y = school_count)) +
geom_bar(stat = "identity", fill = "lightcoral", color = "black") +
labs(title = "后十名省份高校数量排行",
x = "省份",
y = "高校数量") +
theme_minimal()
# 显示前十名和后十名柱状图
print(top_10_plot)
print(bottom_10_plot)
代码3:各省985、211、双一流数量统计,使用南丁格尔图输出前十名
代码主要通过使用读取数据中“层次那一列的信息”进行if语句的判断,第四列”层次“包含这个学校的985,211,双一流信息,注意如果是985、211院校,其值为“985、211、双一流”,这样这所学校则既属于985也属于211还属于双一流,第六列”地区“包含这个学校是属于哪个省的,具体值为”广东“这样的形式,注意不是”广东省“
# 读取数据
data <- readxl::read_excel("D:/RWorkPlace/RVersionFinal/中国大学综合排名2023.xlsx")
# 处理层次列,将 NaN 填充为字符串 "无"
data$层次 <- ifelse(is.na(data$层次), "无", data$层次)
# 初始化省份学校数量的字典
province_985_count <- rep(0, nrow(data))
province_211_count <- rep(0, nrow(data))
province_double_count <- rep(0, nrow(data))
# 处理每个学校的层次和地区信息
for (i in seq_along(data$层次)) {
levels <- unlist(strsplit(as.character(data$层次[i]), ','))
# 判断学校是否为985学校
if ('985' %in% levels) {
# 省份985学校数量加一
province_985_count[i] <- 1
}
if ('211' %in% levels) {
# 省份211学校数量加一
province_211_count[i] <- 1
}
if ('双一流' %in% levels) {
# 省份双一流学校数量加一
province_double_count[i] <- 1
}
}
# 将省份985学校数量添加到 DataFrame 中
data$省份 <- gsub("省市", "", data$地区)
data$`985数量` <- province_985_count
data$`211数量` <- province_211_count
data$`双一流数量` <- province_double_count
# 输出每个省份对应的985大学数量
result_table1 <- table(data$省份, data$`985数量`)
result_table2 <- table(data$省份, data$`211数量`)
result_table3 <- table(data$省份, data$`双一流数量`)
# 找出数量排名前10的省份
top_10_provinces1 <- names(sort(result_table1[, "1"], decreasing = TRUE)[1:10])
top_10_provinces2 <- names(sort(result_table2[, "1"], decreasing = TRUE)[1:10])
top_10_provinces3 <- names(sort(result_table3[, "1"], decreasing = TRUE)[1:10])
# 输出每个省份对应的数量
result_table_df1 <- as.data.frame.matrix(result_table1)
result_table_df2 <- as.data.frame.matrix(result_table2)
result_table_df3 <- as.data.frame.matrix(result_table3)
# 输出数量排名前10的省份及其对应的数量
top_10_table_df1 <- result_table_df1[top_10_provinces1, ]
top_10_table_df2 <- result_table_df2[top_10_provinces2, ]
top_10_table_df3 <- result_table_df3[top_10_provinces3, ]
# 输出省份
provinces1 <- rownames(top_10_table_df1)
provinces2 <- rownames(top_10_table_df2)
provinces3 <- rownames(top_10_table_df3)
# 输出对应的数量
quantities1 <- top_10_table_df1$`1`
quantities2 <- top_10_table_df2$`1`
quantities3 <- top_10_table_df3$`1`
draws <- function(x, y, n, m) {
mydata <- data.frame(a = c(x), b = c(y))
myAngle <- seq(-20, -340, length.out = 10)
# 创建ggplot对象
p <- ggplot(mydata) +
geom_bar(aes(x = a, y = b), width = 1, stat = "identity",
colour = "black", fill = "#F8766D") +
geom_text(aes(x = a, y = b, label = b), color = "white",
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "x", start = 0) +
ylim(c(0, m)) +
theme_light() +
theme(panel.background = element_blank(),
panel.grid.major = element_line(colour = "grey80", size = .25),
axis.text.y = element_text(size = 12, colour = "black"),
axis.line.y = element_line(size = 0.25))
# 设置图表标题
result <- switch(
n,
"南丁格尔--拥有985大学数量排名前10的省份",
"南丁格尔--拥有211大学数量排名前10的省份",
"南丁格尔--拥有双一流大学数量排名前10的省份",
"False"
)
p + labs(title = result)
}
# 绘制图表
draws(provinces1, quantities1, 1, 8)
draws(provinces2, quantities2, 2, 20)
draws(provinces3, quantities3, 3, 20)
代码4:分析前65所高校的论文发表情况和综合排名的关系
本代码主要采用柱状图+折线图双图合一的方式展示他们之间的关系
library(ggplot2)
library(dplyr)
library(readxl)
# 读取数据
data <- read_excel("D:/RWorkPlace/RVersionFinal/2023全国高校论文.xlsx")
# 取前65个学校
data_subset <- head(data, 65)
# 将 `2023综合排名` 列转换为数值型
data_subset$`2023综合排名` <- as.numeric(data_subset$`2023综合排名`)
# 将 `合计` 列转换为数值型
data_subset$`合计` <- as.numeric(data_subset$`合计`)
# 指定学校名称的顺序
school_order <- data_subset$`学校名称`
# 将 `学校名称` 列转换为因子,并指定顺序
data_subset$`学校名称` <- factor(data_subset$`学校名称`, levels = school_order)
# 创建图表
plot <- ggplot(data_subset, aes(x = `学校名称`)) +
# 左纵轴 - 柱状图
geom_bar(aes(y = `合计`), stat = "identity", fill = "blue", alpha = 0.7) +
# 添加左纵轴标签和标题
ylab("论文数量") +
ggtitle("学校论文数量和综合排名关系图") +
# 设置右纵轴 - 综合排名
scale_y_continuous(
name = "论文发表数量",
breaks = seq(1, 150, by = 10),
sec.axis = sec_axis(~ 140 - ., name = "综合排名", breaks = seq(1, 140, by = 10))
) +
# 右纵轴 - 折线图
geom_line(aes(y = 140 - `2023综合排名`, group = 1), color = "green", size = 1.5) +
geom_point(aes(y = 140 - `2023综合排名`), color = "red", size = 3) + # 设置折线图点的颜色
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
# 显示图表
print(plot)
代码5:饼状图展示前60所高校发表的nature论文数量对比
本代码直接采用了pie函数对数据进行饼状图分析,将前60所高校分为了四部分画了四个饼状图,用于展示排名接近的大学之间的论文实力差距
library(readxl)
# 读取数据
data <- read_excel("D:/RWorkPlace/RVersionFinal/2023全国高校论文.xlsx")
# 取前20个学校
data_subset1 <- head(data, 15)
# 选择第20到第40行的数据
data_subset2 <- data[15:30, ]
# 选择第20到第40行的数据
data_subset3 <- data[30:45, ]
data_subset4 <- data[45:60, ]
# 创建饼状图
pie(as.numeric(data_subset1$Nature), labels = data_subset1$`学校名称`, main = "Nature占比分析", col = rainbow(length(data_subset1$`学校名称`)))
pie(as.numeric(data_subset2$Nature), labels = data_subset2$`学校名称`, main = "Nature占比分析", col = rainbow(length(data_subset2$`学校名称`)))
pie(as.numeric(data_subset3$Nature), labels = data_subset3$`学校名称`, main = "Nature占比分析", col = rainbow(length(data_subset3$`学校名称`)))
pie(as.numeric(data_subset4$Nature), labels = data_subset4$`学校名称`, main = "Nature占比分析", col = rainbow(length(data_subset4$`学校名称`)))
代码6:饼状图展示前60所高校发表的nature论文数量对比
library(readxl)
# 读取数据
data <- read_excel("D:/RWorkPlace/RVersionFinal/2023全国高校论文.xlsx")
# 取前20个学校
data_subset1 <- head(data, 15)
# 选择第20到第40行的数据
data_subset2 <- data[15:30, ]
# 选择第20到第40行的数据
data_subset3 <- data[30:45, ]
data_subset4 <- data[45:60, ]
# 创建饼状图
pie(as.numeric(data_subset1$Science), labels = data_subset1$`学校名称`, main = "Science占比分析", col = rainbow(length(data_subset1$`学校名称`)))
pie(as.numeric(data_subset2$Science), labels = data_subset2$`学校名称`, main = "Science占比分析", col = rainbow(length(data_subset2$`学校名称`)))
pie(as.numeric(data_subset3$Science), labels = data_subset3$`学校名称`, main = "Science占比分析", col = rainbow(length(data_subset3$`学校名称`)))
pie(as.numeric(data_subset4$Science), labels = data_subset4$`学校名称`, main = "Science占比分析", col = rainbow(length(data_subset4$`学校名称`)))
输出结果及分析
代码1输出结果
从输出结果中可以看出广州的本科高校数量最多,有33所,珠海佛山次之有5所,深圳有3所,可见广州数据是断层式领先,如果需要在广东省选择教育水平比较高的城市去学习和发展的话,选择广州是最合适的选择
代码2
可见江苏、山东、河南、河北是高校数量最多的四个省份,但是与前十中其他省份的差别并没有特别大的需求,如果需要选择教育水平较高的省份,可以根据自己的其他需要,如:和自己家的远近程度或者经济状况综合考虑。而排名靠最后的十个省份中,宁夏青海等地的高校数量甚至不足五所,如果想选择教育水平较高的省份进行学习或者工作,应该尽量避开这十个省份。
代码3
可见,无论是985,211还是双一流,北京都是最多的。除此之外江苏虽然985高校较少,但211和双一流高校很多,所以在双一流的南丁格尔图中也表现非常突出。其次是上海,虽然985多,但是相对211和双一流较少。所以在选择出省读书的时候,可以优先考虑北京、江苏、上海等顶级高校数量较多、教育水平较高的省份
代码4
可见论文数量和学习综合水平不是完全正比的线性关系,有许多高校虽然综合排名不高,但也能发表许多顶刊论文,有着强悍的科研实力,同学们要综合自己的分数选择合适的学校,并不是985高校一定强于其他学校,如果重视科研但分数不高的同学可以选择这些论文数较多但综合排名相对不高的学校。比如南方科技大学、上海科技大学、西湖大学等,都是近十年来新建设的大学,拥有充足的科研设备和资金,发展势头很好,可以优先考虑。
代码5
Nature更侧重于使用比较新奇的手段提供了解决问题的方法,注重于思维上创新性
Science更侧重于通过实际科学研究证实了或阐述了某种思想,注重于应用上的实践
可以根据自己的需要选择。对于顶级学校两个期刊的发表都是相对平均的,需要关注的是中国科学技术大学是前15中唯一nature远小于science的,说明学校更注重科学实验的研究和证明。南京大学则nature远大于science,说明学校更注重创新性思维的发展。(代码56作为额外补充不细讲)
代码6