カテゴリー
AI・IoT・Computer BLOG

エクセル病院リスト生成アプリ制作の舞台裏 | NES’s blog




 下にある検索窓にキーワードを入れて検索すると、対象の病院・診療所のリストが表示されます。

 このデータベースはオリジナルです。元となるデータは厚生労働省の公開データですが、見やすくするために独自開発したアプリケーションソフトウエアを使っています。

 そのアプリがどのようにしてできたのか、簡単にご紹介いたします。




医療機関(病院・診療所):
医療機関名 都道府県 所在地 院長名 標榜科目




医療機関(病院・診療所):
医療機関名 都道府県 所在地 開設者 管理者(院長) 標榜科目

医療機関(薬局):
医療機関名 都道府県 所在地 開設者 管理者 標榜科目




 ├ Visual Basic 6.0からスタート
 ├ VB6からVisual Studio 2022へ
 ├ BASICからC#へ
 ├ 作り変えた理由
 ├ 全都道府県データを解析
 ├ 発見された都道府県間の差分
   ├ 病院と診療所が別ファイル
   ├ 都道府県名が無い
   ├ 特定機能病院・地域医療支援病院のフラグ
   ├ 医療機関番号
 ├ 解決しがたい都道府県間の差分
 ├ 医科専業と歯科併設の医科
 ├ 医師・歯科医師・薬剤師数
 ├ 想像通りに重い処理
 ├ プレチェック
 ├ 処理速度向上
 ├ Microsoft Excelファイルエクスポート
 ├ ウェブデータベースへエクスポート
 ├ ウェブDBインポートファイル生成
 ├ PHPファイル作成
 ├ メモリ増量

Return to top



Visual Basic 6.0からスタート

 病院リストをエクセルファイルで一覧表示するという試みは2021年春に一旦は完結しました。

 当時はMicrosoftのVisual Basic 6.0という開発ソフト(言語)を使って開発しました。

 機能としては全国の厚生労働省地方厚生局から医療機関のリストを取得して、それを一旦はデータベースに取り込んで、そこから任意の形式のファイルで出力するというものです。
 今月開発した最新版と骨子は変わっていません。

 当時の画面の一部をご紹介します。
 開発者以外の誰も使わない、一人専用アプリなので見た目はこだわっていません。
 ミスをしないように、いくつかの仕掛けはしました。

Return to top



VB6からVisual Studio 2022へ

 Visual Basic 6.0は筆者が大学在学中に梅田のヨドバシカメラで購入した物ですが、このソフトは1990年代からあるものです。

 いわば20世紀のコンピューターシステム用に開発された環境で2020年代のパソコン環境に合わせようとすることに無理が生じました。
 簡単に言えば32bitと64bitの違いが『不具合』という形で現れるようになりました。

 バグであれば改修できますが、根本的な環境の問題は解決できないため乗換が必要になりました。

 今年の初めまではVisual Studio 2019を使っていましたが、2022がリリースされてからはそちらに乗り換え、従って2022年5月に開発したエクセル病院リスト生成アプリはVisual Studio 2022の環境下で開発しました。

Return to top



BASICからC#へ

 2021年版の開発言語はBASICでしたが、2022年版はC#に変更しました。

 その違いは何かと言うと、このエクセル病院リストにおいては特にありません。

 他のアプリを開発する上では、Windowsの環境以外に、AndroidやiOSへ応用する際にBASICよりC#の方が馴染みやすいという特徴があります。転換作業が効率的です。

 時代に合わせて、BASICからC#へ乗り換えたということになります。

Return to top



