[データ解析]健診データのクラスタリング
利用ライブラリ:library(gplots); library(ggplot2) 主な関数 :heatmap.2(Data, density.info="none", trace="none", hclustfun=function(d) hclust(d, method="ward")); ggplot() + geom_rect() + scale_x_continuous()
健診データをクラスタリングしてみる。
同時に確認するのならヒートマップが良い。
対象者(横軸)は細かく分かれていてあんまり綺麗じゃないけど、変数(縦軸)は項目毎に分かれていそう。
体型・血圧・脂質・血糖・肝機能・尿酸・尿検査・貧血に分かれている。
これらの項目同士の相関はある程度あるけど、独立リスク因子として考えた方が無難っぽい。
法定階層化はそんなに間違ってないんだろうなぁ(まぁもともと批判の多くはウエストの基準に対してだけだったようにも思うし)。
また対象者の方をクラスタリングすると次のようになる。
上に挙げた因子はやっぱり一緒に動いている印象。
階層化のようにリスクカテゴリにして、二値変数で”リスクパターン”を探索した方が生産的かもなぁ。
クラスタリング結果を描いたコードは↓
(今回データは無しです)
#------クラスターごとの特徴を確認(yは1~15変数が検査値、16変数にクラスターフラグ) #---標準化した後平均値を出す yScale <- apply(y[, -16], 2, scale) ClusterMean <- apply(yScale, 2, function(d) tapply(d, y$cluster, mean)) #---HDLとHBはリスク方向が逆 ClusterMean[, 10] <- -ClusterMean[, 10] ClusterMean[, 15] <- -ClusterMean[, 15] ClusterMeanVec <- data.frame(mean=c(t(ClusterMean)), label=rep(1:ncol(ClusterMean), nrow(ClusterMean)), class=factor(rep(c(1:nrow(ClusterMean)), rep(ncol(ClusterMean), nrow(ClusterMean))))) #---長方形と折れ線で確認(あまり綺麗じゃないなぁ) library(ggplot2) ggplot(ClusterMeanVec, aes(xmin=label+(as.numeric(class)-5)/11, xmax=label+(as.numeric(class)-4)/11, ymin=0, ymax=mean, x=label+(as.numeric(class)-4.5)/11, y=mean, col=class, fill=class)) + xlab(NULL) + geom_rect(alpha=0.3) + geom_line() + scale_x_continuous(breaks=1:ncol(ClusterMean), labels=colnames(ClusterMean)) #---各クラスタの人数を追加 text(seq(5, 10, length.out=10), 1, 1:10) text(seq(5, 10, length.out=10), 0.98, table(y$cluster))