医薬品副作用データベース①
ここまでの投稿でSQLite3を用いてデータベース作成・活用について書いてきました。今回からは、少し業務に活用できそうなテーマでデータベースを扱ってみたいと思います。
医薬品副作用データベースの利用
医療関係者には、医薬品の使用による副作用と疑われる症例をPMDA(医薬品医療機器総合機構)へ報告する義務があります。報告された症例は、評価され安全対策の実施へと活用されています。
この集積された症例は、医薬品副作用データベースとしてPMDAより公開されています(Japanese Adverse Drug Event Report database, JADER)。
利用規約に同意し先に進むとcsvファイルのダウンロードページに辿り着けます。ファイルは情報の種類ごとに以下の4つに分かれているようです。
症例一覧テーブル(demo):性別、年齢、体重など基本情報
医薬品情報テーブル(drug):医薬品(一般名、販売名)、医薬品の関与(被疑薬、併用薬など)、投与量など医薬品に関する情報
副作用情報テーブル(reac):有害事象、転帰など副作用に関する情報
原疾患テーブル(hist):原疾患等の有害事象が起きた患者側の背景因子情報
各テーブルのリレーションシップは下図のようになっています。
この4つのデータセットは一括でもダウンロードできますが、120Mbyteもあるので(2024年9月時点)、分割ファイルをサンプルデータセットとして使用します。
※サンプルとして分割ファイル31をダウンロードしましたが、csvファイルは全データが毎回更新され、前回掲載分からの差分データではないようです。ダウンロードしたタイミングによっては中のデータが異なる(=データベースからの抽出結果が異なる)ので、以降に記載するコードの実行結果が一致しない可能性もありそうです。
csvからデータベースを作成
以前の投稿で記載した通り、DataFrameからデータベースへ書き込むことができるので、csvをDataFrameとして読み込めば良さそうです。
import sqlite3
import pandas as pd
df_demo = pd.read_csv('demo.csv', encoding='cp932')
df_drug = pd.read_csv('drug.csv', encoding='cp932')
df_hist = pd.read_csv('hist.csv', encoding='cp932')
df_reac = pd.read_csv('reac.csv', encoding='cp932')
read_csv()を使用するとcsvをDataFrameとして読み込むことができます。第一引数にファイルバス、第二引数にencodingを指定します。encodingが異なると文字化けしてしまいます。df_demo.head()で中身を確認して、ちゃんと読み込めているか確認しましょう。
side_effects.dbというデータベースを作成し、上記DataFrameをテーブルとして書き込みます。
db = sqlite3.connect('side_effects.db')
c = db.cursor()
df_demo.to_sql('demo', db, if_exists='replace')
df_drug.to_sql('drug', db, if_exists='replace')
df_hist.to_sql('hist', db, if_exists='replace')
df_reac.to_sql('reac', db, if_exists='replace')
リレーションテーブルの作成
識別番号と報告回数が全テーブルに共通して含まれているので、結合する時のキーとして使用できそうです。1つの副作用報告には、医薬品情報が複数含まれている可能性があります。副作用の原因と思われる被疑薬(被疑薬自体が複数の場合もあります)や元々飲んでいた(副作用の原因ではなさそうな)併用薬があるため、症例一覧テーブル(demo)と医薬品情報テーブル(drug)の結合は1対多になります。
同様に、複数の症状を有害事象として報告している場合は、症例一覧テーブル(demo)と副作用情報テーブル(reac)の結合も1対多となります。
c.execute("""
SELECT * FROM demo
""")
print(len(c.fetchall()))
> 14713
症例一覧テーブル(demo)には14,713レコード含まれています。他のテーブルも同様に調べると、医薬品情報テーブル(drug)には114,880レコード、副作用情報テーブル(reac)には19,861レコード含まれています。
それでは、demoテーブルにdrugテーブルとreacテーブルを識別番号+報告回数をキーとして結合し、join_tableを作成します。
c.execute(
"""
CREATE TABLE join_table AS
SELECT
demo.識別番号,
demo.報告回数,
demo.性別,
demo.年齢,
demo.身長,
demo.体重,
drug.医薬品(一般名),
drug.医薬品(販売名),
drug.投与量,
drug.医薬品の関与,
drug.使用理由,
drug.医薬品の処置,
drug.再投与による再発の有無,
reac.有害事象,
reac.転帰
FROM
demo
JOIN drug ON demo.識別番号 = drug.識別番号 AND demo.報告回数 = drug.報告回数
JOIN reac ON demo.識別番号 = reac.識別番号 AND demo.報告回数 = reac.報告回数
"""
)
c.execute("""
SELECT * FROM join_table
""")
print(len(c.fetchall()))
> 154517
テーブルを結合し、約15万件のデータが入ったjoin_tableを作成することができました。次回は、このテーブルから必要なデータを抽出するクエリを作成していきたいと思います。
勢いでhistテーブルも作りましたが…説明では使わないかもしれません。
この記事が気に入ったらサポートをしてみませんか?