Claude Code × Medical Application

【Claude Code】治療の流れを1枚の図に Part3:結果の検証 — 正解を先に決めた架空の患者データ

1. はじめに — 図が出ることと、人数が正しいことは別

Sankey 図は、データを読み込めばそれらしく描けます。だからこそ、画面に図が出たことと、その人数が正しいことは別 です。

  • 同じ治療の書き方が2通りあれば、柱が2本に分かれて、どちらも細く見える
  • 患者 ID が重複していれば、同じ人を2回数える
  • 2次治療の列を1つずらして読めば、移り変わりがまるごと違う

どれも、図を見ただけでは気づけません。治療の実態をつかむための道具が、自分の数字の確かめをおろそかにしていては意味がありません。

この回では、治療ラインの推移の数字を、4つの段で確かめた方法を紹介します。

  1. 全体:正解を先に決めた架空の患者データで、人数を突き合わせる
  2. 崩れ:わざと崩した入力で、読み込みとデータの確かめの振る舞いを見る
  3. 表記の違い:まとめる候補を、ルールと AI の両方で正解と照らす
  4. 大きさ:10万行のファイルでの速さを測る
  • 145 / 145項目正解のファイルと、ツールの集計が一致した数
  • 10 / 10回AI の提案(列の対応・表記の違い)が正解と一致した回数
  • 21件わざと崩した入力で、データの確かめが出した注意点
  • 約0.9秒10万行のファイルの読み込みと点検

2. 全体 — 正解を先に決めた架空の患者データ

2-1. なぜ架空のデータを自分で作るか

実在の処方データは、公開のツールには入れられません。公開されているデータを使っても、「どの患者が何人で、どこからどこへ移ったか」の正解は、誰かが後から数えることになります。結果を見てから「だいたい合っている」と判断する余地が残ります。

そこで、正解を先に決めてから、データを作る 形にしました。

2-2. 架空の関節リウマチの患者データ

ツールに最初から入っている架空のデータは、関節リウマチの患者 3,000人分です。

項目 中身
人数・列 3,000人、34列、ライン5まで
列の形 解析用のリスティングの形(群の名前 tx_groupname_1〜5、開始日・終了日、個別のレジメン名、並び順のコード、施設・性別・年齢・検査値など)
治療の群 MTX 単剤、csDMARD の併用、TNF 阻害薬+MTX、TNF 阻害薬以外の生物学的製剤、JAK 阻害薬、その他(薬は一般名と薬効分類だけ)
仕込んだ表記の違い 施設B の tnfi+mtx(大文字小文字)、施設C の JAKi(全角)
作り方 乱数の種を固定したプログラム。何度作っても同じデータになる
架空のデータ demo_data.csv の先頭9人。patientid・site・sex・age などの列のあとに、ライン1・2の regimen_name・tx_group・tx_groupname・tx_start・tx_end が並ぶ。tx_groupname の列に、仕込んだ表記の違い tnfi+mtx と JAKi が見える
ツールに入っている架空のデータの中身(一部の列だけ)

1人の患者の記録は、たとえば次のようになります。

架空の患者1人の処方の時系列。csDMARD の併用 → JAK 阻害薬 → TNF 阻害薬+MTX → TNF 阻害薬以外の生物学的製剤、の4ライン
架空の患者1人(RA000037)の4つのライン(架空のデータ)

2-3. 正解を同時に書き出す

データを作るプログラムは、作ると同時に正解のファイル(JSON)を書き出します。

  • ラインごとの、治療ごとの人数
  • あるラインのある治療から、次のラインのどの治療へ何人移ったか
  • 仕込んだ表記の違いの組と、それぞれの件数

ツールで架空のデータを読み込み、表記の違いをまとめたあとの集計を、この正解と1項目ずつ突き合わせます。

2-4. 結果

突き合わせたもの 項目の数 一致
ラインごとの人数 32 すべて
次のラインへの移り変わりの人数 111 すべて
表記の違いの件数(tnfi+mtx 348件、JAKi 131件) 2 すべて
合計 145 145
正解とツールの集計を並べた図。ラインごとの人数と移り変わりの人数が、145項目すべて一致
正解とツールの集計の突き合わせ(架空のデータ)

この突き合わせはテストとして書いてあり、ツールに手を入れるたびに自動で回ります。画面を作り直したときも、点検の決まりを直したときも、集計の数字が変わっていないことをそのつど確かめられました。

3. 崩れ — わざと崩した入力

3-1. 崩し方を決めておく

