数据可视化期末报告

Author

221527218 吴烁婷

1 报告要求

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

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

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

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

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

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

  • 评分标准:

    • 每章节图形各20分

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

    • 数据独特性强10%

    • 图形个性化强15%

2 类别数据可视化

2.1 案例数据解释与展示

  • 数据来源:本人参加的第十四届市场调研大赛的团队调查问卷数据,主题是特种兵旅行。本例数据是483个个案对特种兵方式旅行总体方式满意这一量表问题的赞同程度,有非常不同意,不同意,中立,同意,非常同意五种程度。
#数据处理
data1<-read_xlsx("使用数据(1).xlsx")
df1<- data1 %>% select(性别,对特种兵式旅行总体满意) %>% 
  group_by(性别,对特种兵式旅行总体满意) %>% 
  summarise(人数=n(), .groups = "drop")
# 定义顺序
likert_order <- c("非常不同意", "不同意", "中立", "同意", "非常同意")

# 转换为有序因子
df1$对特种兵式旅行总体满意 <- factor(
  df1$对特种兵式旅行总体满意,
  levels = likert_order,
  ordered = TRUE)

2.2 图形1——双变量堆叠条形图

# 图双变量堆叠条形图
ggplot(df1,aes(x=对特种兵式旅行总体满意,y=人数,fill=性别))+
  geom_col(width=0.8,color="gray30")+
  geom_text(
    aes(label = 人数),
    position = position_stack(vjust = 0.5),  # 标签居中
    size = 3,
    color = "black"  # 黑色字体(如果背景色太深可改为white)
  )+
  scale_fill_brewer(palette="Blues")+   # 设置调色板
  ggtitle("不同满意度下的性别分布")

  • 图形解读:体验过特种兵式旅行的人中,女生人数占比较高,这与大部分当代女生追求“出片”也许有很大关系;体验过特种兵式旅行的人中,对这种旅游方式满意的人数是313人,占总人数的64.8%,超过参与调查的人数的一半。

3 数据分布可视化

3.1 案例数据解释与展示

  • 数据:2002至2022年间河北省,山西省,辽宁省,吉林省,黑龙江省,浙江省,安徽省,福建省,江西省,山东省,湖南省,广东省,四川省,贵州省,西藏自治区,陕西省16个省的农村居民人均工资性收入和人均经营净收入

  • 数据来源:广东金融学院图书馆数据库

data2<-read_xlsx("使用数据(3).xlsx")
df <- data2 %>% select(人均工资性收入,人均经营净收入) %>% 
  gather(人均工资性收入,人均经营净收入,key=指标,value=指标值)   # 融合数据
DT::datatable(df,rownames = FALSE)

3.2 图形2——叠加直方图

ggplot(df)+aes(x=指标值,y=..density..,fill=指标)+
  geom_histogram(position="identity",color="gray60",alpha=0.5)+
  theme(legend.position=c(0.8,0.8),# 设置图例位置
       legend.background=element_rect(fill="grey90",color="grey"))+
                                                # 设置图例背景色和边框颜色
  ggtitle("人均工资性收入&人均经营净收入的叠加直方图")

  • 图形解读:人均工资性收入和经营性收入总体都呈现右偏形态,但工资性收入的拖尾特征更明显,峰值都出现在0-5000之间。

4 变量关系可视化

4.1 案例数据解释与展示

  • 数据是2000-2020年间,北京,广东省,西藏,陕西四个地区的人口出生率(‰)和人口死亡率(‰)。

  • 数据来源:广东金融学院图书馆数据库

data3<-read_xlsx("使用数据(2).xlsx")
DT::datatable(data3,rownames = FALSE)

4.2 图形3——分组散点图矩阵

ggpairs(data3, columns = 3:4,aes(color=地区,alpha=0.3))

#df<-filter(data6_1,地区%in%c("北京","天津","上海"))
  • 图形解读:广东省和西藏自治区的出生率和死亡率相关系数较高,北京市出生率和死亡率相关系数低,没有显著相关关系。北京、广东和西藏的出生率分布形态近似,北京和西藏的死亡率分布形态近似。

5 样本相似性可视化

5.1 案例数据解释与展示

  • 数据是用上个案例(图形3)的数据,本例利用这份数据做聚类分析
data4.2<-read_xlsx("使用数据(2).xlsx")
df1<- data4.2 %>% 
  select(人口出生率,人口死亡率) %>% 
  scale()  
rownames(df1) <- make.unique(data4.2$地区)  #地区可重复出现
DT::datatable(df1)

