AI×医療事務(カナダ)

今は医療事務しているので医療事務関連、IT関連をのんびりと備忘録も含め記載していきます カナダ・歯科助手のことも復習がてら記載中 

python で レセプトの病名チェック・算定漏れ等(一部)

(令和4年6月9日 改良部分が多々あるので  参考程度にお願い致します)

 

はじめに

環境

記事の概要

作成したプログラム

今後の活用

終わりに

 

 

 

はじめに

現役で医療事務をしています

医療業界には様々な 

「非効率」  「複雑化」「情報のばらつき」

等問題点が多いため上げるときりがないです が

まずは、

医療事務の仕事はルーティンワークが多く 且つ 患者様等とのコミュニケーションを取りながらの大量の事務作業が多いため 

「自動化」「簡素化」

出来ないかということがpythonを学び始めたきっかけです

今回 Aidemyさんを受講したのは 無料版をした際に「見やすい」

progate等 基礎を固めたぐらいの「初心者にもわかりやすい」と以前から思っていたからです

また職業訓練給付金の対象になっていたということもあります

 

環境

Python 3.8.8 

pandas           : 1.1.3

python           : 3.8.5.final.0

glob2                                             0.7

pip              : 21.3.1

IDE: Visual Studio Code 

(pipコマンドで確認: pip list)

記事の概要

▶対象者

どのような方にも読んでいただきたいですが

医療業界で働いている方  医療業界に関わりがある業者の方  に少しだとしても為になるのではないかと思っています

▶どのようなことをしていくか

データ分析 。

詳細に記載すると、

診療録である.txtデータ→私が使用している電子カルテであれば診療録が .txtの拡張子として保存が常にされています

請求書になる.UKEファイル(形式は.csv)→国に提出するレセプトという ある意味 請求書の情報が記載されているデータ

 

 

レセプトは 患者様の自己負担金以外の金額を国に請求するための いわゆる請求用紙です

それぞれの 検査等に対し 様々な項目があり 各々に点数が割り当てられています

該当の検査等の項目をレセプトに記載し、国に請求することを算定する(以下、算定するという言葉を使用) といいます

 

診療録である.txtデータにて

該当の検査をしているか 該当のキーワードを分析

請求書になる.UKEファイル(形式は.csv)  にて

該当のキーワードとなる行にて 該当となる 傷病名コードと診療コード(コードについてはHPに著作権があるので 傷病名コード(医科)等調べると該当HPが出ます)があるか分析

各々の分析を照合し 

算定しているが 

算定する際に必要 且つ 検査しており所見として見られる病名があるかチェックする

「病名漏れ」  

検査を行っている 且つ  検査しており所見として見られる病名がある   が

算定していない

「算定漏れ」

を出力する

 

レセプトは1日30人患者様がいらっしゃっているとして 30人×31日でおおよそ900件ほどあるので 人間の力ではどうしても漏れが発生します

患者様への未収金分の回収、返金処理等 迷惑をかけることも増えます

そのため 患者様への負担を軽減する。医療事務の仕事量を軽減する という意味で良い点があります

 

最終目標としては医療事務が一人一人の患者様の会計前に その日に行った検査に対する算定を請求しているか、算定に伴う患者様ごとの病名を目視にて確認しています

作業についてはルールに沿って確認しています ルーティン作業になります

人間が行うと効率化すれば5分、人によっては30分チェックにかかります

人間一人一人の能力によって患者様が支払いに待つ時間が変わってしまうので患者様に待たせることなく早い時間で支払いを行えるようにし病院にいるのはただでさえ疲れるので早めに病院を終え薬などもすぐに受け取れるように、ストレスを軽減する というのが目標です

 

shinryohoshu.mhlw.go.jp

developer.medley.jp

電子レセプトについて

www.kartemaker.com

 

 

 

作成したプログラム

 

①必要なものをimport 等していきます

#①必要なものをimport 等
from calendar import month
from dataclasses import dataclass
import os
from os import O_EXLOCK
from flask import g
import pandas as pd
import numpy as np
import csv
import glob
import re

from flask import Flask, request,redirect, url_for, Response,render_template

 

②診療録の記載がある 拡張子.txt(以降 診療録という単語を使って説明していく) が入っているパスをglobを使用し,