実際のファイルには、きれいでないところがあります。そこで、架空のデータとは別に、わざと崩した小さな入力(160行・16列)を作りました。崩しているのは次の8点です。

崩し方 例
列名の形 大文字小文字・区切り(line 1、Line_2、LINE-3)がばらばら
欠測と値の書き方 空欄、NA、null などが混ざる。前後に空白の入った値(" Beta ")もある
引用符 引用符の中に区切りの文字や改行がある
日付の書式 2020-01-05、2020/1/5、20200105 などが混ざる
ID 指数表記(1.05E+17)と、重複した ID
ラインの飛び 1次治療が空欄なのに2次治療に値がある
途中の空行 データの途中に空の行がある
改行の形 Windows の改行(CRLF)
わざと崩した入力 tricky.csv の先頭8行。列名の形がばらばらで、重複した ID、NA や NULL、2021-02-30 のようなあり得ない日付、not a date、前後の空白、alpha や全角の ALPHA が混ざっている
わざと崩した入力の中身(先頭の8行)

3-2. 結果

  • 列の対応:列名の形が崩れていても、名前で当たりました
  • データの確かめ:21件の注意点を出しました
わざと崩した入力のデータの確かめ。ID の重複、指数表記の ID、前後の空白、大文字小文字だけの違い、日付の前後、ラインの歯抜け、日付の空欄などが並ぶ
わざと崩した入力のデータの確かめ
注意点 件数 中身
患者 ID の重複 1 ID のある 160 行に対して、ID は 149 種類
指数表記の ID 1 1.05E+17 のような ID がある
前後の空白 3 ライン1〜3の列に " Beta " がある(画面では「」で囲んで空白を見せる)
大文字小文字だけの違い 3 ライン1〜3の列に Alpha と alpha
日付の前後 2 2次治療の開始日が1次治療より前の行が 38 件、3次治療が2次治療より前の行が 40 件
ラインの歯抜け 2 1次治療が空欄なのに2次治療に値がある行が 29 件、2次が空欄で3次に値がある行が 14 件
ラインの無い日付 3 治療の名前が空なのに開始日だけが入っている行が、ライン1〜3で 25・17・18 件
日付として読めない値 3 書いてあるのに日付として読めない値が、ライン1〜3の開始日で 12・22・22 件(空欄は含まない)
日付の空欄 3 ラインに治療があるのに開始日が空欄の行が、ライン1〜3で 16・13・10 件

崩した入力でも、黙って図にしない ことを確かめました。図は描きますが、データ品質のタブに注意点が並び、何が起きているかが分かります。

3-3. 点検そのものも点検する

この表は、最初は15件でした。公開の前の見直しで、点検の決まりに3つの食い違いが見つかったからです。

  • 前後の空白:空白を除いたあとの値で調べていたので、この注意は決して出なかった。読み込んだままの値で調べるように直した
  • 日付として読めない値:空欄まで「読めない」に数えていた。書いてあるのに読めないものだけを数え、空欄は「日付の空欄」として別に出すようにした
  • 患者 ID の重複:空欄の ID も含めて数えていた。値のある ID だけで重複を調べ、空欄は別に知らせるようにした

点検の正解は、ツールの集計のコードを使わずに、入力ファイルから別のプログラムで数え直して作りました。ツールのコードで正解を作ると、同じ誤りを正解にしてしまうからです。

4. 表記の違い — ルールと AI を正解と照らす

4-1. 表記の違いは、人数を変える

架空のデータには、施設ごとの書き方の違いを2組仕込んであります。まとめる前の図では、同じ治療が別の柱に分かれます。

表記の違いをまとめる前の Sankey 図。TNFi+MTX と tnfi+mtx、JAKi と JAKi が別の柱になっている
まとめる前。同じ治療が別の柱に分かれる(架空のデータ)

4-2. ルールの候補

ツールは、次の手順で名前をそろえてみて、同じ形になる名前どうしをまとめる候補として出します。

  1. 全角・半角をそろえる
  2. 小文字にする
  3. 区切りの記号(+ + / / ・)で薬ごとに分ける
  4. 薬ごとに空白を除く
  5. 薬を並べ替えてつなぐ(「MTX+TNFi」と「TNFi+MTX」を同じにする)

残す名前は、件数の最も多い書き方にします。

ルールによるまとめの候補。TNFi+MTX 864件と tnfi+mtx 348件、JAKi 419件と JAKi 131件
ルールの候補。仕込んだ2組だけが出る(架空のデータ)

架空のデータでは、仕込んだ2組と完全に一致する 候補が出ました。余計な組は出ていません。