作り変えた理由

 2021年版のエクセル病院リストアプリは、古いWindowsパソコン上であれば動作するので、手元にあるパソコンで集計することには問題ありません。

 問題となったのは厚生労働省側の提供データの変化です。

 前作リリースの2021年5月時点では、地方厚生局毎にフォーマットが異なっていました。
 四国支局に限ってはファイル形式すら一致しておらず、事前に手作業でファイル形式を揃えるところから始めていました。

 ところが全国でシステムが刷新されたために、47都道府県がほぼ同一のフォーマットで提供されることになりました。

 そこで当方に問題が生じたのが、都道府県毎に変えていた読取の仕様が使えなくなりました。
 フォーマットが一本化できるのは良いのですが、せっかく都道府県毎に分けて作ったシステムが短期間で使えなくなってしまいました。

 とはいえ、医工連携コンサルティングには根拠データが必要ですので、システムを刷新することにしました。

Return to top



全都道府県データを解析

 フォーマットが統一されたというのは確かなのですが、細かな点で違いがありました。

 人間が読む分には支障がなくても、コンピューター処理するには大きな課題です。

 それを解析するために、全47都道府県のエクセルデータを何度も読んでは比べ、差を見つけ出しました。

Return to top



発見された都道府県間の差分

病院と診療所が別ファイル

 最初なので気づきづらかったですが、北海道厚生局のデータは『群市区別』と『コード内容別』があり、ここではコード内容別を選べば全国フォーマットと一致します。

 他の都府県では『医科』でひとくくりですが、北海道だけは医科の中で『病院』と『診療所』が分かれています。

 したがって、47都道府県だから47ファイルという訳にはいかないことが判明しました。

 プログラムを組む上で、ファイル数を既定するのか、流動性を持たせるのかは大きな違いです。

北海道


都道府県名が無い

 多くの都道府県で同じセルに都道府県名が入っているのですが、入っていないものも多くありました。

 茨城県、栃木県、群馬県、埼玉県、千葉県、東京都、神奈川県、新潟県、山梨県、長野県、石川県、香川県の1都11県には入っていませんでした。

 この原因の1つが、厚生局のデータ収集の方法です。
 自身の所在県のデータを取得すると都道府県名が記入されず、他県のデータを取得した時には都道府県名が記入されるというシステムの『仕様』が関係します。
 このシステム開発者の考え方としては恐らく、自県のことなのだから入れるまでもなくわかっている、という合理的な考えなのかもしれないなと思いました。
 しかしながらデータは1県だけ見れば良い物ではないので、比較して使う時には困ります。

 これは付番などに影響を与えました。

茨城県


特定機能病院・地域医療支援病院のフラグ

 これはJ列のセルに記述があるべきなのですが、ときどき無い場合があります。

 例えば大学病院等の『特定機能病院』は三重県と京都府で抜けています。
 三重大学、京都大学、京都府立医科大学のいずれも特定機能病院は取り消されていないことを厚生労働省に確認した上で、この記述が抜け落ちているだけということを、地方厚生局に確認しなければなりません。

 北海道のデータでは地域医療支援病院が抜けています。10以上あるはずなのですが、ダウンロードしたエクセルデータには1つもありません。

京都府


医療機関番号

 医療機関番号にはルールがあり、これは診療報酬請求と密接に関わり合います。
 地方厚生局が公開するデータには都道府県番号と点数表番号を抜いた番号が記載されます。

 2ケタ・4ケタ・1ケタで構成される医療機関番号は、ほとんどの都道府県でカンマ(コンマ)区切りです。

 都道府県番号はこちらのプログラム上で処理しました。

 この、欠落する都道府県番号と点数表番号は悩ましいところです。
 一応、コードはわかっています。医科は1、歯科は3、薬局は4、訪問看護師テーションコードは6となっているので、参照元のエクセルファイルを分類することで付番は可能になるかなと思っています。
 悩ましいというのは、この重要なコードを当方が勝手に付記することです。基本的には参照したファイルの生データを並べ替えするだけとしていれば何も問題は無いのですが、書き換えると何か課題が生じるのではと心配しています。


 さて、医療機関番号についてはまず、小さな問題として富山県の表では医療機関番号欄に『医富409』といった独自の番号(コード)が付記されます。

 プログラム上ではこれを無視すれば済むので、小さな問題です。

