华东师范大学校徽
华东师范大学社会发展学院标志
School of Social Development
多源数据分析与实践 · Week 3
1 / 29

第二章 重点解析

主讲人:刘贇喆 副教授 | 华东师范大学 社会发展学院
数据类型与结构 · 整洁数据 · tidyverse 数据操作 · 数据清洗与诊断 · 探索性数据分析(EDA)
目录
2 / 29
1.0 数据类型与结构
-- / --

SECTION01 / 05

1.0数据类型与结构

Data Types and Structures

1.0 数据类型与结构
-- / --

对象有类型,也有结构

Every object has a type and a structure

先问“里面是什么”,再问“这些值怎样组织”。

R OBJECTx
x <- c(18, 21, 24)
[1]18 [2]21 [3]24
class(x)numeric数值型 typeof(x)double双精度浮点型

先看数值类型

先看类别,再看存储

class()对象属于哪一类? typeof()底层如何存储?
# 将 3 个数值组成向量,赋值给 xx <- c(18, 21, 24)class(x)   # 输出:"numeric"typeof(x)  # 输出:"double"
numeric
数值型:x 属于数值对象
double
双精度浮点型:数值在底层的存储方式

判断顺序:先确认向量中存放的值属于什么类型,再判断这些值如何组织;"21" 看似数字,实际是文本。

1.0 数据类型与结构
-- / --

数据框与 tibble

Data frames and tibbles

同一份数据,打印出来有什么区别?

BASE R · 基础结构data.frame

R 自带的数据框:数据按行列排列,不同列可以保存不同类型的值。

TIDYVERSE · 常见变体tibble

tidyverse 中 tibble 包提供的数据框变体;保留行列结构,打印结果更简洁。

01 · 创建 30 行的 data.framedf <- data.frame(id = sprintf("S%02d", 1:30), score = 61:90)
02 · 转换同一份数据tb <- tibble::as_tibble(df)
BASE Rdata.frame默认继续打印
> df
     id score
1   S01    61
2   S02    62
3   S03    63
4   S04    64
5   S05    65
6   S06    66
7   S07    67
8   S08    68
9   S09    69
10  S10    70
11  S11    71

输出节选:后续还会继续打印至第 30 行

TIDYVERSEtibble默认预览前 10 行
> tb
# A tibble: 30 × 2
   id    score
   <chr> <int>
 1 S01      61
 2 S02      62
 3 S03      63
 4 S04      64
 5 S05      65
 6 S06      66
 7 S07      67
 8 S08      68
 9 S09      69
10 S10      70
# ℹ 20 more rows
# ℹ Use `print(n = ...)` to see more rows
2.0 整洁数据
-- / --

SECTION02 / 05

2.0整洁数据

Tidy Data

2.0 整洁数据
-- / --

整洁数据的原则

Principles of tidy data

Hadley Wickham · Tidy Data (2014)
01 VARIABLE

每个变量,占一列

Each variable forms a column.

02 OBSERVATION

每条观测,占一行

Each observation forms a row.

03 OBSERVATIONAL UNIT

每类观测单位,各成一表

Each type of observational unit forms a table.

04

一个取值,一个单元格

Each value is a cell; each cell is a single value.

后续教材的单元格规则
2.0 整洁数据
-- / --

整洁数据辨析

Recognising Tidy Data

TABLE 01地区人口年度记录
district_iddistrictpop_2019pop_2020pop_2021
D01甲区118000120000125000
D02乙区9600098000102000
D03丙区148000150000154000
D04丁区800008200084000
D05戊区111000113000116000
D06己区740007600079000
... 更多地区

01 / 04第 02 组取自 R 内置 airquality;其余为教学示例

3.0 tidyverse 数据操作
-- / --

SECTION03 / 05

3.0tidyverse 数据操作

Data Manipulation with the tidyverse

3.0 tidyverse 数据操作
-- / --

tidyverse 包生态

A Coordinated Collection of R Packages

tidyverse 官方标识
tidyverse

围绕数据科学工作流程设计的包的组合。

加载核心包library(tidyverse)
3.0 tidyverse 数据操作
-- / --

一条真实流水线

Trace a tidyverse workflow, step by step

continent_life_change.R
library(tidyverse)
library(gapminder)

continent_change <- gapminder %>%
  filter(year %in% c(1997, 2007)) %>%
  select(continent, year, lifeExp) %>%
  group_by(continent, year) %>%
  summarise(mean_life = mean(lifeExp), .groups = "drop") %>%
  pivot_wider(names_from = year, values_from = mean_life,
              names_prefix = "life_") %>%
  mutate(gain = life_2007 - life_1997) %>%
  arrange(desc(gain)) %>%
  slice_head(n = 3)