ただし、このルールで拾えるのは、書き方の「形」の違いだけです。ハイフンの有無、略称と正式名(「MTX」と「メトトレキサート」)、日本語と英語、書き誤りは拾いません。

4-3. AI の候補

ルールで拾えない違いのために、AI にもまとめる候補を頼めます。AI に渡すのは、レジメンの名前と件数だけ です(公開版では架空のデータのときだけ。詳しくは Part4(近日公開))。

AI のまとめの候補。理由の一文つきで並んでいる
AI の候補。理由つきで並び、確定するまで何も変わらない(架空のデータ)
AI の候補を選んでまとめる前後(架空のデータ)

AI の答えは毎回同じとは限りません。そこで、列の対応と表記の違いのそれぞれについて、架空のデータで AI を5回ずつ呼び、正解と照らしました(答えの使い回しはせず、毎回呼んでいます)。

依頼 回数 正解と一致 1回の時間 1回の費用
列の対応(ライン・開始日・患者 ID) 5 5 3.4〜4.2 秒 約0.1円
表記の違いのまとめ 5 5 1.1〜1.4 秒 約0.03円

10回とも正解でした。列の対応はライン・開始日・患者 ID のすべてを当て、表記の違いは仕込んだ2組だけを返し、余計な組は返しませんでした。

4-4. まとめたあと

候補を選んでまとめると、柱が1本になり、正解の人数と一致します(2章の突き合わせは、この状態で行っています)。まとめは図と数字にだけ効き、読み込んだファイルの値は変えません。「まとめを解除する」で元に戻せます。

表記の違いをまとめた後の Sankey 図。柱が1本ずつになっている
まとめた後(架空のデータ)

5. 大きさ — 10万行での速さ

実際のデータは、3,000人よりずっと大きいことがあります。そこで、架空のデータの行を繰り返して新しい患者 ID を振り、10万行(14.7MB) のファイルを作って測りました。

処理 時間(5回)
読み込みと点検 912〜950 ミリ秒
集計(既定の設定) 52〜67 ミリ秒
集計(ライン5まで) 83〜98 ミリ秒

集計は、絞り込みや設定を変えるたびに走る処理です。50 ミリ秒前後なら、クリックしてすぐに図が変わります。

6. Claude Code に任せたことと、人が決めたこと

任せたこと 人が決めたこと
架空のデータと正解のファイルを作るプログラム 疾患(関節リウマチ)、治療の群、ライン5まで、という形
正解と集計の突き合わせのテスト 正解をデータより先に決めること
わざと崩した入力を作り、振る舞いを確かめるテスト 崩し方の8点、とくに Excel で丸められた ID を入れること
点検の見直しと、別のプログラムで数え直した点検の正解 空欄と「読めない値」を分けるなど、注意の出し方の決まり
ルールの候補の実装 拾う違い(形の違いだけ)と拾わない違いの線引き
AI を5回ずつ呼んで正解と照らす試行 AI の答えを候補にとどめること
10万行での速さの測定 どれくらいの大きさを想定するか

突き合わせやテストは、一度書けば何度でも回せます。画面を作り直したり、AI の機能を足したり、点検の決まりを直したりしても、集計の数字が変わっていないことをそのつど確かめられました。

7. まとめ

  • 画面に図が出ることと、人数が正しいことは別。全体・崩れ・表記の違い・大きさの4つの段で確かめた
  • 全体:正解を先に決めた架空の関節リウマチのデータ(3,000人)で、145項目すべてが正解と一致した
  • 崩れ:わざと崩した入力(160行)で、列の対応は名前で当たり、21件の注意点を出した。点検そのものの食い違いも見つけて直した
  • 表記の違い:ルールの候補は仕込んだ2組だけを出し、AI は10回とも正解だった。それでも確定は人がする
  • 大きさ:10万行のファイルを約0.9秒で読み込み、集計は50ミリ秒前後
  • 正解を先に決めること、崩し方を決めること、AI を候補にとどめることは、人が決めた

正解を先に用意しておけば、「だいたい合っている」で止まらずに済みます。そして、正解を自分で作ったことの限界も、忘れずに書いておきます。

次のステップ

Part4 では、AI の組み込みを扱います。AI に何を渡し、何を渡さないか、公開版で架空のデータに限る仕組みをどう作ったか、お手元のファイルでは AI に何も送っていないことをどう確かめるかを紹介します。

出典

  • 本ページの画面写真と数値は、架空の関節リウマチのデータ(3,000人)と、わざと崩した入力で作成したものです。実在の患者・施設・薬剤・企業とは関係ありません