富山県

 次は少々面倒なところで、コンマ区切りではなくハイフン区切りになります。

 プログラム上ではコンマだけでなくハイフンも監視する処理を加えなければならないので、10万軒近くある医療機関の全データ処理となると重くのしかかります。

島根県

 次はもう少し面倒なことに、沖縄県のみ全角で『・』(中点・中ポツ)が入ります。

 このセルの処理は半角であることを前提に処理したかったのですが、全角が入ってきました。

 先ほどのハイフンと加えて、2つ目の追加処理が発生しています。

沖縄県

 厚労省の統一システムが導入されても記号が一致しないということは、参照元のファイルがこのようになっているという事だと思います。

 レセプトの処理がどのようになっているかわからないのですが、局によっては『コンマ区切りで』と指定しているようですので、いずれは統一されることを願っています。

Return to top



解決しがたい都道府県間の差分

 入力方法の違いなどであれば、プログラムの書き方次第でどうにかなる部分があります。

 しかしながら、元々の生データに地域差がある場合についてはどうにもなりません。

 2022年5月分のデータで言えば、三重県と京都府では『特定機能』というフラグが立っていませんでした。これについては合計3病院なので『取り消しになっていない』『手入力して差し支えない』ということを事務局に確認しました。

 地域支援となると、数が多く、指定機関が自治体であるため厚生労働省が一元管理している訳でもないのでハードルが高いです。厚生労働省のウェブサイトからは都道府県のページへのリンクが張られているだけで、そのページを開いても病院リストが出ている訳ではないので、何を信用して良いかわかりません。
 山形県と広島県はリンク切れになっています。
 なぜかわからないのが宮崎県のリンクです。リンク先では地域医療支援病院は表示されず県立学校の入試情報が表示されます。推測ですがフォルダがkurashiであるべきがkenkoになっていることが関係していると思いますが、なぜ薬務が教育にリンクされるのか謎です。

 2022年5月分で言うと地域医療については北海道や宮城県などでフラグが立っていませんでした。

【参考】厚生労働省:地域医療支援病院について

Return to top



医科専業と歯科併設の医科

 北海道では医科の中で診療所と病院が分かれていましたが、他にも分かれているファイルがあります。

 医科と歯科の併設について、取り扱いが分かれます。

 医科の中に歯科を併設するのか、歯科の中に医科を併設するのか、このあたりの解釈も難しいです。

 例えば『大阪大学医学部附属病院』は『医科』に登録されています。
 この診療科には『歯科』もあるので、『歯科』のリストの中の『歯科併設』(歯科を併設する医科)のリストにも阪大病院は掲載されています。

 同じ敷地に在る『大阪大学歯学部附属病院』は『歯科』に登録されています。
 この病院の診療科には内科や小児科も標榜していいますので、『医科』の『医科併設』(医科を併設する歯科)にもリストされています。

 主従関係のようなものですが、医科を主とするか歯科を主とするかで、分類が変わります。

 阪大は敷地内の別々の場所に医学部附属病院と歯学部附属病院があり、別々の病院として届出されていますが、異なるケースもあります。

 『東京医科歯科大学病院』は『医科』としてのリストされますが『歯科』リストへの掲載はありません。この背景には医学部附属病院と歯学部附属病院の一体化があると思われます。
 2021年9月30日に東京医科歯科大学歯学部附属病院は『廃止』されています。手続き上は医学部附属病院が形を変えて『東京医科歯科大学病院』になったようです。
 今月の数字を見ると常勤で医師602名、歯科医144名、非常勤は医師459名と歯科医738名です。
 前年同月は常勤で医師598名、歯科医12名、非常勤で医師443名と歯科医23名でしたので、歴然とした差が在ります。

 東京のルールがあるのかもしれませんが『日本歯科大学附属病院』や『東京歯科大学水道橋病院』なども『医科』にリストされています。
 いずれも歯科大学なので、医科は内科などで少人数の医師が診療している程度です。東京歯科大学水道橋病院の医師配置は常勤で医師5名、歯科医師204名と圧倒的に歯科医師数が多いですが、医科となっています。

