このレポートは、factoextraに収められているfviz系functionで説明されている多重対応分析MCAのチュートリアルを日本語環境で実行するための前準備として、データの変数名、カテゴリーを日本語化するためのものである。

変数名の変更には、colnames() を使った代入。 カテゴリーの変更には、パッケージcarのRecode()を使っている。 カテゴリーの変更には、パッケージdplyrのrecode()を使っている。 最後に、確認のために、MCAを実行してその出力をグラフ化している。

#library(car)# dplyr::recode を使うようにしたので不要。
library(factoextra)
## Loading required package: ggplot2
## Welcome! Related Books: `Practical Guide To Cluster Analysis in R` at https://goo.gl/13EFCZ
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
options(width=90)

オリジナルのデータを読み込む

data(poison)
head(poison)
##   Age Time   Sick Sex   Nausea Vomiting Abdominals   Fever   Diarrhae   Potato   Fish
## 1   9   22 Sick_y   F Nausea_y  Vomit_n     Abdo_y Fever_y Diarrhea_y Potato_y Fish_y
## 2   5    0 Sick_n   F Nausea_n  Vomit_n     Abdo_n Fever_n Diarrhea_n Potato_y Fish_y
## 3   6   16 Sick_y   F Nausea_n  Vomit_y     Abdo_y Fever_y Diarrhea_y Potato_y Fish_y
## 4   9    0 Sick_n   F Nausea_n  Vomit_n     Abdo_n Fever_n Diarrhea_n Potato_y Fish_y
## 5   7   14 Sick_y   M Nausea_n  Vomit_y     Abdo_y Fever_y Diarrhea_y Potato_y Fish_y
## 6  72    9 Sick_y   M Nausea_n  Vomit_n     Abdo_y Fever_y Diarrhea_y Potato_y Fish_n
##     Mayo Courgette   Cheese   Icecream
## 1 Mayo_y   Courg_y Cheese_y Icecream_y
## 2 Mayo_y   Courg_y Cheese_n Icecream_y
## 3 Mayo_y   Courg_y Cheese_y Icecream_y
## 4 Mayo_n   Courg_y Cheese_y Icecream_y
## 5 Mayo_y   Courg_y Cheese_y Icecream_y
## 6 Mayo_y   Courg_y Cheese_y Icecream_y

変数名、カテゴリーを日本語化する

dplyr::recode を使う

# 初版では、carのRecodeでやっていた。
#library(car)
#poison$性別 <- Recode(poison$性別,F" = "女性", "M" = "男性";',as.factor.result=TRUE)

colnames(poison) <- c("年齢","時刻","発症","性別","吐き気","嘔吐","腹痛","発熱","下痢",
                      "ポテト","魚","マヨ","ズッキーニ","チーズ","アイスクリーム")

poison$性別 <- recode(poison$性別,F = "女性",M = "男性")
poison$発症 <- recode(poison$発症,Sick_n = "発症_n",Sick_y = "発症_y")
poison$吐き気 <- recode(poison$吐き気,Nausea_n = "吐き気_n",Nausea_y = "吐き気_y")
poison$嘔吐 <- recode(poison$嘔吐,Vomit_n = "嘔吐_n",Vomit_y = "嘔吐_y")
poison$腹痛 <- recode(poison$腹痛,Abdo_n = "嘔吐_n",Abdo_y = "嘔吐_y")
poison$発熱 <- recode(poison$発熱,Fever_n = "発熱_n",Fever_y = "発熱_y")
poison$下痢 <- recode(poison$下痢,Diarrhea_n = "下痢_n",Diarrhea_y = "下痢_y")
poison$ポテト <- recode(poison$ポテト,Potato_n = "ポテト_n",Potato_y = "ポテト_y")
poison$魚 <- recode(poison$魚,Fish_n = "魚_n", Fish_y = "魚_y")
poison$マヨ <- recode(poison$マヨ,Mayo_n = "マヨ_n", Mayo_y = "マヨ_y")
poison$ズッキーニ <- recode(poison$ズッキーニ, Courg_n = "ズッキ_n", Courg_y = "ズッキ_y")
poison$チーズ <- recode(poison$チーズ, Cheese_n = "チーズ_n", Cheese_y ="チーズ_y")
poison$アイスクリーム <- recode(poison$アイスクリーム,Icecream_n = "アイス_n", Icecream_y = "アイス_y")

