Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Ⅳ. 可視化事例集 2017

140 views

Published on

Rの初心者向け一日講座テキストの第四分冊(全四冊)

Published in: Education
  • Be the first to comment

  • Be the first to like this

Ⅳ. 可視化事例集 2017

  1. 1. 統計解析ソフト R による 「ミクロデータ分析の基礎」 平成 29 年度(2017 年) Ⅳ. 可視化事例集 作成: 和田かず美・河野真理子 協力: 床裕佳子・坂下佳一郎・田中隆・飯島信也
  2. 2. 目次 1.e-statデータ(結果表)からのグラフ作成............................................1 1.1 折れ線グラフ ................................................................................1 1.2 棒グラフ......................................................................................4 1.3 人口ピラミッド .............................................................................9 2.レーダーチャート.................................................................................12 3.地図の作成 .........................................................................................15 4.バルーンプロット.................................................................................22 5.Circos プロット...................................................................................26 ~応用編について~ ここでは、R の最大の特徴である可視化方法について、いくつかの事例を、サンプ ルコードとともに紹介する。Excel でもグラフ等を描くことはできるが、R では関数 やパッケージを使うことで複雑な作図を作成できる。また一度コードを作成すれば、 データを変えて容易に同じ作図が可能になる。
  3. 3. IV-1 1.e-statデータ(結果表)からのグラフ作成 e-stat で公表されている結果表から折れ線グラフ、棒グラフ、人口ピラミッドを作成す る。 1.1 折れ線グラフ 人口推計平成 29 年 5 月報の総人口の推移の折れ線グラフを作成する。必要なデータファ イルの入手手順は以下のとおり。 ① まず、e-stat [http://www.e-stat.go.jp/] から、「統計データを探す」というタブを 選び、「主要な統計から探す」を選択する。 ② 一番左上にある「人口・世帯」の項の二番目にある「人口推計」を選択する。 ③ 「各月 1 日現在人口」の「月次」から、最新のもの(テキスト作成時点では、2017 年 5 月)を選択する。 ④ 表が 2 つ表示されるので、下の「(参考表)全国人口の推移」の行の「Excel」ボタン を押してデータファイル(ファイル名 05k2-2.xls)を入手し、適切なフォルダに保存 する。 入手した結果表のイメージは、表 1.1 のとおり。現在のところ、このデータは Excel 形 式のみで公開されており、結合セルも多いので、手作業で編集・加工を行い、表 1.2 のよ うな R へのインプット用の csv ファイルを作成する。 具体的には、使用する「年月」と「月初人口」だけを二行目以降に残し、各列の一行目 には、R 内で変数の名前となる項目名として、1 列目の年月データには「YearMonth」、2 列目の人口データには「Popuration」を入れる。二列目は、セルの書式設定の表示形式を 標準形式として数値内のカンマを除き、年月データを西暦に書き換え、csv 形式(例えばフ ァイル名を 05k2-2.csv)として保存する。 この csv ファイルの置き場所を、下に示したコードの setwd 関数内で指定する。また、 read.csv 関数で指定するファイル名は作成した csv ファイルの名前と一致させなければな らない。サンプルコードの黄色いマーカー部分は、使用するフォルダやファイル名に合わ せて修正が必要な部分を示している。 rm(list=ls(all=T RUE)) # 作業領域の掃除 setwd("D:/K01/V04/1-1") #インプットデータの保存先
  4. 4. IV-2 #加工した人口推計データ csv データを読み込む(表示) (dat <- read.csv("05k2-2.csv", header=TRUE)) str(dat) #データを見る #人口を万単位にする dat$Population <- dat$Population/10000 #*************************** # plot 引数 #type:p(点プロット),l(線プロット),b(点と線プロット)他 c,o,h,s,S,n #lty:線の形式 #lwd:線分の幅(数値が大きくなるほど太くなる) #xlab,ylab:x 及び y 座標名 #las:ラベルを全て垂直に #main:グラフのタイトル #*************************** #描画 plot(dat$Population, type="l", lty=1, lwd=1, xlab="年月 ", ylab="人 口(万 人) ", las=3, main="平成 29 年 5 月人口推計(2015 年 1 月~2016 年 12 月)") #----------------図 1.1 が表示される #これでも表示できるが、x 軸の年月が分かりづらい #余白の変更 par(mar=c(6,6,4,2)) #下・左・上・右の余白サイズ(標準は c(5,4,4,2)) #x 軸と y 軸を別の関数で指定する plot(dat$Population, type="l", lty=1, lwd=1, axes=F, ann=F) axis(side=1,at=1:nrow(dat),labels=dat$YearMonth, las=3) #x 軸 axis(side=2,at=0:max(dat$Population), las=2) #y 軸 mtext("人口(万人)", side=2, line=4) #y 軸のラベル名 title(main="平成 29 年 5 月人口推計(2015 年 1 月~2016 年 12 月)") #タイトル abline(h=seq(0, max(dat$Population), by=2), col="gray", lty=3) #折れ線から数値を読みやすいよう、目盛りの横線を点線で挿入 #----------------図 1.2 が表示される
  5. 5. IV-3 表 1.1 公表結果(参考表) 表 1.2 加工済みインプットデータ ※ 人口データは、カンマを含まない標準形式とし、年月は西暦に修正した。 図 1.1 人口推計折れ線グラフ(1) YearMonth Population 2015年1月 127176979 2015年2月 127157870 2015年3月 127066223 2015年4月 127111844 2015年5月 127080352 2015年6月 127108903 2015年7月 127141473 2015年8月 127128146 2015年9月 127064921 2015年10月 127094745 2015年11月 127095545 2015年12月 127088188 2016年1月 127028111 2016年2月 127013740 2016年3月 126947631 2016年4月 126975470 2016年5月 126924786 2016年6月 126969402 2016年7月 126994511 2016年8月 126976264 2016年9月 126902751 2016年10月 126932772 2016年11月 126937499 2016年12月 126917789 この例では年 月の軸ラベル が分かり難い
  6. 6. IV-4 図 1.2 人口推計折れ線グラフ(2) 1.2 棒グラフ 全国の人口を都道府県別に棒グラフで表示する。使用するデータは「平成 27 年国勢調査 人口速報集計」の「第 1 表 人口,人口増減(平成 22 年~27 年),面積,人口密度,世帯 数及び世帯数増減(平成 22 年~27 年) - 全国,全国市部・郡部,都道府県,都道府県市 部・郡部,市区町村」である。 e-Stat [http://www.e-stat.go.jp/] から、「統計データを探す」⇒「主要な統計から探 す」⇒ 一番左上にある「人口・世帯」の項の「国勢調査」⇒「平成 27 年国勢調査」⇒「人 口速報集計」⇒ 表番号 1 の行の csv ボタンを押して、データファイルをダウンロードし、 適切なフォルダに保存する(ファイル名は、001_00.csv)。 次に、このファイルを R に読み込み、必要な 47 都道府県のデータを抽出する。必要な列 は、「地域コード」、「都道府県名」、「平成 27 年人口」及び「平成 22 年人口」について、次 の条件の列を抜き出している。 ・ 地域識別コード:「a(都道府県)」 ・ 地域コード:「0(全国)」を除く 軸ラベル改善 数値を読みやすい よう、目盛り線を追 加
  7. 7. IV-5 rm(list=ls(all=T RUE)) # 作業領域のお掃除 #ファイルの保存先の指定※R では「¥」を「/」にすること setwd("D:/K01/V04/1-2") #エクセルの CSV データを読み込む dat <- read.table("001_00.csv", sep=",", skip=9, header=TRUE) #第1引数:読み込む csv ファイル名は「001_00.csv」 #第2引数:CSV データの区切り文字は「,」 #第3引数:読み飛ばし行数は9行 #第4引数:1行目をヘッダーにする(TRUE) #※第2引数以降の引数の順番は不問 #取り込んだデータの確認 head(dat) #上位レコード表示 tail(dat) #下位レコード表示 # ヘッダーが空欄の場合や数値から始まる場合は、先頭に「X」が付与される。 #データの抽出 #地域識別コード(列番号=4)が「a(都道府県)」のデータを抜き出す idx <- which(dat[,4]=="a") #対象データの行番号を配列で取得 dat[idx,] #対象データの行番号のデータを表示 nrow(dat[idx,]) #対象データの行数を表示→#[1] 48 #全国が含まれるため、条件を追加 #地域コード(列番号=3)が「0(全国)」を除く idx1 <- which(dat[,4]=="a" & dat[,3]!="0") #対象データの行番号を配列で取得 dat[idx1,] #対象データの行番号のデータを表示 nrow(dat[idx1,]) #対象データの行数を表示→#[1] 47 ##棒グラフ #都道府県別の人口データ(都道府県名と平成 27 年人口) KenJinko <- data.frame(dat[idx1,5], dat[idx1,6]) #*************************** # barplot 関数の引数の解説 # legend:右上に判例を書く # names:各棒のラベルを定める文字型ベクトル指定 # width:各棒の相対的な幅を決める # space:各棒の間の間隔 # beside:TRUE で、行列の列毎のブロック分けではなく、それぞれ値毎に棒を描く # horiz:TRUE で棒を水平に(データは下から順に並ぶ) # cex.names:文字の大きさ(標準1) #*************************** ##縦
  8. 8. IV-6 barplot(KenJinko[,2], names=KenJinko[,1],las=2, cex.names=0.6, main="都道府 県別平成 27 年人口") #----------------図 1.3 が表示される ##横 #※横向きにする場合は、並びが下からになるため、rev で順番を上からに修正している barplot(rev(KenJinko[,2]), names=rev(KenJinko[,1]), las=1, cex.names=0.8, horiz=TRUE, main="都道府県別平成 27 年人口") #特定の都道府県(和歌山県-30 県)の棒の色を変えてみる barplot(rev(KenJinko[,2]), names=rev(KenJinko[,1]), las=1, cex.names=0.8, horiz=TRUE, main="平成 27 年都道府県別人口", col=c(rep("lightblue",17),"pink",rep("lightblue",29)), xlim=c(0, ceiling(KenJinko[13,2]/10e5)*10e5)) # KenJinko[13,2]は東京の人口。10 の 5 乗オーダーで切り上げて軸の最大値に abline(v=((1:15)*10e5), col="gray", lty=3) # 目盛りの点線をグレーで #----------------図 1.4 が表示される #都道府県別人口を時系列(平成 22 年と平成 27 年)で並べてみる KenJinko2 <- data.frame(dat[idx1,7], dat[idx1,6]) rownames(KenJinko2) <- dat[idx1,5] par(mar=c(4,5,3,1)) # マージン設定、下・左・上・右 barplot(t(KenJinko2), las=2, names=rownames(KenJinko2), cex.names=0.6, beside=T RUE, main=" 都 道 府 県 別 平 成 22 年 と 27 年 の 人 口 ", col=c("lightblue","pink"), ylim=c(0, ceiling(KenJinko[13,2]/10e5)*10e5)) abline(h=seq(1000000,14000000,1000000), col="gray", lty=3) legend("topright",legend=c("平成 22 年","平成 27 年"), fill=c("lightblue","pink"), bg="white") #----------------図 1.5 が表示される #市区町村別の人口を表示 #地域コードの上二桁が「30(和歌山県)」の市区町村別のデータ取得 idx30 <- which(substr(dat[,3],1,2)==30 & dat[,4] %in% c("2","3")) idx30 # 内容表示 CityJinko <- data.frame(dat[idx30,5], dat[idx30,6]) #縦棒グラフ par(mar=c(6,5,3,1)) # マージン設定、下・左・上・右 barplot(CityJinko[,2], names=CityJinko[,1],las=2, cex.names=0.8, main="平成 27 年和歌山県市町村別人口" ) #----------------図 1.6 が表示される #横棒グラフ
  9. 9. IV-7 barplot(rev(CityJinko[,2]), names=rev(CityJinko[,1]), las=1, cex.names=0.8, horiz=TRUE, main="平成 27 年和歌山県市町村別人口") 図 1.3 平成 27 年都道府県別人口棒グラフ 図 1.4 平成 27 年都道府県別人口横棒グラフ(和歌山県を着色)
  10. 10. IV-8 図 1.5 都道府県別人口平成 22 年と平成 27 年の比較棒グラフ 図 1.6 平成 27 年和歌山県市区町村別人口棒グラフ 和歌山市 海南市 橋本市 有田市 御坊市 田辺市 新宮市 紀の川市 岩出市 紀美野町 かつらぎ町 九度山町 高野町 湯浅町 広川町 有田川町 美浜町 日高町 由良町 印南町 みなべ町 日高川町 白浜町 上富田町 すさみ町 那智勝浦町 太地町 古座川町 北山村 串本町 平成27年和歌山県市町村別人口 0 50000 100000 150000 200000 250000 300000 350000
  11. 11. IV-9 1.3 人口ピラミッド R の Pyramid パッケージに収録されている Pyramids 関数により、人口ピラミッドを作 成する。使用するデータは「平成 27 年国勢調査人口等基本集計」の「第 3-1 表「年齢(各 歳),男女別人口,年齢別割合,平均年齢及び年齢中位数(総数及び日本人)」である。 データは、e-Stat [http://www.e-stat.go.jp/] から、「統計データを探す」⇒「主要な 統計から探す」⇒ 一番左上にある「人口・世帯」の項の「国勢調査」⇒「平成 27 年国勢 調査」⇒「人口等基本集計(男女・年齢・配偶関係,世帯の構成,住居の状態など)」⇒ 「全 国結果」⇒表番号 3-1 の行の csv ボタンを押して、データファイルをダウンロードし、適 切なフォルダに保存する(ファイル名は、00310_00.csv)。 人口ピラミッド作成に必要なデータは、年齢階級区分と男女年齢別人口で、表 1.3 に示 すレイアウトになるようデータを整形する。以下の例では、ダウンロードしたデータをそ のまま R に読み込み、R 内で必要なデータを抽出・成形しているが、この作業を Excel で 行い、成形後のファイルを読み込む形でも問題はない。 表 1.3 人口ピラミッド作成用のデータイメージ #人口ピラミッドをつくろう! rm(list=ls(all=T RUE)) # 作業領域のお掃除 #ファイルの保存先の指定※R では「¥」を「/」にする setwd("D:/K01/V04/1-3") #変更が必要 #人口データの CSV 形式データを読み込む #第 3-1 表 年齢(各歳),男女別人口,年齢別割合,平均年齢及び年齢中位数(総数及び日本 人) dat <- read.table("00310_00.csv", sep=",", skip=11, header=TRUE) #第1引数:読み込む csv ファイル名は「00310_00.csv」 #第2引数:CSV データの区切り文字は「,」 age total male female 1 0 2 1 3 2 4 3 110 109 111 110+
  12. 12. IV-10 #第3引数:読み飛ばし行数は 11 行 #第4引数:1行目をヘッダーにする(TRUE) #※第2引数以降の引数の順番は不問 #取り込んだデータの確認 head(dat) #ファイルの先頭の 6 レコード表示 tail(dat) #ファイル末端の 6 レコード表示 # ヘッダーが空欄の場合や数値から始まる場合は、先頭に「X」が付与される。 #データの抽出・成型================================ #データの抽出 #大項目(列番号=2)が「0101(総人口日本人)」「0202(日本人男性)」「0302(日本人 女性)」のデータを抜き出す #さらに地域コード(列番号=3)が「0(全国)」 #地域識別コード(列番号=4)が「a(全国)」 idx <- which(dat[,2] %in% c("101","202","302") & dat[,3]=="0" & dat[,4]=="a") #対象データの行番号を配列で取得 dat[idx,] #対象データの行番号のデータを表示 nrow(dat[idx,]) #対象データの行数を表示→#[1] 3 #0~110 歳までの列は 7 列~117 列 Jinko <- matrix(NA, nc=4, nr=111) colnames(Jinko) <- c("age", "total", "male", "female") Jinko[,1] <- t(rep(0:110)) #0 歳から 110 歳以上の年齢情報 Jinko[,2:4] <- t(dat[idx,7:117]) #0 歳から 110 歳以上の横のデータを縦に入れ替える (転置) Jinko2 <- data.frame(Jinko) #data.frame 型に変換 #型の変換(factor->numeric)と千人単位に変換 Jinko2[,2] <- as.numeric(as.character(Jinko2[,2]))/1000 Jinko2[,3] <- as.numeric(as.character(Jinko2[,3]))/1000 Jinko2[,4] <- as.numeric(as.character(Jinko2[,4]))/1000 str(Jinko2) #データの確認 max(Jinko2[,3:4]) #横の人口の最大値の確認 head(Jinko2) # age total male female #1 0 957.190 480.925 460.898 #2 1 970.336 488.854 465.670 #3 2 1006.691 506.509 484.764 #4 3 1012.766 510.136 487.542 #5 4 1040.723 526.126 500.829
  13. 13. IV-11 #6 5 1043.969 528.569 502.380 #人口ピラミッドの作成 require(pyramid) #*************************** #pyramids 引数 #Left:左側(男性)のデータ #Right:右側 (女性)のデータ #Center:中央(年齢)のデータ #Laxis:最小値,最大値,幅 #Clab,Llab,Rlab:中央、左、右のラベル名 #Cstep:表示する数の幅 #main:タイトル #*************************** par(mar=c(2,1,3,1)) # マージン設定、下・左・上・右 pyramids(Left=Jinko2[,3], Right=Jinko2[,4], Center=Jinko2[,1], Laxis=seq(0,1200,len=7), Clab="年齢", Llab="男性", Rlab="女性", Cstep=10, main="2017 年人口ピラミッド") #----------------図 1.7 が表示される 図 1.7 2017 年人口ピラミッド
  14. 14. IV-12 2.レーダーチャート fmsb パッケージの radarchart 関数を使って、一般用ミクロデータの十大費目をレーダ ーチャートに表示する。 rm(list=ls(all=T RUE)) #install.packages("fmsb") require(fmsb) setwd("D:/K01/V04/2") dat <- read.table("D:/K01/imicro/ippan_2009zensho_z_datasetE410S.csv", header=TRUE, sep=",", skip=8, colClasses=c(rep("factor",7), rep("numeric",423))) #最大、最小データの準備(最大値は年齢階級別の各金額の平均の最大値を切り上げ) maxmin <- data.frame( Food = c(ceiling(max(tapply(dat[,11],dat$T_Age_5s,mean))/1000)*1000, 0), Housing = c(ceiling(max(tapply(dat[,12],dat$T_Age_5s,mean))/1000)*1000, 0), LFW = c(ceiling(max(tapply(dat[,13],dat$T_Age_5s,mean))/1000)*1000, 0), Furniture= c(ceiling(max(tapply(dat[,14],dat$T_Age_5s,mean))/1000)*1000, 0), Clothes = c(ceiling(max(tapply(dat[,15],dat$T_Age_5s,mean))/1000)*1000, 0), Health = c(ceiling(max(tapply(dat[,16],dat$T_Age_5s,mean))/1000)*1000, 0), Transport= c(ceiling(max(tapply(dat[,17],dat$T_Age_5s,mean))/1000)*1000, 0), Education=c(ceiling(max(tapply(dat[,18],dat$T_Age_5s,mean))/1000)*1000, 0), Recreation=c(ceiling(max(tapply(dat[,19], dat$T_Age_5s, mean)) /1000) *1000, 0), OL_Expenditure = c(ceiling (max(tapply(dat[,20], dat$T_Age_5s, mean))/1000) * 1000, 0)) #描写データの準備 dt <- data.frame( Food = round(tapply(dat$Food, dat$T_Age_5s, mean),digit=0), Housing = round(tapply(dat$Housing, dat$T_Age_5s, mean),digit=0), LFW = round(tapply(dat$LFW, dat$T_Age_5s, mean),digit=0), Furniture = round(tapply(dat$Furniture, dat$T_Age_5s, mean),digit=0), Clothes = round(tapply(dat$Clothes, dat$T_Age_5s, mean),digit=0), Health = round(tapply(dat$Health, dat$T_Age_5s, mean),digit=0), Transport = round(tapply(dat$Transport, dat$T_Age_5s, mean),digit=0), Education = round(tapply(dat$Education, dat$T_Age_5s, mean),digit=0),
  15. 15. IV-13 Recreation = round(tapply(dat$Recreation, dat$T_Age_5s, mean),digit=0), OL_Expenditure = round(tapply(dat$OL_Expenditure, dat$T_Age_5s, mean), digit=0)) dt <- rbind(maxmin, dt) #データの結合 #データ出力 write.csv(dt,"chart_dt.csv",row.names=F) dt1 <- read.csv("chart_dt.csv") #ラベルの設定,データの行名を取得 VLabel <- colnames(dt) cols <-rainbow(ncol(dt1)) # 画面分割 # ※ 凡例が必要なければ画面分割する必要はないので以下の四行を飛ばす op <- par(no.readonly = TRUE) #グラフィックパラメータを保存 nf <- layout( matrix( c(1,2,0,0), 2, 2, byrow=T ), c(3,1), c(1,0)) # 横 3:1 に画面分割 par(mar=c(1,1,3,1)) # マージン設定、下・左・上・右 ####radarchart の設定##### #centerzero = TRUE で中心が 0 #axistype:軸基準設定,0:無し, 1:割合, 2:実数, 3:割合,実数, 4:最大を 1, 5:最大を 1,実数 #seg:分割数 #pcol:線の色(デフォルトは 8 色繰り返し) #cglcol:罫線の色 #plty:線の種類 #plwd:線の太さ #cglty:罫線の種類 #cglwd:罫線の太さ #vlcex:ラベルの大きさ radarchart(dt1, axistype = 2, seg = 10, plty = 1, vlcex = 1, pcol=cols ,cglcol="gray70", centerzero = TRUE, vlabels = VLabel, plwd = 2, cglty=3,cglwd=.1, title = "年齢階級別 10 大費目別平均消費支出") labels <- c("非就業", "30 歳未満", "30~34 歳", "35~39 歳", "40~44 歳", "45~49 歳 ", "50~54 歳", "55~59 歳", "60~64 歳", "65 歳以上") plot.new() # 次の画面に移動 legend("bottomright", legend = labels, col = cols, lty = 1,box.lty = 0, lwd=2) #----------------図 2.1 が表示される
  16. 16. IV-14 図 2.1 fmsb パッケージによるレーダーチャート ※ この図は、出力されたプロットを png 形式で保存し、ペイントで余白等を調整している
  17. 17. IV-15 3.地図の作成 R で地図を描く方法は複数あるが、ここでは国土交通省が公開している国土数値情報のダ ウンロードページにあるシェープファイルを利用する例を示す。シェープファイルとは、 地理情報システム(GIS: Geographic Information System)内で、地図等の図形データ を取り扱うための標準的なファイル形式の一つである。 まず、次のような手順で必要なシェープファイル(この例では全国)を入手する。 ① 国土数値情報ダウンロードサービス [ http://nlftp.mlit.go.jp/ksj/index.html ] で 公開されている様々なデータの中から、「2. 政策区域」にある「行政区域」を選択する と 、 以 下 の URL に な る [ http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v2_3.html ] 。 ② 「ダウンロードするデータの選択」から「全国」にチェックを入れ、「次へ」ボタンを 押す。 ③ データリストの中から、最新の平成 29 年度のデータ「N03-170101_GML.zip」にチ ェックを入れ、「次へ」ボタンを押す。 ④ アンケート画面になるので、様式に記入し、「回答する」ボタンを押す。 ⑤ 国土数値情報利用約款が表示されるので、内容を確認し、「はい」ボタンを押す。 ⑥ ③で選択したデータファイルのダウンロードページになるので、「ダウンロード」ボタ ンを押す。 ⑦ ダウンロードされた zip ファイルを適切な場所で解凍する。収録されている 6 つのフ ァイルのうち、以下の 2 つのファイルを使用する。 ・ N03-17_170101.shp:地形情報(シェープファイル) ・ N03-17_170101.dbf:各シェープに対する縦表形式の属性情報 この他、1.2で使用した、平成 27 年国勢調査人口速報集計データを使用する。 rm(list=ls(all=T RUE)) require(maptools) #シェープファイルを読み込むため require (deldir) # require (rgeos) # require (spsurvey) #dbf ファイルを読み込むため require (RColorBrewer)
  18. 18. IV-16 #シェープファイル読み込む***【注意】少々時間がかかる*** setwd("D:/K01/V04/ShapeFile") jpn <- readShapePoly("N03-17_170101.shp") #シェープファイルの読み込み jpn.dbf <- read.dbf("N03-17_170101.dbf") # dbf ファイルの読み込み #日本地図(沖縄を含む) xlim <- c(126, 146) # 経度 ylim <- c(26, 46) # 緯度 ##日本地図(沖縄を含めない) #xlim <- c(128, 146) # 経度 #ylim <- c(30, 46) # 緯度 #47 都道府県別に色を変更する # 全市区町村の膨大な情報をプロットするため、時間がかかる par(mar=c(0,0,0,0)) # マージン設定、下・左・上・右 mycol <- rainbow(47, v=.9, alpha=.6)[as.numeric(factor(jpn.dbf$N03_001))] plot(jpn, xlim=xlim, ylim=ylim, col=mycol, lty=.08) # 地図をプロット #----------------図 3.1 が表示される #和歌山県のシェープファイルを抜き出し、プロット wakayama <- jpn[which(substr(jpn$N03_007,1,2)=="30"),] plot(wakayama) #----------------図 3.2 が表示される #大阪府のシェープファイルを抜き出し、プロット(着色、境界線の色の設定) osaka <- jpn[which(substr(jpn$N03_007,1,2)=="27"),] plot(osaka, col="gray", border="white") #近畿地方(2府5県)をプロット #----------------図 3.3 が表示される kinki <- jpn[which(substr(jpn$N03_007,1,2) %in% c("24", "25", "26", "27", "28", "29", "30")),] plot(kinki, col="gray", border="white") #************************************************************ #和歌山県人口データ読み込み setwd("D:/K01/V04/3") #1-2 で使用したデータと同じ dat <- read.table("D:/K01/V04/1-2/001_00.csv", sep=",", skip=9, header=T RUE) #地域識別コード(列番号=4)が「a(全国、都道府県)」かつ地域コード(列番号=3)が
  19. 19. IV-17 「0(全国)」を除く idx1 <- which(dat[,4]=="a" & dat[,3]!="0") #対象データの行番号を取得 dat[idx1,] #対象データ表示 #都道府県別人口データ(平成 27 年人口) KenJinko <- data.frame(dat[idx1,6]) head(KenJinko) # dat.idx1..6. #1 5383579 #2 1308649 #3 1279814 #4 2334215 #5 1022839 #6 1122957 #ここでシェープファイルの N03_007(市区町村コード)がないと異常終了するため #チェックする k.no <- substring(jpn.dbf$N03_007, 1, 2) table(k.no, useNA="ifany") #k.no # NA はないが県番号にブランクデータが存在する # 01 02 03 04 05 06 07 08 09 10 11 12 13 14 # 140 9606 2246 7850 7213 2469 725 288 161 28 37 81 1527 6086 1292 # 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #2674 56 1695 2949 36 79 48 1736 1122 7481 19 1002 142 2187 40 # 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #3832 828 3452 410 574 3004 3511 667 4935 3803 2054 312 9177 1956 2358 # 45 46 47 #1681 8127 4328 ix1 <- which(k.no == "") jpn.dbf$N03_001[ix1] # [1] 千葉県 東京都 東京都 東京都 東京都 東京都 東京都 東京都 # ………………………………………. # [113] 東京都 東京都 東京都 東京都 東京都 東京都 東京都 東京都 # [121] 東京都 東京都 東京都 東京都 東京都 愛知県 和歌山県 福岡県 # [129] 鹿児島県 鹿児島県 鹿児島県 鹿児島県 鹿児島県 鹿児島県 鹿児島県 鹿児島県 # [137] 鹿児島県 鹿児島県 鹿児島県 沖縄県 # 47 Levels: 愛知県 愛媛県 茨城県 岡山県 沖縄県 岩手県 岐阜県 宮崎県 ... 和歌山県 # 該当県は県名から市区町村コードの二桁を付与 k.no <- substring(jpn.dbf$N03_007, 1, 2) k.no[which(jpn.dbf$N03_001=="千葉県")] <- "12" k.no[which (jpn.dbf$N03_001=="東京都")] <- "13"
  20. 20. IV-18 k.no[which (jpn.dbf$N03_001== "愛知県")] <- "23" k.no[which (jpn.dbf$N03_001=="和歌山県")] <- "30" k.no[which (jpn.dbf$N03_001== "福岡県")] <- "40" k.no[which (jpn.dbf$N03_001=="鹿児島県")] <- "46" k.no[which (jpn.dbf$N03_001== "沖縄県")] <- "47" table(k.no, useNA="ifany") # ブランクや NA データがないことを確認 # RColorBrewer でパレットを作る p <- colorRampPalette(c("white", "red"))(50) # 白~赤のグラデで 50 色作成 palette(p) #47 都道府県別に人口に応じて色分けする cols <- (KenJinko- min(KenJinko))/diff(range(KenJinko))*46+4 mycol <- p[cols$dat[as.numeric(k.no)]] #県番号ごとに色を指定する par(mar=c(0,0,0,0)) # マージン設定、下・左・上・右 plot(jpn, xlim=xlim, ylim=ylim, col=mycol, lty=.08) #都道府県別人口地図 #----------------図 3.4 が表示される #************************************************************ #全国の市区町村ごとの人口を抽出 #地域識別コード(4 列目)が「0,2,3」のみ(1 は政令市の合計) idx <- which(dat[,4] %in% c("0","2","3")) #地域コード,市区町村名,人口平成 27 年 Jinko <- data.frame(dat[idx,3], dat[idx,5], dat[idx,6]) head(Jinko) # dat.idx..3. dat.idx..5. dat.idx..6. #1 1101 札幌市 中央区 237784 #2 1102 札幌市 北区 285432 #3 1103 札幌市 東区 262075 #4 1104 札幌市 白石区 209770 #5 1105 札幌市 豊平区 218792 #6 1106 札幌市 南区 141358 #全国の市区町村ごとの人口から和歌山県(30 県)のみに抽出 Jinko30 <- Jinko[substring(Jinko[,1],1,2)=="30",c(1,3)] nrow(Jinko30) #和歌山県の市区町村数 #和歌山県の市区町村別の人口を色別に表示する #グラデーションを作成する p30 <- colorRampPalette(c("lemonchiffon", "magenta"))(34)
  21. 21. IV-19 palette(p30) #人口によりグラデーションを数値化(2列目) cols30 <- (Jinko30[,2]- min(Jinko30[,2]))/diff(range(Jinko30[,2]))*31 + 3 Jinko30 <- cbind(Jinko30, cols30) #和歌山県市区町村コード、人口、色に分ける mycol30 <- cols30[as.numeric(factor(wakayama$N03_007))] plot(wakayama,col=p30[mycol30]) #和歌山県の人口 #----------------図 3.5 が表示される 図 3.1 日本地図
  22. 22. IV-20 図 3.2 和歌山県地図 図 3.3 近畿地方地図
  23. 23. IV-21 図 3.4 日本人口地図 図 3.5 和歌山県人口地図
  24. 24. IV-22 4.バルーンプロット バルーンプロットは、バブルチャートとも呼ばれ、プロットしているのが同じ大きさの 点ではなく、大きさを持つ「バブル」であることが大きな特徴である。これにより、縦軸 と横軸、バブルの大きさにより、2次元のプロットで3つのデータを表現することができ る。ggplot パッケージを使用して、バルーンプロットを作成する例を紹介する。 使用するデータは、和歌山県商工観光労働部観光局が出している「観光客動態調査報告 書」の平成 27 年版の「17-3.外国人宿泊客主要観光地別国別推計」のデータを使用する。 こ の デ ー タ は 、 和 歌 山 県 の github レ ポ ジ ト リ [ https://github.com/wakayama-pref-org ]に csv 形式で収録されている。画面 4.1 か ら、緑色の「Clone or download」ボタンを押すと、「Clone with HTTPS」というポップ アップが出るので、「Download ZIP」を選択し、適切な場所に解凍する。 画面 4.1 H27 年の和歌山県観光客動態データ [https://github.com/wakayama-pref-org/tourist_dynamics_research_report_h27] ① ②
  25. 25. IV-23 解凍されたデータのうち、ここでは、foreigner_major_countries.csv を使用するが、 そのままでは読み込みでエラーになるので、テキストエディタで以下のような下処理を行 い、foreigner_major_countries2.csv という名前で保存する。  ダブルクォーテーション[“]を置換機能で全て削除  表側見出しに入っている改行を落とす  最終行のデータが一つ足りないため、そのままでは読み込みでエラーが起きるが、合 計欄は使用しないので削除する #ggplot を使ってバルーンプロット rm(list=ls(all=T RUE)) require(reshape2) require(ggplot2) #使用するデータの保存先 setwd("D:/K01/V04/4") # sep="," : タブ区切り # header=TRUE : ヘッダーあり # as.is=TRUE : 因子属性にしない # fileEncoding="UTF8" :文字コード指定 datx <- read.table("foreigner_major_countries2.csv", sep=",", header=T RUE, as.is=TRUE, fileEncoding="UTF8") #datx=input データ同様の内容(17 行 20 列) # ラベルがない冒頭の変数(観光地)の名前は、自動的に「X」になる # X 中国 韓国 台湾 香港 シンガポール タイ #1 高野山 1766 412 562 831 915 318 #2 加太・友ヶ島 556 81 230 1346 42 64 #3 和歌浦・紀三井寺・和歌山城 他 51160 3013 11578 19858 1100 2234 #4 西有田 69 10 100 222 13 14 #5 煙樹海岸・白崎海岸・道成寺・御坊 他 68 76 22 25 0 0 #6 龍神温泉・護摩壇山 36 33 0 42 13 6 #7 田辺・中辺路・百間山・みなべ 8900 3614 30322 15721 1147 345 #8 白浜温泉・椿温泉 12610 3929 10857 42076 1412 2816 #9 枯木灘 102 61 314 7 0 0 #10 串本 747 283 1383 9091 20 184 #11 勝浦温泉・湯川温泉 4271 3599 23396 6731 2782 2313 #12 熊野本宮温泉郷 420 183 248 778 259 117 #13 新宮・瀞峡 114 61 399 238 82 42 #14 海南生石山周辺 2694 89 56 96 6 214 #15 紀仙郷 9060 128 790 178 32 172
  26. 26. IV-24 #16 橋本周辺 5636 247 20 38 1 0 #17 その他 71 55 201 35 0 0 #datx のデータから、合計の行と列を取って整形 daty <- melt(datx[,-21], value.name="count") #melt 後の datx の内容(323 行) # X variable count #1 高野山 中国 1766 #2 加太・友ヶ島 中国 556 #3 和歌浦・紀三井寺・和歌山城 他 中国 51160 #4 西有田 中国 69 #5 煙樹海岸・白崎海岸・道成寺・御坊 他 中国 68 #6 龍神温泉・護摩壇山 中国 36 #7 田辺・中辺路・百間山・みなべ 中国 8900 #8 白浜温泉・椿温泉 中国 12610 #9 枯木灘 中国 102 #実数でプロット attach(daty) ggplot(daty, aes(x=variable, y=X)) + xlab(" 国 ") + ylab(" 訪 問 先 ") + geom_point(aes(size=count), shape=21, colour="black", fill="cornsilk") + scale_size_area(max_size=20, guide=FALSE) +geom_text(aes(y=X, label=count), vjust=1, colour="grey60", size=4)+theme(axis.text.x = element_text(angle = 30, hjust = 1)) #----------------図 4.1 が表示される #割合でプロット mysum <- tapply(count, variable, sum) #mysum # 中国 韓国 台湾 香港 # 98280 15874 80478 97313 # シンガポール タイ マレーシア インドネシア # 7824 8839 1718 732 # インド アジアその他 米国 カナダ # 278 12045 14307 3711 # イギリス フランス ドイツ スペイン # 6025 14343 4592 5902 # ヨーロッパその他 オーストラリア.ニュージーランド その他 # 17851 13033 24449 #割合でプロット ggplot(daty, aes(x=variable,y=X)) + xlab(" 国 ") + ylab(" 訪 問 先 ") +
  27. 27. IV-25 geom_point(aes(size=count/mysum[variable]*100), shape=21, colour="black", fill="cornsilk") + scale_size_area(max_size=20, guide=FALSE) +geom_text(aes(y=X, label=paste(round(count/mysum[variable]*100,1),"%")), vjust=1, colour="grey60", size=4)+theme(axis.text.x = element_text(angle = 30, hjust = 1)) #----------------図 4.2 が表示される detach(daty) 図 4.1 人口によるバルーンプロット描画
  28. 28. IV-26 図 4.2 割合によるバルーンプロット描画 5.Circos プロット circlize パッケージの chordDiagram 関数を使用して、circos プロットにより都道府県 別の人口移動を可視化する。circos プロットにより、都道府県を円形に並べ、移動元から 移動先に線で結ぶことにより、人口移動を可視化することができる。 使用するデータは、住民基本台帳人口移動報告年報(基本集計)の表番号2「男女,移 動前の住所地別都道府県間移動者数-都道府県,3大都市圏(東京圏,名古屋圏,大阪圏), 21 大都市(移動者(外国人含む),日本人移動者)(平成 28 年)」を DB でレイアウトを設 定して出力、不要な行は Excel 上で削除した。データの作成方法は、以下のとおり。 e-Stat [http://www.e-stat.go.jp/] から、「統計データを探す」⇒「政府統計全体から 探す」⇒ 上から二番目の「政府統計全体から探す(分野別)」枠内の「人口・世帯」を選 択⇒「住民基本台帳人口移動報告」⇒「年報(基本集計)」の最新である「2016 年」を選択 ⇒表番号 2 の行の db ボタンを押す。そして、以下の条件で表示項目を選択、ダウンロード ボタンを押し、csv ファイルを適切なフォルダに保存する(ファイル名は、例えば FEH_00200523_170621130600.csv)。
  29. 29. IV-27  表章項目 都道府県間移動者数  性別 総数  移動前の住所地 47 都道府県のみ選択  国籍 移動者(外国人含む)  全国・都道府県・大都市 47 都道府県のみ選択  時間軸(年次) 2016 年 保存した csv ファイルを Excel で開き、画面 5.1 で示すように余分な行と列を削除し、 数値からカンマを除いて、例えば FEH.csv という名前で、カンマ区切りのテキストデータ として保存する。 画面 5.1 DB でダウンロードしたデータのイメージ 画面 5.2 ダウンロードした csv データの加工方法 数字部分を全て選択し、セルの書式設定 の表示形式を、「標準」にして、数字から カンマを除く 表頭: 移動先 表側: 移動元
  30. 30. IV-28 #circos プロット rm(list=ls(all=T RUE)) require(GlobalOptions); require(shape); require(circlize); require(RColorBrewer) setwd("D:/K01/V04/5") #データの保存先を指定 #カンマ区切りの CSV ファイルの読込み datz <- read.table("FEH.csv", sep=",", header=TRUE) attach(datz) #データの整形 mat <- data.matrix(datz [1:47,2:48]) # 他県への流入・流出マトリックス rownames(mat) <- datz [1:47,1] #行名(都道府県名) colnames(mat) <- datz [1:47,1] #列名(都道府県名) diag(mat) <- 0 #対角要素を 0 に置換 #色の設定 6 地域別で色を変えているので、6 色をそれぞれ地域内の県の数並べている regcol <- inverse.rle(list(lengths=c(7,7,9,7,9,8), values=rev(rainbow(6,start=0,end=.6,s=.6,v=.95)))) # 北海道+東北 7 県、関東 7 県、中部 9 県、関西 7 県、中国・四国 9 県、九州沖縄 8 県 #出力ファイル(png 形式) png("cluster.png", height = 4800, width = 4800, res = 300) chordDiagram(mat, directional = TRUE, #指向性を解りやすく表現 transparency = 0.5, #透明度の調整 row.col = regcol , #列の色を設定、データ列で色数を指定 grid.col = regcol #ラベルの色を設定 ) dev.off() #デバイスの終了 #----------------図 6.1 が表示される detach(datz) ☆ Excel で文字化けが起きたら ダウンロードされたファイルの文字コードは UTF-8 のため、Windows 機でファイル のアイコンをダブルクリックして csv ファイルを開く場合に文字化けする可能性がある。 文字化けが起こったら、ファイルの拡張子を txt に変え、Excel のメニューバーから「フ ァ イ ル 」 ⇒ 「 開 く 」 ⇒ 拡 張 子 を txt に 変 更 し た 例 え ば 「FEH_00200523_170621130600.txt」を選択 ⇒「元のデータの形式」を「カンマや タブなどの区切り文字によってフィールドごとに区切られたデータ」にチェックを入れて 「次へ」ボタンを押す ⇒ 表示される画面の「区切り文字」の「カンマ」にチェックを入 れて、「次へ」ボタンを押す ⇒ 表示される画面で「完了」ボタンを押す。
  31. 31. IV-29 図 5.1 都道府県別人口移動の circos プロット

×