使用 Python 探索医疗保健患者付款人数据 分析患者再入院情况
医疗保健患者付款人索赔数据包含医疗服务的保险索赔信息,例如 PCP 就诊、急诊室就诊、牙科手术、外科手术等。这些数据包含敏感的患者信息,例如会员保险 ID、有关医疗保健服务和程序的详细信息、保险单信息以及保险范围和患者责任成本。这些数据可用于医疗保健领域的各种决策支持用例,包括降低患者再入院率、检测欺诈和实施基于价值的护理。
随着医疗保健技术的兴起,对匿名医疗保健数据的需求也随之增加。与许多其他类型的数据不同,付款人索赔数据受健康保险流通和责任法案 (HIPAA) 的保护。这使得许多创新健康科技初创企业难以在医疗保健领域进行开发和创新。综合付款人索赔数据对于该领域的小型参与者来说是一个不错的选择,因为它可以使公司能够构建概念证明 (PoC),而无需获取敏感患者数据的麻烦。
对付款人索赔数据的探索性数据分析可以深入了解与医疗保险索赔相关的许多风险。例如,通过患者付款人数据,您可以了解哪些患者经常返回急诊室。从那里您可以分析可能导致急诊室再次入院的因素。如果某些因素可以通过决策进行修改,这些分析可以帮助防止未来再次入院。例如,考虑一位患有充血性心力衰竭 (CHF) 的患者。该诊断可以作为再入院可能性较高的指标。为了防止再次入院,心脏病专家可以安排随访以评估症状并确定 CHF 是否恶化。其他预防措施包括远程监控患者和管理处方药物。
除了病情类型外,还有许多其他因素导致急诊患者再次入院。这些包括术后并发症、药物管理不当、慢性病恶化等。为了进一步了解重新入院的原因,让我们考虑另一个例子。
考虑一位因冠状动脉搭桥手术后出现的并发症而重新进入急诊室的患者。当心脏动脉被斑块堵塞导致血流受限时,通常需要进行这种手术。该手术涉及通过使用身体其他部位的血管创建血流路径来恢复心脏阻塞动脉的血流。手术后,该患者可能会因感染而出现发烧和肿胀的情况,这导致他们返回急诊室。患者可能会接受清创术(去除坏死组织)和抗生素处方等治疗。随后再次入院的原因可能是心悸和呼吸急促。治疗可能是监测心率并使用β受体阻滞剂稳定心率。一般来说,
出于多种原因,防止患者再次入院非常重要。首先,如果患者没有重新入院,资源将向新患者开放。此外,减少患者再次入院可以降低总体医疗成本。最后,再入院率是医疗机构评估护理质量的一种方式。如果再入院率较低,则可能意味着护理质量良好。相反,高再入院率可能与患者护理和结果不佳有关。
在这篇文章中,我们将使用 Python 对合成患者付款人数据进行探索性数据分析。在我们的分析中,我们将分析急诊室就诊和医疗保健程序计费的模式。我们将研究涉及急诊室患者重新入院的具体现实场景。出于我们的目的,我们将使用DataFabrica上提供的综合医疗保健患者付款人索赔数据。免费层可在Apache 2.0 许可证下免费下载、修改和共享。
https://datafabrica.info/
https://datafabrica.info/products/healthcare-patient-payer-data
代码解读
读入数据
让我们首先将患者付款人数据读入 Pandas 数据帧:
import pandas as pd
df = pd.read_csv("synthetic_patient_payer_data.csv")
df.head()
代码解读


我们还可以显示列名称的完整列表:
print(df.columns)
代码解读

数据列的含义如下:

我们还打印数据集中的行数:
print(len(df))
405
代码解读
我们还可以使用集合模块中的 Counter 方法来查看男性和女性患者的分布:
from collections import Counter
print(Counter(df['gender']))
Counter({'Female': 225, 'Male': 180})
代码解读
我们看到数据包含 225 名女性患者和 180 名男性患者。
我们可以为保险提供商做同样的事情:
print(Counter(df['insurance_provider']))
Counter({'Cigna': 102, 'Aetna': 88, 'Anthem Inc.': 77,
'UnitedHealth Group': 77, 'Humana': 61})
代码解读
我们看到大多数索赔来自 Cigna 和 Aetna。
让我们对设施名称执行相同的操作:
print(Counter(df['facility_name']))
代码解读

我们看到大多数索赔来自“俄勒冈健康与科学大学医院”。
我们还看一下设施位置:
print(Counter(df['facility_location']))
代码解读

我们看到大多数索赔来自纽约、波士顿和洛杉矶。
稍后我们将看到我们可以使用条形图生成这些分布的可视化。
患者付款人数据的可视化
让我们继续查看数字列中的分布。一个有趣的列从total_billed_amount 列开始。我们可以使用 Plotly Express 在total_billed_amount 中生成一些漂亮的直方图:
import plotly.express as px
fig = px.histogram(df['total_billed_amount'], nbins=100, title='Histogram of total_billed_amount')
fig.show()
代码解读

