Kaggle上で「Health」で検索しても医療に関するデータセットがヒットしますね。
職業柄、心エコーとか、ウォールモーションって聞いたことあるけど、なんだ?と思ったので心エコー図のデータセットを見てみることにしました。
データセットについて
- 心臓発作を起こしたことのある患者について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年は生存していた |
相関図
ウォールモーションスコアとの相関図が高いようです。
ウォールモーション
このウォールモーションについて調べて見たのですが、かなり専門的な内容のようです。
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 であり,心機能低下が高度なほど高値となる
ただし、上記の引用した内容とは異なり、データセットの場合は、値が高い方が、生存するようなので、計測方法は異なると思われます。
心エコーとは
超音波検査(エコー)の一種です。
超音波で心臓の大きさ、動き、弁の状態、血液の流れを検査します。
目標変数のばらつき
偏ったりしてないだろうかと思ったのですが、そこまでは偏ってませんでした。
このデータを機械学習する難しさ
相関図を出そうとしたら
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
となってしまいました。欠損値があるようです。
データセットの説明にもデータの少なさという課題については触れられてました。
一応、機械学習をしてみることにしました。
ううーん。28%は、かなり酷い値。2値問題の結果として、50%を下回るというのは、マズイですね。
散布図にしてみると、ウォールモーションスコアも年齢も、この値以降ならば、aliveat1が1になるという切れ目もない様子。