3.0 tidyverse 数据操作
-- / --

用键连接数据

Joining tables by a shared key

点位表 sites

左表 · 4 行
site_iddistrict
A01黄浦
A02徐汇
A03浦东
A04长宁

指标表 indicators

课堂示意值 · 4 行
site_idindexgreen_pctsample_n
A018423.4120
A027618.796
A039127.1142
A056815.983
sites %>% left_join(indicators, by = "site_id")

左表 4 行全部保留。A04 没有指标,得到 NA;右表独有的 A05 不会加入。

连接结果 · 4 行
site_iddistrictindexgreen_pctsample_n
A01黄浦8423.4120
A02徐汇7618.796
A03浦东9127.1142
A04长宁NANANA
sites %>% inner_join(indicators, by = "site_id")

只保留 两表都有 的 A01–A03;A04 和 A05 都不进入结果。

连接结果 · 3 行
site_iddistrictindexgreen_pctsample_n
A01黄浦8423.4120
A02徐汇7618.796
A03浦东9127.1142
sites %>% anti_join(indicators, by = "site_id")

只找出左表 没有匹配 的 A04。适合排查连接键;结果不添加右表的列。

未匹配记录 · 1 行
site_iddistrict
A04长宁
chosen <- select(indicators, site_id, index)sites %>% left_join(chosen, by = "site_id")

先保留连接键 site_id 和需要的 index,再连接;结果只新增这一列指标。

连接结果 · 4 行 · 只接入 index
site_iddistrictindex
A01黄浦84
A02徐汇76
A03浦东91
A04长宁NA
4.0 数据清洗与诊断
-- / --

SECTION04 / 05

4.0数据清洗与诊断

Data Cleaning and Diagnostics

4.0 数据清洗与诊断
-- / --

先诊断,再清洗

Diagnose before cleaning

practice_data8 × 6
idwavedistrictvisitsstatussource
A012023Huangpu120开放app
A022023XuhuiNA开放NA
A022023Xuhui95开放app
A032023Pudong0暂停manual
A042024Huangpu140开放APP
A052024Xuhui87开放app
A062024Pudong210开放app
A062024Pudong210开放app
glimpse(practice_data) · 输出节选
Rows: 8
Columns: 6
$ id       <chr> "A01", "A02", "A02", "A03", ...
$ wave     <int> 2023, 2023, 2023, 2023, ...
$ district <chr> "Huangpu", "Xuhui", "Xuhui", ...
$ visits   <dbl> 120, NA, 95, 0, 140, 87, ...
$ status   <chr> "开放", "开放", "开放", "暂停", ...
$ source   <chr> "app", NA, "app", "manual", ...
summary(practice_data$visits)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
    0.0    91.0   120.0   123.1   175.0   210.0       1
practice_data %>% filter(if_any(everything(), is.na))
# A tibble: 1 × 6
idwavedistrictvisitsstatussource
<chr><int><chr><dbl><chr><chr>
A022023XuhuiNA开放NA
count(practice_data, id, wave)
idwaven
A0120231
A0220232
A0320231
A0420241
A0520241
A0620242
4.0 数据清洗与诊断
-- / --

缺失值处理

Handling missing data

先查缺失原因,再决定删行或填补。

直接删除

Row deletion
drop_na()
NA整行排除

优点简单、可解释,不凭空补值。

代价损失样本;缺失有规律时可能产生偏差。

均值/中位数填补

Mean / median imputation
replace_na()
NAmean() / median()

优点保留记录,便于快速建立基线。

代价压缩差异,也可能改变变量间的关系。

进阶策略Advanced approaches

回归预测

Regression imputation

利用其他变量;单次填补低估波动。

多重插补 · MICE

Multiple imputation

多次填补后合并,表达不确定性。

机器学习

Machine-learning imputation

随机森林等拟合非线性关系。

生成式模型

Generative-model imputation

扩散模型已有表格插补研究。

时序/时空插补

Time-series / space-time imputation

ARIMA 看时间;ST-ARIMA 加入空间。

调整时间尺度

Temporal aggregation · not imputation

按周/月汇总,并检查有效天数。

LLM 可用于探索,但不应将逐格猜值当作通用可靠的填补方法。

Sources: Journal of Big Data (2021) · Infant and Child Development (2023) · Frontiers in Big Data (2021) · ACM TKDD (2025)

4.0 数据清洗与诊断
-- / --

空白、格式与列名

Blanks, formats, and column names

DATA CHECK
tidyverse · 字符处理stringr / str_squish()
01 / 06

