R言語 - 様々なデータタイプを混合してグラフモデルを構築する "mgm" パッケージ

# はじめに
　様々なデータタイプを混合してグラフモデルを構築できたら、色々な発見があると思います。例えば以下のようなユースケースです。

#### データタイプの例
###### インターネット・マーケティングデータの例
　たとえば、とある会社が売り上げの最適化を目標とする中で、データ収集していたら次のようなデータになるでしょう。

| データの名称 | データの種類 |
|:-:|:-:|
| リンクのクリック           | 分類的(categorical)|
| ウェブサイトの滞在時間      |連続的(continuous)|
| 履歴のブラウジング         | 分類的(categorical)|
| ソーシャルメディアのポスト  |件数(count)|
| ソーシャルネットの友人数    |件数(count)|
| ストリーミングサービスの消費|分類的(categorical)|

###### 人の行動特性プロファイルの例
　たとえば、人の行動特性間の相関に興味を向ける中で、データ収集していたら次のようなデータになるでしょう。

| データの名称 | データの種類 |
|:-:|:-:|
| ジェンダー       |      分類的(categorical)|
| 年齢             |     連続的(continuous)|
| 振る舞いの頻繁さ  |      件数(count)|
| イベントの発生    |     分類的(categorical)|
| 薬剤の投与量      |     連続的(continuous)|

　R環境では、これらの様々なデータタイプの相関を "mgm" パッケージにより確認する事ができます。この Tips では、"mgm" パッケージを利用した分析例をご紹介します。  利用したデータは、総務省統計局の[家計調査（家計収支編）時系列データ（二人以上の世帯）](http://www.stat.go.jp/data/kakei/longtime/zuhyou/n1602000.xls)を csv 形式にしたものです。

# データを準備する
家計調査時系列データをダウンロードし、ファイル名「n1602000.csv」で保存します。その後、以下の手順で csv 形式ファイルを読み込みます。
▼サンプルスクリプト

```R:R
# 環境情報
# R version 3.2.5 (2016-04-14) - Very, Very Secure Dishes
# 作業ディレクトリの指定
setwd( "working_dir" )

# データの読み込み
data <- read.csv('n1602000.csv', header=T)  

#データタイプの指定
#"g" Gaussian(正規分布), "p" Poisson(件数), "c" Categorical(分類))
type <- c("c","p","p","g","g","g","g","g","c","g","g","g","g","g","g","g","g",
          "g","g","g","g","g","g","g","g","g","g","g","g","g","g","g","g","g",
          "g","g","g","g","g","g","g","g","g","g","g","g","g","g","g","g","g",
          "g")
#number of categories for each varibale (categorical以外は1になる)
lev <- c(16,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
         1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)

# カラムの名前
data_colnames <- c("Year","Num. of persons per household (persons)",
                   "Num. of earners per household (persons)",
                   "Age of household heads(years old)","Household heads",
                   "Spouse of household heads","Other household members",
                   "Yearly income","Class of yearly income",
                   "Disposable income","Rice","Bread","Noodles",
                   "Other cereals","Raw fish & shellfish",
                   "Salted & dried fish","Fish-paste products",
                   "Other processed fish","Raw meat","Processed meat",
                   "Fresh milk","Dairy products","Eggs","Fresh vegetables",
                   "Dried vegetables & seaweeds","Soybean products",
                   "Other processed vegetables & seaweeds","Fresh fruits",
                   "Processed fruits","Oil & fats","Seasonings",
                   "Cakes & candies","Tea","Coffee & cocoa",
                   "Alcoholic beverages","Eating out","Housing",
                   "Fuel light & water charges","Men's clothing",
                   "Women's clothing","Children's clothing","Medical care",
                   "Public transpor-tation","Private transpor-tation",
                   "Communi-cation","Culture & recreation","Tobacco",
                   "Pocket money (of which detailed uses unknown)",
                   "Social expenses",
                   "Ratio of surplus to disposable income (%)",
                   "average savings rate(%)","Engel's coefficient (%)")
```

# 混合グラフモデルを構築する
　混合グラフモデルは、mgmfit ファンクションで構築します。
▼サンプルスクリプト

```R:R
# 必要に応じて、パッケージをインストールする
# この Tips では、mgm パッケージは1.1-6 を使用しています
install.packages("devtools")
install_github('jmbh/mgm')

# ライブラリの読み込み
library(devtools)
library(mgm)

# 混合グラフモデルの構築
fit <- mgmfit( data, type, lev, d = 4 )

```
このモデルで構築された変数の一部は、次の通りです。

|変数名        |説明                 |
|:-----|:-------|
|fit$signs     | 変数間の相関        |
|fit$wadj      | 重み付け隣接行列    |
|fit$adj       | 重み無し隣接行列    |
|fit$edgecolor | ポジティブ(緑色)、ネガティブ(赤)、未定義(灰色)|


# 混合グラフモデルを可視化する
▼サンプルスクリプト

```R:R
# 必要に応じて、パッケージをインストール
# この Tips では、mgm パッケージは1.3.3 を使用しています
install_github('SachaEpskamp/qgraph')

# ライブラリの読み込み
library(qgraph)

# 変数の定義
groups_typeV <- list("正規分布する変数"=which(type=='g'), 
                     "カウントする変数"=which(type=='p'),
                     "分類に関する変数"=which(type=='c'))
group_col <- c("#72CF53", "#53B0CF", "#ED3939")

# グラフの JPEG への保存
jpeg("家計調査.jpg", height=2*1300, width=2*1300, unit='px')
Q0 <- qgraph(fit$wadj, 
       vsize=3.5, 
       esize=2, 
       layout="spring", 
        edge.color = fit$edgecolor, 
       color=group_col,
       border.width=1.5,
       border.color="black",
       groups=groups_typeV,
       nodeNames=data_colnames,
       legend=TRUE, 
       legend.mode="style2",
       legend.cex=1.5)
dev.off()
```

# 実行結果例
![image](https://qiita-image-store.s3.amazonaws.com/0/106773/f80a5b2b-f0ce-5049-23e4-5b5c6503a50f.png)

収入(No.9)が多い人は、家族メンバ(No.7)が多い傾向にあります。(*家族が多いと、頑張って働くということですかね？*)面白いのは、使途不明金(No.48)まわりです。使途不明金(No.48)が多い人は、当然ながらエンゲル係数(no.52)が高いことと相関があります。また、使途不明金(No.48)が多い人は、家族メンバ(No.7)が多く、それは子供服(No.41)と相関があることも分かります。(*意外と子煩悩な日本人像が浮かび上がりますね*)


# リファレンス
[mgm パッケージのマニュアル](http://arxiv.org/pdf/1510.06871v2.pdf)
[Jonas Haslbeck の Blog](http://jmbh.github.io//Interactions-between-categorical-Variables-in-mixed-graphical-models/)
[Jonas M. B. Haslbeck, Lourens J. Waldorp の論文](http://arxiv.org/pdf/1510.06871v2.pdf)
[総務省統計局 家計調査（家計収支編）時系列データ（二人以上の世帯）](http://www.stat.go.jp/data/kakei/longtime/zuhyou/n1602000.xls)