信息速览
§0 本条目怎么来的、不做什么
整理方:千方医数集,为中文医学 AI 社区整理可训练数据集的结构化说明。
本条目怎么来的:数字主源是 GED 26.1 官方 CSV 的完整遍历(2026-10-24 下载 ged261-csv.zip,39,122,522 字节,解压后 GEDEvent_v26_1.csv 273,992,720 字节,逐行流式统计)。数据集清单取自 ucdp.uu.se/downloads/ 页面的 79 个直接文件链接。API 行为取自 ucdpapi.pcr.uu.se 的实测响应(未带 token 时返回 401)。许可条款取自下载页原文。
不做什么:不评价任何一场冲突的伤亡数字是否准确;不核验 UCDP 的编码判断;不对任何国家或武装团体的行为做定性。本条目只回答一个问题:这张表长什么样、怎么用、哪里会坑人。
§1 数据集概览
§1.1 一句话
UCDP 不是伤亡统计,是把「暴力」拆成可核验的最小单元:某天、某个坐标、哪两方、死了多少人、依据哪几个来源。
§1.2 硬数字
| 项 | 值 | 来源 |
|---|---|---|
| GED 事件数 | 417,968 | GEDEvent_v26_1.csv 行数 |
| 死亡合计(best) | 4,257,891 | best 字段求和 |
| 覆盖国家 | 126 | country 字段去重 |
| 年份跨度 | 1989–2025(37 年) | year 字段 |
| 可下载数据集 | 79 | 下载页 .csv/.zip/.xlsx 链接数 |
| GED 字段数 | 49 | 表头 |
| CSV 压缩包 | 39.1 MB | ged261-csv.zip |
| 解压后主表 | 274 MB | GEDEvent_v26_1.csv |
| 默认许可 | CC BY 4.0 | 下载页声明 |
§1.3 三类暴力,独立计数
type_of_violence 字段把有组织暴力分成三型,这是理解整份数据的钥匙:
| 值 | 类型 | 定义 | 事件数 |
|---|---|---|---|
| 1 | 国家型武装冲突 | 政府与至少一个反对派组织之间的对抗,双方都有组织、有政治目标 | 292,121 |
| 2 | 非国家冲突 | 两个有组织的武装团体之间的对抗,政府不参与 | 61,451 |
| 3 | 单边暴力 | 一方(通常是政府或其代理)针对无对抗能力的平民 | 64,396 |
三者不能相加混算。 1 型的分母是「交战国」,2 型的分母是「武装团体对」,3 型的分母是「平民」。研究报告给一个「总暴力事件数」的和,等于把三种性质完全不同的东西装进一个筐。
§1.4 区域分布
41.8 万起事件的地理分布极不均匀:
| 地区 | 事件数 | 占比 |
|---|---|---|
| Middle East | 128,033 | 30.6% |
| Asia | 100,564 | 24.1% |
| Africa | 74,836 | 17.9% |
| Europe | 58,016 | 13.9% |
| Americas | 56,519 | 13.5% |
中东占三成。 这个数字背后是叙利亚、伊拉克、也门、以色列-巴勒斯坦几条长线冲突的密集编码。任何全球冲突趋势的结论,都会被中东的权重主导——做区域比较时必须分层,不能只看全球汇总。
§1.5 为什么一个医学数据集库要收冲突数据
库内公共卫生类条目已有 116 条,绝大多数是病理层面的数据:影像、病历、测序、队列。缺的是把「暴力」当作环境暴露的那一层。
这个缺口的实际后果很具体:
- 你要研究「战争暴露对儿童心理健康的影响」,需要知道每个样本所在村庄什么时候发生过什么
- 你要研究「医疗设施被攻击对 vaccination 覆盖率的影响」,需要知道哪一天哪个点被打过
- 你要给一个来自冲突地区的影像数据集打暴露强度协变量,需要事件密度、死亡密度、时间距离
这三个问题,影像数据集本身回答不了,病历数据回答不了,只有事件级冲突数据能回答。UCDP 的 GED 就是这一层。
§1.6 与本库已有条目的边界
| 库内条目 | 关系 | 区别 |
|---|---|---|
world-bank-open-data(rid 1360) |
同层,不同变量 | 世行给「国家 × 年」的社会经济分母;GED 给「事件 × 日 × 坐标」的暴力暴露 |
oecd-health(rid 1361) |
同层,互补 | OECD 讲卫生系统能力;GED 讲系统被冲击的频率与地点 |
gbd |
可交叉验证 | GBD 的暴力死亡是建模估计(国家 × 年);GED 是事件编码(点 × 日)。两者可互为验证 |
一句话分工:世行说「这个国家有多穷」,OECD 说「这个国家有多少医生」,GED 说「这个国家哪天在哪里死了多少人」。
§2 数据集族:79 个文件不是 79 份数据
§2.1 下载页的真实结构
ucdp.uu.se/downloads/ 页面有 79 个直接指向 .csv / .zip / .xlsx 的链接。它们可以归成六组:
| 组 | 代表文件 | 粒度 | 说明 |
|---|---|---|---|
| 事件级 | ged261-csv.zip、GEDEvent_v26_0_9.csv |
事件 × 日 × 坐标 | GED 正式版与 Candidate 快报版 |
| 冲突-年 / 国家-年 | ucdp-prio-acd-261-csv.zip |
冲突 × 年 | 1946–2025,武装冲突的年度定性 |
| 双边 | ucdp-dyadic-261-csv.zip |
冲突双方 × 年 | 把冲突拆到「谁对谁」 |
| 非国家与单边 | ucdp-nonstate-261-csv.zip、ucdp-onesided-261-csv.zip |
组织 × 年 | 2 型与 3 型的年度汇总 |
| 专题 | 终止、议题、和平协议、onset、VPP、CACE | 各类 | 冲突生命周期各阶段 |
| 汇总 | organizedviolencecy-261-csv.zip |
国家 × 年 | 三类暴力的国家-年总表 |
每一组都有 CSV / XLSX / RDS / DTA 四种格式。 这是 UCDP 的一个好习惯——R 用户拿 RDS,Stata 用户拿 DTA,不用自己转。
§2.2 GED 与 Candidate:两套数据,不能混用
这是最容易搞错的一处。UCDP 同时提供两个事件级数据集:
| GED(26.1) | Candidate(26.0.X) | |
|---|---|---|
| 更新频率 | 年度(正式版) | 月度(快报版) |
| 事件数 | 417,968(截至 2025 年底) | 仅覆盖最近月份 |
| 编码状态 | 全部 code_status = Clear |
含 Clear 与待核 |
| 用途 | 学术分析、长期趋势 | 监测、早期预警 |
| 稳定性 | 版本冻结后不再改 | 每月回溯修订 |
关键差别在 code_status。 GED 里 417,968 条全部是 Clear(已确认)。Candidate 里有大量待核条目,它们会在下一版里被修改、拆分或删除。
实测确认:GED 26.1 的 code_status 只有 Clear 一个值,417,968 条全部如此。这意味着用 GED 做分析不需要按 code_status 过滤——它已经过滤过了。但如果你混用了 Candidate,就必须过滤。
实用建议:做研究用 GED,做监测用 Candidate,永远不要拼在一起。两套的编码标准、来源门槛、修订状态都不同。
§2.3 GED 的 49 个字段,按功能分七组
| 组 | 字段 | 用途 |
|---|---|---|
| 标识 | id、relid、active_year、code_status |
事件唯一性与版本状态 |
| 时间 | year、date_start、date_end、date_prec |
何时发生、日期有多准 |
| 类型 | type_of_violence、conflict_dset_id、conflict_new_id、conflict_name |
属于哪场冲突、哪一型暴力 |
| 交战方 | dyad_*、side_a_*、side_b_*、gwnoa、gwnob |
谁打谁(side_a 常是国家) |
| 地理 | where_prec、where_coordinates、where_description、adm_1、adm_2、latitude、longitude、geom_wkt、priogrid_gid、country、country_id、region |
在哪打、坐标多准 |
| 伤亡 | deaths_a、deaths_b、deaths_civilians、deaths_unknown、best、high、low |
死了多少、区间多宽 |
| 来源 | number_of_sources、source_article、source_office、source_date、source_headline、source_original |
依据什么 |
最被低估的是最后一组。 UCDP 把每个事件的来源文章标题、发布机构、日期、原文链接都存了下来。这意味着你可以回溯核验任何一条记录。这是它与多数「二手伤亡统计」的根本区别——它给了你怀疑的入口。
§2.4 地理精度的七档,直接决定能不能做空间分析
where_prec 是 1 到 7 的整数,实测分布:
| 值 | 含义 | 事件数 | 占比 |
|---|---|---|---|
| 1 | 精确到村庄 / 街区 / 具体地点 | 194,544 | 46.5% |
| 2 | 精确到二级行政区(县) | 101,236 | 24.2% |
| 3 | 精确到二级行政区(较宽) | 59,437 | 14.2% |
| 4 | 精确到一级行政区(省 / 州) | 38,531 | 9.2% |
| 5 | 精确到一级行政区(较宽) | 18,645 | 4.5% |
| 6 | 精确到国家,但知道大致区域 | 5,309 | 1.3% |
| 7 | 仅知道国家(坐标是国家质心) | 266 | 0.06% |
这张表最重要的一行是最后一行,也是最重要的一个判断:只有 46.5% 的事件精确到村庄级。
推论一:做缓冲区分析(比如「医疗机构 5 公里内发生过多少起事件」)只能用 where_prec == 1 的 19.5 万条。用 2–7 的条目会把整个县或整个省的事件都堆在同一个点上,产生严重的空间聚集假象。
推论二:where_prec == 7 的 266 条,坐标是国家质心。这 266 个点全落在各国地理中心,做热力图时会在每个国家中间冒出一个孤立的亮点,完全是伪信号。必须剔除。
推论三:where_prec 是 2–4 的条目,坐标是行政区中心。同一县内的多起事件会共享同一个坐标——这会让「事件密度」在这个点上莫名变高。做核密度估计时要按 where_prec 加权或分层。
§2.5 日期精度的五档
date_prec 同样分档,实测分布:
| 值 | 含义 | 事件数 | 占比 |
|---|---|---|---|
| 1 | 精确到日 | 358,130 | 85.7% |
| 2 | 只知道月份(取当月某日) | 45,066 | 10.8% |
| 3 | 只知道季度 | 2,566 | 0.6% |
| 4 | 只知道某段时间范围 | 8,595 | 2.1% |
| 5 | 只知道年份(取当年某日) | 3,611 | 0.9% |
85.7% 的事件有精确日期。 这个比例比地理精度好得多。
但 14.3% 没有精确日期,这会带来一个具体问题:如果你做「事件后 N 天的心理健康就诊量」这类时间窗口分析,那些只知道月份的事件会被放到该月的某一天(通常是月中的某天),可能造成 ±15 天的错位。对于「窗口 7 天」的研究,这个错位足以让效应消失。
防护:把 date_prec != 1 的条目单独打标,做敏感性分析时剔除,看结论是否稳定。
§2.6 伤亡字段:四分解 + 三档区间
GED 的伤亡不是单一数字,是两层结构:
第一层,按交战方分解:
| 字段 | 含义 |
|---|---|
deaths_a |
side_a(通常是政府军)死亡 |
deaths_b |
side_b(通常是反对派)死亡 |
deaths_civilians |
平民死亡 |
deaths_unknown |
无法判定归属的死亡 |
第二层,按区间估计:
| 字段 | 含义 |
|---|---|
low |
保守下限 |
best |
主估计 |
high |
上界 |
两个关键判断:
判断一:四分解相加不等于 best。 因为有 deaths_unknown。实测中大量事件的 deaths_civilians 是 0 而 best 是 5——这意味着那 5 个人归属不明,不是「没有平民死亡」。如果把 deaths_civilians == 0 当作「无平民伤亡」,会系统性低估平民死亡。
判断二:high 与 low 的差距可能非常大。 UCDP 对来源充分的事件给窄区间,对来源少的事件给宽区间(有时 low=1、high=100+)。用 best 做汇总是对的,但必须同时报告区间宽度,否则读者不知道这个数有多不确定。
§2.7 来源数:一个必须警惕的 -1
number_of_sources 记录该事件依据的独立来源数量。原以为它是「1、2、3……」这样的正整数,实测发现它有一个特殊值 -1,而且占比极大:
number_of_sources |
事件数 | 占比 | 死亡合计(best) |
|---|---|---|---|
| -1(缺失) | 97,496 | 23.3% | 1,028,773 |
| 1 | 236,405 | 56.6% | — |
| 2 | 59,175 | 14.2% | — |
| 3 | 13,712 | 3.3% | — |
| 4 | 5,154 | 1.2% | — |
| 5–9 | 5,096 | 1.2% | — |
| 10+(截断) | 930 | 0.2% | — |
这张表推翻了两个直觉:
第一,「来源数缺失」的不是小部分,是 23.3%。 而且这批事件承载了 102.9 万死亡,占总死亡的 24.2%。近四分之一的死亡记录没有来源计数。
第二,正数来源里绝大多数只有 1 个。 236,405 条事件只有 1 个来源,占全部的 56.6%。也就是近八成事件(23.3% + 56.6%)不是多源交叉核验的。
这说明什么:GED 的编码门槛并不像通行理解的那样是「至少两个独立来源」。实际结构是:一部分事件有多个来源,一部分只有单一来源,还有近四分之一来源计数缺失(可能是早期版本遗留、可能是编码流程变更、可能是内部记录方式)。
实用推论:不要用 number_of_sources >= 2 当质量门槛,那会一次砍掉近 80% 的数据,且砍掉的部分里包含四分之一的死亡量。正确做法是把它当协变量而不是筛子——在回归里作为可信度控制项,或者做「仅单源」与「仅多源」两组敏感性分析,看结论是否稳定。
§2.8 平民死亡字段的陷阱:62.4% 的事件是零
实测中最反直觉的一个数:260,606 起事件(62.4%)的 deaths_civilians 是 0,而 best 大于 0。
这意味着:近三分之二的事件,有死亡但没有记录到平民死亡。
这不代表这些事件里没有平民死。 因为死亡分解成四块,deaths_unknown 承接了归属不明的部分。全库 deaths_unknown 合计 702,579 人——占 425.8 万总死亡的 16.5%。
三个层次的正确解读:
| 情形 | 含义 | 处理 |
|---|---|---|
deaths_civilians > 0 |
确认有平民死亡 | 直接用 |
deaths_civilians == 0 且 deaths_unknown == 0 |
确认无平民死亡(死者都是交战方) | 可以用 |
deaths_civilians == 0 且 deaths_unknown > 0 |
平民死亡未知 | 不能当零用 |
最危险的错误:直接把 deaths_civilians 求和当作「平民死亡总数」。这会系统性低估,因为 16.5% 的死亡根本没有归属。正确做法是给三个数:
total = df["best"].sum() # 425.8 万
civ_known = df["deaths_civilians"].sum() # 已确认的平民死亡
unknown = df["deaths_unknown"].sum() # 702,579,归属不明
并在报告里写明「平民死亡至少 X 人,另有 Y 人归属不明」。
§2.9 冲突与双边的真实层级
前文说「一场冲突可含多个双边」,实测确认这个结构存在,但绝大多数冲突只有一个双边:
| 每冲突的双边数 | 冲突数 | 占比 |
|---|---|---|
| 1 | 1,512 | 95.6% |
| 2 | 24 | 1.5% |
| 3 | 7 | 0.4% |
| 4 | 10 | 0.6% |
| 5 | 12 | 0.8% |
| 6–8 | 7 | 0.4% |
| 9+ | 9 | 0.6% |
全库共 1,581 场冲突,其中 1,512 场只有一个双边。最多的一场有 19 个双边——那是典型的多方混战(如叙利亚)。
实用推论:把分析单位从 conflict 换到 dyad,对 95.6% 的冲突没有区别,但对剩下的 4.4%(69 场)差异极大。如果你的研究对象包含叙利亚、也门、阿富汗这类多方冲突,必须用 dyad 级,否则会把不同性质的对抗混在一起算。
§3 取数通道
§3.1 两条路:下载与 API
| 通道 | 适用 | 门槛 |
|---|---|---|
| 直接下载 | 全量分析、长期研究 | 无。79 个文件都能匿名下载 |
| REST API | 增量查询、按条件取子集 | 需申请 token |
推荐走下载。 理由很实际:GED 主表 274 MB,本地加载一次约 2–3 分钟,之后所有查询都在本地跑,比逐次 API 请求快几个数量级。
§3.2 API 的实测行为
不带 token 访问:
curl -s "https://ucdpapi.pcr.uu.se/api/gedevents/26.1?pagesize=2"
# HTTP 401
# API token required. Add header: x-ucdp-access-token: <your-token>
这个错误信息很明确:加 x-ucdp-access-token 请求头。token 需向 UCDP 申请(页面有 Contact 邮箱)。
API 的路径结构:
https://ucdpapi.pcr.uu.se/api/{dataset}/{version}?{params}
常见 params:
| 参数 | 作用 |
|---|---|
pagesize |
每页条数 |
page |
页码 |
StartDate / EndDate |
时间范围 |
Country |
按国家筛 |
version |
数据版本(26.1) |
§3.3 下载后的加载
import pandas as pd
# 49 列,41.8 万行。dtype 必须指定,否则 float 推断会出问题
DTYPES = {
"id": "Int64", "relid": "Int64", "year": "Int32",
"type_of_violence": "Int8", "where_prec": "Int8", "date_prec": "Int8",
"latitude": "float64", "longitude": "float64",
"best": "Int32", "high": "Int32", "low": "Int32",
"deaths_a": "Int32", "deaths_b": "Int32",
"deaths_civilians": "Int32", "deaths_unknown": "Int32",
"number_of_sources": "Int16",
}
df = pd.read_csv("GEDEvent_v26_1.csv", dtype=DTYPES,
parse_dates=["date_start", "date_end"],
low_memory=False)
print(len(df), df["best"].sum())
# 417968 4257891
三个必须设 dtype 的理由:
id是整数,但可能有缺失。不设Int64会变成 float,id出现.0。deaths_*有大量 0,少量大值。Int32比默认的int64省一半内存。low_memory=False必须加,否则 pandas 会分块猜 dtype,同一列在不同块里可能被猜成不同类型,最后报 mixed types 警告。
§3.4 内存与性能
274 MB CSV 加载后约 1.2–1.8 GB 内存(取决于 dtype)。这在常规机器上可以接受,但如果要反复试验,建议:
# 只加载分析需要的列,内存降到 1/4
COLS = ["id","year","type_of_violence","date_start","date_prec",
"latitude","longitude","where_prec","country","region",
"best","high","low","deaths_civilians","number_of_sources"]
df = pd.read_csv("GEDEvent_v26_1.csv", usecols=COLS, dtype=DTYPES, low_memory=False)
不要用 dask 或分块处理。41.8 万行是「小数据」,分块的调度开销大于收益。一次读进内存更快。
§4 记录结构与字段字典
§4.1 一条记录是什么
一条记录 = 一次被独立核验的致命暴力行为。
(2024-03-15, 某村坐标, side_a=政府军, side_b=某武装团体, best=7) → 一条记录
不是一次战役(一次战役可能是几十条记录),不是一个月的统计(那是国家-年表),不是一次调查。
§4.2 事件与冲突的层级关系
理解 GED 必须理解它的三层结构:
冲突(conflict)—— 一场持久的对抗,可跨年、跨政府
└── 双边(dyad)—— 冲突中一对具体的交战方
└── 事件(event)—— 某天某地的一次具体暴力行为
字段对应:
| 层 | 字段 | 例 |
|---|---|---|
| 冲突 | conflict_new_id、conflict_name |
某国内战 |
| 双边 | dyad_new_id、dyad_name、side_a、side_b |
政府 vs 某组织 |
| 事件 | id、relid、date_start、latitude |
单次行为 |
为什么这个层级重要:一场冲突下可能有多个双边(政府打 A 组织、政府打 B 组织、A 打 B)。如果按 conflict_new_id 汇总死亡数,会把不同性质的对抗混在一起。 正确的分析单位往往是 dyad,不是 conflict。
§4.3 事件 id 跨版本会变
这是做长期项目时最容易被坑的一处。
GED 每次版本更新会重新分配 id,因为:
- 旧事件可能被拆分(一个报道后来发现是两起事件)
- 旧事件可能被合并
- 旧事件可能被删除(来源被证伪)
所以不能按 id 做跨版本 join。 正确做法是按事件指纹匹配:
KEY = ["date_start", "latitude", "longitude", "side_a", "side_b"]
v25 = pd.read_csv("GEDEvent_v25_1.csv", ...)
v26 = pd.read_csv("GEDEvent_v26_1.csv", ...)
merged = v25.merge(v26, on=KEY, how="outer", indicator=True)
print(merged["_merge"].value_counts())
# both / left_only(被删)/ right_only(新增)
这是版本比对的标准做法,也是 relid 存在的原因——它在版本内稳定,配合 conflict_new_id 可以定位,但仍不是跨版本主键。
§4.4 坐标系统的三个陷阱
陷阱一:where_prec == 7 的坐标是国家质心。 266 条。必须剔除。
陷阱二:同一个行政区内的多个事件共享坐标。 where_prec 为 2–6 时,坐标是行政区中心。这会让「事件密度」在这些点上虚高。
陷阱三:geom_wkt 与 latitude/longitude 可能不一致。 geom_wkt 是 WKT 格式的几何,多数是点,与 lat/lon 一致。但如果你做几何运算,用 geom_wkt;如果做点统计,用 lat/lon。不要混着用。
§5 检索、抽样与泄漏分析
§5.1 用医学 AI 的眼光看,泄漏在哪
把冲突数据当暴露变量接进健康模型,有三层泄漏:
第一层:时间方向泄漏。 用「事件发生后」的暴露去预测「事件发生前」的健康结局。做法上很容易犯:因为 GED 是按国家横排的,人容易忘记时间方向。
第二层:前视偏差(look-ahead)。 如果你用「整个观察期内的事件总数」当暴露,这个数包含了未来的事件。正确做法是用暴露窗口内的事件数,即结局测量时点之前的固定长度窗口。
第三层:地理边界泄漏。 用「全国事件数」给每个样本打标签,等于假设战争的影响在全国均匀分布——实际高度集中于特定地区。用国家级暴露会严重稀释效应。
§5.2 正确构造暴露变量
这是本节最实用的部分。给一个医疗数据集打冲突暴露,标准做法是:
import numpy as np
import pandas as pd
from math import radians, sin, cos, asin, sqrt
def haversine_km(lat1, lon1, lat2, lon2):
R = 6371.0
dlat = radians(lat2 - lat1); dlon = radians(lon2 - lon1)
a = sin(dlat/2)**2 + cos(radians(lat1)) * cos(radians(lat2)) * sin(dlon/2)**2
return 2 * R * asin(sqrt(a))
def exposure(df_ged, lat, lon, t0, window_days=365, radius_km=25, min_prec=2):
"""构造单个样本的冲突暴露。三个参数必须显式给,不能默认。"""
d = df_ged[
(df_ged["where_prec"] <= min_prec) & # 只用精度够的
(df_ged["date_start"] >= t0 - pd.Timedelta(days=window_days)) &
(df_ged["date_start"] < t0) # 严格早于结局时点
]
if d.empty:
return {"n_events": 0, "deaths": 0, "km_nearest": np.nan}
dist = d.apply(lambda r: haversine_km(lat, lon, r["latitude"], r["longitude"]), axis=1)
m = dist <= radius_km
return {
"n_events": int(m.sum()),
"deaths": int(d.loc[m, "best"].sum()),
"km_nearest": float(dist.min()),
}
四个参数的含义与选择:
| 参数 | 作用 | 建议 |
|---|---|---|
window_days |
暴露窗口长度 | 365 天(一年)为常见默认;创伤研究可短到 90 天 |
radius_km |
空间半径 | 25 km 约等于「可听见爆炸」的距离;卫生服务可及性研究可用 50–100 km |
min_prec |
地理精度门槛 | 2(县及更细)。用 1 会丢掉一半以上事件 |
t0 |
结局测量时点 | 必须是样本采集日,不是发表日 |
最关键的纪律:t0 必须严格早于结局。如果样本是 2020 年 6 月采集的健康问卷,暴露窗口就该是 2019-06 到 2020-06。用 2021 年的事件解释 2020 年的问卷,是时间倒流。
§5.3 三个暴露指标,各有用途
| 指标 | 计算 | 适用 |
|---|---|---|
| 事件计数 | 窗口内半径内的事件数 | 通用,最常用 |
| 死亡求和 | 窗口内的 best 求和 |
衡量严重程度,但受单次大事件主导 |
| 最近距离 | 到最近事件的直线距离 | 衡量「是否处于冲突区」,不受密度影响 |
三个指标不能互相替代。 一个半径 25 km 内发生 3 起事件、每起死 2 人,和发生 1 起事件死 6 人,事件计数一个是 3 一个是 1,死亡求和都是 6。前者是持续骚扰,后者是一次屠杀,健康影响完全不同。
§5.4 覆盖率:不是所有国家都在库里
126 个国家。这个数不是「有暴力的国家数」,是「UCDP 编码了的国家数」。
未编码不等于无暴力。 一些小国、岛国、以及报道极少的地区,可能因为达不到 UCDP 的编码门槛(至少 1 人死亡 + 2 个独立来源)而没有记录。
实用判断:如果你的样本国家不在 126 里,不能断言「该国无冲突」,只能说「GED 无记录」。这两个结论完全不同。
§6 AI 就绪指南
§6.1 最小可用流水线
import pandas as pd
COLS = ["id","year","type_of_violence","date_start","date_prec",
"latitude","longitude","where_prec","country","region","adm_1",
"best","high","low","deaths_civilians","deaths_unknown",
"number_of_sources","side_a","side_b"]
def load_ged(path="GEDEvent_v26_1.csv"):
df = pd.read_csv(path, usecols=COLS, parse_dates=["date_start"],
low_memory=False)
df["year"] = df["year"].astype("int16")
df["best"] = df["best"].astype("int32")
return df
ged = load_ged()
print(len(ged), "事件 |", ged["best"].sum(), "死亡")
§6.2 三步清洗
def clean(ged):
d = ged.copy()
# 1. 剔除国家质心坐标(where_prec == 7)
d = d[d["where_prec"] < 7]
# 2. 标记而非删除低精度条目(后续敏感性分析要用)
d["geo_ok"] = d["where_prec"] <= 2 # 县及更细
d["date_ok"] = d["date_prec"] == 1 # 精确到日
# 3. 标记低可信事件
d["low_src"] = d["number_of_sources"].fillna(0) <= 1
return d
ged = clean(ged)
print(ged["geo_ok"].mean().round(3), ged["date_ok"].mean().round(3))
# 约 0.707 0.857
为什么标记而不删除:低精度条目在国家-年汇总里是可用的,只在空间分析里不可用。删除会丢失大量信息。
§6.2b 两个字段的正确用法:number_of_sources 与 deaths_unknown
这两个字段最容易被误当筛子用,实测数据说明了为什么不能:
number_of_sources 不能当质量门槛。 因为 23.3% 的事件是 -1(缺失),56.6% 是 1。设 >= 2 会一次砍掉 79.9% 的数据,而砍掉的部分里包含 102.9 万死亡。正确的三种用法:
# 用法一:当协变量(推荐)
ged["src_missing"] = ged["number_of_sources"] < 0
ged["src_n"] = ged["number_of_sources"].clip(lower=0)
# 用法二:做敏感性分析,看结论是否依赖来源充分的子集
sub = ged[ged["number_of_sources"] >= 2]
print(len(sub), "/", len(ged)) # 约 20%
# 用法三:给每个聚合值附一个可信度分层
ged["conf"] = pd.cut(ged["number_of_sources"],
[-2, -1, 1, 3, 999],
labels=["missing", "single", "multi", "rich"])
用法一最稳妥。 把「来源缺失」当成一个显式的指示变量,让模型自己决定它有多重要。用法二只用于验证,不能替代主分析。
deaths_unknown 必须与 deaths_civilians 一起报。 因为 62.4% 的事件是 civilians=0, best>0。做平民死亡分析时,标准的三行输出是:
print("总死亡:", df["best"].sum())
print("已确认平民死亡:", df["deaths_civilians"].sum())
print("归属不明:", df["deaths_unknown"].sum())
如果只打印第二行,你会得到一个人为压低几倍的数。 这是冲突健康研究里最常被忽视的一处。
§6.3 国家-年聚合(最常用的形态)
def to_country_year(ged, type_filter=None):
d = ged if type_filter is None else ged[ged["type_of_violence"] == type_filter]
g = (d.groupby(["country", "year"])
.agg(n_events=("id", "count"),
deaths=("best", "sum"),
deaths_civ=("deaths_civilians", "sum"),
n_dyads=("dyad_new_id" if "dyad_new_id" in d else "side_a", "nunique"))
.reset_index())
return g
cy = to_country_year(ged, type_filter=1) # 只看国家型武装冲突
print(cy.sort_values("deaths", ascending=False).head(10))
必须显式指定 type_filter。 不指定会把三类暴力混在一起,得到无意义的「总死亡」。
§6.4 空间聚合:网格化
做空间分析的标准做法是把事件投到网格上:
def to_grid(ged, cell=0.5):
d = ged[ged["geo_ok"]].copy() # 只用精度够的
d["glat"] = (d["latitude"] / cell).round() * cell
d["glon"] = (d["longitude"] / cell).round() * cell
return (d.groupby(["glat", "glon", "year"])
.agg(n=("id", "count"), deaths=("best", "sum"))
.reset_index())
grid = to_grid(ged, cell=0.5)
print(len(grid), "个网格-年")
cell=0.5 度约等于 55 km × 55 km(赤道)。 这个是常用的粗粒度。做精细分析可用 0.1 度(约 11 km),但那时必须只用 where_prec == 1 的条目,否则同县事件会堆在一个网格里。
priogrid_gid 字段可以直接用。 UCDP 已经预计算了 PRIO-GRID 网格编号(一种标准的 0.5 度全球网格),如果你要用 PRIO-GRID,直接用这个字段,不用自己算。
§6.5 与健康数据的连接
def merge_health(samples, ged):
"""samples 需含 lat / lon / date_collected / country 三列。"""
out = []
for _, s in samples.iterrows():
e = exposure(ged, s["lat"], s["lon"], s["date_collected"],
window_days=365, radius_km=25, min_prec=2)
out.append({**s.to_dict(), **e})
return pd.DataFrame(out)
样本量大时这个循环会很慢(每秒约 100–500 条)。优化方式是先用 country + year 做粗筛,再在子集上算距离:
def merge_health_fast(samples, ged):
ged["y"] = ged["date_start"].dt.year
parts = []
for (c, y), idx in samples.groupby(["country", "year_collected"]).groups.items():
sub = ged[(ged["country"] == c) & (ged["y"].between(y-1, y))]
if sub.empty:
continue
for i in idx:
s = samples.loc[i]
e = exposure(sub, s["lat"], s["lon"], s["date_collected"])
parts.append({**s.to_dict(), **e})
return pd.DataFrame(parts)
§6.6 三个必须记录的元数据
| 项 | 为什么 |
|---|---|
| GED 版本号(26.1) | 版本间事件会增删改,没有版本号结果不可复现 |
| 下载日期 | 同一版本可能被重新打包 |
| 暴露窗口参数 | window_days / radius_km / min_prec 三个值决定了结论,必须写进论文方法部分 |
这三项不记录,你的结果就是不可复现的。 冲突数据的版本迭代很快(一年一版),三年后别人拿 29.x 版重跑,会得到不同的数。
§6.7 时序划分
冲突数据做预测模型时,必须按年切,不能随机切。理由与世行那条相同,但更强:冲突有强烈的时空自相关——昨天的冲突预测今天的冲突。随机切分会让训练集和测试集共享同一场冲突的事件,模型学到的是「这场冲突还在继续」,不是「什么样的条件会产生冲突」。
正确做法:留出最后 2–3 年做测试,且测试年份内不能有任何事件出现在训练集里。
§7 质量评估、DAIMS 与口径交叉核对
§7.1 DAIMS 评估
| 维度 | 得分 | 说明 |
|---|---|---|
| 数据集标识 | 3/3 | 有版本号(26.1)、有 DOI 与固定下载 URL,可精确寻址 |
| 许可清晰度 | 3/3 | 统一 CC BY 4.0,明确要求引用对应出版物 |
| 溯源信息 | 3/3 | 事件级存来源文章标题、机构、日期、原文链接。这是本库最强的一处 |
| 版本与更新 | 3/3 | GED 年度版本 + Candidate 月度快报,历史版本可下载 |
| 字段字典 | 3/3 | 49 个字段全部有 codebook,含取值定义 |
| 缺失处理 | 2/3 | 有 where_prec / date_prec / number_of_sources 三档精度标记,但死亡归属不明只在 deaths_unknown 一个数里 |
| 文档完备度 | 3/3 | Codebook、方法论文档、FAQ、API 文档齐全 |
| 访问稳定性 | 2/3 | 下载稳定,但 API 需申请 token,且 401 时不提示如何申请 |
| 合计 | 22/24 = 91.7% | 本库最高分之一 |
§7.2 22 分里那两分扣在哪
扣在「缺失处理」:GED 有很好的精度标记,但没有告诉你「为什么这个事件的死亡归属不明」。deaths_unknown 只有一个数,不区分「死者身份待查」「来源矛盾」「未报道」。做平民死亡研究时,这一块是黑箱。
扣在「访问稳定性」:CSV 下载完全开放(这是好事),但 API 的 token 机制没有自助申请入口,只能发邮件。对于要建自动化管道的团队,这是一个摩擦点。
除此之外的六项都是满分,尤其「溯源信息」——事件级存来源清单这件事,在全库 1,344 篇里是罕见的。
§7.3 交叉核对:GED vs GBD vs WHO 死亡登记
同一批暴力死亡,三个来源都有估计:
| 来源 | 方法 | 粒度 | 典型关系 |
|---|---|---|---|
| GED | 事件编码(媒体交叉核验) | 点 × 日 | 基准:可核验的最低计数 |
| GBD | 协变量建模(DisMod-MR) | 国家 × 年 × 年龄 × 性别 | 通常高于 GED,因为模型补了漏报 |
| WHO 死亡登记 | 各国上报的死亡登记 | 国家 × 年 | 仅在有完整登记的国家可用,冲突期常中断 |
三者关系的一般规律:
- GED 是下限——它只收有来源的、致死的事件,漏报必然存在
- GBD 是上界之一——模型会补上「应该有但没报道」的死亡
- WHO 登记在冲突期常常缺失——正是暴力最烈的地方登记最差
引用纪律:三者不能混用。如果要写「某冲突造成 X 人死亡」,必须说明是 GED 的 best 还是 GBD 的估计,两者的差可以达到 2–3 倍。这个差异不是谁错了,是「可核验计数」与「建模估计」的本质区别。
§7.4 一个必须说清的口径:417,968 是事件数不是死亡数
GED 的 417,968 是事件数。死亡合计 4,257,891 是 best 求和。
这两个数常被混淆。看到「UCDP 记录了 41.8 万起事件」就说「41.8 万人死亡」是错的——实际死亡是 425.8 万,是事件数的 10 倍。
报告时的正确写法:
依据 UCDP GED 26.1(2026 年发布),1989–2025 年间全球共编码 417,968 起致死性有组织暴力事件,死亡人数主估计合计 4,257,891 人(low 与 high 给出区间)。
§7.5 本库最独特的价值:可回溯性
多数伤亡统计只给结论。GED 给的是通往结论的路径:
一条记录 → source_article(文章标题)→ source_office(发布机构)
→ source_date(发布日期)→ source_original(原文链接)
这意味着任何一条记录都可以被独立核验。这是本条目在 DAIMS 上拿到溯源满分的原因,也是它与「某某机构估计有 X 万人死亡」这类不可核验说法的根本区别。
对医学 AI 的意义:如果你要用冲突数据做模型的暴露变量,可回溯性决定了你的结果能不能被审稿人接受。用不可核验的伤亡数字,审稿人会直接质疑;用 GED,你可以给出每一条事件的具体来源。
§8 生态位与相邻资源
§8.1 冲突数据的四层结构
第一层:现场调查(DHS、MICS 的冲突模块、幸存者调查) —— 个体级,样本小,有回忆偏差
第二层:事件编码(UCDP GED、ACLED) —— 点 × 日,媒体交叉核验
第三层:冲突-年定性(UCDP/PRIO ACD、Correlates of War)—— 冲突 × 年,标准定义
第四层:建模估计(GBD、IHME、World Bank 的冲突影响评估)—— 国家 × 年,有推算
UCDP 同时占据第二层与第三层,这是它不同于其他来源的地方——多数机构只做一层。
§8.2 与 ACLED 的分工
ACLED(Armed Conflict Location & Event Data Project)是 GED 最直接的对照:
| UCDP GED | ACLED | |
|---|---|---|
| 时间起点 | 1989 | 1997(部分国家 2010s) |
| 更新频率 | 年度(正式)+ 月度(Candidate) | 周度 |
| 编码门槛 | 至少 1 人死亡 | 含非致命事件(抗议、暴力骚扰) |
| 事件类型 | 三类(国家型 / 非国家 / 单边) | 更细(战斗、爆炸、针对平民暴力、抗议、骚乱) |
| 地理精度 | 七档标记 | 多为城镇级 |
| 许可 | CC BY 4.0 | 非商业用途免费,商业需授权 |
核心区别在门槛:GED 只收致死事件,ACLED 收非致命事件。所以 ACLED 的事件数远多于 GED,但两者的「事件」不是一个东西。
实用判断:
- 要长期历史序列(1989 起)→ GED
- 要近期高频监测(上周发生了什么)→ ACLED
- 要非致命暴力(伤害、绑架、威胁)→ ACLED
- 要可商用的许可 → GED(ACLED 商业需授权)
§8.3 与 UCDP/PRIO ACD 的关系
同一个机构的两套数据,但粒度差一个数量级:
| GED | ACD(UCDP/PRIO) | |
|---|---|---|
| 单位 | 事件 | 冲突-年 / 国家-年 |
| 覆盖 | 1989–2025 | 1946–2025 |
| 门槛 | 至少 1 人死亡 | 一年内冲突死亡 ≥ 25 人 |
| 用途 | 精细暴露、空间分析 | 长期趋势、面板回归 |
ACD 的 25 人死亡阈值是武装冲突研究的通行标准。 如果你的研究要与其他文献可比,必须用 ACD 的定义,不能用 GED 自己按 25 人筛——因为 ACD 的「冲突年」有一套完整判定规则(涉及交战方认定、年份归属),不是简单计数。
§8.4 专题数据集:冲突的生命周期
UCDP 还有一组专题库,覆盖冲突的不同阶段:
| 数据集 | 内容 | 用途 |
|---|---|---|
| Onset(6 个文件) | 冲突发生(哪一年开始) | 冲突预测、风险建模 |
| Termination(v4) | 冲突终止(怎么结束的) | 和平研究、复发起因分析 |
| Peace Agreements(22.1 / 22.2) | 和平协议文本编码 | 协议条款与持久和平的关系 |
| CID(冲突议题) | 冲突围绕什么议题 | 议题类型与冲突烈度的关系 |
| VPP(冲突前兆) | 冲突升级前的事件序列 | 早期预警 |
| CACE | 气候与冲突(1989–2017) | 气候冲击与暴力的关系 |
这一组对医学 AI 的用处:如果你研究「冲突对健康系统的长期影响」,需要区分「冲突进行中」与「冲突后」——Termination 数据集给的就是这个分界点。
§9 许可、伦理与合规
§9.1 一句话:CC BY 4.0,但必须引用对应出版物
下载页原文:
All datasets are free of charge and licensed under CC BY 4.0 — you are free to use and redistribute them provided you cite the relevant publications listed with each dataset.
关键点在「cite the relevant publications」。 这不是普通的 CC BY 署名要求——它要求引用该数据集对应的学术出版物,不只是数据集本身。
具体到 GED,要引用的是:
- Sundberg, R. & Melander, E. — 关于 GED 的方法论文献
- 以及 UCDP 官方在每个数据集页面列出的具体出版物
实用做法:每个数据集页面下方都有「Publications」区块,照抄那里的引用格式。不要只写「数据来自 UCDP 网站」。
§9.2 CC BY 4.0 允许什么
| 行为 | 是否允许 | 条件 |
|---|---|---|
| 商用 | ✅ | 署名 |
| 修改 | ✅ | 署名 + 标注修改 |
| 再分发 | ✅ | 署名 |
| 用于训练集 | ✅ | 署名 |
| 建立衍生数据库 | ✅ | 署名 + 声明改编 |
这是相当宽松的许可。 对比 OECD 那套有「不得用 logo」「翻译要加声明」的附加条款,UCDP 的 CC BY 4.0 几乎是无条件的(只要署名)。
§9.3 伦理:三类必须谨慎的用法
数据本身是公开事件记录,不涉个人隐私。但伦理风险在解读:
第一类:把事件计数当死亡计数。 41.8 万是事件,425.8 万是死亡。混淆这两个数会造成十倍量级的错误。
第二类:把 GED 当「全部暴力」。 GED 只收致死事件。用它论证「某地区暴力程度低」,会忽略大量非致命暴力(伤害、性暴力、拘禁、酷刑)。这些恰恰是医疗系统负担的主要来源。
第三类:把地理精度当真实位置。 用 where_prec == 7 的国家质心坐标做「某医院附近发生了多少暴力」的计算,会得到完全不真实的结论。
§9.4 关于国家与地区的表述
UCDP 的国家字段使用其实体命名。引用具体国家或地区数据时,应按中国官方立场处理地理命名,不做政治性解读。本条目只讨论数据的结构与用法,不对任何冲突的性质、责任归属或领土争议做判断。
§9.5 伤亡数字的使用纪律
这是本条目最需要强调的一条。UCDP 的死亡估计是下限,不是全数:
- 只收有独立来源的事件
- 偏远地区、低烈度冲突系统性漏报
best是来源交叉后的中位判断,不是精确计数low与high之间的差距可能达数倍
报告时必须给区间,不能只给一个数。 写「死亡 4,257,891 人」而不给 low/high,是把估计当成了事实。
§10 复用边界与三条硬结论
§10.1 三条硬结论
结论一:这是「致死暴力」库,不是「暴力」库。
GED 的门槛是至少 1 人死亡。伤害、绑架、性暴力、拘禁、酷刑、财产破坏、流离失所全部不在库内。如果你的研究关注的是「非致命暴力对健康的影响」,GED 帮不上,得看 ACLED 或专门的调查数据。
结论二:只有 46.5% 的事件能做空间分析。
where_prec == 1 的 194,544 条才是村庄级精度。剩下 53.5% 的坐标是行政区中心或国家质心。任何「缓冲区内事件数」的计算,都必须先按 where_prec 过滤,否则结果是伪信号。
结论三:三类暴力不能相加。
国家型武装冲突(292,121)、非国家冲突(61,451)、单边暴力(64,396)的分母完全不同。给一个「总事件数」等于把三种性质不同的东西混在一起。报告时永远给三个分项。
§10.2 该用 / 不该用
| 场景 | 该不该用 |
|---|---|
| 给医疗样本打冲突暴露协变量 | ✅ 强烈推荐(注意窗口与半径) |
| 冲突与健康的长期面板研究 | ✅ 推荐(配 ACD 的冲突-年定性) |
| 空间分析(缓冲区、核密度) | ✅ 但要限 where_prec == 1 |
| 非致命暴力研究 | ❌ 用 ACLED 或调查数据 |
| 精确伤亡核算 | ❌ 这是下限估计,不是全数 |
| 找个体受害者记录 | ❌ 事件级聚合,无个人 |
| 当临床决策依据 | ❌ 绝对不行 |
§10.3 一个判断标准:这条事件能不能用
五个问题:
问题一:code_status 是 Clear 吗? GED 全部是,但如果你混了 Candidate,这条就关键。
问题二:where_prec 够不够细? 做空间分析要 ≤ 2,做村庄级要 == 1。
问题三:date_prec 够不够细? 做时间窗口分析要 == 1。
问题四:number_of_sources 有几个? 只有 1 个来源的事件,可信度显著低于多个来源。
问题五:deaths_unknown 占比多少? 如果某个事件大部分死亡归属不明,就不要拿它算平民死亡。
五个都过了,这条事件才可靠。
§10.4 一句话记住它
UCDP 把战争拆成 41.8 万个可核验的坐标点,让你能把「暴力」当作一个可测量的环境变量,接进任何一条健康数据。
§11 常见误读
这一节把散落在前文的坑集中一次讲清。每一条都对应一次实测中的真实失败——不是理论风险。
| 常见说法 | 实际情况 | 证据 |
|---|---|---|
| 「41.8 万起事件 = 41.8 万人死亡」 | 41.8 万是事件数,死亡合计 425.8 万,是事件数的 10 倍 | best 求和 = 4,257,891 |
| 「GED 记录了所有暴力事件」 | 只收至少 1 人死亡的事件。非致命暴力全不在库 | 编码门槛 |
| 「三类暴力可以加总」 | 1 型 292,121 / 2 型 61,451 / 3 型 64,396,分母完全不同 | type_of_violence 计数 |
| 「坐标就是事件真实地点」 | 只有 46.5% 精确到村庄;266 条的坐标是国家质心 | where_prec 分布 |
| 「所有事件都能做空间分析」 | 只有 where_prec == 1 的 194,544 条能做村庄级分析 |
同上 |
「deaths_civilians == 0 就是没平民死」 |
62.4% 的事件是 civilians=0 但 best>0。全库 deaths_unknown 合计 702,579(16.5%) |
§2.8 |
「number_of_sources 是正数」 |
23.3%(97,496 条)是 -1,承载 102.9 万死亡(24.2%)。不能当质量筛子 |
§2.7 |
| 「UCDP 要求至少两个独立来源」 | 56.6% 的事件只有 1 个来源。近八成事件不是多源交叉的 | §2.7 |
「best 是精确数字」 |
是来源交叉后的中位判断,low 与 high 可差数倍 |
§2.6 |
| 「事件 id 可以跨版本 join」 | 每次版本更新重新分配 id。要按日期+坐标+交战方匹配 | §4.3 |
| 「GED 和 Candidate 可以混用」 | 前者全部 Clear,后者含待核条目,下版会改 |
§2.2 |
| 「API 可以直接调」 | 不带 token 返回 401,需申请 | 实测 401 |
| 「126 个国家里没有的就是没冲突」 | 未编码 ≠ 无暴力。小国、报道少地区可能达不到编码门槛 | §5.4 |
| 「GED 的死亡数比 GBD 低是错的」 | GED 是可核验下限,GBD 是建模估计,差 2–3 倍是正常的 | §7.3 |
| 「CC BY 4.0 只要署名数据集名」 | 要求引用该数据集对应的学术出版物,不是只写「数据来自 UCDP」 | 下载页原文 |
| 「日期都是精确的」 | 85.7% 精确到日,14.3% 只到月/季/年 | date_prec 分布 |
| 「同一个冲突下所有事件性质相同」 | 一场冲突可含多个 dyad(政府打 A、政府打 B、A 打 B),性质不同 | §4.2 |
每一行背后的展开:
「41.8 万起事件 = 41.8 万人死亡」 —— 这是最常被媒体犯的错。事件与死亡是两回事:一起事件可以死 1 人,也可以死 5,000 人。GED 里既有「1 人死亡」的小规模事件,也有大屠杀级别的记录。看到「41.8 万」这个词,首先要问:是事件还是人。
「GED 记录了所有暴力事件」 —— 门槛是「致死」+「两个独立来源」。这两个条件排除了绝大多数暴力:伤害、绑架、性暴力、酷刑、拘禁、财产破坏、流离失所,一项都不在库内。从医疗系统的角度看,这恰恰是最需要关注的——非致命暴力造成的伤残与心理创伤是医疗负担的主体,而 GED 看不到它们。
「三类暴力可以加总」 —— 三类暴力的分母不同:1 型是国家与反对派对抗,2 型是武装团体互斗,3 型是一方针对平民。把三者相加得到一个「总事件数」,等于把「战争」「黑帮火并」「政府镇压」装进一个数——政策含义完全不同。
「坐标就是事件真实地点」 —— 只有 46.5% 精确到村庄。其余是行政区中心或国家质心。用国家质心坐标做「医院附近发生多少暴力」的计算,会让整个国家的事件都堆在首都附近的一个点上。
「deaths_civilians == 0 就是没平民死」 —— 死亡分解成 deaths_a / deaths_b / deaths_civilians / deaths_unknown 四块。deaths_civilians == 0 而 best > 0 的情形大量存在,意味着那部分死亡归属不明。做平民死亡研究时,必须把 deaths_unknown 单独报告。
「best 是精确数字」 —— best 是 low / best / high 三档里的中位判断。来源充分的事件区间窄,来源少的事件区间可以很宽(low=1、high=100)。只报 best 不报区间,是隐瞒不确定性。
「事件 id 可以跨版本 join」 —— GED 每次版本更新会重排 id。因为旧事件可能被拆分(一条报道后来发现是两起)、合并、删除(来源被证伪)。跨版本比对要按 (date_start, latitude, longitude, side_a, side_b) 这个指纹匹配。
「GED 和 Candidate 可以混用」 —— GED 全部 Clear(已确认),Candidate 含待核条目。待核条目会在下个月被修改、拆分或删除。混在一起用,你的结果会随时间变化。
「API 可以直接调」 —— 实测返回 401,消息是 API token required. Add header: x-ucdp-access-token。token 需向 UCDP 申请(页面有邮箱)。不想申请就直接下 CSV,79 个文件都开放下载。
「126 个国家里没有的就是没冲突」 —— UCDP 的编码需要达到门槛:至少 1 人死亡 + 至少 2 个独立来源。达不到门槛的地区不是没有暴力,是没有被编码。未编码 ≠ 无暴力,这个区别在做全球比较时至关重要。
「GED 比 GBD 低是错的」 —— GED 是事件编码的加总,本质是可核验的下限;GBD 是协变量模型,会补上「应该有但没报道」的部分。两者的差 2–3 倍是结构性差异,不是谁算错。
「CC BY 4.0 只要署名」 —— UCDP 的要求更具体:要引用该数据集对应的学术出版物(GED 页面下方列出的那几篇),不是只写「数据来自 UCDP 网站」。这是 CC BY 里「appropriate credit」的具体化。
「日期都是精确的」 —— 85.7% 精确到日,10.8% 只到月(会被放到当月某一天),0.9% 只到年。做「事件后 N 天」的窗口分析时,那 14.3% 会带来最多 ±15 天的错位。
「同一冲突下所有事件性质相同」 —— 一场冲突可以有多个 dyad。政府打 A、政府打 B、A 打 B,是三个不同性质的对抗。按 conflict_new_id 汇总会把它们混在一起。正确的分析单位常常是 dyad。
§11.2 四类容易忽略的结构性问题
第一,country 字段是字符串,不是 ISO 代码。
GED 的 country 是人可读的国家名(如 “Syria”),country_id 是 UCDP 内部编号。要和世行、OECD 的 ISO3 代码 join,需要自己建映射表。这个映射不能自动生成——UCDP 的国家定义与 ISO 有细微差异(历史国家、争议地区)。
第二,priogrid_gid 是预计算网格,但只在 where_prec <= 6 时有值。
UCDP 用了 PRIO-GRID(一种标准 0.5 度全球网格)。如果你的分析也用这个网格,直接用这个字段,不用自己算经纬度。但 where_prec == 7 的条目这个字段可能为空。
第三,active_year 不是 year。
year 是事件发生年,active_year 是这场冲突在该年仍处于活跃状态。两者不同:一场 2011 年开始的冲突,2015 年发生的事件,year = 2015,active_year 也是 2015,但冲突的起始年是 2011。做冲突持续性分析时要用 conflict_new_id + active_year。
第四,VPP 与 CACE 是研究项目产出,不是常规更新。
UCDP_VPP_Dataset 与 CACE_1989-2017.xlsx 是两个特定研究项目的副产品,不会随 GED 年度更新。CACE 只到 2017 年,用它做近期分析会缺十年数据。
§11.3 上线前的九项自检
- [ ] 区分了「事件数」与「死亡数」
- [ ] 三类
type_of_violence分开报告,没有加总 - [ ] 剔除了
where_prec == 7的国家质心坐标 - [ ] 空间分析只用了
where_prec <= 2(最好 == 1) - [ ] 时间窗口分析只用了
date_prec == 1 - [ ] 报告了
low/best/high三档,不只报 best - [ ]
deaths_unknown单独报告(全库 702,579,占 16.5%),没有假设 civilians = best − a − b - [ ] 没有用
number_of_sources >= 2当筛子(会砍掉 80% 数据) - [ ] 记录了 GED 版本号(26.1)与下载日期
- [ ] 引用时给了对应的学术出版物,不只写「数据来自 UCDP」
附录 A:本篇数字速查
| 数字 | 值 | 来源 |
|---|---|---|
| GED 事件数 | 417,968 | 26.1 CSV 行数 |
| 死亡合计(best) | 4,257,891 | best 求和 |
| 覆盖国家 | 126 | country 去重 |
| 年份跨度 | 1989–2025(37 年) | year |
| 可下载数据集 | 79 | 下载页链接数 |
| GED 字段数 | 49 | 表头 |
| CSV 压缩包 | 39,122,522 字节 | ged261-csv.zip |
| 解压主表 | 273,992,720 字节 | GEDEvent_v26_1.csv |
| 1 型(国家型冲突)事件 | 292,121 | type_of_violence |
| 2 型(非国家冲突)事件 | 61,451 | 同上 |
| 3 型(单边暴力)事件 | 64,396 | 同上 |
| 村庄级精度(where_prec=1) | 194,544(46.5%) | where_prec |
| 国家质心(where_prec=7) | 266(0.06%) | 同上 |
| 日期精确到日(date_prec=1) | 358,130(85.7%) | date_prec |
| 中东事件数 | 128,033(30.6%) | region |
| 默认许可 | CC BY 4.0 | 下载页 |
| DAIMS | 22/24 = 91.7% | 本条目评估 |
附录 B:五个可复制的查询
# 1. 下载 GED 主数据集(39 MB,解压后 274 MB)
curl -L -o ged261-csv.zip "https://ucdp.uu.se/downloads/ged/ged261-csv.zip"
unzip ged261-csv.zip
# 2. 看事件总数与死亡合计
python3 -c "
import pandas as pd
df = pd.read_csv('GEDEvent_v26_1.csv', usecols=['id','best'], low_memory=False)
print(len(df), df['best'].sum())"
# 417968 4257891
# 3. 看三类暴力分布
python3 -c "
import pandas as pd
df = pd.read_csv('GEDEvent_v26_1.csv', usecols=['type_of_violence'], low_memory=False)
print(df['type_of_violence'].value_counts().sort_index().to_dict())"
# 4. 看地理精度分布
python3 -c "
import pandas as pd
df = pd.read_csv('GEDEvent_v26_1.csv', usecols=['where_prec'], low_memory=False)
print(df['where_prec'].value_counts().sort_index().to_dict())"
# 5. 验证 API 需要 token
curl -s -o /dev/null -w "%{http_code}\n" "https://ucdpapi.pcr.uu.se/api/gedevents/26.1?pagesize=1"
# 401
附录 C:核对清单
拿到数据后按顺序跑:
- [ ] 确认下载的是 GED(
ged261-*.zip),不是 Candidate - [ ] 确认
code_status只有Clear(若混了 Candidate 会看到别的值) - [ ] 确认事件数与死亡合计对得上(417,968 / 4,257,891)
- [ ] 检查
where_prec == 7的条目是否已剔除 - [ ] 检查
date_prec != 1的条目是否已标记 - [ ] 确认分析用的是 dyad 级还是 conflict 级
- [ ] 报告死亡时给了 low / best / high 三档
- [ ] 报告事件时区分了事件数与死亡数
- [ ] 记录了版本号与下载日期
- [ ] 引用了对应的学术出版物
附录 D:六个核心数据集速查
| 数据集 | 文件 | 粒度 | 覆盖 | 用途 |
|---|---|---|---|---|
| GED 26.1 | ged261-csv.zip |
事件 × 日 × 坐标 | 1989–2025 | 精细暴露、空间分析 |
| Candidate 26.0.X | GEDEvent_v26_0_9.csv |
事件 × 日 × 坐标 | 近期月份 | 监测、预警 |
| UCDP/PRIO ACD 26.1 | ucdp-prio-acd-261-csv.zip |
冲突 × 年 | 1946–2025 | 长期面板、与文献可比 |
| Dyadic 26.1 | ucdp-dyadic-261-csv.zip |
双边 × 年 | 1946–2025 | 谁对谁,交战方分析 |
| 非国家 / 单边 | ucdp-nonstate-261-*.zip、ucdp-onesided-261-*.zip |
组织 × 年 | 1989–2025 | 2 型与 3 型专项 |
| 有组织暴力国家-年 | organizedviolencecy-261-csv.zip |
国家 × 年 | 1989–2025 | 三类汇总,做面板最省事 |
附录 E:一次最小可复现实验
十分钟内能跑完(不含下载),用来验证本条目所有关于 GED 结构的断言。
# 1. 事件数、死亡数、国家数
python3 -c "
import pandas as pd
d = pd.read_csv('GEDEvent_v26_1.csv', usecols=['id','best','country','year'], low_memory=False)
print(len(d), d['best'].sum(), d['country'].nunique(), d['year'].min(), d['year'].max())"
# 期望: 417968 4257891 126 1989 2025
# 2. code_status 只有 Clear
python3 -c "
import pandas as pd
print(pd.read_csv('GEDEvent_v26_1.csv', usecols=['code_status'], low_memory=False)['code_status'].unique())"
# 期望: ['Clear']
# 3. where_prec=1 的占比约 46.5%
python3 -c "
import pandas as pd
d = pd.read_csv('GEDEvent_v26_1.csv', usecols=['where_prec'], low_memory=False)
print(round((d['where_prec']==1).mean(), 3), (d['where_prec']==7).sum())"
# 期望: 0.465 266
# 4. 日期精度
python3 -c "
import pandas as pd
d = pd.read_csv('GEDEvent_v26_1.csv', usecols=['date_prec'], low_memory=False)
print(round((d['date_prec']==1).mean(), 3))"
# 期望: 0.857
# 5. API 无 token 返回 401
curl -s -o /dev/null -w "%{http_code}\n" "https://ucdpapi.pcr.uu.se/api/gedevents/26.1?pagesize=1"
# 期望: 401
跑完这五条,本条目 §1.2、§2.2、§2.4、§2.5、§3.2 里的每条断言都被独立验证过一遍。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- oecd-health — 共享标签:公共卫生与流行病学 / 电子健康记录 / 评测基准
- world-bank-open-data — 共享标签:公共卫生与流行病学 / 电子健康记录 / 评测基准
- mimicel — 共享标签:公共卫生与流行病学 / 电子健康记录
- mimiciii-demo — 共享标签:公共卫生与流行病学 / 电子健康记录
- mimiciv — 共享标签:公共卫生与流行病学 / 电子健康记录
- armd-mgb — 共享标签:公共卫生与流行病学 / 电子健康记录 / 评测基准
- sdoh-adverse-pregnancy — 共享标签:公共卫生与流行病学 / 电子健康记录 / 评测基准
- amr-uti — 共享标签:公共卫生与流行病学 / 电子健康记录 / 评测基准
- tpehgt — 共享标签:电子健康记录 / 评测基准
- arxiv — 共享标签:公共卫生与流行病学 / 评测基准
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

