医疗器械公司医院账期滚动回款分析报告

医疗器械公司医院账期滚动回款分析报告

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个月内完成信息系统升级,以系统性改善回款管理效率。长期来看,应建立数据驱动的客户信用管理和产品组合优化机制,从根本上提升应收账款质量。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
小明的头像 - 宋马
评论 抢沙发

请登录后发表评论

    暂无评论内容