我们还可以定义一个函数,该函数采用数字列名称,并在使用列名称调用时在该列中显示 Plotly Express 直方图。让我们对total_billed_amount、insurance_covered_amount 和病人_responsibility_amount 执行此操作。
def histogram(column):
mean = df[column].mean()
fig = px.histogram(df[column], nbins=100, title=f'Histogram of {column}; mean: {mean}')
fig.show()
histogram('total_billed_amount')
histogram('insurance_covered_amount')
histogram('patient_responsibility_amount')
代码解读

我们还可以使用条形图分析给定分类列的分类值的分布。让我们对facility_location 列执行此操作:
data_counter = Counter(df['facility_location'])
data_dict = {'item': list(data_counter.keys()), 'count': list(data_counter.values())}
fig = px.bar(data_dict, x='item', y='count', title='Bar Chart of facility_location')
fig.show()
代码解读

正如我们之前看到的,纽约是最常见的设施地点。现在,我们定义一个函数,该函数采用分类列名称并生成给定分类列的分类值计数条形图:
def get_barchart(column):
data_counter = Counter(df[column])
data_dict = {'item': list(data_counter.keys()), 'count': list(data_counter.values())}
fig = px.bar(data_dict, x='item', y='count', title=f'Bar Chart of {column}')
fig.show()
get_barchart('facility_location')
get_barchart('diagnosis_code')
代码解读

分析患者再入院情况
接下来我们可以看一个重新入院患者的例子。为此,我们对唯一的患者标识符使用 Pandas value_count 方法。在本例中,它将是病人 ID:
patient_count = df['patient_id'].value_counts().reset_index()
代码解读
接下来我们可以重命名列:
patient_count.columns = ['patient_id', 'count']
代码解读
对计数进行排序:
patient_count.sort_values('count', ascending = False, inplace= True)
代码解读
重置索引:
patient_count.reset_index(inplace= True)
代码解读
并显示结果数据框:
patient_count
代码解读

我们看到重新入院的患者有一个 Patient_id HOSP123-405,它在数据中出现了 5 次。我们可以使用 iloc 方法从数据框中提取这个 Patient_id:
readamitted_id = patient_count['patient_id'].iloc[0]
readamitted_id
代码解读
'HOSP123-405'
代码解读
根据该患者 ID 过滤我们的数据框:
df_readmit = df[df['patient_id'] == readamitted_id]
代码解读
并显示该重新入院患者对应的5行:
df_readmit = df_readmit[['insurance_provider', 'total_billed_amount',
'insurance_covered_amount', 'patient_responsibility_amount',
'diagnosis', 'diagnosis_code', 'procedure', 'cpt_code']]
df_readmit
代码解读

我们看到该患者每次就诊的诊断顺序:
冠状动脉疾病
手术部位感染
肺炎
移植失败
心房颤动
让我们创建一个将诊断映射到程序的字典,以便我们可以轻松地了解每个诊断的治疗方式:
print(dict(zip(list(df_readmit['diagnosis']), list(df_readmit['procedure']))))
代码解读

我们看到这对应于以下患者旅程:
首次就诊:患者被诊断患有冠状动脉疾病并接受冠状动脉搭桥手术
第二次就诊:患者被诊断为手术部位感染,并开了治疗感染的药物
第三次就诊:患者确诊为肺炎并接受吸入治疗
第四次就诊:患者被诊断患有冠状动脉移植衰竭,即新创建的路径被阻塞或停止正常工作。移植失败的手术是冠状动脉造影,使医生能够看到阻塞的动脉。如果堵塞程度较轻,简单的生活方式改变和药物治疗就足够了。如果堵塞严重,可能需要进行后续手术,例如血管成形术。
第五次就诊:患者被诊断患有心房颤动,进行的程序是电生理评估。
如果我们计算总账单金额的总和:
print("total_billed_amount: ", df_readmit['total_billed_amount'].sum())
代码解读
total_billed_amount: 80550.0
代码解读
我们发现这五次就诊产生了 80,550 美元的医疗费用,其中大部分费用可以通过更好的术前评估、优质护理、患者教育和明确的患者出院指示来避免。术前评估涉及医生和医疗保健提供者收集患者的健康史,这可能有助于医疗保健提供者提前了解与手术相关的风险。
风险包括先前存在的疾病、当前的药物、患者的心理健康状况等。例如,患有糖尿病和高血压等疾病的患者术后再入院的风险很高。此外,如果药物管理不善,患者当前正在服用的药物也可能会增加再次入院的风险。
本文中的代码可在GitHub上找到。
https://github.com/spierre91/medium_code/blob/master/datafabrica/eda_patient_payer.ipynb
代码解读
结论
在这篇文章中,我们对 DataFabrica 综合医疗保健患者付款人数据进行了探索性数据分析。患者付款人数据对于各种医疗保健分析用例非常有用。在我们的分析中,我们研究了急诊室患者的再入院情况,这对医院来说是一个持续的挑战。患者再入院与护理质量差、患者治疗结果不佳和医疗费用较高有关。因此,能够分析和考虑导致再入院的因素是很有用的。虽然我们只考虑患者重新入院,但其他用例包括健康保险欺诈分析/检测和患者住院时间预测。在未来的帖子中,我们将分析一些额外的患者再入院场景以及其他医疗保健分析用例。
合成信用卡数据的免费版本就在这里。完整的数据集可以在这里找到。
https://datafabrica.info/products/free-healthcare-patient-payer-data-sample
代码解读