近畿厚生局:保険医療機関・保険薬局等の管内指定状況等について
関東信越厚生局:保険医療機関・保険薬局の指定等一覧及び保険医・保険薬剤師の新規登録一覧
大阪大学医学部附属病院
大阪大学歯学部附属病院
東京医科歯科大学病院
東京歯科大学水道橋病院
日本歯科大学附属病院

Return to top



医師・歯科医師・薬剤師数

 医師、歯科医師、薬剤師の数は常勤・非常勤に分けて掲載されています。

 この掲載方法もユニークで、常勤総数の欄は『常 勤:    9』というように、空欄を入れて書かれています。

 勤務医数も『(医     9)』となっているので、この空白を制御する必要がありました。

 また、常勤と書かれたセルの下にある医師、歯科医師、薬剤師の内訳を示す行数は、施設毎に異なります。
 クリニックですと常勤医1人というのが多いので、常勤セルの下が括弧書きで医師数、その下のセルは次の医療機関の電話番号になっています。

 この構造を理解するのに時間がかかったというか、例外が無いかを探すのに時間がかかりました。

 医科・歯科・薬局の合計で20万軒ありますので、Excelの行数で言うと100万行に満たないが近いものがある、という感じですので、チェックは容易ではありません。


 今回注意した点としては、0人であることと、空欄であることを分けて考えました。

 0人として届け出ていればゼロで間違いないと思いますが、空欄の場合は記載忘れの可能性もあるので、あえて空欄のまま残しました。

 特に薬剤師の欄は、病院で0人というところは少ないと思いますので、おそらくゼロではなく、空欄なのだと思います。


Return to top



想像通りに重い処理

 47都道府県で47ファイル以上、病院が8千余り、診療所が約9万軒あるので、全件処理には相応の時間がかかります。

 厚生労働省のエクセルファイルの特徴として1医療機関あたり1行で作られていないため、診療所でも2行以上、病院だと5~6行を使っているので、医療機関が100軒あれば300~500行くらいの処理が発生します。

 東京都には医療機関が13,000軒以上あるので、2022年5月のエクセルファイルは50,764行ありました。毎月多少の増減があるものの、約5万行の処理が発生することは必至です。

 恐らく、Open XMLなどMicrosoft Excelのファイルを直接操作できる技術を使えば早いのだと思いますが、素人プログラミングにそのような技術実装がないので、昔ながらのExcelシートを読込む技術で対応しています。

 厚生労働省のExcelファイルをデータベース化するための時間の9割以上が、Excelファイルの読み込みにかかっているので、いずれは改善したいと思います。

Return to top



プレチェック

 処理が重い上に、都道府県は47もあるので、処理の途中でスタックすると無駄となる時間が膨大です。

 1県ずつインポートすれば処理途中でのスタックも被害は1県のみとなりますが、セットアップ作業が47回必要になるので、非常に煩わしいです。

 そこで、読込は全県一斉もできるようにした上で、最初にファイルのチェックを行うことにしました。
 すべてのExcelファイルを開いて、異常を点検した上で閉じるという作業を経てから、本格処理に入るようにしたことで、エラーでスタックする率は減りました。

 それでも、こちらが想定していなかった事が起こることもあるので、スタックがゼロになるとは思っていません。

 今月のデータで言えば、電話番号が空欄という医療機関が見つかり、空欄処理を追加することでエラーを回避しました。

 管理者、いわゆる院長先生の氏名が文字化けすることも多々ありますが、個人名なので仕方がないこととして、これは無視しています。
 実際にダイレクトメールなどを送るときには『御侍史』などと恰好を付けても氏名が誤っていては失礼極まりないので、個別のチェックが必要だと思います。

