【Ruby】救急外来で使えそうな診断ツールを作ってみた記録

投稿者: | 2016年8月7日

救急外来で使えそうな疾患診断支援ツールを作ってみた

bayes0diagnosisbayes1graph1graph2


 医療 × Ruby × Tk × 人工知能(単純ベイズ分類器)ネタです。数年前に臨床研修をしていた時の話です。臨床研修の記憶が残っているうちに書き残していこうと思います。(実際にはそれほど使えるわけではない)

病気の診断のプロセスを考えてみる

 単純化して考えます。

① 主訴をとる

② 鑑別疾患と頻度を考える

③ 診察・検査をする

⑤ 各疾患の可能性を検討する

⑥ 最も可能性が高いものを選ぶ

上記のようなプロセスを部分的にでも模倣すれば、診断支援ツールが作れるものとします。

ツールを作ろうと思ったきっかけ

 『UCSFに学ぶできる内科医への近道』という本の第2版に、夜間当直の研修医が、腹痛の患者さんを診察する小話が載っています。

 私は現在この本を持ってないので記憶を頼りに書くしかないのですが、主人公の研修医は、腹痛の患者が虫垂炎であるかどうか悩み、所見から虫垂炎である確率を計算していきます。オッズに陽性尤度比を掛けあわせていき、夜間に虫垂炎の可能性が50%を超えため、「虫垂炎である」と判断して外科の先生をコールします。
 何が起こるか予測できない緊張感のある当直中に、資料に当たりながら悠長に確率計算をするというエピソードは、すこし現場の光景からかけ離れているように感じます。しかし研修医が外科の先生を呼ぶかどうか迷うことは、しばしば経験するケースではないでしょうか。

UCSFに学ぶ できる内科医への近道
3版

 このエピソードを読んで、私は次のように思いました。「所見ごとに尤度比を掛けあわせれば疾患の確率が計算できるんだ。」「それならば、検査所見ごとに、事前確率、陽性尤度比・陰性尤度比をあらかじめ登録すれば、疾患を自動診断できるソフトが作れるんじゃないか?」「どうしてこんな簡単なことを誰もやらないのだろう?」

その時は良い思いつきだと思いました。

 実はこのエピソードは、『UCSFに学ぶ出来る内科医への近道』第3版から丸ごと削除されています。確率の掛け算には落とし穴があります。確率を掛け合わせることができるのは、それそれの検査項目が互いに独立な場合のみです。ほとんどのケースではそうでないので、確率を掛け合わせることはできません。(有名なレジデントマニュアルでもこのように怪しい記述があるのですから、個人のブログに間違いが沢山書いてあっても許容されるべきだと思っています。)

感度・特異度の資料

 次に、感度・特異度・陽性尤度比・陰性尤度比の情報が掲載されている資料を探しました。下記の本に、いくつかの疾患について情報が載っていましたのでこれを採用しました。

JAMA版 論理的診察の技術

bayes0

 この本に、「互いに独立ではない検査項目を掛けあわせてはならない」と注意書きがしてあったので、ようやく私は作ろうとしているツールの限界に気が付きました。
kakeawase

 しかし、擬似確率であっても、このようなツールを作ることには意義がある気がしたので作業を続けました。

プログラミング言語、GUIツールキット

 iPhone用のアプリを作りたかったのでobjective-Cを勉強していましたが、結局は初心者でも書きやすいと感じたプログラミング言語Rubyに入門しました。今だったらPythonに入門していたかも知れません。
 GUIツールは、Ruby/Tk を選びました。グラフ表示はRuby/Tkの拡張ライブラリであるPlotchartを試用しました。ナイーブベイズのアルゴリズムは自分で書きました。

鑑別疾患を表示する

 鑑別疾患とは、症状から推測される病気のリストのことです。現場ではリストそのものよりも、「正しい主訴を選択する」ことが大切であると言われています。
diagnosis

レジデント初期研修用資料 内科診療ヒントブック 改訂2版
鑑別疾患リストは、実用性に優れたmedtoolz先生のマニュアル本から使用させて頂きました。

単純ベイズ分類器で確率を計算する

 このように、項目事の独立性を仮定して、ベイズの定理を適応する分類アルゴリズムを「ナイーブベイズ分類器」と呼びますが、このことは、あとから知りました。順序が逆だと思われるかも知れませんが、「感度・特異度」は国家試験の必須項目なのでみな学びますが、「単純ベイズ分類器」というものはどちらかと言えばプログラミングの世界の言葉なので、そういう概念を知っている人は少ないのです。
bayes1
↑虫垂炎について、ナイーブベイズで確率計算させているところ。

多クラス分類

 このソフトを友人に見せたところ、「すべての疾患について確率を計算して、最も確率が高いものを選べば、自動診断ソフトが作れるのではないか」という意見をいただきました。なるほど、これは凄いアイディアだ。と思いましたが、実際には使える資料が少なすぎて全く実現しませんでした。

実際に使ってみてわかったこと

 鑑別診断の表示、疾患の感度・特異度・陽性尤度比・陰性尤度比のブラウザは、研修医レベルなら現場でも十分に実用性があるということがわかりました。

graph2graph1


心不全の、陽性尤度比・陰性尤度比を表示したところ

 一方で、計算機能は、現場ではほとんど役に立たないことがわかりました。その最大の原因は、機械に一つ一つデータをインプットすることが煩雑で実用性に欠けることです。少なくとも計算機能を使用することで、新たに救える人命はないと思います。

 そのほか単純なケースではありますが、非IT分野に身を置く素人でも、Rubyのような(少なくとも入門は)簡単なプログラミング言語を用いることで今よりも少し深くITを活用できる可能性があるということを認識するきっかけになりました。(もちろんIT導入にともなう様々なリスクもあります。)

このツールと臨床現場の思考には大きな溝がある

 言うまでもないことですが、医師に限らず実際のスタッフの思考回路は、この種のソフトとは、さまざまな面で全く異なる動きをしていると感じられます。これについては、多岐にわたることであり、まったく勉強・経験が足らず、頭の整理が追いついていないと感じています。
医者は現場でどう考えるか

ツールについて

 このツールは、「もしもこのようなツールがあったら、何を考えるか」を調べる個人的な目的で作られました。正常に動作しているところもありますが、少なくない機能がヴェーパーウェアの段階です。ソースコードは素人が書いてるものにしても雑な部類に入るので公開するつもりはありません。
 気づいた方もいらっしゃるかも知れませんが、GUIはMacの作業自動化ソフトautomatorをそっくり参考にしました。

automator_2x

最後に

 IBMワトソンが診断を行ったというニュースを読んで、このエントリーを書いてみました。もちろん、このようなポンコツ診断ツールと、IBMの看板である最新鋭の診断支援システムは1から100まで異なるものです。しかし、これから技術がどのような劇的な進歩を遂げようとも、医療の本質はあまり変化しないのではないかという気がします。
 けれども、私達は面白い時代に生きているようですから、無理のない範囲で時代の波を追いかけてみたいと願っています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です