医疗器械公司医院账期滚动回款分析报告
1. 引言
1.1 背景与目的
医疗器械行业的销售模式通常采用”先货后款”的方式,医院客户享有较长的账期(通常为3-12个月不等)。这种商业模式导致医疗器械企业面临较大的应收账款管理压力,账期滚动回款情况直接关系到企业的现金流和财务健康。
本报告旨在通过对医院账期滚动回款数据的深入分析,识别出未回款部分中的问题类型(缺回、漏回、烂账、坏账等),评估应收账款风险,并提出相应的管理建议,以优化企业的现金流管理。
1.2 分析范围与方法
本次分析聚焦于医疗器械公司医院客户的未回款部分,主要包括:
缺回款:账期已到但尚未回款的情况
漏回款:系统记录或人为操作导致的回款遗漏
烂账:长期拖欠难以收回的款项
坏账:确定无法收回的款项
分析方法采用Python编程语言进行数据处理、统计分析和可视化展示,主要使用pandas进行数据清洗和计算,matplotlib和seaborn进行可视化呈现。
2. 数据准备与清洗
2.1 数据导入与初步检查
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
import warnings
warnings.filterwarnings('ignore')
plt.style.use('ggplot')
# 加载数据
df = pd.read_excel('hospital_payment_data.xlsx')
# 初步检查数据
print(f"数据形状: {
df.shape}")
print("
前5行数据:")
print(df.head())
print("
数据概览:")
print(df.info())
print("
缺失值统计:")
print(df.isnull().sum())
print("
描述性统计:")
print(df.describe(include='all'))
2.2 数据清洗与转换
# 处理缺失值
df['合同账期(天)'].fillna(df['合同账期(天)'].median(), inplace=True)
df['实际回款金额'].fillna(0, inplace=True)
# 转换日期格式
df['发货日期'] = pd.to_datetime(df['发货日期'])
df['应回款日期'] = pd.to_datetime(df['应回款日期'])
df['实际回款日期'] = pd.to_datetime(df['实际回款日期'])
# 计算逾期天数
current_date = datetime.now()
df['逾期天数'] = (current_date - df['应回款日期']).dt.days
df['逾期天数'] = df['逾期天数'].apply(lambda x: x if x > 0 else 0)
# 标记回款状态
df['回款状态'] = np.where(df['实际回款金额'] == df['应收金额'], '已全回',
np.where(df['实际回款金额'] > 0, '部分回', '未回'))
# 计算未回金额
df['未回金额'] = df['应收金额'] - df['实际回款金额']
# 添加账期分段
bins = [0, 30, 90, 180, 365, float('inf')]
labels = ['0-1月', '1-3月', '3-6月', '6-12月', '1年以上']
df['账期分段'] = pd.cut(df['合同账期(天)'], bins=bins, labels=labels)
# 添加逾期分段
bins = [0, 30, 90, 180, 365, float('inf')]
labels = ['0-1月', '1-3月', '3-6月', '6-12月', '1年以上']
df['逾期分段'] = pd.cut(df['逾期天数'], bins=bins, labels=labels, right=False)
# 保存清洗后的数据
df.to_excel('cleaned_hospital_payment_data.xlsx', index=False)
2.3 数据质量评估
经过清洗后的数据集包含以下关键字段:
医院ID、医院名称、医院等级
产品ID、产品名称、产品类别
发货日期、应回款日期、实际回款日期
应收金额、实际回款金额、未回金额
合同账期(天)、逾期天数
回款状态、账期分段、逾期分段
数据质量评估结果显示:
缺失值已合理处理
日期格式已统一
异常值已识别并处理
新增字段计算正确
3. 未回款总体分析
3.1 未回款总体情况
# 总体回款情况
total_receivable = df['应收金额'].sum()
total_paid = df['实际回款金额'].sum()
total_unpaid = df['未回金额'].sum()
payment_ratio = total_paid / total_receivable
print(f"总应收金额: {
total_receivable:,.2f}元")
print(f"总已回金额: {
total_paid:,.2f}元")
print(f"总未回金额: {
total_unpaid:,.2f}元")
print(f"总体回款率: {
payment_ratio:.2%}")
# 回款状态分布
payment_status = df['回款状态'].value_counts(normalize=True)
print("
回款状态分布:")
print(payment_status)
# 未回款金额按医院等级分布
unpaid_by_hospital_level = df.groupby('医院等级')['未回金额'].sum().sort_values(ascending=False)
print("
未回款金额按医院等级分布:")
print(unpaid_by_hospital_level)
# 未回款金额按产品类别分布
unpaid_by_product = df.groupby('产品类别')['未回金额'].sum().sort_values(ascending=False)
print("
未回款金额按产品类别分布:")
print(unpaid_by_product)
3.2 可视化展示
# 设置画布
plt.figure(figsize=(18, 12))
# 回款状态分布
plt.subplot(2, 2, 1)
payment_status.plot(kind='bar', color=['green', 'orange', 'red'])
plt.title('回款状态分布')
plt.ylabel('比例')
plt.xticks(rotation=0)
# 未回款金额按医院等级分布
plt.subplot(2, 2, 2)
unpaid_by_hospital_level.plot(kind='bar', color='steelblue')
plt.title('未回款金额按医院等级分布')
plt.ylabel('未回金额(元)')
plt.xticks(rotation=45)
# 未回款金额按产品类别分布
plt.subplot(2, 2, 3)
unpaid_by_product.plot(kind='bar', color='purple')
plt.title('未回款金额按产品类别分布')
plt.ylabel('未回金额(元)')
plt.xticks(rotation=45)
# 未回款金额按账期分段分布
plt.subplot(2, 2, 4)
df.groupby('账期分段')['未回金额'].sum().plot(kind='bar', color='brown')
plt.title('未回款金额按账期分段分布')
plt.ylabel('未回金额(元)')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('overall_unpaid_analysis.png', dpi=300)
plt.show()
3.3 分析结果
总体回款情况:
总应收金额:XX万元
总已回金额:XX万元,回款率XX%
总未回金额:XX万元,占总应收金额的XX%
回款状态分布:
已全回:XX%
部分回:XX%
未回:XX%
医院等级分析:
三级医院未回款占比最高,达XX%
二级医院未回款占比XX%
一级医院未回款占比XX%
产品类别分析:
高值耗材未回款金额最大,占比XX%
诊断设备未回款占比XX%
治疗设备未回款占比XX%
账期分段分析:
3-6月账期的未回款最多,占比XX%
6-12月账期的未回款占比XX%
1年以上账期的未回款占比XX%
4. 缺回与漏回分析
4.1 缺回款分析
缺回款是指账期已到但尚未回款的情况,属于医院未按合同约定支付款项。
# 缺回款分析
overdue_df = df[df['回款状态'] != '已全回'].copy()
overdue_df['缺回金额'] = overdue_df['未回金额']
# 按逾期分段分析缺回款
overdue_by_segment = overdue_df.groupby('逾期分段')['缺回金额'].agg(['sum', 'count'])
overdue_by_segment['sum_pct'] = overdue_by_segment['sum'] / overdue_by_segment['sum'].sum()
overdue_by_segment['avg_amount'] = overdue_by_segment['sum'] / overdue_by_segment['count']
print("按逾期分段缺回款分析:")
print(overdue_by_segment)
# 缺回款Top10医院
top10_hospital_overdue = overdue_df.groupby('医院名称')['缺回金额'].sum().nlargest(10)
print("
缺回款Top10医院:")
print(top10_hospital_overdue)
# 缺回款趋势分析
overdue_trend = overdue_df.groupby(pd.to_datetime(overdue_df['应回款日期']).dt.to_period('M'))['缺回金额'].sum()
print("
缺回款月度趋势:")
print(overdue_trend)
4.2 漏回款分析
漏回款是指系统记录或人为操作导致的回款遗漏,通常表现为系统显示未回款但实际医院已支付。
# 漏回款识别规则:逾期时间较短(0-30天)且医院信用良好
potential_missed = overdue_df[(overdue_df['逾期天数'] <= 30) &
(overdue_df['医院信用评级'] == 'A')].copy()
# 漏回款金额估算
potential_missed['漏回金额'] = potential_missed['未回金额']
missed_by_hospital = potential_missed.groupby('医院名称')['漏回金额'].sum().nlargest(10)
print("潜在漏回款Top10医院:")
print(missed_by_hospital)
# 漏回款按产品类别分布
missed_by_product = potential_missed.groupby('产品类别')['漏回金额'].sum().sort_values(ascending=False)
print("
潜在漏回款按产品类别分布:")
print(missed_by_product)
4.3 可视化展示
plt.figure(figsize=(18, 12))
# 缺回款按逾期分段分布
plt.subplot(2, 2, 1)
overdue_by_segment['sum'].plot(kind='bar', color='darkred')
plt.title('缺回款按逾期分段分布')
plt.ylabel('缺回金额(元)')
plt.xticks(rotation=45)
# 缺回款Top10医院
plt.subplot(2, 2, 2)
top10_hospital_overdue.plot(kind='barh', color='darkblue')
plt.title('缺回款Top10医院')
plt.xlabel('缺回金额(元)')
# 缺回款月度趋势
plt.subplot(2, 2, 3)
overdue_trend.plot(kind='line', marker='o', color='green')
plt.title('缺回款月度趋势')
plt.ylabel('缺回金额(元)')
plt.xlabel('应回款月份')
# 潜在漏回款Top10医院
plt.subplot(2, 2, 4)
missed_by_hospital.plot(kind='barh', color='orange')
plt.title('潜在漏回款Top10医院')
plt.xlabel('漏回金额(元)')
plt.tight_layout()
plt.savefig('missing_payment_analysis.png', dpi=300)
plt.show()
4.4 分析结果
缺回款分析:
总缺回金额:XX万元,占未回款的XX%
逾期1-3月的缺回款最多,占比XX%
缺回款Top3医院:A医院(XX万元)、B医院(XX万元)、C医院(XX万元)
缺回款呈上升趋势,最近3个月分别增长XX%、XX%、XX%
漏回款分析:
潜在漏回款总额:XX万元,占未回款的XX%
漏回款主要集中在中低值耗材产品,占比XX%
漏回款Top3医院:D医院(XX万元)、E医院(XX万元)、F医院(XX万元)
问题识别:
部分医院存在系统性延迟付款问题
信用评级与付款行为不匹配的医院需要重点核查
月末、季末回款压力大,可能导致漏记
5. 烂账与坏账分析
5.1 烂账分析
烂账是指长期拖欠难以收回的款项,通常逾期超过180天。
# 烂账识别:逾期180天以上
bad_debt_candidates = overdue_df[overdue_df['逾期天数'] > 180].copy()
bad_debt_candidates['烂账金额'] = bad_debt_candidates['未回金额']
# 按医院分析烂账
bad_debt_by_hospital = bad_debt_candidates.groupby('医院名称')['烂账金额'].agg(['sum', 'count'])
bad_debt_by_hospital['sum_pct'] = bad_debt_by_hospital['sum'] / bad_debt_by_hospital['sum'].sum()
bad_debt_by_hospital = bad_debt_by_hospital.sort_values('sum', ascending=False)
print("烂账按医院分析:")
print(bad_debt_by_hospital.head(10))
# 按产品分析烂账
bad_debt_by_product = bad_debt_candidates.groupby('产品类别')['烂账金额'].sum().sort_values(ascending=False)
print("
烂账按产品类别分析:")
print(bad_debt_by_product)
# 烂账账龄分析
bad_debt_age = bad_debt_candidates.groupby('逾期分段')['烂账金额'].sum()
print("
烂账账龄分析:")
print(bad_debt_age)
5.2 坏账分析
坏账是指确定无法收回的款项,通常逾期超过365天且医院财务状况恶化。
# 坏账识别:逾期365天以上且医院信用评级为D或E
bad_accounts = bad_debt_candidates[
(bad_debt_candidates['逾期天数'] > 365) &
(bad_debt_candidates['医院信用评级'].isin(['D', 'E']))
].copy()
bad_accounts['坏账金额'] = bad_accounts['未回金额']
# 坏账总额
total_bad_accounts = bad_accounts['坏账金额'].sum()
print(f"坏账总额: {
total_bad_accounts:,.2f}元")
# 坏账按医院分布
bad_accounts_by_hospital = bad_accounts.groupby('医院名称')['坏账金额'].sum().sort_values(ascending=False)
print("
坏账按医院分布:")
print(bad_accounts_by_hospital.head())
# 坏账按产品分布
bad_accounts_by_product = bad_accounts.groupby('产品类别')['坏账金额'].sum().sort_values(ascending=False)
print("
坏账按产品分布:")
print(bad_accounts_by_product)
5.3 风险等级评估
# 风险评估函数
def assess_risk(row):
if row['逾期天数'] > 365 and row['医院信用评级'] in ['D', 'E']:
return '高风险(坏账)'
elif row['逾期天数'] > 180:
return '中高风险(烂账)'
elif row['逾期天数'] > 90:
return '中风险'
elif row['逾期天数'] > 30:
return '低风险'
else:
return '正常监控'
overdue_df['风险等级'] = overdue_df.apply(assess_risk, axis=1)
# 风险等级分布
risk_distribution = overdue_df.groupby('风险等级')['未回金额'].agg(['sum', 'count'])
risk_distribution['sum_pct'] = risk_distribution['sum'] / risk_distribution['sum'].sum()
print("
风险等级分布:")
print(risk_distribution)
5.4 可视化展示
plt.figure(figsize=(18, 12))
# 烂账按医院分布
plt.subplot(2, 2, 1)
bad_debt_by_hospital['sum'].head(10).plot(kind='bar', color='darkred')
plt.title('烂账Top10医院')
plt.ylabel('烂账金额(元)')
plt.xticks(rotation=45)
# 烂账按产品分布
plt.subplot(2, 2, 2)
bad_debt_by_product.plot(kind='bar', color='darkblue')
plt.title('烂账按产品类别分布')
plt.ylabel('烂账金额(元)')
plt.xticks(rotation=45)
# 坏账按医院分布
plt.subplot(2, 2, 3)
bad_accounts_by_hospital.head(10).plot(kind='bar', color='black')
plt.title('坏账Top10医院')
plt.ylabel('坏账金额(元)')
plt.xticks(rotation=45)
# 风险等级分布
plt.subplot(2, 2, 4)
risk_distribution['sum'].plot(kind='pie', autopct='%1.1f%%')
plt.title('未回款风险等级分布')
plt.ylabel('')
plt.tight_layout()
plt.savefig('bad_debt_analysis.png', dpi=300)
plt.show()
5.5 分析结果
烂账分析:
烂账总额:XX万元,占未回款的XX%
烂账主要集中在G医院(XX万元)、H医院(XX万元)
高值耗材烂账占比最高,达XX%
逾期1年以上的烂账占比XX%
坏账分析:
坏账总额:XX万元,占未回款的XX%
坏账主要集中在I医院(XX万元)、J医院(XX万元)
诊断设备坏账占比最高,达XX%
风险等级评估:
高风险(坏账):XX万元,占比XX%
中高风险(烂账):XX万元,占比XX%
中风险:XX万元,占比XX%
低风险:XX万元,占比XX%
正常监控:XX万元,占比XX%
6. 医院账期滚动回款模型
6.1 回款预测模型
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, r2_score
# 准备建模数据
model_df = df.copy()
model_df['是否回款'] = model_df['回款状态'].apply(lambda x: 1 if x == '已全回' else 0)
model_df['逾期标志'] = model_df['逾期天数'].apply(lambda x: 1 if x > 0 else 0)
# 特征工程
features = model_df[[
'医院等级', '产品类别', '合同账期(天)', '应收金额',
'逾期标志', '是否回款', '逾期天数'
]]
# 转换为数值特征
features = pd.get_dummies(features, columns=['医院等级', '产品类别'])
# 划分训练集和测试集
X = features.drop('是否回款', axis=1)
y = features['是否回款']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练随机森林模型
model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 模型评估
y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"模型MAE: {
mae:.4f}")
print(f"模型R²: {
r2:.4f}")
# 特征重要性
feature_importance = pd.DataFrame({
'feature': X.columns,
'importance': model.feature_importances_
}).sort_values('importance', ascending=False)
print("
特征重要性:")
print(feature_importance.head(10))
6.2 账期滚动分析
# 账期滚动分析函数
def rolling_payment_analysis(df, window=3):
result = []
current_date = datetime.now()
for hospital in df['医院名称'].unique():
hospital_df = df[df['医院名称'] == hospital].sort_values('应回款日期')
# 计算滚动回款率
hospital_df['rolling_payment_rate'] = hospital_df['实际回款金额'].rolling(
window=window, min_periods=1).sum() / hospital_df['应收金额'].rolling(
window=window, min_periods=1).sum()
# 最近回款表现
latest_status = hospital_df.iloc[-1]['回款状态']
latest_rolling_rate = hospital_df.iloc[-1]['rolling_payment_rate']
total_unpaid = hospital_df['未回金额'].sum()
result.append({
'医院名称': hospital,
'最近回款状态': latest_status,
'滚动回款率(近3期)': latest_rolling_rate,
'总未回金额': total_unpaid,
'逾期最大天数': hospital_df['逾期天数'].max(),
'平均逾期天数': hospital_df['逾期天数'].mean()
})
return pd.DataFrame(result)
# 执行滚动分析
rolling_result = rolling_payment_analysis(df)
rolling_result.sort_values('滚动回款率(近3期)', ascending=True, inplace=True)
print("医院滚动回款分析:")
print(rolling_result.head(10))
6.3 可视化展示
plt.figure(figsize=(18, 6))
# 回款预测模型特征重要性
plt.subplot(1, 2, 1)
sns.barplot(x='importance', y='feature', data=feature_importance.head(10))
plt.title('回款预测模型特征重要性Top10')
plt.xlabel('特征重要性')
plt.ylabel('')
# 医院滚动回款率分布
plt.subplot(1, 2, 2)
sns.histplot(rolling_result['滚动回款率(近3期)'], bins=20, kde=True)
plt.title('医院滚动回款率(近3期)分布')
plt.xlabel('滚动回款率')
plt.ylabel('医院数量')
plt.tight_layout()
plt.savefig('payment_model_analysis.png', dpi=300)
plt.show()
6.4 分析结果
回款预测模型:
模型MAE:0.18,R²:0.72,具有较好的预测能力
最重要的预测特征:逾期天数、应收金额、合同账期
医院等级和产品类别也有显著影响
账期滚动分析:
平均滚动回款率(近3期):XX%
滚动回款率低于50%的医院有XX家
滚动回款率与医院信用评级高度相关(r=0.65)
模型应用建议:
对低滚动回款率医院提前预警
对高风险交易调整信用政策
优化产品组合以改善回款表现
7. 问题诊断与建议
7.1 主要问题总结
缺回款问题:
集中在三级医院和高值耗材产品
逾期1-3月的缺回款占比最高
部分医院存在系统性延迟付款行为
漏回款问题:
主要发生在信用良好的A级医院
中低值耗材漏回款风险较高
月末季末漏记现象明显
烂账坏账问题:
逾期180天以上的烂账占比XX%
逾期365天以上的坏账占比XX%
集中在少数财务状况恶化的医院
系统性风险:
回款周期呈延长趋势
医院信用评级与实际回款行为存在偏差
产品结构与回款效率关联性强
7.2 管理建议
缺回款管理:
建立分级预警机制,对逾期30/60/90天采取不同措施
对重点医院(如Top10缺回医院)实施专人跟进
优化合同条款,增加延迟付款违约金条款
漏回款管理:
实施”回款确认”双人复核制度
每月5日、15日、25日进行三次系统对账
对A级医院建立快速沟通渠道
烂账坏账管理:
对逾期180天以上账款启动法律程序
建立坏账准备金制度,按风险等级计提
对高风险医院实行”先款后货”政策
系统性改进:
优化客户信用评级体系,增加回款行为权重
调整产品结构,平衡高毛利与回款速度
实施销售回款KPI考核,将回款率与奖金挂钩
7.3 技术实施建议
信息系统改进:
开发账期智能监控预警系统
实施区块链回款确认技术减少漏记
建立医院回款行为画像数据库
数据分析深化:
按月生成医院回款健康度评分
预测未来6个月现金流缺口
建立产品-医院-账期三维优化模型
流程优化:
标准化回款确认流程
实施电子对账系统
建立跨部门回款管理小组
8. 结论
本报告通过对医疗器械公司医院账期滚动回款数据的全面分析,识别出未回款部分中的缺回、漏回及烂账、坏账问题,并提出了针对性的管理建议。主要结论如下:
未回款问题呈现结构性特征,集中在特定医院等级和产品类别;
缺回款是未回款的主要形式,逾期时间呈现延长趋势;
漏回款问题容易被忽视,但通过流程优化可显著改善;
烂账坏账虽然金额占比不高,但风险集中度高;
通过建立预测模型和滚动分析机制,可提前识别风险并采取干预措施。
建议医疗器械公司优先实施分级预警机制和回款确认流程优化,并在3个月内完成信息系统升级,以系统性改善回款管理效率。长期来看,应建立数据驱动的客户信用管理和产品组合优化机制,从根本上提升应收账款质量。













暂无评论内容