Chekila/japan-medical-device-data-pipeline
GitHub: Chekila/japan-medical-device-data-pipeline
这是一个针对日本医疗器械认证数据的端到端数据清洗与探索性分析项目,旨在将原始Excel数据转化为标准化、可分析的格式。
Stars: 0 | Forks: 0
# 日本医疗器械认证数据清洗与探索性分析
## 1. 项目介绍
本项目对从日本PMDA网站获取的医疗器械认证数据进行清洗与分析。
本项目的目标是将原始Excel数据集转换为干净、标准化且可用于分析的格式。工作流程包括列名翻译、缺失值检查、日期格式化、重复记录检测、SQLite数据库导出以及探索性数据分析(EDA)。
清洗后的数据集支持下游分析,包括法规数据审查、认证年份趋势分析、认证机构分析以及主要供应商分析。
## 2. 数据来源
原始数据下载自日本独立行政法人医药品医疗器械综合机构(PMDA)网站。
| 项目 | 描述 |
|---|---|
| 来源机构 | 日本独立行政法人医药品医疗器械综合机构(PMDA) |
| 来源网址 | `https://www.pmda.go.jp/review-services/drug-reviews/about-reviews/devices/0026.html?` |
| 来源文件 | `000280216.xlsx` |
| 数据格式 | Excel 文件 |
| 访问日期 | `2026-05-12` |
原始数据集包含日本医疗器械认证记录,包括认证机构代码、认证编号、认证日期、销售名称、通用产品类别、认证供应商、企业标识符、继承相关信息、认证摘要日期以及认证撤销日期。
## 3. 数据提取
示例:
```
import pandas as pd
data1 = pd.read_excel("../data/000280216.xlsx")
```
## 4. 清洗工作流程
### 4.1 加载并检查原始数据
使用 `pandas.read_excel()` 加载原始Excel文件。在清洗前进行了初步检查,包括数据集形状、列名、数据类型、缺失值以及样本记录,以了解原始结构。
### 4.2 标准化列名并添加数据来源
将日文列名翻译为标准化的英文蛇形命名格式,以提高可读性并支持下游分析。添加了源元数据(`source_file`、`source_url`)以保留对原始数据集的可追溯性。
### 4.3 检查缺失值并保留具有业务含义的空值
检查了所有列中的缺失值。当空值表示有意义的业务状态而非数据质量问题时(例如,未撤销的认证或不存在的继承事件),则予以保留。
### 4.4 标准化日期列
使用 `pd.to_datetime()` 转换日期相关列,并将其标准化为一致的格式,以便进行下游分析和SQLite导出。
目标列包括:
- `certification_date`
- `date_of_succession`
- `certification_summary_date`
- `certification_revocation_date`
### 4.5 识别并去除重复记录
去重工作流程如下:
1. 定义重复键列
2. 使用 `duplicate_flag` 标记重复组
3. 检查标记的重复记录
4. 移除已确认的重复项,同时保留首次出现的记录
5. 重新检查数据集是否还有剩余重复项
首先,基于复合业务键进行重复检测:
```
duplicate_keys = [
"certification_number",
"sales_name",
"vendor_name_certified_person"
]
```
选择这些列是因为一条真正的重复记录应指代相同的认证编号、相同的产品销售名称和相同的认证供应商。
然后,使用以下方法标记重复组:
```
data1["duplicate_flag"] = data1.duplicated(
subset=duplicate_keys,
keep=False
)
```
使用 `keep=False` 来标记每个重复组内的所有行,以便在删除前检查重复记录。
初始重复检测识别出:
```
1294 rows flagged as belonging to duplicate groups
```
在检查标记的重复组后,移除已确认的重复记录,同时保留首次出现的记录:
```
data1 = data1.drop_duplicates(
subset=duplicate_keys,
keep="first"
)
```
去重前后的数据集大小:
| 阶段 | 行数 |
|------|-----------:|
| 去重前 | 26,630 |
| 去重后 | 25,849 |
| 移除行数 | 781 |
这表明存在多个重复组,通过在保留首次出现记录的同时移除重复项,数据集减少了781条记录。
最后,再次检查数据集以确认在相同的重复键下没有重复记录。
去重后验证结果:
```
Remaining duplicate records: 0
```
这确认了去重过程成功移除了已确认的重复记录,同时为每个重复组保留了一条代表性记录。
经过去重和标准化后,清洗后的数据集被导出为:
```
cleaned_japan.xlsx
```
此文件作为可用于分析的数据集,并被用作后续探索性数据分析(EDA)和可视化工作流程的输入。
### 4.6 将清洗后的数据集导出到SQLite
清洗后的数据集被导出为SQLite格式,用于结构化存储、SQL查询以及未来与仪表板或下游分析工作流程的集成。
输出:
```
Japan_medical_devices.sqlite
```
## 5. 数据库模式
以下模式描述了清洗后的日本医疗器械认证数据集。
| 列名 | 描述 | 示例值 | 数据类型 |
|---|---|---|---|
| certification_body_code | 分配给记录的认证机构代码。 | AB, AI, AG | object |
| certification_number | 医疗器械的认证编号。 | 217ABBZX00001000 | object |
| certification_date | 认证签发日期。 | 2005-08-15 | datetime64[ns] |
| sales_name | 医疗器械的销售或营销名称。 | ビデオプロセッサEPK-1000 | object |
| general_name | 医疗器械的通用类别/名称。 | 胚移植用カテーテル | object |
| vendor_name_certified_person | 认证供应商或持有人的名称。 | ペンタックス株式会社 | object |
| corporate_number | 供应商的企业标识号。 | 5080101000000 | float64 |
| company_name_designated_foreign_manufactured_medical_device_manufacturer_and_distributor | 指定外国制造商/分销商的名称(如适用)。 | AJMD株式会社 | object |
| corporate_number_2 | 与外国制造商/分销商相关的企业编号。 | 5010001141738 | float64 |
| transition_from_authorization_to_certification | 表示从授权到认证的转换。 | ○ | object |
| succession_item | 表示是否发生了继承。 | 2025/3/31 0:00:00 | object |
| date_of_succession | 继承日期(如适用)。 | 2018-04-01 | datetime64[ns] |
| change_of_certification_body_at_time_of_succession | 表示在继承期间认证机构是否发生了变更。 | ○ | object |
| certification_summary_date | 认证信息汇总日期。 | 2011-04-07 | datetime64[ns] |
| certification_revocation_date | 认证撤销日期。 | 2024/4/24 0:00:00 | datetime64[ns] |
| source_file | 清洗期间添加的原始源文件名。 | 000280216.xlsx | object |
| source_url | 清洗期间添加的原始源URL。 | https://www.pmda.go.jp/review-services/drug-reviews/about-reviews/devices/0026.html? | object |
| duplicate_flag | 表示该记录是否属于重复组。 | True / False | bool |
## 6. 探索性数据分析(EDA)
使用清洗后的数据集进行了EDA:
```
cleaned_japan.xlsx
```
分析的目的是了解整体数据结构、认证趋势、认证机构分布以及主要供应商构成。
### 6.1 数据集概览
首先检查了清洗后的数据集,以了解其整体结构和质量。
初步检查包括:
- 数据集形状
- 列名
- 数据类型
- 非空计数
- 缺失值计数
- 缺失值比率
去重过程后,数据集大小发生了变化:
| 阶段 | 记录数 |
|------|--------------:|
| 原始数据集 | 26,630 |
| 清洗后数据集 | 25,849 |
| 移除的重复项 | 781 |
清洗后数据集中的重复状态分布:
```
False 25336
True 513
```
总体而言,清洗后的数据集为后续EDA提供了标准化的基础。
### 6.2 认证年份趋势分析
按认证年份对认证记录进行分组,以检查医疗器械认证的时间趋势。
分析包括:
1. 计算每年的认证数量
2. 生成折线图以可视化随时间的变化
认证年份趋势:
每年的认证数量从2005年开始迅速增长,并在2008年达到峰值(2,525项认证),随后在接下来的几年里逐渐下降。2017年至2025年间的认证数量保持相对稳定,通常在700至1,000条记录之间。
### 6.3 认证机构分析
原始数据集仅提供认证机构代码(例如 AA, AB, AC)。
使用公开可用的PMDA信息和相关监管来源确定了相应的认证机构:https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iyakuhin/touroku/index.html
为了提高可解释性,添加了一个参考表,包含:
| 字段 | 描述 |
|------|------|
| certification_body_code | 数据集中的原始代码 |
| certification_body_name | 完整的认证机构名称 |
| certification_body_short_name | 用于报告的简化名称 |
| status | 活跃或已废止 |
| abolished_date | 废止日期(如适用) |
发现几个认证机构在前几年已被废止,并在参考表中明确标记。
然后生成了认证机构分布可视化图,以比较各认证机构的认证量。
认证机构分布:
认证活动集中在少数几个主要认证机构。Cosmos、TÜV SÜD、JET、SGS Japan 和 BSI Japan 的认证量最高,这表明这些机构在日本医疗器械认证体系中发挥着主导作用。
### 6.4 主要供应商分析
使用以下方法进行了主要供应商分析:
```
vendor_name_certified_person
```
工作流程包括:
1. 根据认证数量识别前10名供应商,并将日文供应商名称翻译成英文
2. 根据供应商比例生成饼图可视化
可视化显示的主要供应商包括:
- FUJIFILM Corporation(富士胶片株式会社)
- Olympus Medical Systems Corporation(奥林巴斯医疗系统株式会社)
- GE Healthcare Japan Corporation(GE医疗日本株式会社)
- Canon Medical Systems Corporation(佳能医疗系统株式会社)
- OMRON Healthcare Co., Ltd.(欧姆龙健康医疗株式会社)
## 7. 已知局限性、边缘情况和质量检查
### 已知局限性
- 某些字段包含缺失值,因为它们仅适用于特定记录,例如继承相关字段和认证撤销日期。
- 几列包含日语文本,包括产品名称和供应商名称。仅在报告和可视化需要时添加了英文翻译。
- 认证机构代码是根据官方参考信息映射到认证机构名称的,但原始数据集仅包含代码。
### 边缘情况
- 具有相同认证编号的记录仍可能代表不同的产品或供应商,因此去重并非仅基于认证编号。
- 某些认证机构在前几年已被废止,并在认证机构参考表中单独标记。
### 已执行的质量检查
在清洗和EDA期间执行了以下检查:
- 检查了数据集形状、列名、数据类型和缺失值。
- 审查了缺失值并保留了具有业务含义的空值。
- 使用复合键识别了重复组。
- 去重后重新检查了数据集,并确认没有重复记录剩余。
## 8. 复现步骤
本项目包含数据清洗工作流程和EDA工作流程。
### 1. 设置环境
使用 `uv` 安装项目依赖:
```
uv sync
```
如果需要手动添加依赖:
```
uv add pandas numpy matplotlib openpyxl jupyter ipykernel
```
### 2. 运行清洗工作流程
打开并运行清洗 notebook:
```
japan_cleaning.ipynb
```
此 notebook 使用 `000280216.xlsx` 作为输入,执行标准化列名、处理缺失值、格式化日期列、执行去重以及导出清洗后的数据集。
预期的清洗输出:
```
cleaned_japan.xlsx
```
预期的SQLite输出:
```
Japan_medical_devices.sqlite
```
### 3. 运行EDA工作流程
打开并运行EDA notebook:
```
japan_eda.ipynb
```
此 notebook 使用 `cleaned_japan.xlsx` 作为输入,执行数据集概览、认证年份趋势分析、认证机构分布分析以及主要供应商分析。
### 6. 查看输出
主要输出包括:
```
data/processed/cleaned_japan.xlsx
database/Japan_medical_devices.sqlite
reference/certification_body_mapping.xlsx
outputs/certification_year_trend.png
outputs/certification_body_distribution.png
outputs/vendor_distribution.png
```
这些输出包括清洗后的数据集、SQLite数据库、认证机构映射表以及用于认证趋势、认证机构分布和主要供应商分布的EDA可视化结果。
标签:BSD, Excel数据处理, NoSQL, pandas, Python, SQLite数据库, 代码示例, 供应商分析, 内核监控, 医疗器械, 医疗监管, 医疗设备认证, 探索性数据分析, 数据分析, 数据库导出, 数据挖掘, 数据清洗, 数据预处理, 无后门, 日期格式化, 日本PMDA, 监管数据, 缺失值处理, 认证机构分析, 趋势分析, 逆向工具, 重复检测