UCDP 冲突数据 — 41.8 万起有组织暴力事件,记到村庄与单日

它不是伤亡统计,是把「暴力」这件事拆成可核验的最小单元:某天、某个坐标、哪两方、死了多少人、依据什么来源。37 年、126 个国家、425.8 万条死亡记录。做冲突与健康研究时,这是唯一能让你把「战争」当作一个可测量的环境暴露变量接进模型的东西

来源 Uppsala Conflict Data Program(乌普萨拉冲突数据计划,乌普萨拉大学和平与冲突研究系) url: https://ucdp.uu.se/发布时间: 2026-10-24最后更新: 2026-10-24 阅读 5
UCDP 冲突数据 — 41.8 万起有组织暴力事件,记到村庄与单日

信息速览

数据集名称UCDP 冲突数据 — 41.8 万起有组织暴力事件,记到村庄与单日
数据类型417,968 起事件,126 个国家,1989–2025,425.8 万死亡,村庄级坐标,单日精度,CC BY 4.0,79 个数据集
规模不适用(事件级聚合记录,不含个体身份;伤亡数为事件级估计,非个人记录)
接入方式Uppsala Conflict Data Program(乌普萨拉冲突数据计划,乌普萨拉大学和平与冲突研究系) url: https://ucdp.uu.se/
AI 就绪度

§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 的理由:

  1. id 是整数,但可能有缺失。不设 Int64 会变成 float,id 出现 .0。
  2. deaths_* 有大量 0,少量大值。Int32 比默认的 int64 省一半内存。
  3. 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 — 共享标签:公共卫生与流行病学 / 评测基准

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集