読者です 読者をやめる 読者になる 読者になる

300億円欲しい

メジャーリーグのデータ解析します

Rで作った地図に統計情報を載せたい

アメリカの犯罪者状況を可視化したい

Rのデフォルトで使えるデータフレームで,
アメリカの州別の暴力犯罪発生率が入っているものがあります.

>data(USArrests)

>head(USArrests)

           Murder Assault UrbanPop Rape
Alabama      13.2     236       58 21.2
Alaska       10.0     263       48 44.5
Arizona       8.1     294       80 31.0
Arkansas      8.8     190       50 19.5
California    9.0     276       91 40.6
Colorado      7.9     204       78 38.7

アメリカの各州で, 人口10万人に対して何人が逮捕されているかを表しています.
暴行(Assault)件数が多いですね. 怖い.

このデータを, アメリカの地図上に表してみたいです.
州別に色分けして, 危険なところの色が濃くなるようにします.

地図を描くときには, map_data("states") を利用します.
前回も使いました.

> library(ggplot2)
> head(map_data("state"))
       long      lat group order  region subregion
1 -87.46201 30.38968     1     1 alabama      <NA>
2 -87.48493 30.37249     1     2 alabama      <NA>
3 -87.52503 30.37249     1     3 alabama      <NA>
4 -87.53076 30.33239     1     4 alabama      <NA>
5 -87.57087 30.32665     1     5 alabama      <NA>
6 -87.58806 30.32665     1     6 alabama      <NA>

地図を描くだけなら, このmap_data("state")だけでいけます.
これも前回と同じです.

states <- map_data("state")

q <- ggplot()
q <- p + geom_polygon(data = states, 
                      aes(x=long, y=lat, group=group),
                      fill = "orange", colour="black")
q

f:id:gg_hatano:20130921125242p:plain

この地図に, 犯罪発生率の情報を載せます.

データフレームの準備

USArrestsとmap_data("state")の2つのデータフレームをマージします.

# 地図の情報
Total <- map_data("state")

# 犯罪者の情報
data(USArrests)

# マージの準備 州の名前でマージしたい
regionvec <- rownames(USArrests)

# 大文字小文字を合わせる
USArrests$region <- tolower(regionvec)

# regionに注目してマージする
Total <- merge(Total, USArrests, by="region")

マージして得られたデータフレームはこんな感じです.

>head(Total)
 region      long      lat group order subregion Murder Assault UrbanPop Rape
1 alabama -87.46201 30.38968     1     1      <NA>   13.2     236       58 21.2
2 alabama -87.48493 30.37249     1     2      <NA>   13.2     236       58 21.2
3 alabama -87.95475 30.24644     1    13      <NA>   13.2     236       58 21.2
4 alabama -88.00632 30.24071     1    14      <NA>   13.2     236       58 21.2
5 alabama -88.01778 30.25217     1    15      <NA>   13.2     236       58 21.2
6 alabama -87.52503 30.37249     1     3      <NA>   13.2     236       58 21.2

位置情報に犯罪者のデータが合併されたデータフレームになっています.

このデータフレームをggplotでなんやかんやします.

ggplotでなんやかんや

Murderの発生率を描いてみます.

p <- ggplot()
p <- p + geom_polygon(data=Total, 
                      aes(x=long, y=lat, group = region, fill=Total$Murder),  # 塗りつぶしをMurderで
                      colour="black") 
p <- p + scale_fill_continuous(low = "white", high = "darkred", guide="colorbar") # 色の設定
p

f:id:gg_hatano:20130923211922p:plain


ちゃんと色分けできています.

aes()の中身の, fill= ... のところで塗りつぶしの色を決めます.

塗りつぶしの色を何によって決めるか...だけを指定すればOKです.

つぎはAssault

p <- ggplot()
p <- p + geom_polygon(data=Total, 
                      aes(x=long, y=lat, group = region, fill=Total$Assault),  # 塗りつぶしをAssaultで
                      colour="black") 
p <- p + scale_fill_continuous(low = "white", high = "darkred", guide="colorbar") # 色の設定
p

f:id:gg_hatano:20130923212146p:plain

最後にRape. 気になります.

p <- ggplot()
p <- p + geom_polygon(data=Total, 
                      aes(x=long, y=lat, group = region, fill=Total$Rape),  # 塗りつぶしをRapeで
                      colour="black") 
p <- p + scale_fill_continuous(low = "white", high = "darkred", guide="colorbar") # 色の設定
p

f:id:gg_hatano:20130923212223p:plain

...どうやって解釈していいのか. 下のほうが怖いみたいですね. 知りませんけど.

まとめ

地図に統計情報を載せるときには,

何かの統計情報と, 地図情報map_data()とを場所を軸にしてマージ.

ggplotで色指定すればOK.

2013年9月25日追記

地図を見ると謎の線が沢山入っていますね...
原因を調査中です.