厚労省患者調査の見方

厚生労働省が3年おきにやっている調査です。傷病名ごとの総患者数の推計を取得できるので重宝しています。詳しい集計方法、推計方法は公式をご確認ください。

傷病分類には「疾病、傷害及び死因の統計分類」という独自のコードを使っていますが、ICDに準拠しているため外部のデータベースとも比較的連携がしやすいです。ただしPAから始まるコードは患者調査独自のコードなので注意。

昭和59年~平成5年は「疾病、傷害及び死因統計分類(ICD-9)」を、
平成8年~平成17年は「疾病、傷害及び死因の統計分類(ICD-10準拠)」を、
平成20年~平成26年は「疾病、傷害及び死因の統計分類(ICD-10(2003年版)準拠)」を、
平成29年から「疾病、傷害及び死因の統計分類(ICD-10(2013年版)準拠)」を

患者調査の概要

統計局e-Statにて1996年以降のデータのCSVがダウンロードできます。フォーマットがバラバラなので扱うのが面倒です。

2008年以降の4調査はAPIが公開されています。今回はこちらを使います(ネタバレをすると、CSVファイルはフォーマットがグチャグチャだったからAPI経由でJSONファイルを取得したのですが、こちらも別の部分がグチャグチャだったり辛かったです)。

総患者数,傷病基本分類別 API

e-StatのAPI機能を利用するためにはユーザ登録が必要です。詳しくは利用ガイドをご覧ください。

利用登録が済んだら先ほどのページのAPIの部分をクリックし、URLをメモ(多分ここも検索条件を設定すればいちいち指定しなくてもいいはず。でもAPIの仕様見るのめんどくさい)。

総患者数,傷病基本分類別 API

‘appId=’の部分に自分のアプリケーションIDを設定しましょう。
さらに’app/getStats…’の部分を’app/json/getStats…’と置換することでjson形式で取得します(デフォルトはxmlっぽいテキスト。改行や空白が面倒)。

import requests
url = 'http://api.e-stat.go.jp/rest/2.1/app/json/getStatsData?appId=YOUR_APP_ID&lang=J&metaGetFlg=Y&cntGetFlg=N&sectionHeaderFlg=1&statsDataId=0003028039'

data = json.loads(requests.get(url).text)

データは傷病クラスとその患者数が別の要素の中に突っ込まれています。扱いづらい。。。

傷病クラスはこんな感じ。

print(data['GET_STATS_DATA']['STATISTICAL_DATA']['CLASS_INF']['CLASS_OBJ'][2]['CLASS'][0])

{'@code': '1', '@name': 'A000\u3000コレラ菌によるコレラ', '@level': '1'}

患者数はこんな感じ。

print(data['GET_STATS_DATA']['STATISTICAL_DATA']['DATA_INF']['VALUE'][0])

{'@tab': '38', '@cat01': '1', '@cat02': '1', '@time': '1', '@unit': '千人', '$': '-'}

傷病分類ごとのクラスと患者数が辞書形式でそれぞれリストに格納されているので、これらを合わる必要があります。
わかりづらいんですが、生のデータと見比べたところ傷病クラスの@codeと患者数の@cat02を紐づければ良さそう(ただし年によっては@cat01の場合あり)。
ICD-10のコードベースで管理しなおします。

class_list = data['GET_STATS_DATA']['STATISTICAL_DATA']['CLASS_INF']['CLASS_OBJ'][2]['CLASS']
val_list = data['GET_STATS_DATA']['STATISTICAL_DATA']['DATA_INF']['VALUE']

results = []
for _class, val in zip(class_list, val_list):
    code = _class['@code']
    name = _class['@name']
    cat02 = val['@cat02']
    val = val['$']
    icd_code, name = name.split('\u3000', 1)  # ここも年によって全角スペースだったり半角スペースだったり1個だったり複数だったりするのであとで正規表現にしました
    results.append([icd_code, name, val])

こんな感じでICD-10のコード別に患者数(千人)を表示することができました。見やすい。

さてあとは2008, 2011, 2014, 2017をマージするだけ。ただし前述の通りPAコードは患者調査独自に作成したコードであり、年度を跨ぐとずれてしまいます。例えば2008, 2011では「歯科矯正」はPA213ですが、2014, 2017ではPA214となっています。どうせICD-10にマッピングできない項目ですし、無視しちゃいましょう。

他の傷病名も一見ずれているように見えますが、その実ほとんどは表記揺れです。例えば2008年は「B854 シラミおよびケジラミの混合寄生症」、2017年は「B854 シラミ及びケジラミの混合寄生症」。間違い探しか。
こんな感じに微妙なズレはあるものの、ICD-10のコードを信用して連続していると思って良いとのこと(厚生労働省に問い合わせて確認済み)。

まとめました。こんな感じ。

気が向いたらデータダウンロードしてマージするところまでまとめたコードを公開します(向かなさそう)。

参考

コメントを残す