summary(poison)
##       年齢            時刻           発症      性別         吐き気       嘔吐   
##  Min.   : 4.00   Min.   : 0.00   発症_n:17   女性:28   吐き気_n:43   嘔吐_n:33  
##  1st Qu.: 6.00   1st Qu.: 0.00   発症_y:38   男性:27   吐き気_y:12   嘔吐_y:22  
##  Median : 8.00   Median :12.00                                                  
##  Mean   :16.93   Mean   :10.16                                                  
##  3rd Qu.:10.00   3rd Qu.:16.50                                                  
##  Max.   :88.00   Max.   :22.00                                                  
##      腹痛        発熱        下痢         ポテト      魚         マヨ       ズッキーニ
##  嘔吐_n:18   発熱_n:20   下痢_n:20   ポテト_n: 3   魚_n: 1   マヨ_n:10   ズッキ_n: 5  
##  嘔吐_y:37   発熱_y:35   下痢_y:35   ポテト_y:52   魚_y:54   マヨ_y:45   ズッキ_y:50  
##                                                                                       
##                                                                                       
##                                                                                       
##                                                                                       
##       チーズ    アイスクリーム
##  チーズ_n: 7   アイス_n: 4    
##  チーズ_y:48   アイス_y:51    
##                               
##                               
##                               
## 

多重対応分析をおこないグラフに表示する

library(FactoMineR)
library(factoextra)
library(ggpubr)

