今回の分析作業に必要なパッケージを先に読み込んでおく。
library(reshape2)
library(dplyr)
library(ggplot2)
library(FactoMineR)
library(fpc)
OBSの授業「ビジネス統計分析」でも利用した都道府県別医療関係データを用いて、主成分分析とクラスタリング分析について発展的な事柄についてまとめたのが本資料である。データファイルはCSVファイルとして保存されている。
iryou <- read.csv(file="Iryou-Pref.csv")
head(iryou)
## Pref D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12
## 1 Hokkaido 9.2 62.0 1536.3 224.6 1170.2 7.4 42.9 42.0 10.9 9.6 1.4 80.2
## 2 Aomori 6.4 66.1 1111.5 184.5 1018.1 8.3 35.7 43.3 9.8 7.9 1.3 77.4
## 3 Iwate 5.9 70.5 1081.4 189.6 972.1 7.6 36.9 44.1 8.5 7.1 1.3 75.9
## 4 Miyagi 4.9 69.5 870.1 218.3 856.9 4.8 42.2 47.7 8.4 6.2 1.2 75.7
## 5 Akita 5.5 77.2 1178.5 207.5 1004.2 8.0 37.4 50.0 9.7 7.1 1.3 78.6
## 6 Yamagata 4.8 81.0 1025.6 210.0 941.8 6.7 37.0 47.4 8.4 7.0 1.3 80.3
## D13 D14 D15 D16 D17 D18 D19 D20 D21 D22
## 1 30.7 14626.5 1.96 625.4 341.0 12.5 4.6 175.5 92.0 21.2
## 2 27.3 11484.5 2.27 725.2 369.7 16.0 5.3 198.7 135.5 23.3
## 3 25.9 11572.5 2.07 725.0 333.0 13.2 6.2 211.7 160.9 26.4
## 4 20.7 11640.5 1.84 547.1 280.4 10.1 6.5 143.7 106.3 19.8
## 5 25.9 13054.2 2.08 785.7 392.8 15.2 7.4 207.4 162.8 26.5
## 6 22.4 13405.8 1.80 727.3 353.4 11.3 5.8 204.7 152.1 24.6
まず都道府県の名“Pref”をケース名に設定する。なおOBSの授業『ビジネス統計分析』ではRコマンダーを利用している。同じ作業をコマンドを使って行うなら以下のようになる。この資料では実行コマンドを敢えて表示して勉強の便に資したい。
rownames(iryou) <- iryou$Pref
vars <- colnames(iryou)[-1]
最初にデータの要約をする。量的変量なら最大値と最小値、中央値や平均値を確認しておく。質的変量なら不審なラベルがないかどうかを見ておこう。
summary(iryou[,vars])
## D1 D2 D3 D4
## Min. : 3.300 Min. : 57.00 Min. : 692.2 Min. :148.2
## 1st Qu.: 4.850 1st Qu.: 71.35 1st Qu.: 953.3 1st Qu.:201.4
## Median : 6.100 Median : 80.00 Median :1111.5 Median :228.0
## Mean : 6.991 Mean : 79.61 Mean :1168.6 Mean :230.3
## 3rd Qu.: 8.400 3rd Qu.: 88.70 3rd Qu.:1362.8 3rd Qu.:261.2
## Max. :16.100 Max. :108.80 Max. :2201.7 Max. :296.7
## D5 D6 D7 D8
## Min. : 609.7 Min. : 2.600 Min. :33.40 Min. :32.50
## 1st Qu.: 856.6 1st Qu.: 4.700 1st Qu.:39.85 1st Qu.:40.65
## Median :1001.1 Median : 6.000 Median :42.30 Median :44.10
## Mean :1022.0 Mean : 5.891 Mean :42.73 Mean :44.75
## 3rd Qu.:1170.8 3rd Qu.: 6.700 3rd Qu.:45.25 3rd Qu.:48.90
## Max. :1484.3 Max. :11.400 Max. :59.70 Max. :62.20
## D9 D10 D11 D12
## Min. : 6.300 Min. : 4.500 Min. :1.100 Min. :72.40
## 1st Qu.: 8.100 1st Qu.: 6.450 1st Qu.:1.250 1st Qu.:78.45
## Median : 8.700 Median : 7.100 Median :1.300 Median :79.60
## Mean : 8.862 Mean : 7.362 Mean :1.296 Mean :80.00
## 3rd Qu.: 9.750 3rd Qu.: 8.100 3rd Qu.:1.300 3rd Qu.:82.45
## Max. :10.900 Max. :10.900 Max. :1.600 Max. :87.70
## D13 D14 D15 D16
## Min. :20.2 Min. : 7923 Min. :1.640 Min. :401.2
## 1st Qu.:24.6 1st Qu.:11323 1st Qu.:1.830 1st Qu.:562.0
## Median :26.6 Median :12565 Median :1.850 Median :601.5
## Mean :27.5 Mean :12340 Mean :1.884 Mean :608.8
## 3rd Qu.:29.1 3rd Qu.:13519 3rd Qu.:1.965 3rd Qu.:674.5
## Max. :46.5 Max. :14948 Max. :2.270 Max. :785.7
## D17 D18 D19 D20
## Min. :213.3 Min. : 7.10 Min. :3.200 Min. :107.9
## 1st Qu.:290.9 1st Qu.:10.45 1st Qu.:4.950 1st Qu.:154.2
## Median :300.9 Median :11.90 Median :6.000 Median :173.9
## Mean :307.9 Mean :12.08 Mean :5.962 Mean :174.5
## 3rd Qu.:331.6 3rd Qu.:13.25 3rd Qu.:6.800 3rd Qu.:196.4
## Max. :392.8 Max. :17.60 Max. :9.200 Max. :245.3
## D21 D22
## Min. : 60.80 Min. :17.70
## 1st Qu.: 89.35 1st Qu.:19.80
## Median :106.40 Median :20.80
## Mean :108.32 Mean :21.16
## 3rd Qu.:121.30 3rd Qu.:22.35
## Max. :162.80 Max. :26.50
直ちに分かるのは項目間でデータの大きさがかなり違うという点である。主成分はばらつきの大きなデータの影響を受ける。そこでデータをすべて標準化して、尺度を共通化しておくのが主成分分析の鉄則である。Rコマンダーでは「相関行列を使う」ことで実質的には同じことをしている。
コマンド“scale”で各列のデータを標準化できるが、そのままではマトリックス型の値になる。後で主成分得点をデータセットに簡単に追加できるようにするため、iryou.stdをデータフレーム型にしている — Rコマンダーでデータセットと呼んでいるのはデータフレーム型の値である。
iryou.std <- as.data.frame(scale(iryou[,vars]))
標準化された数値を標準値と言う。この標準値は、統計分析で頻繁に使われる物差しになっている。受験でよく使われる偏差値も標準値から派生した尺度である。標準化をしてもデータの間の相関関係は変わらない。たとえば、身長と体重には正の相関がある―大きな人は背が高く、体重も重くなる傾向がある。実は、身長と体重を標準化しても相関係数は同じである。桁数の違いが大きいデータは扱いづらい。そんな時、単位を変えて桁数のバランスをとることが多いが、統計分析の場では標準化が最も頻繁にとられる尺度調整法になっている。
実際に、標準化されたデータの平均と分散を求めると、どの項目も平均が0、分散が1になっている。分散が1ということはその平方根である標準偏差も1である。
round(apply(iryou.std,2,mean),3)
## D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18
## 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## D19 D20 D21 D22
## 0 0 0 0
round(apply(iryou.std,2,var),3)
## D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## D19 D20 D21 D22
## 1 1 1 1
まず主成分分析を行う。Rコマンダーのメニューで主成分分析を選ぶとコマンド“princomp”が実行されるが、それよりは見やすいグラフを自動的に作成してくれるFactoMineRのPCAを使うことにする。Rコマンダーのプラグイン・ツール“RcmdrPlugin.FactoMineR”を利用しても同じである。
pca <- PCA(iryou.std)
コマンド“PCA”を実行すると、第1主成分と第2主成分を散布図にプロットした図が自動的に作成され、プロっとされた個々の点に対応するケース名が表示されるので便利である。加えて、元の個別データと二つの主成分がどのように関連しているかも別の図に視覚化される。
図“Variables factor map (PCA)”をみると、元の個別データのほとんど全ては第1主成分に対してプラスの寄与をしていることが分かる(データD7「年間救急出動件数だけは僅かに負の寄与であるが)。第1主成分は元のデータ全体の単純平均ではないにしても、概念としては合計にかなり近いものと解釈される。
第1主成分に対して第2主成分のほうは個別データとの関連に正負の違いが出ている。大雑把にみて、D1からD14までの医療機関の数や利用状況は正の寄与を、D15より後の病院別死亡率に関するデータは負の寄与をしているようである。第2主成分は医療機関の供給状況と死亡率の状況のバランスを測っているものと先ずは解釈してよさそうである。
主成分分析のウィークポイントは、得られた主成分の意味解釈にあることは授業中に話したことではあるが、この辺は対応分析と併用するとよいかもしれない。
FactoMineRの“PCA”コマンドは主成分得点を散布図に描いてくれるので大変便利であある。しかし、より掘り下げた分析を進めるには、やはり各都道府県の主成分得点をデータセットに追加しておきたい。それには以下のようにする。
まず主成分分析の結果を保存している“pca”の中身を確認する。
names(pca)
## [1] "eig" "var" "ind" "svd" "call"
色々な結果が保存されていることが分かるが、散布図を描くときに参照された座標値は結果“pca$ind$coord”の第1列“Dim.1”と第2列“Dim.2”であることが確認できる。実際、これらをそれぞれ“PC1”、“PC2”と名前をつけてデータセット“iryou.std”に追加し、散布図を描いてみると上と同じ散布図が得られる。
iryou.std$PC1 <- pca$ind$coord[,1]
iryou.std$PC2 <- pca$ind$coord[,2]
ggplot(iryou.std, aes(x=PC1,y=PC2)) +
geom_point() +
geom_text(aes(label=rownames(iryou.std)))
上で得られた二つの主成分(PC1とPC2)に基づいて、都道府県別医療状況のクラスター分析を行う。
OBSの授業「ビジネス統計分析」でも説明したとおり、クラスター分析には非階層型クラスタリングと階層型クラスタリングの二つの方法がある。
ここでは授業を復習する意味合いから、まず非階層型クラスタリングを行う。非階層型クラスタリングで大切な点は、第1にクラスタ数を指定しなければならないこと。第2はクラスターの種として最初にランダムにとられる何個かの点の選び方によって結果として得られるクラスター構成に違いがもたらされる、つまり実行するたびに異なった結果になる可能性があるということである。
都道府県を幾つのクラスターに分けるかだが、散布図をみて自然にクラスター数が見て取れるわけではない。こんな場合は、まずは上下左右に分けてみるという意味合いからクラスター数を4、あるいは3と指定して、その後でクラスターごとの特徴の違いを調べるという手順をとると色々なことが分かることが多い。
clst<-kmeans(iryou.std[,c("PC1","PC2")],centers=4,iter.max=100)
結果の一覧は次のとおりである。
names(clst)
## [1] "cluster" "centers" "totss" "withinss"
## [5] "tot.withinss" "betweenss" "size" "iter"
## [9] "ifault"
length(clst$cluster)
## [1] 47
結果の中の“cluster”がグループ分けされた後、各都道府県に割り当てられたグループ番号である。これを元のデータ表に“cluster”という名前で追加してから、四つのクラスターで層別化して都道府県の散布図を描く。
iryou.std$cluster <- clst$cluster
p.cluster <- ggplot(iryou.std,aes(x=PC1,y=PC2,color=as.factor(cluster)))
p.cluster <- p.cluster + geom_point()
p.cluster <- p.cluster + geom_text(aes(label=rownames(iryou.std),vjust=1))
p.cluster <- p.cluster+xlim(-8.5,8.5)
p.cluster <- p.cluster+theme_bw()
plot(p.cluster)
クラスター分析の結果にランダム性が残っていることを確認するため同じクラスタリングをもう一度行ってみる。
clst.again <- kmeans(iryou.std[,c("PC1","PC2")],centers=4,iter.max=100)
2番目のクラスタリングに基づいて散布図を描く。
iryou.std$cluster.again <- clst.again$cluster
p.cluster <- ggplot(iryou.std,aes(x=PC1,y=PC2,color=as.factor(cluster.again)))
p.cluster <- p.cluster + geom_point()
p.cluster <- p.cluster + geom_text(aes(label=rownames(iryou.std),vjust=1))
p.cluster <- p.cluster+xlim(-8.5,8.5)
p.cluster <- p.cluster+theme_bw()
plot(p.cluster)
1番目と2番目の散布図を見比べると、左上の区域にな東京都と大阪府が、最初のクラスタリングでは同じグループに入っているのに、2番目の散布図では別々のグループに分かれている。
各グループとクラスター番号との対応や散布図におけるクラスター番号の位置取りも二つの散布図で違いがある。
このように一度きりのクラスタリングで47都道府県のグループ分けを確定するのは問題が残る。また、クラスター数をここではアドホックに4と指定したが、なぜクラスター数は4でなければならないか、その最適性にも説明が必要である。
最適なクラスター数を決めるには、クラスター内の分散に着目する。理想的なクラスタリングは、現実には発生しないにせよ、各クラスターの内部においては全て同一の値、クラスター間にのみ違いあるという場合である。したがってクラスター内の分散が小さくなるクラスター数の方がよいと判定するのは自然である。実際、クラスター数を増やしていくと、クラスター内のデータはまとまってくる傾向がある。クラスター内の分散を合計した値が減少する速さに着目して、その減少速度が遅くなる点でクラスター数を決める方式は合理性がある。
更に、クラスター内分散に対するクラスター間分散の比率に着目してもよい。これはCalinski-Harabasz(CH) Indexである。理想的なクラスタリングにおいては、クラスター内分散がゼロ、クラスター間でのみ分散が残るのでCH指標は無限大になる。通常のケースではなるべくCH指標がピークをとるクラスター数を選べばよい。
まず所要の関数を定義しておく。
sqr_edist <- function(x, y){
sum((x-y)^2)
}
wss.cluster <- function(clustermat){
c0 <- apply(clustermat, 2, FUN=mean)
sum(apply(clustermat, 1, FUN=function(row){sqr_edist(row,c0)}))
}
wss.total <- function(dmatrix, labels){
wsstot <- 0
k <- length(unique(labels))
for(i in 1:k){
wsstot <- wsstot + wss.cluster(subset(dmatrix, labels==i))
}
wsstot
}
totss <- function(dmatrix){
grandmean <- apply(dmatrix,2,FUN=mean)
sum(apply(dmatrix, 1, FUN=function(row){sqr_edist(row, grandmean)}))
}
ch_criterion <- function(dmatrix, kmax, method="kmeans"){
if(!(method %in% c("kmeans", "hclust"))){
stop("method must be one of c('kmeans','hclust')")
}
npts <- dim(dmatrix)[1] # number of rows
totss <- totss(dmatrix)
wss <- numeric(kmax)
crit <- numeric(kmax)
wss[1] <- (npts-1)*sum(apply(dmatrix,2,var))
for(k in 2:kmax){
if(method=="kmeans"){
clustering <- kmeans(dmatrix, k, nstart=10, iter.max = 100)
wss[k] <- clustering$tot.withinss
} else {
d <- dist(dmatrix, method="euclidean")
pfit <- hclust(d, method="ward")
labels <- cutree(pfit, k=k)
wss[k] <- wss.total(dmatrix, labels)
}
}
bss <- totss - wss
crit.num <- bss/(0:(kmax-1))
crit.denom <- wss/(npts - 1:kmax)
crit <- crit.num / crit.denom
crit[1] <- NA
list(crit=crit, wss=wss, totss=totss)
}
クラスター数を1個(=クラスタリングしない)から10個までに範囲を決め、順に主成分得点“PC1”と“PC2”に基づくkmeans“を実行しよう。このとき、クラスターごとにクラスター内分散とCH Indexを保存する。そうしてから横軸にクラスター数を、縦軸にクラスター内分散、CH Indexをとって折れ線グラフを描く。
pcs <- c("PC1", "PC2")
clustcrit <- ch_criterion(iryou.std[,pcs], 10, method="kmeans")
critframe <- data.frame(k=1:10, ch=scale(clustcrit$crit), wss=scale(clustcrit$wss))
critframe2 <- melt(critframe, id.vars = c("k"), variable.name = "measure", value.name = "score")
ggplot(critframe2, aes(x=k, y=score, color=measure)) +
geom_point(aes(shape=measure)) +
geom_line(aes(linetype=measure)) +
scale_x_continuous(breaks = 1:10, labels = 1:10)
この図をみると、クラスター数を増やすに伴ってクラスター内分散は減少している。一方、CH指標はクラスター数が3の前後でピークを形成している。6個以降はCH指標が上昇しているが、これはクラスター内分散の減少速度が鈍くなる一方でクラスター数の増加によってクラスター間の分散が増えていることよる。
最初に行ったクラスタリングではクラスター数を4としたが、最適なクラスター数としては3のほうが良いと判断できる。
上ではクラスタリング結果には常にランダム性が残ることに注意を促した。実際、都道府県の医療状況に着目するとしても、現実に他の都道府県と明確な違いがあり、クラスターを設けることの根拠がある現実のクラスターがある一方で、クラスター数を4と指定したことが原因となって実際には存在しないクラスターが計算上は導かれてくる、そんな見せかけのクラスターもまた得られがちである。実態の伴わないクラスタリングで形成されたグループは安定性に欠け、クラスター分析を行うたびに所属するグループが変わったりする。
パッケージ“fpc”にある“clusterboot”は何度も反復して計算をおこない最終的に安定したクラスタリングを返してくれるので大変便利である。
ここではクラスタリングを100回反復して各グループの安定性をみてみる。
cboot <- clusterboot(iryou.std[,c("PC1","PC2")], clustermethod = kmeansCBI, krange=3:4)
最数的に確定できたグループを表示させよう。
group <- cboot$result$partition
for(i in 1:3){
print(paste("cluster", i))
print(iryou$Pref[group==i])
}
## [1] "cluster 1"
## [1] Hokkaido Toyama Ishikawa Wakayama Tottori Shimane Hiroshima
## [8] Yamaguchi Tokushima Kagawa Ehime Kochi Fukuoka Saga
## [15] Nagasaki Kumamoto Oita Miyazaki Kagoshima
## 47 Levels: Aichi Akita Aomori Chiba Ehime Fukui Fukuoka Fukushima ... Yamanashi
## [1] "cluster 2"
## [1] Miyagi Tochigi Saitama Chiba Tokyo Kanagawa Fukui
## [8] Gifu Shizuoka Aichi Mie Shiga Kyoto Osaka
## [15] Hyogo Nara Okayama Okinawa
## 47 Levels: Aichi Akita Aomori Chiba Ehime Fukui Fukuoka Fukushima ... Yamanashi
## [1] "cluster 3"
## [1] Aomori Iwate Akita Yamagata Fukushima Ibaraki Gumma
## [8] Niigata Yamanashi Nagano
## 47 Levels: Aichi Akita Aomori Chiba Ehime Fukui Fukuoka Fukushima ... Yamanashi
これらのグループはクラスター計算のたびにどの程度安定して同じ構成員と組み合わされたのだろうか。
cboot$bootmean
## [1] 0.8165997 0.7997885 0.8132880
表示された数値は、いわゆる“Jaccard Coefficient”(ジャッカード係数)を100回にわたるクラスタリング計算を通して平均した値であって、ある回のクラスター計算による構成メンバーが別の回の構成メンバーとどの程度まで共通しているかという指標の平均値である。当然ながら、クラスター計算によらず同じ構成員が含まれるグループは安定性が高いわけである。上の数値をみると、どれも75%を超えており、十分な安定性を有している。クラスターの安定性を示す平均ジャッカード係数が0.5未満になる場合は、そのクラスターに実質的な意味はないと判断される。
上の結果に基づいて層別化された散布図にしてみる。
iryou.std$cluster.final <- cboot$result$partition
p.cluster <- ggplot(iryou.std,aes(x=PC1,y=PC2,color=as.factor(cluster.final)))
p.cluster <- p.cluster + geom_point()
p.cluster <- p.cluster + geom_text(aes(label=rownames(iryou.std),vjust=1))
p.cluster <- p.cluster+xlim(-8.5,8.5)
p.cluster <- p.cluster+theme_bw()
plot(p.cluster)
今回のクラスター分析の結果に基づき、各クラスターの特徴づけを行っておこう。特徴づけは標準値ではなく元データのほうが見やすいので、元のデータセット“iryou”に確定したクラスター番号を追加しておく。
iryou$cluster <- iryou.std$cluster.final
iryou %>% group_by(cluster) %>% summarise(avgD1=mean(D1))
## # A tibble: 3 x 2
## cluster avgD1
## <int> <dbl>
## 1 1 9.61
## 2 2 5.01
## 3 3 5.58
iryou %>% group_by(cluster) %>% summarise(avgD2=mean(D2))
## # A tibble: 3 x 2
## cluster avgD2
## <int> <dbl>
## 1 1 86.2
## 2 2 76.6
## 3 3 72.7
iryou %>% group_by(cluster) %>% summarise(avgD3=mean(D3))
## # A tibble: 3 x 2
## cluster avgD3
## <int> <dbl>
## 1 1 1434.
## 2 2 949.
## 3 3 1059.
iryou %>% group_by(cluster) %>% summarise(avgD4=mean(D4))
## # A tibble: 3 x 2
## cluster avgD4
## <int> <dbl>
## 1 1 258.
## 2 2 220
## 3 3 196.
iryou %>% group_by(cluster) %>% summarise(avgD5=mean(D5))
## # A tibble: 3 x 2
## cluster avgD5
## <int> <dbl>
## 1 1 1259.
## 2 2 829.
## 3 3 920.
iryou %>% group_by(cluster) %>% summarise(avgD6=mean(D6))
## # A tibble: 3 x 2
## cluster avgD6
## <int> <dbl>
## 1 1 6.51
## 2 2 4.68
## 3 3 6.9
iryou %>% group_by(cluster) %>% summarise(avgD7=mean(D7))
## # A tibble: 3 x 2
## cluster avgD7
## <int> <dbl>
## 1 1 42.6
## 2 2 44.7
## 3 3 39.5
iryou %>% group_by(cluster) %>% summarise(avgD8=mean(D8))
## # A tibble: 3 x 2
## cluster avgD8
## <int> <dbl>
## 1 1 48.5
## 2 2 40.7
## 3 3 45.0
iryou %>% group_by(cluster) %>% summarise(avgD9=mean(D9))
## # A tibble: 3 x 2
## cluster avgD9
## <int> <dbl>
## 1 1 8.86
## 2 2 8.35
## 3 3 9.79
iryou %>% group_by(cluster) %>% summarise(avgD10=mean(D10))
## # A tibble: 3 x 2
## cluster avgD10
## <int> <dbl>
## 1 1 8.39
## 2 2 6.16
## 3 3 7.58
iryou %>% group_by(cluster) %>% summarise(avgD11=mean(D11))
## # A tibble: 3 x 2
## cluster avgD11
## <int> <dbl>
## 1 1 1.35
## 2 2 1.24
## 3 3 1.29
iryou %>% group_by(cluster) %>% summarise(avgD12=mean(D12))
## # A tibble: 3 x 2
## cluster avgD12
## <int> <dbl>
## 1 1 82.1
## 2 2 79.1
## 3 3 77.6
iryou %>% group_by(cluster) %>% summarise(avgD13=mean(D13))
## # A tibble: 3 x 2
## cluster avgD13
## <int> <dbl>
## 1 1 31.5
## 2 2 24.5
## 3 3 25.3
iryou %>% group_by(cluster) %>% summarise(avgD14=mean(D14))
## # A tibble: 3 x 2
## cluster avgD14
## <int> <dbl>
## 1 1 13678.
## 2 2 11178.
## 3 3 11889.
iryou %>% group_by(cluster) %>% summarise(avgD15=mean(D15))
## # A tibble: 3 x 2
## cluster avgD15
## <int> <dbl>
## 1 1 1.90
## 2 2 1.83
## 3 3 1.94
iryou %>% group_by(cluster) %>% summarise(avgD16=mean(D16))
## # A tibble: 3 x 2
## cluster avgD16
## <int> <dbl>
## 1 1 648.
## 2 2 531.
## 3 3 676.
iryou %>% group_by(cluster) %>% summarise(avgD17=mean(D17))
## # A tibble: 3 x 2
## cluster avgD17
## <int> <dbl>
## 1 1 327.
## 2 2 276.
## 3 3 329.
iryou %>% group_by(cluster) %>% summarise(avgD18=mean(D18))
## # A tibble: 3 x 2
## cluster avgD18
## <int> <dbl>
## 1 1 12.6
## 2 2 10.5
## 3 3 13.9
iryou %>% group_by(cluster) %>% summarise(avgD19=mean(D19))
## # A tibble: 3 x 2
## cluster avgD19
## <int> <dbl>
## 1 1 6.18
## 2 2 5.29
## 3 3 6.75
iryou %>% group_by(cluster) %>% summarise(avgD20=mean(D20))
## # A tibble: 3 x 2
## cluster avgD20
## <int> <dbl>
## 1 1 190.
## 2 2 151.
## 3 3 188.
iryou %>% group_by(cluster) %>% summarise(avgD21=mean(D21))
## # A tibble: 3 x 2
## cluster avgD21
## <int> <dbl>
## 1 1 112.
## 2 2 87.9
## 3 3 138.
iryou %>% group_by(cluster) %>% summarise(avgD22=mean(D22))
## # A tibble: 3 x 2
## cluster avgD22
## <int> <dbl>
## 1 1 21.1
## 2 2 19.8
## 3 3 23.8
クラスタリングには非階層型である“hclust”コマンドを用いてもよい。
階層型クラスリングでは、都道府県の間に医療状況の違いを表現される距離をデータから計算することから始める。その互いの距離が近い順からまず二つの都道府県を組み合わせ2個のクラスターをつくる。その後は、相互の距離が近い順からクラスターを統合し、最終的にはデータ全体を一つのクラスターにまで統合する。このプロセスにランダム性が入る余地はないので、安定的なクラスタリング結果を得るには階層型クラスター分析が適している。半面、レコード(=1行)間の距離を求めておくことが必要なので計算負荷が大きくなり、非常に多数のケースをクラスタリングするには非階層型を用いざるを得ない。都道府県の数は47とそれほど多くはないので、階層型方法でクラスター分析をしてもよいだろう。
まず都道府県の間の距離を求めておく。距離はユークリッド距離、即ち個別データがN個あり、二つのケースX、Yの個別のデータをXi、Yiとおけば N∑i=1(Xi−Yi)2 という計算式で距離(=違いの大きさ)を定義する。
distance <- dist(iryou.std[,vars],method="euclidean")
この距離を“hclust”コマンドに与えると階層型クラスタリングができる。
fit <- hclust(distance, method="ward")
plot(fit)
階層型クラスタリングにおいて、最初に形成される2個のクラスターから始まりデータ全体から成る1個のクラスターで終わる樹形図をデンドログラム(dendrogram)と呼ぶ。デンドログラムは都道府県どうしの違いを表現する距離に基づいて作成されるので、ここに結果の不確定性をもたらすランダムな要素はない。それでもデータ全体を何個のクラスターに分けるのが最適であるのかという判定はやはり難しい。
最適クラスター数の選択は階層型クラスリングにおいても同じ作業になるので、ここではクラスター数を前述のように3と設定してクラスター構造を確認しておくにとどめる。
group <- cutree(fit, k=3)
for(i in 1:3){
print(paste("cluster", i))
print(iryou$Pref[group==i])
}
## [1] "cluster 1"
## [1] Hokkaido Toyama Ishikawa Fukui Kyoto Wakayama Tottori
## [8] Shimane Okayama Hiroshima Yamaguchi Tokushima Kagawa Ehime
## [15] Kochi Fukuoka Saga Nagasaki Kumamoto Oita Miyazaki
## [22] Kagoshima
## 47 Levels: Aichi Akita Aomori Chiba Ehime Fukui Fukuoka Fukushima ... Yamanashi
## [1] "cluster 2"
## [1] Aomori Iwate Akita Yamagata Fukushima Ibaraki Gumma
## [8] Niigata Yamanashi Nagano
## 47 Levels: Aichi Akita Aomori Chiba Ehime Fukui Fukuoka Fukushima ... Yamanashi
## [1] "cluster 3"
## [1] Miyagi Tochigi Saitama Chiba Tokyo Kanagawa Gifu
## [8] Shizuoka Aichi Mie Shiga Osaka Hyogo Nara
## [15] Okinawa
## 47 Levels: Aichi Akita Aomori Chiba Ehime Fukui Fukuoka Fukushima ... Yamanashi
クラスター番号付けには違いがあるが、「大都市圏」、「地方圏」、「東北・北陸ブロック」という基本構造は共通していることに気がつくだろう。先述した非階層型クラスタリングと今回の階層型クラスタリングで異なったグループに所蔵する都道府県が見つかるとすれば、それは方法によって所属先が変わるという意味で結びつきの弱さを示すものと解釈してもよいだろう。