vcd::mosaicで行%,列%をセルに表示する

Author
Affiliation

津田塾大学 数学・計算機科学研究所

Published

July 8, 2024

1 labelling_cellsでセルの中に数値をさせるためには、表の属性をtableにすること、また、行名、列名がついていることが重要。

  • https://stackoverflow.com/questions/23745201/labeling-cells-function-with-2d-mosaic

2 packageを読み込む

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(vcdExtra)
要求されたパッケージ vcd をロード中です
要求されたパッケージ grid をロード中です
要求されたパッケージ gnm をロード中です

次のパッケージを付け加えます: 'vcdExtra'

以下のオブジェクトは 'package:dplyr' からマスクされています:

    summarise

3 Dataを用意する

  • 以下のデータは、『対応分析入門』オーム社、2015の第1章の表。
.dd <- matrix(c(301, 497, 208, 50, 254, 187,
                261, 550, 250, 27, 339, 157,
                361, 534, 204, 59, 324, 216, 
                463, 766, 334, 72, 350, 601,
                89, 350, 195, 12, 143, 167,
                23, 182, 124, 10, 60, 110,
                117, 298, 145, 11, 184,56,
                104, 379, 219,21, 152,213,
                130, 352, 153, 17, 272, 264,
                168,370, 187, 51, 162, 424),byrow= T,10,6 )

dimnames(.dd) <- list(
  余暇 = c("スポーツイベント","映画","ダンス/ディスコ",          # **行変数名**をつけること!
         "カフェ/レストラン","劇場","クラッシック・コンサート",
         "ポップ・コンサート","絵画展","図書館","教会サービス"),
  職種 = c("現業","Low非現業","High非現業","農民","学生","退職者")) # **列変数名**をつけること!

3.1 行分析

.dd %>% prop.table(margin=1) -> tmp #%>% addmargins(margin=2)
round(100*tmp,1) -> .dd.p

3.2 mosaic plotで表示

  • labelling_cells に渡す表はtableであること
.dd %>% mosaic(shade=TRUE,rot_labels = c(left = 0, top = 90,right=0),
               margins=c(left=9,top=5),just_labels=c(left="right",top="left"),pop=FALSE)
labeling_cells(text=.dd.p,clip=FALSE)(as.table(.dd.p))

3.3 列分析

.dd %>% prop.table(margin = 2) #%>% addmargins()
                          職種
余暇                           現業  Low非現業 High非現業       農民
  スポーツイベント         0.14923153 0.11617578 0.10302130 0.15151515
  映画                     0.12940010 0.12856475 0.12382368 0.08181818
  ダンス/ディスコ          0.17897868 0.12482468 0.10104012 0.17878788
  カフェ/レストラン        0.22954883 0.17905563 0.16542843 0.21818182
  劇場                     0.04412494 0.08181393 0.09658247 0.03636364
  クラッシック・コンサート 0.01140307 0.04254324 0.06141654 0.03030303
  ポップ・コンサート       0.05800694 0.06965872 0.07181773 0.03333333
  絵画展                   0.05156173 0.08859280 0.10846954 0.06363636
  図書館                   0.06445216 0.08228144 0.07578009 0.05151515
  教会サービス             0.08329202 0.08648901 0.09262011 0.15454545
                          職種
余暇                           学生     退職者
  スポーツイベント         0.11339286 0.07807933
  映画                     0.15133929 0.06555324
  ダンス/ディスコ          0.14464286 0.09018789
  カフェ/レストラン        0.15625000 0.25093946
  劇場                     0.06383929 0.06972860
  クラッシック・コンサート 0.02678571 0.04592902
  ポップ・コンサート       0.08214286 0.02338205
  絵画展                   0.06785714 0.08893528
  図書館                   0.12142857 0.11022965
  教会サービス             0.07232143 0.17703549
.dd %>% prop.table(margin = 2) -> .dd.pc0
100*.dd.pc0 %>% round(3) -> .dd.pc
t(.dd) %>% mosaic(split_vertical = c(TRUE,FALSE),shade=TRUE,
                  rot_labels = c(left = 0, top = 90,right=0),
                  margins=c(left=9,top=5),just_labels=c(left="right",top="left"),pop=FALSE
                  )
labeling_cells(text=as.table(t(.dd.pc)),clip=FALSE,
               split_vertical = c(TRUE,FALSE))(as.table(t(.dd.pc)))

4 参考文献

  • “WorkingwithcategoricaldatawithRandthevcdand vcdExtrapackages” https://www.datavis.ca/courses/VCD/vcd-tutorial.pdf
  • “Mosaic plots” https://cran.r-project.org/web/packages/vcdExtra/vignettes/mosaics.html
  • “The Strucplot Framework: Visualizing Multi-way Contingency Tables with vcd” https://cran.r-project.org/web/packages/vcd/vignettes/strucplot.pdf
  • “15 Chart: Mosaic | edav dot info, 1st edition” https://jtr13.github.io/EDAV/mosaic.html