5.2 图形4——K-means聚类图

#fviz_nbclust(df1, kmeans, method = "wss")#确定聚类数
set.seed(123)  # 保证结果可重复
km_result <- kmeans(df1, centers = 3, nstart = 25)

fviz_cluster(km_result, data = df1,
             palette = brewer.pal(3, "Set1"), 
             ellipse.type="convex",  
             star.plot = TRUE,      # 显示中心点连线
             repel = TRUE,          # 避免标签重叠
             labelsize=8,
             ggtheme = theme_minimal(),
             main = "各地区出生率死亡率聚类结果 (k=3)")

df_result <- data4.2 %>% 
  mutate(Cluster = km_result$cluster)


# 查看聚类结果
print(df_result)
# A tibble: 76 × 5
   时期   地区   人口出生率 人口死亡率 Cluster
   <chr>  <chr>       <dbl>      <dbl>   <int>
 1 2020年 北京市       6.99       5.19       1
 2 2019年 北京市       8.12       5.49       3
 3 2018年 北京市       8.24       5.58       3
 4 2017年 北京市       9.06       5.3        1
 5 2016年 北京市       9.32       5.2        1
 6 2015年 北京市       7.96       4.95       1
 7 2014年 北京市       9.75       4.92       1
 8 2012年 北京市       9.05       4.31       1
 9 2011年 北京市       8.29       4.27       1
10 2010年 北京市       7.48       4.41       1
# ℹ 66 more rows
# 分析聚类特征
df_result %>% 
  group_by(Cluster) %>% 
  summarise(
    avg_出生率 = mean(人口出生率),
    avg_死亡率 = mean(人口死亡率),
    包含地区 = paste(unique(地区), collapse = ", ")
  )
# A tibble: 3 × 4
  Cluster avg_出生率 avg_死亡率 包含地区          
    <int>      <dbl>      <dbl> <chr>             
1       1       9.72       4.71 北京市, 广东省    
2       2      15.9        5.43 广东省, 西藏自治区
3       3       9.86       6.19 北京市, 陕西省    
  • 图形解读:数据明显聚成三类,第1类出生率死亡率都较低;第二类出生率高,死亡率较低;第三类出生率较低,死亡率较高。根据分类特征,北京大部分归到1类;广东省也归于1类;陕西归于3类;西藏归于2类。

6 时间序列可视化

6.1 案例数据解释与展示

  • 本例数据使用图2的部分数据,截取了河北省、黑龙江省、广东省和西藏自治区的人均工资性收入和人均经营净收入
data5<-filter(data2,地区%in%c("河北省","黑龙江省","广东省","西藏自治区"))
df<-data5 |> gather(人均工资性收入:人均经营净收入,key=指标,value=指标值)
df$日期 <- as.numeric(gsub("年", "", df$日期))  # 转为数值型年份
DT::datatable(df)

6.2 图形5——折线图

# 绘制折线图
ggplot(df,aes(x=日期,y=指标值,color=指标))+    # 设置x轴、y轴和线的颜色
  geom_line(size=0.8)+   # 绘制折线图
  geom_point(aes(shape=指标),size=2)+
  scale_color_manual(
    values = c("#FF9F33", "#4DAF4A")) +
  theme(axis.text.x=element_text(size=7,angle=90,hjust=1,vjust=1),
        legend.position = "bottom",  # 可以指定图例位置(right/left/top/bottom)
    legend.title = element_text(size = 10),  # 图例标题大小
    legend.text = element_text(size = 10)     # 图例文字大小
    )+
  theme(panel.grid.minor.x=element_blank(),  # 去掉x轴次网格线
        panel.grid.minor.y=element_blank())+ # 去掉y轴次网格线
  scale_x_continuous(
    breaks = seq(min(df$日期), max(df$日期), by = 1),  # 每年一个刻度
    expand = c(0, 0)
  )+
  facet_wrap(~地区,ncol=2,scale="free")   # 按指标分面,并单独设置各分面图的y轴刻度

  • 图形解读:四个省份的收入都是呈上升趋势,符合经济规律。2002年至2022年的广东省经营净收入小于工资性收入,工资性收入的增长速率大于经营净收入;河北省2010年后,工资性收入大于经营净收入,且增长速率变大,两者的差值逐年增大;黑龙江省和西藏的工资性收入均小于经营净收入,黑龙江省两者的差距也是逐年增大,但西藏两者差值先增大后又有减小趋势。