基本的な考え方と階層的方法
(Press ?
for help, n
and p
for next and previous slide)
村田 昇
データ https://noboru-murata.github.io/statistical-data-analysis2/data/data06.zip
Pref : 都道府県名 Forest : 森林面積割合 (%) 2014年 Agri : 就業者1人当たり農業産出額(販売農家)(万円) 2014年 Ratio : 全国総人口に占める人口割合 (%) 2015年 Land : 土地生産性(耕地面積1ヘクタール当たり)(万円) 2014年 Goods : 商業年間商品販売額[卸売業+小売業](事業所当たり)(百万円) 2013年 Area : 地方区分
Pref | Forest | Agri | Ratio | Land | Goods | Area |
Hokkaido | 67.9 | 1150.6 | 4.23 | 96.8 | 283.3 | Hokkaido |
Aomori | 63.8 | 444.7 | 1.03 | 186 | 183 | Tohoku |
Iwate | 74.9 | 334.3 | 1.01 | 155.2 | 179.4 | Tohoku |
Miyagi | 55.9 | 299.9 | 1.84 | 125.3 | 365.9 | Tohoku |
Akita | 70.5 | 268.7 | 0.81 | 98.5 | 153.3 | Tohoku |
Yamagata | 68.7 | 396.3 | 0.88 | 174.1 | 157.5 | Tohoku |
Fukushima | 67.9 | 236.4 | 1.51 | 127.1 | 184.5 | Tohoku |
Ibaraki | 31 | 479 | 2.3 | 249.1 | 204.9 | Kanto |
Tochigi | 53.2 | 402.6 | 1.55 | 199.6 | 204.3 | Kanto |
Gumma | 63.8 | 530.6 | 1.55 | 321.6 | 270 | Kanto |
Saitama | 31.9 | 324.7 | 5.72 | 247 | 244.7 | Kanto |
Chiba | 30.4 | 565.5 | 4.9 | 326.1 | 219.7 | Kanto |
Tokyo | 34.8 | 268.5 | 10.63 | 404.7 | 1062.6 | Kanto |
Kanagawa | 38.8 | 322.8 | 7.18 | 396.4 | 246.1 | Kanto |
Niigata | 63.5 | 308.6 | 1.81 | 141.9 | 205.5 | Chubu |
Figure 1: 散布図
Figure 2: 主成分得点による散布図
Figure 3: 散布図上のクラスタ構造 (クラスタ分析の概念図)
クラスタ分析 (cluster analysis) の目的
個体の間に隠れている 集まり=クラスタ を個体間の“距離”にもとづいて発見する方法
社会生活統計指標の一部(関東)
Figure 4: 凝集的クラスタリング
Figure 5: クラスタリングの手続き (その1)
Figure 6: クラスタリングの手続き (その2)
Figure 7: クラスタリングの手続き (その3)
Figure 8: クラスタリングの手続き (その4)
Figure 9: クラスタリングの手続き (その5)
Figure 10: クラスタリングの手続き (その6)
Figure 11: デンドログラムによるクラスタ構造の表示
データ : 変数の値を成分としてもつベクトル
\begin{equation} \boldsymbol{x}=(x_{1},\dotsc,x_{d})^{\mathsf{T}}, \boldsymbol{y}=(y_{1},\dotsc,y_{d})^{\mathsf{T}}\in\mathbb{R}^{d} \end{equation}
各成分の差の2乗和の平方根 (2ノルム)
\begin{equation} d(\boldsymbol{x},\boldsymbol{y}) =\sqrt{(x_{1}-y_{1})^{2}+\dotsb+(x_{d}-y_{d})^{2}} \end{equation}
格子状に引かれた路に沿って移動するときの距離
\begin{equation} d(\boldsymbol{x},\boldsymbol{y}) =|x_{1}-y_{1}|+\dotsb+|x_{d}-y_{d}| \end{equation}
各成分の差の \(p\) 乗和の \(p\) 乗根(\(p\)-ノルム)
\begin{equation} d(\boldsymbol{x},\boldsymbol{y}) =\bigl\{|x_{1}-y_{1}|^{p}+\dotsb+|x_{d}-y_{d}|^{p}\bigr\}^{1/p} \end{equation}
dist()
, kmeans()
などdaisy()
, agnes()
, pam()
などautoplot()
を使うためのパッケージ
ggdendro : ggplotによるデンドログラム描画のパッケージ
#' 最初に一度だけ以下のいずれかを実行しておく
#' - Package タブから ggdendro をインストール
#' - コンソール上で次のコマンドを実行 'install.packages("ggdendro")'
関数 stats::dist()
dist(x, method = "euclidean", diag = FALSE, upper = FALSE, p = 2)
#' x: データフレーム
#' method: 距離 (標準はユークリッド距離,他は"manhattan","minkowski"など)
#' diag: 対角成分を持たせるか
#' upper: 上三角成分を持たせるか (標準は下三角成分のみ)
#' 返値は dist class
関数 cluster::daisy()
daisy(x, metric = c("euclidean", "manhattan", "gower"),
stand = FALSE, type = list(), weights = rep.int(1, p),
warnBin = warnType, warnAsym = warnType, warnConst = warnType,
warnType = TRUE)
#' x: データフレーム
#' metric: 距離 (標準はユークリッド距離,他は"manhattan"など)
#' stand: 正規化(平均と絶対偏差の平均による)の有無
#' 返値は dissimilarity class
都道府県別の社会生活統計指標を用いて以下を確認しなさい
#' データの読み込み方の例
js_df <- read_csv("data/japan_social.csv") |>
column_to_rownames(var = "Pref") |> # 'Pref'を行名に変換
select(-Area) # 地方名は除く
クラスタ : いくつかのデータ点からなる集合
\begin{equation} C_{a}=\left\{\boldsymbol{x}_{i}|i\in\Lambda_{a}\right\},\; C_{b}=\left\{\boldsymbol{x}_{j}|j\in\Lambda_{b}\right\},\quad C_{a}\cap C_{b}=\emptyset \end{equation}
最も近い対象間の距離を用いる方法
\begin{equation} D(C_{a},C_{b}) =\min_{\boldsymbol{x}\in C_{a},\;\boldsymbol{y}\in C_{b}} d(\boldsymbol{x},\boldsymbol{y}) \end{equation}
統合前後のクラスタ間の関係
\begin{equation} D(C_{a}+ C_{b}, C_{c}) =\min\bigl\{D(C_{a},C_{c}), D(C_{b},C_{c})\bigr\} % =\min\left\{D(C_{a},C_{c}), D(C_{b},C_{c})\right\} \end{equation}
最も遠い対象間の距離を用いる方法
\begin{equation} D(C_{a},C_{b}) =\max_{\boldsymbol{x}\in C_{a},\;\boldsymbol{y}\in C_{b}} d(\boldsymbol{x},\boldsymbol{y}) \end{equation}
統合前後のクラスタ間の関係
\begin{equation} D(C_{a}+ C_{b}, C_{c}) =\max\bigl\{D(C_{a},C_{c}), D(C_{b},C_{c})\bigr\} % =\max\left\{D(C_{a},C_{c}), D(C_{b},C_{c})\right\} \end{equation}
全ての対象間の平均距離を用いる方法
\begin{equation} D(C_{a},C_{b}) =\frac{1}{|C_{a}||C_{b}|} \sum_{\boldsymbol{x}\in C_{a},\;\boldsymbol{y}\in C_{b}} d(\boldsymbol{x},\boldsymbol{y}) \end{equation}
統合前後のクラスタ間の関係
\begin{equation} D(C_{a}+ C_{b}, C_{c}) =\frac{|C_{a}|D(C_{a},C_{c})+|C_{b}|D(C_{b},C_{c})}{|C_{a}|+|C_{b}|} \end{equation}
関数 stats::hclust()
hclust(d, method = "complete", members = NULL)
#' d: 距離行列
#' method: 分析法 (標準は最長距離法,他は"single","average"など)
分析のための補助的な関数
#' stats::cutree() - デンドログラムに基づくクラスタの分割
cutree(tree, k = NULL, h = NULL)
#' tree: stats::hclust() の返値
#' k: クラスタの数を指定して分割
#' h: クラスタの高さを指定して分割
視覚化のための関数 (ggplot 系)
ggdendrogram(data,
segments = TRUE, labels = TRUE, leaf_labels = TRUE,
rotate = FALSE, theme_dendro = TRUE, ...)
#' data: stats::hclust(), stats::dendrogram() などの返値
視覚化のための関数 (graphics 系)
#' stats::plot.hclust() - 系統樹の表示
plot(x, labels = NULL, hang = 0.1, check = TRUE,
axes = TRUE, frame.plot = FALSE, ann = TRUE,
main = "Cluster Dendrogram",
sub = NULL, xlab = NULL, ylab = "Height", ...)
#' x: stats::hclust() の返値
#' stats::rect.hclust() - クラスタの分割表示 (cutreeとほぼ同様)
rect.hclust(tree, k = NULL, which = NULL, x = NULL, h = NULL,
border = 2, cluster = NULL)
#' tree: stats::hclust() の返値
関数 ggfortify::autoplot()
(ggplot 系)
autoplot(object, data = NULL, frame = FALSE,
scale = 1, x = 1, y = 2,
variance_percentage = TRUE, ...)
#' object: stats::prcomp() などの返値
#' data: 描画に必要な追加データ
#' frame: クラスタごと(colourなどで指定)に凸包または楕円を描画
#' 詳細は '?ggfortify::autoplot.pca_common()/ggbiplot()'を参照
関数 cluster::clusplot()
(graphics 系)
clusplot(x, clus, diss = FALSE, stand = FALSE,
lines = 2, shade = FALSE, color = FALSE,
labels= 0, plotchar = TRUE,
col.p = "dark green", col.txt = col.p, col.clus = 5,...)
#' x: データフレーム
#' clus: クラスタ分割
#' stand: 正規化の有無
#' lines: クラスタ間の繋がりの表示 (0:無,1:外,2:中心)
#' shade: 網掛けの有無
#' labels: ラベルの表示 (0:無,2:データとクラスタ, 3:データ, 4:クラスタ, など)
#' col.p/txt/clue: データ点・文字・クラスタの色指定
#' 詳細は '?cluster::clusplot.default()' を参照
package::cluster
の利用
関数 cluster::agnes()
agnes(x, diss = inherits(x, "dist"), metric = "euclidean",
stand = FALSE, method = "average", par.method,
keep.diss = n < 100, keep.data = !diss, trace.lev = 0)
#' x: データフレーム,または距離行列
#' metric: 距離 (標準はユークリッド距離,他は 'manhattan' など)
#' stand: 正規化(平均と絶対偏差の平均による)の有無
#' method: 分析法 (標準は群平均法,他は 'single', 'complete' など)
視覚化のための補助的な関数 (base R系)
#' cluster::plot.agnes() - 系統樹および凝集係数の表示
plot(x, ask = FALSE, which.plots = NULL, main = NULL,
sub = paste("Agglomerative Coefficient = ",round(x$ac, digits = 2)),
adj = 0, nmax.lab = 35, max.strlen = 5, xax.pretty = TRUE, ...)
#' x: cluster::agnes() の返値
#' which.plots: 1 - banner plot, 2 - dendrogram
アンケート概要 (Q2の結果を利用)
【応募期間】 2009年1月4日~2009年2月28日 【応募方法】 インターネット、携帯ウェブ 【内 容】 Q1. おむすびを最近1週間に、何個食べましたか? そのうち市販のおむすびは何個でしたか? Q2. おむすびの具では何が一番好きですか? A.梅 B.鮭 C.昆布 D.かつお E.明太子 F.たらこ G.ツナ H.その他 Q3. おむすびのことをあなたはなんと呼んでいますか? A.おにぎり B.おむすび C.その他 Q4. おむすびといえば、どういう形ですか? A.三角形 B.丸形 C.俵形 D.その他 【回答者数】 男性 9,702人 32.0% 女性 20,616人 68.0% 総数 30,318人 100.0%
上記のデータを用いて以下の分析を行いなさい
#' データの読み込み
om_data <- read_csv(file = "data/omusubi.csv")
om_df <- om_data |> column_to_rownames(var = "Pref")
Hellinger距離を用いて距離行列を作成しなさい
\(\boldsymbol{p},\boldsymbol{q}\) を確率ベクトルとして 定義される確率分布の間の距離
\begin{equation} d_{hel}(\boldsymbol{p},\boldsymbol{q}) = \frac{1}{\sqrt{2}}d_{euc}(\sqrt{\boldsymbol{p}},\sqrt{\boldsymbol{q}}) \end{equation}