見出し画像

医薬品副作用データベース①

ここまでの投稿でSQLite3を用いてデータベース作成・活用について書いてきました。今回からは、少し業務に活用できそうなテーマでデータベースを扱ってみたいと思います。


医薬品副作用データベースの利用

医療関係者には、医薬品の使用による副作用と疑われる症例をPMDA(医薬品医療機器総合機構)へ報告する義務があります。報告された症例は、評価され安全対策の実施へと活用されています。
この集積された症例は、医薬品副作用データベースとしてPMDAより公開されています(Japanese Adverse Drug Event Report database, JADER)。

利用規約に同意し先に進むとcsvファイルのダウンロードページに辿り着けます。ファイルは情報の種類ごとに以下の4つに分かれているようです。

  1. 症例一覧テーブル(demo):性別、年齢、体重など基本情報

  2. 医薬品情報テーブル(drug):医薬品(一般名、販売名)、医薬品の関与(被疑薬、併用薬など)、投与量など医薬品に関する情報

  3. 副作用情報テーブル(reac):有害事象、転帰など副作用に関する情報

  4. 原疾患テーブル(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テーブルも作りましたが…説明では使わないかもしれません。

この記事が気に入ったらサポートをしてみませんか?