すべて読み取り datastoresに格納

(print関数にて目的のものが出力されるか確認もする)

 
datastores = glob.glob('/(該当のディレクトリ)/病名漏れと算定漏れチェッカー/(該当のディレクトリ)/*/*.txt')
#print(text_lists)

 

ディレクトリ構成は下記

(該当のディレクトリ)/*(年月日)/*.txt(.txtの拡張子のあるファイル   画像の場所では1つのみある)

③datastoresに格納されている 診療録が保存されているパス1件1件をfor文で取り出す

txtデータのファイル名は「 _ 」で区切られている  

_ で区切られている1番目が患者番号に該当するため (txtdirsp[0]) とし該当の患者番号を出力するために後々使用する

#後々使う変数の用意
exam3dpatients =
submitdatepatients =
 
#print(datastores)
for text_list2 in datastores:
#⭐datastores のパスを/で区切る
dirsp = text_list2.split("/")
#⭐ .text の拡張子ファイルすべてを出力
diralltextfiles = dirsp[-1]
#print(diralltextfiles)
#⭐ .text の拡張子ファイルを_で区切る
txtdirsp = diralltextfiles.split("_")
#(txtdirsp[0])
#print(txtdirsp)
 

 

④診療録のデータを1件openし content 変数に格納していく

 
with open(text_list2) as f:
content = f.read()

 

⑤診療録の中身に"3D" または "OCT" の文字列が存在すれば、exam3dpatients変数に txtdirsp[0](患者番号)を格納する


if "3D" or "OCT" in content:
#print(txtdirsp[0])
exam3dpatients += [txtdirsp[0]]
#print(exam3dpatients)

 

⑥点検用レセプト(私が使用しているカルテは点検用レセプトデータにしか薬の情報は入っていないため、院外処方となっているため提出するUKEファイルというものには薬の情報が全く入っていないため)を参照し

点検用レセプト(国保).UKE をopen、  kokuho変数に格納

点検用レセプト(社保).UKEをopen、syaho変数に格納

<当ブログでは  kokuho変数のデータのみ使用していく>

点検用レセプトは 1患者につき ここで使用するもので言うと  RE、SY、SI 行というもので構成されている

UKEファイルについては下記URL  P6〜P8  参照

http://www.resept.com/BENKYOKAI/reseptseminartext2013.pdf

RE,SY,SI は いづれかの行にいづれか1個のみが一番左の1列目に記載されている

RE がある行に 患者情報

SY がある行に  傷病名情報

SIがある行に 診療行為情報

RE、SY、SI 行のワンセットの1人目の患者の情報が終わるとき 次のRE行が出現する そのRE行から 2人目の情報となる

 
# 下記のfor文でline変数に格納する場合、同一患者で複数回line変数が繰り返される。
 
kokuho = open("/(ディレクトリ名)/(ディレクトリ名)/点検用レセプト(国保).UKE", encoding="shift-jis")

 
syaho = open("/(ディレクトリ名)/(ディレクトリ名)/点検用レセプト(社保).UKE", encoding="shift-jis")

 

 

⑦今回は 眼底三次元(D256-2 眼底三次元画像解析  200点)  という算定項目を対象とする

shirobon.net

三次元病名が 点検用レセプト内のSYが存在する行に存在するかどうかチェックする

そのため 三次元病名の 「傷病名コード」を sanjigen_byoumei変数に格納する

 該当病名は各都道府県ごとに違うことと個人情報となるためここでは  [1,2,3,4]と表すこととする

sanjigen_byoumei = [1,2,3,4]
 

国保の点検レセプトから1要素ずつ取り出しfor文で処理をしていく

line_RE = False
line_SY = False
line_SI = False

kokuhoARI3D = []
#文字列じゃないと出力できない
for line in kokuho:
#print(kokuho)
#print(sanjigen_byoumei)

 

⑨レセプトの1要素にREが出てくるたびに患者番号(splitしてインデックス番号13番めの内容)を格納、line_◯◯ の状況を更新

 
if 'RE' in line:
name = line.split(',')[13] #*
#print("ID:"+ name)
line_RE = True
line_SY = False
line_SI = False
 

 

⑩ レセプトの1要素に SYが出現し かつ 三次元病名の傷病名コードに当てはまる記述があれば line_SYをTrueにする

 
if "SY" in line and any (id in line for id in sanjigen_byoumei):
#print(name)
#▶ok
line_SY = True # SYの該当あり判定

⑪レセプトの1要素に SIが出現し かつ 眼底三次元の 診療行為番号(ここでは非公開とする ネットにて診療行為コードと検索すると対象のサイトが現れるので探せる)に当てはまる記述があれば ,line_SIをTrueにする

kokuhoARI3d という関数について ここでのif文の条件式に当てはまった患者番号を

⑨のname関数にて取得する

 
if 'SI' and "(ここでは非公開とする)" in line:
#print(name) # 患者名出力
 
line_SI = True
# listに追加していく形にする
kokuhoARI3D += [name] ###この条件にあてはまった患者番号をREに該当するline変数の中の記述(*上記)から取得する。
#print(kokuhoARI3D)
 

 

⑫line_SY が当てはまらない(レセプトの1要素に SYが出現し かつ 三次元病名の番号に当てはまる記述がない) 

かつ 

line_SI に該当する(レセプトの1要素に SIが出現し かつ 眼底三次元の診療行為コードに当てはまる記述がある)

<要約すると 検査はしているが病名がない>

ならば

 検査はしているが病名がない 患者番号(name)を出力

 
 
if not line_SY and line_SI:
print(name + ":kokuho三次元の病名がない") # 患者名出力
line_RE = False
line_SY = False
line_SI = False
# 初期化

 

 

 

検査を行っているが(exam3dpatients)が三次元を算定していない患者番号(nowmonth3dID)を出力していく

exam3dpatientsは⑤参照   kokuhoARI3D は⑪参照

exam3dpatients は重複しているデータを省くと260件

kokuhoARI3D は64件となる

出力されるのは248件の患者番号となる

結果 検査を行っているが 算定を行っていない患者は248件となる

<この部分にて該当の年月日を 指定する コードを記載していないため上記 248件となった 更に改良し使用する際は 該当年月日も条件として指定した件数が出力される予定である>

 
kokuho3dexamARInonSANTEI = {}
nowmonth3dID = {}
#64件 ARI3D  654件 exam
#リスク回避
if len(kokuhoARI3D) >len(exam3dpatients) :
kokuho3dexamARInonSANTEI = set(kokuhoARI3D) - set(exam3dpatients)
else:
kokuho3dexamARInonSANTEI = set(exam3dpatients) - set(kokuhoARI3D)


if submitdatepatients:
nowmonth3dID = kokuho3dexamARInonSANTEI
print("kokuho三次元を算定してない:" + nowmonth3dID)

 

 

 

今後の活用

「自動化」「効率化」をポイントに行いたいことは多数あるのですが

まず 直近の目標として

今回のコードについて

→一部なのでコードの完成後Flaskアプリ化し GUI形式で使用できるようにする

最終的には

診療録として扱える電子カルテアプリを作成し今回の病名チェカー兼算定チェッカーを使用できるようにする

そのため対象のサイトからデータを自動取得する等 更なる自動化を行いたい

 

Aidemy さんで今回 データ分析を学んでいるので、

時系列解析等も今現在作成中なので作成し発展させ来院患者数と月ごとの売上(診療報酬の総合)を予測する

 

データ分析に関係ないものとして興味があるものが

Twilio 等で電話対応 自動化 

ネット予約のサイト、自動受付 等  多々興味があるので

その他についてはゆっくり行っていきたいと思っています 

 

 

終わりに

自分の性格としては完璧主義な部分があり自分でどうにかしようとする面があるので

思い切って Aidemyさんのチュータの方にカウンセリングや質問をし

自分で調べ続ければわかるのでは?と思うものも積極的に聞けるチューターの方の存在はとても必須だと感じました

就職しOJT等で教えていただくのが一番環境としてはいいかもしれません

(その職場の教える方等が良さそうであれば)

私の場合は 医療事務を本業としてこれからも働いていく予定なので、 本業で使用できるものを作成しながら 副業としてどこかで働ければと考えているのでサービスを多用しながら模索していきたいと思います