看起来空,不等于缺失

先去掉多余空格,再把空字符串转为 NA。

原始取值" "3 个空格
规范结果NA真正的缺失值

提醒再用 dplyr::na_if() 转成缺失值;数值 0 不是空白。

tidyverse · 数值读取readr / parse_number()
02 / 06

看着像数值,实际仍是字符

单位和分隔符混在取值里,会妨碍直接计算。

原始取值 · 字符"1,200 人"逗号与单位混在数值里
解析结果 · 数值1200可以参与计算

提醒解析前核对单位、小数点与千位分隔符。

tidyverse · 日期时间lubridate / ymd_hms()
03 / 06

T、Z 是格式,不是脏字符

解析时间戳时,保留时区信息。

原始取值 · 字符2026-09-25T14:30:00ZISO 格式时间戳
解析后 · UTC2026-09-25 14:30 UTC带时区的日期时间

提醒T 分隔日期与时间;Z 表示 UTC。

EXT
扩展包 · 非 tidyverse 核心包janitor / clean_names()
04 / 06

列名能读懂,不一定好引用

空格、标点或重名都可能增加代码错误。

原始列名Student ID含空格
规范列名student_id便于代码引用

提醒若出现 student_id_2,应回查原始重名。

tidyverse · 数据框tibble / rownames_to_column()
05 / 06

行名藏着 ID,先显式成列

记录标识留在行名里,导出或连接时容易遗漏。

原始 · 行名A01 · A02表内没有显式 ID 列
转换后 · 变量site_idA01、A02 成为列取值

提醒先确认行名能否唯一标识记录。

tidyverse · 字符处理stringr / str_to_lower()
06 / 06

写法不一,同类被拆开

大小写或尾部空格会制造多余类别。

原始标签"Female" / "female "看似同一类别
统一后"female"归入同一组

提醒先用 str_squish() 去空格;同义词仍需数据字典。

5.0 探索性数据分析
-- / --

SECTION05 / 05

5.0探索性数据分析

Exploratory Data Analysis

5.0 探索性数据分析
-- / --

探索性数据分析

Exploratory Data Analysis (EDA)

EDA Exploratory Data Analysis · 探索性数据分析

通过统计摘要、表格与图形,系统查看数据的结构、分布、异常和变量关系。

为什么先探索?

  • 发现问题缺失、异常与编码错误
  • 选择方法根据分布和样本量选统计量
  • 明确方向决定哪些差异或关系值得追踪

从数据到下一步判断

  1. 01明确单位一行代表谁、何时?
  2. 02检查整洁行列含义、类型与格式
  3. 03诊断质量缺失、重复与异常值
  4. 04观察分布形状、偏态与极端值
  5. 05描述统计计数、均值与分位数
  6. 06比较关系组间差异、变量关联
  7. 07记录复查处理依据与新问题
5.0 探索性数据分析
-- / --

分布与描述统计

Distributions and Descriptive Statistics

从数据到下一步判断

  1. 01明确单位一行代表谁、何时?
  2. 02检查整洁行列含义、类型与格式
  3. 03诊断质量缺失、重复与异常值
  4. 04观察分布形状、偏态与极端值
  5. 05描述统计计数、均值与分位数
  6. 06比较关系组间差异、变量关联
  7. 07记录复查处理依据与新问题
04

观察分布

Univariate exploration

一次只看一个变量的形状与异常。

直方图看形状、偏态与多峰
核密度图 · KDE平滑分布;带宽影响曲线
Q–Q 图看与参考分布的偏离
箱线图看分位数与离群值

本章先学读图;绘图操作后续展开。

05

描述性统计

先核对缺失与完整率,再看分布和分位数。

R / INPUTskimr 为扩展包,需预先安装
library(tidyverse)
library(gapminder)
library(skimr)
gapminder %>%
  select(lifeExp, pop, gdpPercap) %>%
  skim()
数据概况 Data Summaryskim() 输出节选
NamePiped data Rows1,704 Columns3 Typenumeric × 3 GroupsNone
Variable type: numeric
skim_variablen_missingcomplete_ratemeansdp0p25p50p75p100hist
lifeExp0159.512.923.648.260.770.882.6
pop0129601212.106157897.6001127936647023596.19585222.1318683096
gdpPercap017215.9857.241.1202.3532.9325.113523.

统计列与数值按实际输出整理;微型直方图为分布轮廓示意。

多源数据分析与实践 · Week 3
30 / 30

Thanks

第三周:第二章 重点解析

主讲人:刘贇喆 副教授 | 华东师范大学 社会发展学院
滚轮 / 方向键 / 空格切换