Return to top



処理速度向上

 処理速度を高めるために、プログラムは幾度も見直しを行いました。

 とはいえ、素人プログラマーの限界があります。
 処理方法の選択肢が少ないため、改善策も見当たりません。

 今月の北海道のデータは医科の病院だけですとEXCELファイルが278KB、540病院の登録がありました。
 これをインポートして処理するのにかかった時間は54秒です。平均してしまえば1秒に10病院を処理したことになります。
 実際にはプレチェックなど前後処理があるので、個別の処理速度はもう少し早かったのだと思います。

 このペースで進んだとしても10万件なら1万秒、166分なので約3時間かかることになります。

 おそらくですが、エクセルデータを丸ごと読込んでXMLファイル化し、それを処理すると早くなると思ったので改編したところ、北海道の540件のデータ処理には1分17秒かかりました。
 予想は外れでした。

 件数が8,566件ある大阪府では、処理速度の改善が見られました。Excelから直接XMLに変換する方法では53分28秒かかりました。
 Excelファイルを処理なしにXML仮ファイルに丸写しして、そのXML仮ファイルからXMLに変換する迂回法では23分50秒で処理できました。
 内訳としては処理開始からExcel⇒XML仮までに12分以上、すなわち半分以上の時間を費やしています。
 後半のXML仮⇒XMLの方がややこしい処理をたくさん行っているので、本来はこちらの方が時間がかかってもおかしくないのですが、Excelという外部アプリのファイル処理が重いということが窺い知れます。

 新しい方法では1件当たり約0.167秒、10万件で約16,694秒なので約278分です。
 先のExcelから直接変換する方法では、北海道の540件で言うと166分という試算がありましたが、実際はExcelの処理行数が多くなると処理速度が著しく低下するので理論通りには進みません。
 大阪府の場合ですと8,566件を53分28秒でしたので1件あたり0.375秒、10万件で約37,450秒なので約624分かかります。10時間以上もパソコンに処理をさせておくことになります。
 

 この結果から見ると、Excel処理が重いことがわかりました。

 倍速化されたことは、47都道府県の処理に換算すると数時間分の影響が及ぶと考えられます。

Return to top



Microsoft Excelファイルエクスポート

 集計結果は汎用性の高いMicrosoft Excelで扱える形式のファイルに変換する機能を具備しました。

 これはかなり軽量な作業、プログラミングも出力負荷も軽かったです。

 集計結果の一例を以下よりダウンロードできます。

【参考】兵庫県の保険医療機関【医科】(2022年6月1日現在)[Excel]

【参考】兵庫県の保険医療機関【歯科】(2022年6月1日現在)[Excel]

【参考】兵庫県の保険医療機関【薬局】(2022年6月1日現在)[Excel]

Return to top



ウェブデータベースへエクスポート

 XMLファイルにまとめた病院リストは、エクセルファイルへの変換ができるほか、CSVファイル化してウェブデータベースへ取り込むこともできます。

 実際にウェブデータベース化した病院リストが下記のとおりです。クリックすると実際のデータベースが閲覧できます。

 本来はコンサル業のためにエクセルの病院リストを作成しているので、無償で閲覧できるウェブデータベースとは分けて考えています。
 ウェブデータベースは1回当たりの表示件数に制限があったり、複数の方法で絞り込むことができません。

 エクセルであればフィルタ機能をつかって医科だけに絞り込んだ上で地域を絞り込むことなど容易にできます。


医療機関(病院・診療所):
医療機関名 都道府県 所在地 院長名 標榜科目

MeKiKiデータベース情報サービス:医療機関検索(病院・診療所)

Return to top



