library(conflicted) # 関数名の衝突を警告
conflicts_prefer( # 優先的に使う関数を指定
::filter(),
dplyr::select(),
dplyr::lag(),
dplyr
)library(tidyverse)
library(broom) # 解析結果を tibble 形式に集約
library(gt) # 表の作成
library(gtsummary) # 分析結果の表の作成
library(ggfortify) # biplot表示のため
統計データ解析
第7講 サンプルコード
準備
以下で利用する共通パッケージを読み込む.
寄与率・累積寄与率
問題
標準化の有無の違いで寄与率・累積寄与率がどのように異なるか確認しなさい.
prcomp(toy_data) # 標準化を行わない場合
prcomp(toy_data, scale. = TRUE) # 標準化を行う場合
正式なオプション名は scale.
であるが,sc = TRUE
など他のオプションと区別できれば短縮表記も可能.
japan_social.csv
の読み込み方の例<- read_csv("data/japan_social.csv") |> js_data mutate(Area = as_factor(Area))
MASS::UScereal
の整理の例glimpse(MASS::UScereal) # 各変数の属性を確認する. <- MASS::UScereal |> uc_data rownames_to_column(var = "product") |> # 行名の製品名を列に加える as_tibble()
base R
の data.frame
型なので tibble 型に変換しておく.
解答例
MASS::UScereal
の場合
元のデータは data.frame 形式なので,tibble に変換して整理しておく. また,適当な方法で視覚化をすることを推奨する.
<- MASS::UScereal |>
uc_data rownames_to_column(var = "product") |> as_tibble()
標準化なしの分析は以下のようになる.
<- uc_data |>
uc_pca_raw select(where(is.double)) |>
prcomp()
summary(uc_pca_raw)
Importance of components:
PC1 PC2 PC3 PC4 PC5 PC6 PC7
Standard deviation 203.19 98.6927 50.36206 6.82381 2.3718 1.48975 0.94740
Proportion of Variance 0.77 0.1817 0.04731 0.00087 0.0001 0.00004 0.00002
Cumulative Proportion 0.77 0.9517 0.99896 0.99983 0.9999 0.99998 0.99999
PC8
Standard deviation 0.55042
Proportion of Variance 0.00001
Cumulative Proportion 1.00000
$rotation uc_pca_raw
PC1 PC2 PC3 PC4 PC5
calories -0.179207473 -0.1462324241 -0.96480715 0.045234798 -0.092696691
protein -0.011145612 0.0025160642 -0.01538123 -0.072061722 -0.169798607
fat -0.002912531 -0.0006278695 -0.01548280 0.077006299 -0.396417270
sodium -0.493173560 -0.8416992943 0.21967258 0.007757990 -0.001777641
fibre -0.027380174 0.0202681877 0.01023689 -0.075965904 -0.187070010
carbo -0.015056930 -0.0272462011 -0.10970338 -0.693413074 0.620733329
sugars -0.008609442 -0.0013826562 -0.04640333 0.707209145 0.620447068
potassium -0.850577043 0.5186488067 0.07824275 -0.005786195 0.012896751
PC6 PC7 PC8
calories -0.012034965 -0.0040178657 0.0696281364
protein -0.069385729 0.9054169859 -0.3755184499
fat 0.370507919 -0.3543044317 -0.7575401217
sodium -0.001439163 -0.0001605839 -0.0008059101
fibre -0.918767097 -0.2184131271 -0.2571603627
carbo 0.042042740 -0.0770477377 -0.3363935184
sugars -0.103827276 0.0320770971 -0.3175882779
potassium 0.032892502 -0.0016414154 0.0107594252
|>
uc_pca_raw tidy("d") |>
ggplot(aes(x = PC, y = percent)) + geom_bar(stat = "identity")
|>
uc_pca_raw tidy("d") |>
ggplot(aes(x = PC, y = cumulative)) + geom_bar(stat = "identity")
autoplot(uc_pca_raw, scale = 0,
data = uc_data, label = TRUE, label.label = "product")
標準化ありの分析は以下のようになる.
<- uc_data |>
uc_pca select(where(is.double)) |>
prcomp(scale. = TRUE)
summary(uc_pca)
Importance of components:
PC1 PC2 PC3 PC4 PC5 PC6 PC7
Standard deviation 2.0595 1.1595 1.0847 0.77916 0.70038 0.32184 0.17080
Proportion of Variance 0.5302 0.1681 0.1471 0.07589 0.06132 0.01295 0.00365
Cumulative Proportion 0.5302 0.6982 0.8453 0.92120 0.98252 0.99547 0.99911
PC8
Standard deviation 0.08427
Proportion of Variance 0.00089
Cumulative Proportion 1.00000
$rotation uc_pca
PC1 PC2 PC3 PC4 PC5 PC6
calories -0.4095924 -0.40065656 0.1958834 0.007486492 -0.2032066 0.05255351
protein -0.4476405 0.17567026 0.0722067 -0.194640140 -0.1277506 -0.82959021
fat -0.2683607 -0.44417203 -0.2702646 -0.602181956 0.4973648 0.12339688
sodium -0.3474018 0.06764946 0.1195216 0.616762389 0.6907158 -0.03693360
fibre -0.3829156 0.46677617 -0.1976082 -0.097098382 -0.1367666 0.35604740
carbo -0.2882507 -0.20478232 0.6861866 -0.003106577 -0.2260198 0.29493081
sugars -0.1938910 -0.46258366 -0.5521416 0.455559106 -0.3701522 -0.03653264
potassium -0.4145359 0.36462256 -0.2330796 -0.045479335 -0.1054703 0.27809848
PC7 PC8
calories -0.35011143 0.68311726
protein 0.03187206 -0.14178644
fat 0.05108036 -0.17268441
sodium -0.03505495 -0.01931262
fibre -0.60446872 -0.27597329
carbo 0.23510504 -0.45909745
sugars 0.07382281 -0.30369583
potassium 0.66817773 0.32232225
|>
uc_pca tidy("d") |>
ggplot(aes(x = PC, y = percent)) + geom_bar(stat = "identity")
|>
uc_pca tidy("d") |>
ggplot(aes(x = PC, y = cumulative)) + geom_bar(stat = "identity")
autoplot(uc_pca_raw, scale = 0,
data = uc_data, label = TRUE, label.label = "product")
主成分分析の視覚化
問題
それぞれのデータの主成分分析の結果を利用してバイプロットによる可視化を行いなさい.
- 標準化したデータでの主成分分析を行いなさい.
- 第1主成分と第2主成分でのバイプロットを描きなさい.
- 第2主成分と第3主成分でのバイプロットを描きなさい.
autoplot(prcompの結果, x = x軸成分, y = y軸成分) # 主成分の指定
解答例
MASS::UScereal
の場合
autoplot(uc_pca,
data = uc_data, colour = "mfr", # メーカー毎に色付け
shape = 19, size = 1,
label = TRUE, label.label = "product", label.repel = TRUE,
loadings = TRUE, loadings.colour = "orange",
loadings.label = TRUE, loadings.label.repel = TRUE,
loadings.label.colour = "brown", loadings.label.size = 4) +
theme(legend.position = "none")
autoplot(uc_pca, x = 2, y = 3, # 第2 vs 第3
data = uc_data, colour = "mfr",
shape = 19, size = 1,
label = TRUE, label.label = "product", label.repel = TRUE,
loadings = TRUE, loadings.colour = "orange",
loadings.label = TRUE, loadings.label.repel = TRUE,
loadings.label.colour = "brown", loadings.label.size = 4) +
theme(legend.position = "none")
第1,2主成分得点で散布図を描き,上と比較してみる.
augment(uc_pca, data = uc_data) |>
ggplot(aes(x = .fittedPC1, y = .fittedPC2, label = product, colour = mfr)) +
geom_point(shape = 19, size = 1) +
::geom_text_repel(size = 3, max.overlaps = 40) +
ggrepeltheme(legend.position = "none")
配置は変わらないが,座標軸が異なることがわかる. 関数 autoplot()
において scale=0
とするとデータの座標は主成分得点となる.
options(ggrepel.max.overlaps = 40)
autoplot(uc_pca, scale = 0,
data = uc_data, colour = "mfr",
shape = 19, size = 1,
label = TRUE, label.label = "product", label.repel = TRUE, label.size = 3,
loadings = TRUE, loadings.colour = "orange",
loadings.label = TRUE, loadings.label.repel = TRUE,
loadings.label.colour = "brown", loadings.label.size = 4) +
theme(legend.position = "none")