より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

心エコー図のデータセット「echocardiogram-UCI」による分析。ウォールモーションって何?

Kaggle上で「Health」で検索しても医療に関するデータセットがヒットしますね。

www.kaggle.com

職業柄、心エコーとか、ウォールモーションって聞いたことあるけど、なんだ?と思ったので心エコー図のデータセットを見てみることにしました。

データセットについて

  • 心臓発作を起こしたことのある患者について1年間生存したかというデータセットです。
  • データセットが132行と多くない
  • 生存していないケースを正しく予測したい(救えなかった命について治療を検討しなければならないということでしょう)

詳細

項目名 説明
survival 生存期間(月)
alive 生存期間の終わりに死亡=0 生存=1
age 心臓発作が発生した年齢
pericardialeffusion 心外液が流動的か(0/1)
fractionalshortening 心臓の周囲の収縮性の尺度。低いほど異常
epss E点中隔分離、収縮性のもう1つの尺度。大きいほど異常
lvdd 左室拡張末期寸法。これは拡張末期の心臓の大きさの尺度。大きいほど病気になりやすい
wallmotion-score 心室のセグメントでどのように動いているかの尺度
wallmotion-index ウォールモーションスコアを見たセグメント数で割った値。心エコー図では12~13のセグメントを見る。wallmotion-scoreの代わりにこちらを使う
mult 無視していい値
name 患者名。置換済み。(よって、不要な変数
group 無視していい値
aliveat1 0=患者が1年以内に死亡/1=患者が1年は生存していた

相関図

ウォールモーションスコアとの相関図が高いようです。

f:id:rimever:20190106195021p:plain

ウォールモーション

このウォールモーションについて調べて見たのですが、かなり専門的な内容のようです。

http://jams.med.or.jp/symposium/full/122040.pdfより

2)16 分画左室壁運動スコア(Wall Motion Score Index : WMSI)

局所的な機能低下が出現する例では,局所的な機能評価が必要である.

一般に左室を 16セグメントに分割し,それぞれの分画で壁運動をスコア化し,評価する.

正常=1,低収縮=2,無収縮=3,外側運動=4,心室瘤=5 点とし,

このスコアの平均値が Wall Motion ScoreIndex(WMSI)である.

WMSI は健常例では1.0 であり,心機能低下が高度なほど高値となる

ただし、上記の引用した内容とは異なり、データセットの場合は、値が高い方が、生存するようなので、計測方法は異なると思われます。

心エコーとは

超音波検査(エコー)の一種です。

超音波で心臓の大きさ、動き、弁の状態、血液の流れを検査します。

目標変数のばらつき

偏ったりしてないだろうかと思ったのですが、そこまでは偏ってませんでした。

f:id:rimever:20190108075555p:plain

このデータを機械学習する難しさ

相関図を出そうとしたら

import seaborn as sns
k  = 8
target_col = 'aliveat1'
corrmat = df.corr()
cols = corrmat.nlargest(k, target_col)[target_col].index
cm = np.corrcoef(df[cols].values.T)
plt.subplots(figsize=(9, 9))
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, cbar = True, annot = True, square=True, fmt='.2f', annot_kws={'size':10},yticklabels=cols.values,xticklabels=cols.values)
plt.show()

Traceback (most recent call last): at cell 7, line 9 at /opt/anaconda3/envs/datalore-user/lib/python3.6/site-packages/seaborn/matrix.py, line 517, in heatmap at /opt/anaconda3/envs/datalore-user/lib/python3.6/site-packages/seaborn/matrix.py, line 167, in init at /opt/anaconda3/envs/datalore-user/lib/python3.6/site-packages/seaborn/matrix.py, line 206, in determine_cmap_params at /opt/anaconda3/envs/datalore-user/lib/python3.6/site-packages/numpy/core/methods.py, line 32, in _amin ValueError: zero-size array to reduction operation minimum which has no identity

となってしまいました。欠損値があるようです。

データセットの説明にもデータの少なさという課題については触れられてました。

一応、機械学習をしてみることにしました。

f:id:rimever:20190113203508p:plain

ううーん。28%は、かなり酷い値。2値問題の結果として、50%を下回るというのは、マズイですね。

f:id:rimever:20190113203903p:plain

散布図にしてみると、ウォールモーションスコアも年齢も、この値以降ならば、aliveat1が1になるという切れ目もない様子。