DPCデータの分析とかやるブログ

DPCデータの分析なんかをテキトーにやってます。

DPC疾患の月別推移を可視化する

今回はDPC入院料の分析のお話です。
DPC入院料の推移を見ると、時折奇妙な動きをすることがあります。特定の科の数字が跳ね上がったり、下がったりです。
もちろん中身をチェックすることになりますが、毎回集計して目で見るのは面倒ですね。自動化しましょう。 まず、元のデータとしてこんなものを用意します。

data = psql.read_sql("select to_char(実施年月日,'YYYYMM') AS month,データ識別番号,実施年月日,診療科区分,分類番号, \
sum(行為点数*行為回数) AS DPC総点数 \
from dtable \
Where データ区分 = 93 \
group by month,データ識別番号,実施年月日,診療科区分,分類番号",connection)

これで、診療月/診療科区分/分類番号を含むデータが得られました。 さて、次に出すのは分類別の集計です。DPC分類を使うとデータが細かくなりすぎますので、MDC6を使うことにします。
(分類番号の頭6桁を切り出すだけです)
点数合計の推移が見たいときもあれば、延べ件数が見たいとき、平均が見たいときなどもあるでしょう。 グラフに出来るといいですね。
深く考えずに全部突っ込んでみます。

def diff_dpc(df,ka=None,func='sum'):
    '''月別・MDC6別に集計したDataFrameを返す。funcはmean,sum,count辺りが良いが、
    groupbyで使えるなら何でもいい。
  同時に比較結果をグラフにして表示する。
    kaはオプションだが、無いと項目数が多すぎてグラフが見づらい'''
    if ka:
        df = df[df['診療科区分'] == ka]
    else:
        pass
    
    df['MDC6'] = [x[0:6] for x in df['分類番号']]
    
    result = df.groupby(['month','MDC6']).agg(func)
    result.reset_index(inplace=True)

    ax = sns.barplot(x='MDC6',y='dpc総点数',hue='month',data=result)
    for item in ax.get_xticklabels():
        item.set_rotation(90)
    plt.show()
    
    return result

実際には diff_dpc(data,ka=110,func='count') のようにして使います。 グラフの描画は完全に副作用ですし、引数で指定するかclassに書き換えて独立メソッドにした方がいい気もしますね…