macOS + Rをつかってcsvデータをビジュアライズしてみる

統計的な処理をやったことがなかったので、それに特化された言語のRをいじってみた。

### データソース候補

[海外在留邦人数調査統計　統計表一覧 ｜ 外務省](http://www.mofa.go.jp/mofaj/toko/page22_000043.html)

- 平成29年（2017年）要約版（平成28年10月1日現在）（閲覧用（PDF））（印刷用（PDF））（Excel 1）（Excel 2）（Excel 3）（CSV）
- 平成29年（2017年）詳細版（平成28年10月1日現在）（PDF 1）（PDF 2）（Excel 1 ）（Excel 2 ）（CSV 1）（CSV 2）
- 平成28年（2016年）要約版（平成27年10月1日現在）（閲覧用（PDF））（印刷用（PDF））（Excel 1）（Excel 2）（CSV）
- 平成28年（2016年）詳細版（平成27年10月1日現在）（PDF 1）（PDF 2）（Excel 1 ）（Excel 2 ）（CSV 1）（CSV 2）
- 平成27年（2015年）要約版（平成26年10月1日現在）（閲覧用（PDF））（印刷用（PDF））（Excel 1）（Excel 2）（CSV）
- 平成27年（2015年）詳細版（平成26年10月1日現在）（PDF 1）（PDF 2）（Excel 1 ）（Excel 2 ）（CSV 1）（CSV 2）
- 平成26年（2014年）要約版（平成25年10月1日現在）（閲覧用（PDF））（印刷用（PDF））（Excel 1）（Excel 2）（CSV）
- 平成26年（2014年）詳細版（平成25年10月1日現在）（PDF 1）（PDF 2）（Excel 1）（Excel 2）（CSV 1）（CSV 2）
- 平成25年（2013年）要約版（平成24年10月1日現在）（閲覧用（PDF））（印刷用（PDF））（Excel ）（CSV）
- 平成24年（2012年）速報版（平成23年10月1日現在）（閲覧用（PDF））（印刷用（PDF）） （Excel） （CSV） 詳細版-1（PDF） 詳細-2（PDF）

これらの中から、CSVを使うと思ったが、おそろしく毎年データ形式がちがうのでデータソースを
「平成29年（2017年）要約版（平成28年10月1日現在）」を部分的に絞って整形して使用する


H14-H28 (2002-2016)

- 在留邦人総数 h28-h14
  1. 永住者
  2. 長期滞在者
      1. 民間企業関係者
      2. 報道関係者
- 本人と家族も含み、男女の合計である

xlsxファイルをNumbers.appで加工してutf-8のcsvにしておく

```tsv
	H28	H27	H26	H25	H24	H23	H22	H21	H20	H19	H18	H17	H16	H15	H14
Ⅰ　アジア	392216	385507	379498	362878	362022	331796	312767	302469	292632	287157	277735	260747	234734	206521	187952
Ⅱ　大洋州	118452	114436	108903	105067	100320	95198	91186	91189	86553	82491	78099	72871	67887	63018	63588
Ⅲ　北米	491844	485864	477507	474996	472835	454835	442900	437308	436532	422116	414552	397585	380228	369639	352358
Ⅳ　中米	14419	12354	12125	11352	11112	10167	9784	9546	9292	9021	8780	8700	7810	7584	6977
Ⅴ　南米	79615	79608	80213	82756	81754	82029	83831	85009	85750	85974	88662	89701	92676	94310	95652
Ⅵ　西欧	213202	211445	204711	194406	194878	182836	177380	180622	180742	174713	174138	162643	159528	152833	150587
Ⅶ　東欧・旧ソ連	9806	9249	9061	8968	8783	8112	7823	7916	8051	8002	7656	7132	6297	5715	5109
Ⅷ　中東	10962	10569	10083	9773	9606	9452	9695	9832	9754	8845	7685	7062	6077	5857	5608
Ⅸ　アフリカ	7931	8020	8050	8037	8236	8102	7963	7888	7658	7317	6351	6069	6028	5541	5770
Ⅹ　南極	30	26	24	30	31	30	28	28	29	35	37	37	42	44	40
```


## Rのインストール

homebrewはgcc依存で時間がかかりそうだったので、公式のBinary [R for Mac OS X](https://cran.r-project.org/bin/macosx/)　でインストール。
[XQuartz](https://www.xquartz.org/)　も必要。




## Rの起動と終了

`r` でなく `R`

```
% R

R version 3.4.3 (2017-11-30) -- "Kite-Eating Tree"
Copyright (C) 2017 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin15.6.0 (64-bit)

R は、自由なソフトウェアであり、「完全に無保証」です。
一定の条件に従えば、自由にこれを再配布することができます。
配布条件の詳細に関しては、'license()' あるいは 'licence()' と入力してください。

R は多くの貢献者による共同プロジェクトです。
詳しくは 'contributors()' と入力してください。
また、R や R のパッケージを出版物で引用する際の形式については
'citation()' と入力してください。

'demo()' と入力すればデモをみることができます。
'help()' とすればオンラインヘルプが出ます。
'help.start()' で HTML ブラウザによるヘルプがみられます。
'q()' と入力すれば R を終了します。

 [以前にセーブされたワークスペースを復帰します]
> q()
Save workspace image? [y/n/c]: n
```

### データの読み込み

いろいろ、読み込み方があり、cp932を指定した方もあるが、今回はわざわざやらないで
utf-8のファイルを `read.table()` で読み込みする。

```
> csv <- read.csv('./h28_mod.tsv')
> mode(csv)
[1] "list"
> colnames(csv)
[1] "H28.H27.H26.H25.H24.H23.H22.H21.H20.H19.H18.H17.H16.H15.H14"
> rownames(csv)
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
>

> library(readr)
> csv <- read_csv('./h28_mod.tsv')
> mode(csv)
[1] "list"
> colnames(csv)
[1] "\tH28\tH27\tH26\tH25\tH24\tH23\tH22\tH21\tH20\tH19\tH18\tH17\tH16\tH15\tH14"
> rownames(csv)
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"

> df <- read.table('./h28_mod.tsv')
> mode(df)
[1] "list"
> colnames(df)
 [1] "H28" "H27" "H26" "H25" "H24" "H23" "H22" "H21" "H20" "H19" "H18" "H17"
[13] "H16" "H15" "H14"
> rownames(df)
 [1] "Ⅰ　アジア"       "Ⅱ　大洋州"       "Ⅲ　北米"         "Ⅳ　中米"
 [5] "Ⅴ　南米"         "Ⅵ　西欧"         "Ⅶ　東欧・旧ソ連" "Ⅷ　中東"
 [9] "Ⅸ　アフリカ"     "Ⅹ　南極"
```

統計処理に特化されていて便利そう。

```
> summary(data)
   Ⅰ　アジア        Ⅱ　大洋州         Ⅲ　北米          Ⅳ　中米
 Min.   :187952   Min.   : 63018   Min.   :352358   Min.   : 6977
 1st Qu.:269241   1st Qu.: 75485   1st Qu.:406068   1st Qu.: 8740
 Median :302469   Median : 91186   Median :437308   Median : 9546
 Mean   :305109   Mean   : 89284   Mean   :434073   Mean   : 9935
 3rd Qu.:362450   3rd Qu.:102694   3rd Qu.:473916   3rd Qu.:11232
 Max.   :392216   Max.   :118452   Max.   :491844   Max.   :14419
    Ⅴ　南米         Ⅵ　西欧       Ⅶ　東欧・旧ソ連    Ⅷ　中東
 Min.   :79608   Min.   :150587   Min.   :5109    Min.   : 5608
 1st Qu.:81892   1st Qu.:168390   1st Qu.:7394    1st Qu.: 7374
 Median :85009   Median :180622   Median :8002    Median : 9606
 Mean   :85836   Mean   :180978   Mean   :7845    Mean   : 8724
 3rd Qu.:89182   3rd Qu.:194642   3rd Qu.:8876    3rd Qu.: 9802
 Max.   :95652   Max.   :213202   Max.   :9806    Max.   :10962
  Ⅸ　アフリカ      Ⅹ　南極
 Min.   :5541   Min.   :24.00
 1st Qu.:6210   1st Qu.:28.50
 Median :7888   Median :30.00
 Mean   :7264   Mean   :32.73
 3rd Qu.:8028   3rd Qu.:37.00
 Max.   :8236   Max.   :44.00
```

### データの変形

行列の入れ替えが必要なので `t()` で入れ替える。
x軸のyearラベルと凡例でつかう areaラベルを設定する。

```
> df
                   H28    H27    H26    H25    H24    H23    H22    H21    H20
Ⅰ　アジア       392216 385507 379498 362878 362022 331796 312767 302469 292632
Ⅱ　大洋州       118452 114436 108903 105067 100320  95198  91186  91189  86553
Ⅲ　北米         491844 485864 477507 474996 472835 454835 442900 437308 436532
Ⅳ　中米          14419  12354  12125  11352  11112  10167   9784   9546   9292
Ⅴ　南米          79615  79608  80213  82756  81754  82029  83831  85009  85750
Ⅵ　西欧         213202 211445 204711 194406 194878 182836 177380 180622 180742
Ⅶ　東欧・旧ソ連   9806   9249   9061   8968   8783   8112   7823   7916   8051
Ⅷ　中東          10962  10569  10083   9773   9606   9452   9695   9832   9754
Ⅸ　アフリカ       7931   8020   8050   8037   8236   8102   7963   7888   7658
Ⅹ　南極             30     26     24     30     31     30     28     28     29
                   H19    H18    H17    H16    H15    H14
Ⅰ　アジア       287157 277735 260747 234734 206521 187952
Ⅱ　大洋州        82491  78099  72871  67887  63018  63588
Ⅲ　北米         422116 414552 397585 380228 369639 352358
Ⅳ　中米           9021   8780   8700   7810   7584   6977
Ⅴ　南米          85974  88662  89701  92676  94310  95652
Ⅵ　西欧         174713 174138 162643 159528 152833 150587
Ⅶ　東欧・旧ソ連   8002   7656   7132   6297   5715   5109
Ⅷ　中東           8845   7685   7062   6077   5857   5608
Ⅸ　アフリカ       7317   6351   6069   6028   5541   5770
Ⅹ　南極             35     37     37     42     44     40

> data <- t(df)
> data
    Ⅰ　アジア Ⅱ　大洋州 Ⅲ　北米 Ⅳ　中米 Ⅴ　南米 Ⅵ　西欧 Ⅶ　東欧・旧ソ連 Ⅷ　中東
H28    392216    118452  491844   14419   79615  213202            9806   10962
H27    385507    114436  485864   12354   79608  211445            9249   10569
H26    379498    108903  477507   12125   80213  204711            9061   10083
H25    362878    105067  474996   11352   82756  194406            8968    9773
H24    362022    100320  472835   11112   81754  194878            8783    9606
H23    331796     95198  454835   10167   82029  182836            8112    9452
H22    312767     91186  442900    9784   83831  177380            7823    9695
H21    302469     91189  437308    9546   85009  180622            7916    9832
H20    292632     86553  436532    9292   85750  180742            8051    9754
H19    287157     82491  422116    9021   85974  174713            8002    8845
H18    277735     78099  414552    8780   88662  174138            7656    7685
H17    260747     72871  397585    8700   89701  162643            7132    7062
H16    234734     67887  380228    7810   92676  159528            6297    6077
H15    206521     63018  369639    7584   94310  152833            5715    5857
H14    187952     63588  352358    6977   95652  150587            5109    5608
    Ⅸ　アフリカ Ⅹ　南極
H28        7931      30
H27        8020      26
H26        8050      24
H25        8037      30
H24        8236      31
H23        8102      30
H22        7963      28
H21        7888      28
H20        7658      29
H19        7317      35
H18        6351      37
H17        6069      37
H16        6028      42
H15        5541      44
H14        5770      40

> area <- colnames(data)
> area
 [1] "Ⅰ　アジア"       "Ⅱ　大洋州"       "Ⅲ　北米"         "Ⅳ　中米"
 [5] "Ⅴ　南米"         "Ⅵ　西欧"         "Ⅶ　東欧・旧ソ連" "Ⅷ　中東"
 [9] "Ⅸ　アフリカ"     "Ⅹ　南極"
 
> rownames(data)
 [1] "H28" "H27" "H26" "H25" "H24" "H23" "H22" "H21" "H20" "H19" "H18" "H17"
[13] "H16" "H15" "H14"
> year <- c(2016:2002)
> year
 [1] 2016 2015 2014 2013 2012 2011 2010 2009 2008 2007 2006 2005 2004 2003 2002
```

### 複数データの図の描画

`plot()` だと同時に描画できないので、 `matplot()` を使う

```
> matplot(data)
 50 件以上の警告がありました (最初の 50 個の警告を見るには warnings() を使って下さい)
> warnings()
 警告メッセージ:
1: In plot.xy(xy, type, ...) :
   フォントファミリー "Arial" に対してフォントが見つかりません
2: In plot.xy(xy, type, ...) :
   フォントファミリー "Arial" に対してフォントが見つかりません..
..
..


```


### 日本語フォントの指定

`area` が日本語なので、対応したフォントを指定しないといけない。
macOSでは、quartzFontを使って生成・指定ができる。
Roman, Bold, Italic, BoldItalic の順でlistで指定する
（日本語フォントだとItalicはないので Regular, Bold, Regular, Bold）

family に quartzFontsで追加したものを指定する

```
> quartzFonts()
$serif
[1] "Times-Roman"      "Times-Bold"       "Times-Italic"     "Times-BoldItalic"

$sans
[1] "Helvetica"             "Helvetica-Bold"        "Helvetica-Oblique"
[4] "Helvetica-BoldOblique"

$mono
[1] "Courier"             "Courier-Bold"        "Courier-Oblique"
[4] "Courier-BoldOblique"

> quartzFonts("ricty" =  c("Ricty-Regular", "Ricty-Bold", "Ricty-Regular", "Ricty-Bold"))
> quartzFonts()
$serif
..
..
..
$ricty
[1] "Ricty-Regular" "Ricty-Bold"    "Ricty-Regular" "Ricty-Bold"

> par(family = "ricty")

matplot(year, data)
```
![Screenshot 2018-01-22 21.45.24.png](https://qiita-image-store.s3.amazonaws.com/0/200541/5970b00e-0f90-dce1-6537-574bb682bc4c.png)

![Screenshot 2018-01-22 21.49.42.png](https://qiita-image-store.s3.amazonaws.com/0/200541/fbba269c-d49c-85dc-f935-8a359fc3d43d.png)


### 大きな桁数の数字が指数表示にならないようにする

scipenオプションが0になっているのを大きくしてあげればいい。

```
> 100000
[1] 1e+05
> options(scipen=100)
> 100000
[1] 100000
````
![Screenshot 2018-01-22 21.50.49.png](https://qiita-image-store.s3.amazonaws.com/0/200541/3f99369e-04b2-1e7a-22d4-02c999e9961a.png)



### 凡例

グラフの line typeとcolorにあわせてあげる

```
> matplot(year, data, type='l', xlab="年", ylab="人数", main="在留邦人総数")
> legend('topleft', area)
```

![Screenshot 2018-01-22 21.58.42.png](https://qiita-image-store.s3.amazonaws.com/0/200541/3dd27846-ade2-1752-694c-82b40b8d9ab8.png)


```
> matplot(year, data, type='o', xlab="年", ylab="日本人", main="在留邦人総数",lty=c(6:1), col=c(10:1), pch = c(1:10))
> legend('topleft', area, lty=c(6:1), col=c(10:1))
```
![Screenshot 2018-01-22 21.59.47.png](https://qiita-image-store.s3.amazonaws.com/0/200541/3b710c78-d031-b098-213a-2a1b1b967640.png)



### 参考にした

- [R\-Tips](http://cse.naro.affrc.go.jp/takezawa/r-tips/r.html)
- [Rプログラミングの小ネタ](http://tips-r.blogspot.jp/)
- [Rプログラム \(TAKENAKA's Web Page\)](http://takenaka-akio.org/doc/r_auto/index.html)
- [R \| R の使い方、グラフの書き方、ggplot の使い方](https://stats.biopapyrus.jp/r/)
- [R グラフ 凡例の調整 legendのオプション – バイオインフォ 道場 \[bioinfo\-Dojo\]](http://bioinfo-dojo.net/2017/08/17/r-legend_option/)



### おまけ

それぞれのエリアについて（平成28年10月1日現在）

- Ⅰ　アジア
  - インド
  - インドネシア
  - カンボジア
  - シンガポール
  - スリランカ
  - タイ
  - 韓国
  - 台湾
  - 中国
  - ネパール
  - パキスタン
  - バングラデシュ
  - 東ティモール
  - フィリピン
  - ブータン
  - ブルネイ
  - ベトナム
  - マレーシア
  - ミャンマー
  - モルディブ
  - モンゴル
  - ラオス
- Ⅱ　大洋州
  - オーストラリア
  - 北マリアナ諸島（米領-在サイパン事）
  - キリバス
  - グアム（在ハガッニャ総領事館）
  - クック諸島
  - サモア（米領）
  - サモア独立国
  - ソロモン諸島
  - ツバル
  - トンガ
  - ナウル
  - ニウエ
  - ニューカレドニア(仏領）
  - ニュージーランド
  - バヌアツ
  - パプアニューギニア
  - パラオ
  - フィジー
  - ポリネシア(仏領－タヒチ）
  - マーシャル
  - ミクロネシア
- Ⅲ　北米
  - 米国
  - カナダ
  - グリーンランド(デンマーク領）
- Ⅳ　中米
  - アルバ島(蘭領)
  - アンティグア・バーブーダ
  - アンテｨル諸島（蘭領）
  - エルサルバドル
  - キュラカオ島（蘭領）
  - キューバ
  - グアテマラ
  - グァドループ島(仏領)
  - グレナダ
  - コスタリカ
  - ジャマイカ
  - セントクリストファー・ネーヴィス
  - セントビンセント及びグレナディーン諸島
  - セントマーティン島（蘭領）
  - セントルシア
  - ドミニカ共和国
  - ドミニカ国
  - トリニダード・トバゴ
  - ニカラグア
  - バージン諸島（米領）
  - バージン諸島（英領）
  - ハイチ
  - パナマ
  - バハマ
  - バルバドス
  - プエルトリコ（米領）
  - ベリーズ
  - ホンジュラス
  - マルティニーク島（仏領）
  - メキシコ
- Ⅴ　南米
  - アルゼンチン
  - ウルグアイ
  - エクアドル
  - ガイアナ
  - ギアナ（仏領）
  - コロンビア
  - スリナム
  - チリ
  - パラグアイ
  - ブラジル
  - ベネズエラ
  - ペルー
  - ボリビア
- Ⅵ　西欧
  - アイスランド
  - アイルランド
  - アンドラ
  - イタリア
  - 英国
  - エストニア
  - オーストリア
  - オランダ
  - キプロス
  - ギリシャ
  - サンマリノ
  - スイス
  - スウェーデン
  - スペイン
  - デンマーク
  - ドイツ
  - ノルウェー
  - バチカン
  - フィンランド
  - フェロー諸島（デンマーク領）
  - フランス
  - ベルギー
  - ポルトガル
  - マルタ
  - モナコ
  - ラトビア
  - リトアニア
  - リヒテンシュタイン
  - ルクセンブルク
- Ⅶ　東欧・旧ソ連
  - アゼルバイジャン
  - アルバニア
  - アルメニア
  - ウクライナ
  - ウズベキスタン
  - カザフスタン
  - キルギス
  - クロアチア
  - コソボ
  - ジョージア
  - スロバキア
  - スロベニア
  - セルビア
  - タジキスタン
  - チェコ
  - トルクメニスタン
  - ハンガリー
  - ブルガリア
  - ベラルーシ
  - ポーランド
  - ボスニア・ヘルツェゴビナ
  - マケドニア旧ユーゴスラビア共和国
  - モルドバ
  - モンテネグロ
  - ルーマニア
  - ロシア
- Ⅷ　中東
  - アフガニスタン
  - アラブ首長国連邦
  - イエメン
  - イスラエル及びガザ地区等
  - イラク
  - イラン
  - オマーン
  - カタール
  - クウェート
  - サウジアラビア
  - シリア
  - トルコ
  - バーレーン
  - ヨルダン
  - レバノン
- Ⅸ　アフリカ
  - アルジェリア
  - アンゴラ
  - ウガンダ
  - エジプト
  - エチオピア
  - エリトリア
  - ガーナ
  - カーボヴェルデ
  - ガボン
  - カメルーン
  - ガンビア
  - ギニア
  - ギニアビサウ
  - ケニア
  - コートジボワール
  - コモロ
  - コンゴ共和国
  - コンゴ民主共和国
  - サントメ・プリンシペ
  - ザンビア
  - シエラレオネ
  - ジブチ
  - ジンバブエ
  - スーダン
  - スワジランド
  - セーシェル
  - 赤道ギニア
  - セネガル
  - ソマリア
  - タンザニア
  - チャド
  - 中央アフリカ
  - チュニジア
  - トーゴ
  - ナイジェリア
  - ナミビア
  - 西サハラ
  - ニジェール
  - ブルキナファソ
  - ブルンジ
  - ベナン
  - ボツワナ
  - マダガスカル
  - マラウィ
  - マリ
  - 南アフリカ
  - 南スーダン
  - モーリシャス
  - モーリタニア
  - モザンビーク
  - モロッコ
  - リビア
  - リベリア
  - ルワンダ
  - レ・ユニオン（仏領）
  - レソト
- Ⅹ　南極
  - 南極

わかったこと、南極に家族をつれてはいかない