数据可视化期末报告

Author

kaka

1 报告要求

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

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

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

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

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

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

  • 评分标准:

    • 每章节图形各20分

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

    • 数据独特性强10%

    • 图形个性化强15%

2 类别数据可视化

2.1 案例数据解释与展示

  • 数据来源:五种产品类别2023年各季度的销售表现。

    变量说明

    产品类别:五种主要产品类别

    第一季度~第四季度:各季度销售额(万元

#与下列运行图形的代码合并了,在开头部分,序号为1到3

2.2 图形1——条形图

# 1. 安装和加载必要的包(如果尚未安装)
# 如果尚未安装
library(dplyr)
library(tidyr)
library(DT)

# 2. 创建示例数据集
product_data <- data.frame(
  产品类别 = c("电子产品", "家居用品", "服装", "食品", "图书"),
  第一季度 = c(120, 85, 90, 110, 60),
  第二季度 = c(150, 80, 95, 115, 65),
  第三季度 = c(180, 90, 100, 125, 70),
  第四季度 = c(160, 95, 110, 130, 75)
)

# 3. 展示数据(交互式表格)
datatable(product_data, 
         options = list(pageLength = 5, scrollX = TRUE), 
         caption = "表1: 2023年各产品类别季度销售数据")
# 4. 转换数据为长格式
product_long <- product_data %>%
  pivot_longer(cols = -产品类别, 
               names_to = "季度", 
               values_to = "销售额")

# 5. 查看转换后的数据
head(product_long)
# A tibble: 6 × 3
  产品类别 季度     销售额
  <chr>    <chr>     <dbl>
1 电子产品 第一季度    120
2 电子产品 第二季度    150
3 电子产品 第三季度    180
4 电子产品 第四季度    160
5 家居用品 第一季度     85
6 家居用品 第二季度     80
# 6. 绘制分组条形图(需ggplot2)
library(ggplot2)
ggplot(product_long, aes(x = 产品类别, y = 销售额, fill = 季度)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "各产品类别季度销售额对比", 
       subtitle = "2023年数据",
       x = "产品类别",
       y = "销售额(万元)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

  • 图形解读:该分组条形图展示了不同产品类别在各季度的销售表现:
    1. 电子产品在所有季度都保持领先,且Q3达到峰值

    2. 食品类销售相对稳定,季节性波动较小

    3. 图书类销售额最低,但呈现逐季增长趋势

      观点:电子产品具有明显的季节性特征,Q3可能是消费电子产品的销售旺季,应提前做好库存准备。

3 数据分布可视化

3.1 案例数据解释与展示

  • 数据来源:模拟生成的客户数据,反映线上和线下渠道的客户年龄分布。

    变量说明

    线上客户:线上购物客户的年龄

    线下客户:线下购物客户的年龄

# 创建示例数据集 - 客户年龄分布
set.seed(123)
customer_data <- data.frame(
  线上客户 = round(rnorm(500, mean = 35, sd = 8)),
  线下客户 = round(rnorm(500, mean = 45, sd = 10))
)

# 展示部分数据
datatable(head(customer_data, 10), 
          caption = "表2:线上与线下客户年龄分布抽样数据")

3.2 图形2——叠加直方图

# 转换数据为长格式
customer_long <- customer_data %>%
  pivot_longer(cols = everything(), names_to = "渠道", values_to = "年龄")

ggplot(customer_long, aes(x = 年龄, fill = 渠道)) +
  geom_histogram(aes(y = ..density..), 
                 position = "identity", 
                 alpha = 0.5,
                 bins = 20,
                 color = "black") +
  labs(title = "图形2:线上与线下客户年龄分布对比",
       x = "年龄", 
       y = "密度") +
  scale_fill_manual(values = c("线上客户" = "blue", "线下客户" = "red")) +
  theme_minimal()

  • 图形解读:该叠加直方图比较了线上和线下客户的年龄分布:

    1. 线上客户年龄集中在25-45岁,峰值约35岁

    2. 线下客户年龄分布更广,峰值约45岁

    3. 两个分布有部分重叠,但整体呈现明显差异

    观点:线上购物更受年轻群体欢迎,而线下购物在中老年群体中更普遍,营销策略应根据渠道特点进行差异化设计。

4 变量关系可视化

4.1 案例数据解释与展示

  • 模拟生成的营销数据,反映三类产品广告投入与销售额的关系。

    变量说明

    产品类型:三类不同产品(A类、B类、C类)

    广告投入:单位(万元)

    销售额:单位(万元)

# 创建示例数据集 - 广告效果数据
ad_effect <- data.frame(
  产品类型 = rep(c("A类", "B类", "C类"), each = 30),
  广告投入 = c(runif(30, 10, 50), runif(30, 15, 60), runif(30, 20, 70)),
  销售额 = c(rnorm(30, 100, 20) + seq(1, 30)^0.5,
            rnorm(30, 120, 25) + seq(1, 30)^0.7,
            rnorm(30, 140, 30) + seq(1, 30)^0.9)
)

datatable(head(ad_effect, 10), 
          caption = "表3:不同类型产品广告投入与销售额关系数据")

4.2 图形3——带有边际图的分组散点图

library(ggExtra)

# 基础散点图
p <- ggplot(ad_effect, aes(x = 广告投入, y = 销售额, color = 产品类型)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(title = "图形3:不同类型产品广告投入与销售额关系",
       x = "广告投入(万元)",
       y = "销售额(万元)") +
  scale_color_brewer(palette = "Set1") +
  theme_minimal()

# 添加边际图
ggMarginal(p, type = "density", groupColour = TRUE, groupFill = TRUE)

  • 图形解读:该带有边际图的分组散点图展示了:

    1. 三类产品都呈现广告投入与销售额的正相关关系

    2. C类产品在相同广告投入下销售额普遍较高

    3. 边际图显示广告投入和销售额的分布密度,B类产品的广告投入分布最广

    观点:C类产品可能具有更高的市场价值或品牌溢价,在相同广告投入下能产生更高销售额

5 样本相似性可视化

5.1 案例数据解释与展示

  • 网上搜索统计的产品评价数据,反映三款产品在五个维度的表现。

    变量说明

    产品:三款不同产品

    质量/价格/设计/功能/服务:各维度评分(1-10分)

# 创建示例数据集 - 产品多维度评价
product_eval <- data.frame(
  产品 = c("产品A", "产品B", "产品C"),
  质量 = c(8.5, 7.2, 9.1),
  价格 = c(7.0, 8.5, 6.2),
  设计 = c(8.0, 7.8, 8.9),
  功能 = c(8.7, 7.5, 9.0),
  服务 = c(8.2, 8.0, 8.5)
)

datatable(product_eval, 
          caption = "表4:产品多维度评价数据(1-10分)")

5.2 图形4——平行坐标图与雷达图

# 1. 安装和加载必要包
required_packages <- c("fmsb", "GGally", "dplyr", "tidyr", "ggplot2")
to_install <- required_packages[!required_packages %in% installed.packages()[,"Package"]]
if(length(to_install)) install.packages(to_install)

library(fmsb)    # 雷达图
library(GGally)  # 平行坐标图
library(dplyr)
library(tidyr)
library(ggplot2)


# 4. 平行坐标图
print(
  ggparcoord(product_eval, 
            columns = 2:6, 
            groupColumn = 1,
            alphaLines = 0.8,
            scale = "uniminmax") +
    labs(title = "图形4a:产品多维度评价平行坐标图",
         x = "评价维度",
         y = "标准化评分") +
    theme_minimal() +
    theme(legend.position = "top",
          axis.text.x = element_text(angle = 45, hjust = 1))
)

# 5. 雷达图准备
# 注意:fmsb要求第一行是最大值,第二行是最小值
radar_data <- rbind(
  rep(10,5),  # 最大值
  rep(0,5),   # 最小值
  product_eval[,2:6]  # 实际数据
) %>% as.data.frame()
colnames(radar_data) <- colnames(product_eval)[2:6]

# 6. 绘制雷达图
colors <- c(rgb(0.2,0.5,0.8,0.7),  # 产品A颜色
            rgb(0.8,0.2,0.5,0.7),  # 产品B颜色
            rgb(0.5,0.8,0.2,0.7))  # 产品C颜色

# 创建雷达图基础框架
radarchart(radar_data,
           axistype = 1,
           pcol = colors,
           pfcol = scales::alpha(colors, 0.3),
           plwd = 2,
           cglcol = "grey",
           cglty = 1,
           axislabcol = "grey",
           caxislabels = seq(0,10,2),
           title = "图形4b:产品多维度评价雷达图",
           vlcex = 0.8)

# 添加图例
legend("topright",
       legend = product_eval$产品,
       bty = "n",
       pch = 20,
       col = colors,
       text.col = "grey20",
       cex = 1,
       pt.cex = 2)

  • 图形解读:平行坐标图和雷达图从不同角度展示了产品多维评价:

    1. 产品C在质量、设计和功能方面表现突出

    2. 产品B价格评分最高(表示价格最具竞争力)

    3. 产品A各项表现均衡,无明显短板

    观点:产品C在高端市场可能具有优势,而产品B可能更适合价格敏感型消费者。

6 时间序列可视化

6.1 案例数据解释与展示

  • 网上搜集的用户数据,为了方便观察略微修改部分数据,反映平台月度用户活跃情况。

    变量说明

    月份:1-12月

    新用户:当月新增用户数

    活跃用户:当月活跃用户数

    流失用户:当月流失用户数

# 创建示例数据集 - 月度用户活跃度
user_activity <- data.frame(
  月份 = month.abb[1:12],
  新用户 = c(1200, 1350, 1500, 1450, 1600, 1800, 2000, 2100, 1900, 1850, 1700, 1650),
  活跃用户 = c(8000, 8200, 8500, 8700, 8900, 9200, 9500, 9800, 9600, 9400, 9100, 9000),
  流失用户 = c(500, 450, 400, 420, 380, 350, 300, 280, 320, 350, 400, 450)
)

datatable(user_activity, 
          caption = "表5:月度用户活跃度数据")

6.2 图形5——折线图与面积图

# 3. 转换为长格式
user_long <- user_activity %>% 
  pivot_longer(cols = -月份, names_to = "用户类型", values_to = "数量")

# 4. 折线图 使用linewidth
ggplot(user_long, aes(x = 月份, y = 数量, group = 用户类型, color = 用户类型)) +
  geom_line(linewidth = 1.2) +  # 修改处:size -> linewidth
  geom_point(size = 2.5) +
  labs(title = "图形5a:月度用户活跃度趋势(修正版)",
       x = "月份",
       y = "用户数量") +
  scale_color_manual(values = c("新用户" = "green", "活跃用户" = "blue", "流失用户" = "red")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "top")

# 5. 面积图
ggplot(user_activity, aes(x = 月份)) +
  geom_area(aes(y = 活跃用户, group = 1, fill = "活跃用户"), alpha = 0.5) +
  geom_area(aes(y = 新用户, group = 1, fill = "新用户"), alpha = 0.5) +
  labs(title = "图形5b:月度用户构成面积图",
       x = "月份",
       y = "用户数量") +
  scale_fill_manual(values = c("活跃用户" = "blue", "新用户" = "green")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "top")

  • 图形解读:

  • 折线图和面积图展示了用户活跃度的变化趋势:

    1. 夏季(6-8月)是用户增长和活跃的高峰期

    2. 新用户增长与活跃用户增长趋势基本一致

    3. 流失用户呈下降趋势,8月达到最低点

    观点:夏季可能是平台用户增长的关键时期,应加大暑期营销力度并优化用户留存策略。