読者です 読者をやめる 読者になる 読者になる

DPCデータの分析とかやるブログ

DPCデータの分析なんかをテキトーにやってます。

様式1ファイルを扱ってみる(1)

今までのエントリでは、DPCデータのうちEFファイルとDファイルに焦点を絞って話してきました。
当然、こう思う方もいるでしょう。

「あれ、様式1はどこいったの?」

面倒くさいので扱いたくなかった試行錯誤の途中なのでエントリにしていませんでしたが、今回は様式1の話をしてみます。 まずは基本的な考え方から。

  • 旧様式1
id 項目1 項目2 項目3 項目4 項目5 …項目n
001 中身1 中身2 中身3 中身4 中身5 …中身N
002 中身1 中身2 中身3 中身4 中身5 …中身N

横1行に全てのデータが入っています。 これをデータの横持ちと呼び、SQLなどで別のデータと結合するのにとても便利です。 問題は、データ項目が膨れ上がった際、横700列など、人間にもDBにも優しくない構造になることでしょうか。

  • 新様式1

流石にこれはいかん、ということで様式1はこんな形になりました。

id カテゴリ番号 ペイロード1 ペイロード2 ペイロード9
001 カテゴリ1 中身1 中身2 …中身9
001 カテゴリ2 中身1 中身2 …中身9
001 カテゴリ3 中身1 中身2 …中身9
001 カテゴリ4 中身1 中身2 …中身9

カテゴリー項目を持たせ(本物の様式1ではコードと呼ばれます)、それに対応する中身がペイロード1〜9に記載されます。 例えば病名カテゴリであれば、ペイロード1~9にICD10や日本語病名が入り、患者情報であれば、身長体重が入ったりします。 このように、idを重複させて縦方向にデータを伸ばすのを縦持ちと呼び、多様なデータを保存できますが、そのままSQLなどに読み込むには不向きです。

現在の様式1は縦持ちデータです。さて、どう扱ったらいいものでしょうか?

方法1 テーブルを横持ちに変換する

  • メリット
    深く考える必要がありません。 データは1入院1レコードですので、EF/Dファイルで集計したデータとの結合が容易です。

  • デメリット
    当然ながら、事前に横持ちに変換する必要があります。 様式1のサイズは小さいので、Excelのマクロでも対処可能ですし、スクリプトを書いてもよいでしょう。 また、将来的に新しい項目が追加された場合、テーブル定義を書き直すことになります。 (残念ながら、大変ありそうな話です)

方法2 テーブルを縦持ちのまま読み込む

  • メリット
    事前処理は不要です。そのまま読み込んですぐ使えます。 また、将来的の新項目追加にも、テーブル定義の書き直しなどは不要でしょう。 現在でも様式1はスカスカですので、ペイロード10番とかが追加される可能性は低いと考えられます。

  • デメリット
    他のテーブルと結合する際、横持ちに変換する必要があります。 これはSQLで書いてもよいですし、スクリプト側で処理してもよいでしょう。

ここではまず、方法2のテーブル定義を用意しました。次回から、これをどう扱うか考えていきます。

CREATE TABLE FF1607
(施設コード VARCHAR(255),
データ識別番号 INTEGER,
入院年月日 DATE,
回数管理番号 INTEGER,
統括診療情報番号 VARCHAR(255),
コード VARCHAR(255),
バージョン DATE,
連番 INTEGER,
ペイロード1 VARCHAR(255),
ペイロード2 VARCHAR(255),
ペイロード3 VARCHAR(255),
ペイロード4 VARCHAR(255),
ペイロード5 VARCHAR(255),
ペイロード6 VARCHAR(255),
ペイロード7 VARCHAR(255),
ペイロード8 VARCHAR(255),
ペイロード9 VARCHAR(255),
id SERIAL PRIMARY KEY);

2016-10-20 追記

コメント欄で方法1の実装を書いて欲しい、というご意見を貰いましたので、Pythonスクリプトを書いてみました。

import pandas as pd
FF1 = pd.read_csv('/ファイルの/パス/様式1.txt',delimiter = '\t')
ptable =  pd.pivot_table(FF1,values=['ペイロード1(日付等)','ペイロード2(コード等)','ペイロード3','ペイロード4','ペイロード5',
                                     'ペイロード6','ペイロード7','ペイロード8','ペイロード9(可変長文字列)'],
                         index=['施設コード','データ識別番号','入院年月日','回数管理番号','統括診療情報番号','バージョン','連番'],
                       columns = ['コード'])

pd.pivot_tableメソッドは読み込んだデータの変形を行います。
ExcelのピボットテーブルのPandas版ですね。
Python + Pandasではこのように、ほぼワンライナーで完結しますが、Excelのマクロだと結構な行数になるかも知れません。 私はVBAがさっぱり分からないので、山勘ですが…