ウェブDBインポート用ファイル生成

 ウェブデータベースはCSVファイルしか受け入れできず、その容量には上限がありました。

 全国を一括でインポートすることは不可能なので、分割する必要があります。

 全国の医科データだけでも10万件近くあるので、これを1万件や2万件で分割したCSVファイルを生成する機能を制作しました。

 いまの項目数(列数)であれば、2万件はインポート可能なようなので、医科であれば5ファイルのインポートで済んでいます。

Return to top



PHPファイル作成

 ウェブ上で表示するために、PHPファイルを作成し、そこにTableを設けてデータベースと接続させる方法をとりました。

 特別な方法は使っていません。

 諸問題を解決するために1回に表示できる件数は絞っています。


 表示件数を絞った結果、データベースの表示ページ数が数千ページなってしまったので、ページ指定するための番号一覧が画面いっぱいに埋め尽くすような状態になってしまいました。

 下図のように全件表示の場合は数十万件の医療機関が対象なのでページ指定用の番号一覧も画面一杯ですが、検索して絞り込んでいるときにはそれなりに使いやすい表示になると思います。

Return to top



メモリ増量

 今回、初めてメモリ不足となりました。

 画面表示として『HTTP ERROR 500』です。

 想像するには、データベースとのやり取りで何らかの問題が起きているのだろうと、という感じでした。

 と言いますのも、医科のみのデータベースであれば表示できていたところに、歯科のデータを足したら500番エラーになったので、PHPファイルのタグ入力ミスではないですし、データベースとの接続のタグや設定にも問題はないと思います。


 データが増えてエラーになったのだから、一定量のデータを処理できなくなっていると考えました。

 一覧表示は50件までに絞ってあるので、1枚の画面上で何かということはありません。

 ここで役立ったのが以下のタグです。

<?php
ini_set("display_errors", On);
error_reporting(E_ALL);
?>

 PHPファイルの先頭に入力してウェブサーバへアップロードすると、問題のある行を示してくれます。

 今回は121行目に問題があると指摘されたのでPHPファイルを見てみると、データベースの末端処理に関する行でした。

 データベースの最終行まで読みに行く途中で問題が起こっているので、この作業の改善策を検討しました。


 ここで使ったタグは以下のとおり、メモリの上限設定変更のタグです。

ini_set("memory_limit", "3072M");

 とりあえず適当に変更してみました。
 何かで見たことがあった数字が『2,048』だったので、1.5倍の3,072にしてみました。ダメなら4,096と段階を踏んで変更していこうと思いました。

 この1行を加えるだけで500番エラーが解消し、みなさんに保険医療機関のデータベースをご利用頂けるようになりました。

医科・歯科の保険医療機関一覧

保険薬局の一覧

Return to top



おわりに

 今回はプログラミングは素人ながら、病院や医工連携のコンサルティングは本業としている者が、エクセルで取り扱える病院リストを作るためのアプリケーションソフトウェアの開発にチャレンジしました。

 結果として、コンサルで活用できるエクセルファイルを手に入れることができるようになりました。

 毎月更新されるデータを、約10軒分、手作業で使いやすい形に変えていくのは大変な労力ですので、おそらく長続きしないと思いますが、アプリを使えばわずか数時間の処理、人間の操作は最初の数クリックだけですので、非常に効率化されます。

 このような病院・診療所などのリストは入手するのに数十万円のコストがかかると言われていますので、今回のアプリ開発自体は対価を貰うものではないものの、数十万円の価値はあったかなと思っています。

 他社さまがあまり持っていないデータを当社が持つということにも付加価値があると思います。

 臨床ではEvidence based medicine (EBM)、科学的根拠に基づく医療が実践されていますが、当社が行うコンサルティングも正しいデータに基づくように努めています。
 外から入る正しい情報はフル活用、世の中に存在しないデータは自ら実験して創り出すように努めています。

 データに基づくコンサルティングについて、お気軽にお問合せ頂ければと思います。