なお、factoextra,ggpubr による日本語対応は、まだ暫定対応なので、githubから開発暫定版をダウンロードして用る必要がある。詳細は、githubのissue:“factoextra and japanese text” (https://github.com/kassambara/factoextra/issues/31)を参照

res.mca <- MCA(poison[,5:15],graph=FALSE)
fviz_mca_biplot(res.mca,font.family = "sans",title="食中毒データに対する多重対応分析")

より詳しくは、「多重対応分析:多変量の質的半数のカテゴリー間の連関を解釈し調査するために必須の手法」http://www.sthda.com/english/wiki/multiple-correspondence-analysis-essentials-interpretation-and-application-to-investigate-the-associations-between-categories-of-multiple-qualitative-variables-r-software-and-data-mining を参照のこと。このチュートリアルでpoison が使われている。

もう一つのデータ形式(“Y”/“N”" 、“1”/“0”)を用いる

先に、poisonデータをもとの形式のまま「日本語化」してみた。実は、FactoMineRのMCAは、もう一つ別の形式のデータも受け入れる。

変数名は、日本語化し(しなくてももちろんよいが)、カテゴリーを“y”、“n”(1,0でもよいがfactorにしておく)で表記する形式である。こうしたデータの場合でも、MCAは、変数名に_y、_nをつけてカテゴリーを形成する。

data(poison)# も一度、元のpoisonを呼び出す。 

colnames(poison) <- c("年齢","時刻","発症","性別","吐き気","嘔吐","腹痛","発熱","下痢",
                      "ポテト","魚","マヨ","ズッキーニ","チーズ","アイスクリーム")
poison$性別 <- recode(poison$性別,F = "女性", M = "男性")
poison$発症 <- recode(poison$発症,Sick_n = "N", Sick_y = "Y")
poison$吐き気 <- recode(poison$吐き気,Nausea_n = "N", Nausea_y = "Y")
poison$嘔吐 <- recode(poison$嘔吐,Vomit_n = "N", Vomit_y = "Y")
poison$腹痛 <- recode(poison$腹痛,Abdo_n = "N", Abdo_y = "Y")
poison$発熱 <- recode(poison$発熱,Fever_n = "N", Fever_y = "Y")
poison$下痢 <- recode(poison$下痢,Diarrhea_n = "N", Diarrhea_y = "Y")
poison$ポテト <- recode(poison$ポテト,Potato_n = "N", Potato_y = "Y")
poison$魚 <- recode(poison$魚,Fish_n = "N", Fish_y = "Y")
poison$マヨ <- recode(poison$マヨ,Mayo_n = "N", Mayo_y = "Y")
poison$ズッキーニ <- recode(poison$ズッキーニ,Courg_n = "N", Courg_y = "Y")
poison$チーズ <- recode(poison$チーズ,Cheese_n = "N", Cheese_y = "Y")
poison$アイスクリーム <- recode(poison$アイスクリーム,Icecream_n = "N", Icecream_y = "Y")

summary(poison)
##       年齢            時刻       発症     性別    吐き気 嘔吐   腹痛   発熱   下痢  
##  Min.   : 4.00   Min.   : 0.00   N:17   女性:28   N:43   N:33   N:18   N:20   N:20  
##  1st Qu.: 6.00   1st Qu.: 0.00   Y:38   男性:27   Y:12   Y:22   Y:37   Y:35   Y:35  
##  Median : 8.00   Median :12.00                                                      
##  Mean   :16.93   Mean   :10.16                                                      
##  3rd Qu.:10.00   3rd Qu.:16.50                                                      
##  Max.   :88.00   Max.   :22.00                                                      
##  ポテト 魚     マヨ   ズッキーニ チーズ アイスクリーム
##  N: 3   N: 1   N:10   N: 5       N: 7   N: 4          
##  Y:52   Y:54   Y:45   Y:50       Y:48   Y:51          
##                                                       
##                                                       
##                                                       
## 
tbl_df(poison)
## # A tibble: 55 × 15
##     年齢  時刻   発症   性別 吐き気   嘔吐   腹痛   発熱   下痢 ポテト     魚   マヨ
## *  <int> <int> <fctr> <fctr> <fctr> <fctr> <fctr> <fctr> <fctr> <fctr> <fctr> <fctr>
## 1      9    22      Y   女性      Y      N      Y      Y      Y      Y      Y      Y
## 2      5     0      N   女性      N      N      N      N      N      Y      Y      Y
## 3      6    16      Y   女性      N      Y      Y      Y      Y      Y      Y      Y
## 4      9     0      N   女性      N      N      N      N      N      Y      Y      N
## 5      7    14      Y   男性      N      Y      Y      Y      Y      Y      Y      Y
## 6     72     9      Y   男性      N      N      Y      Y      Y      Y      N      Y
## 7      5    16      Y   女性      N      Y      Y      Y      Y      Y      Y      Y
## 8     10     8      Y   女性      Y      Y      Y      Y      Y      Y      Y      Y
## 9      5    20      Y   男性      Y      N      Y      Y      Y      Y      Y      Y
## 10    11    12      Y   男性      N      Y      N      Y      Y      Y      Y      Y
## # ... with 45 more rows, and 3 more variables: ズッキーニ <fctr>, チーズ <fctr>,
## #   アイスクリーム <fctr>

先ほどの例と同様にMCA処理をおこなって、リザルトをsummary で確認する。変数名_Y、変数名_Nとしてカテゴリ名が生成されていることが確認できる。

res.mca <- MCA(poison[,5:15],graph = FALSE)
summary(res.mca)
## 
## Call:
## MCA(X = poison[, 5:15], graph = FALSE) 
## 
## 
## Eigenvalues
##                        Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7   Dim.8
## Variance               0.335   0.129   0.107   0.096   0.079   0.071   0.060   0.056
## % of var.             33.523  12.914  10.735   9.588   7.883   7.109   6.017   5.577
## Cumulative % of var.  33.523  46.437  57.172  66.760  74.643  81.752  87.769  93.346
##                        Dim.9  Dim.10  Dim.11
## Variance               0.041   0.013   0.012
## % of var.              4.121   1.304   1.229
## Cumulative % of var.  97.467  98.771 100.000
## 
## Individuals (the 10 first)
##          Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3    ctr   cos2  
## 1     | -0.453  1.111  0.347 | -0.264  0.982  0.118 |  0.172  0.498  0.050 |
## 2     |  0.836  3.792  0.556 | -0.032  0.014  0.001 | -0.072  0.088  0.004 |
## 3     | -0.448  1.089  0.548 |  0.135  0.258  0.050 | -0.225  0.856  0.138 |
## 4     |  0.880  4.204  0.748 | -0.085  0.103  0.007 | -0.021  0.007  0.000 |
## 5     | -0.448  1.089  0.548 |  0.135  0.258  0.050 | -0.225  0.856  0.138 |
## 6     | -0.359  0.701  0.025 | -0.436  2.677  0.037 | -1.209 24.770  0.281 |
## 7     | -0.448  1.089  0.548 |  0.135  0.258  0.050 | -0.225  0.856  0.138 |
## 8     | -0.641  2.226  0.615 | -0.005  0.000  0.000 |  0.113  0.216  0.019 |
## 9     | -0.453  1.111  0.347 | -0.264  0.982  0.118 |  0.172  0.498  0.050 |
## 10    | -0.141  0.107  0.039 |  0.122  0.209  0.029 | -0.227  0.872  0.101 |
## 
## Categories (the 10 first)
##             Dim.1    ctr   cos2 v.test    Dim.2    ctr   cos2 v.test    Dim.3    ctr
## 吐き気_N |  0.267  1.516  0.256  3.720 |  0.121  0.811  0.053  1.689 | -0.266  4.670
## 吐き気_Y | -0.958  5.432  0.256 -3.720 | -0.435  2.906  0.053 -1.689 |  0.952 16.734
## 嘔吐_N   |  0.479  3.734  0.344  4.311 | -0.409  7.072  0.251 -3.683 |  0.084  0.363
## 嘔吐_Y   | -0.719  5.601  0.344 -4.311 |  0.614 10.608  0.251  3.683 | -0.127  0.544
## 腹痛_N   |  1.318 15.418  0.845  6.755 | -0.036  0.029  0.001 -0.183 | -0.005  0.001
## 腹痛_Y   | -0.641  7.500  0.845 -6.755 |  0.017  0.014  0.001  0.183 |  0.002  0.000
## 発熱_N   |  1.172 13.541  0.785  6.509 | -0.175  0.783  0.017 -0.972 |  0.097  0.291
## 発熱_Y   | -0.670  7.738  0.785 -6.509 |  0.100  0.447  0.017  0.972 | -0.056  0.167
## 下痢_N   |  1.183 13.797  0.799  6.570 | -0.003  0.000  0.000 -0.015 | -0.083  0.212
## 下痢_Y   | -0.676  7.884  0.799 -6.570 |  0.002  0.000  0.000  0.015 |  0.047  0.121
##            cos2 v.test  
## 吐き気_N  0.253 -3.694 |
## 吐き気_Y  0.253  3.694 |
## 嘔吐_N    0.011  0.760 |
## 嘔吐_Y    0.011 -0.760 |
## 腹痛_N    0.000 -0.026 |
## 腹痛_Y    0.000  0.026 |
## 発熱_N    0.005  0.540 |
## 発熱_Y    0.005 -0.540 |
## 下痢_N    0.004 -0.461 |
## 下痢_Y    0.004  0.461 |
## 
## Categorical variables (eta2)
##              Dim.1 Dim.2 Dim.3  
## 吐き気     | 0.256 0.053 0.253 |
## 嘔吐       | 0.344 0.251 0.011 |
## 腹痛       | 0.845 0.001 0.000 |
## 発熱       | 0.785 0.017 0.005 |
## 下痢       | 0.799 0.000 0.004 |
## ポテト     | 0.029 0.396 0.264 |
## 魚         | 0.007 0.027 0.252 |
## マヨ       | 0.383 0.035 0.039 |
## ズッキーニ | 0.015 0.446 0.053 |
## チーズ     | 0.194 0.053 0.012 |