## Warning: package 'maps' was built under R version 3.6.2
## opendate st.address city state long
## 1 1962-03-01 5801 SW Regional Airport Blvd Bentonville AR -94.23982
## 2 1962-07-01 2110 WEST WALNUT Rogers AR -94.07141
## 3 1964-08-01 1417 HWY 62/65 N Harrison AR -93.09345
## 4 1965-08-01 2901 HWY 412 EAST Siloam Springs AR -94.50208
## 5 1967-10-01 3801 CAMP ROBINSON RD. North Little Rock AR -92.30229
## 6 1967-10-01 1621 NORTH BUSINESS 9 Morrilton AR -92.75858
## lat type
## 1 36.35088 DistributionCenter
## 2 36.34224 SuperCenter
## 3 36.23698 SuperCenter
## 4 36.17990 SuperCenter
## 5 34.81327 Wal-MartStore
## 6 35.15649 SuperCenter
データセットは開店日の情報 opendate を含んでいるにもかかわらず、前回の分析では時間の次元を無視していた。
空間パターンのみではなく時空間パターンを調べることで、ウォルマートが時間とともにどのように拡大していったかをより良く理解することができる。
ここでは様々な時点での全ての営業店舗を表す一連の地図を作成する。
そのために、特定の日付のデータを部分集合化し、前回行ったようにウォルマート店舗の地図を作成する関数を定義する。
前回の一連のコードを walmart.map() という以下の2つの入力値をとる関数として作成する。
data:店舗の開店日を示す opendate という名の変数 (Date クラスでなければならない) を含むデータフレーム
date:地図が作成される時点を定義する別の Date オブジェクト
この関数は指定した日付以前に開店したすべての店舗を部分集合化し、それらの場所を地図上にプロットする。
walmart.map <- function(data, date) {
walmart <- subset(data, subset = (opendate <= date))
map(database = "state")
points(walmart$long, walmart$lat, col = walmart$storecolors,
pch = 19, cex = walmart$storesize)
}この関数を使えば、ある時点における地図を容易に作成できる。
ここでは地図を10年ごとに作成する。
walmart$storecolors <- NA # 空のベクトルを作成
## 赤 = 通常のウォルマート, 緑 = スーパーセンター, 青 = 流通センター
walmart$storecolors[walmart$type == "Wal-MartStore"] <-
rgb(red = 1, green = 0, blue = 0, alpha = 1/3)
walmart$storecolors[walmart$type == "SuperCenter"] <-
rgb(red = 0, green = 1, blue = 0, alpha = 1/3)
walmart$storecolors[walmart$type == "DistributionCenter"] <-
rgb(red = 0, green = 0, blue = 1, alpha = 1/3)
## 流通センターは大きめの円にする
walmart$storesize <- ifelse(walmart$type == "DistributionCenter", 1, 0.5)
walmart$opendate <- as.Date(walmart$opendate)
walmart.map(walmart, as.Date("1974-12-31"))
title("1975")上のような時空間データをビジュアル化するその他の方法として、地理的なパターンが時間とともにどのように変化するかを動的に見せる アニメーション (annimation) がある。
animation パッケージで様々な場所と時間において、ウォルマートがどのようにその店舗を拡大していったかを示すことができる。
アニメーションの準備として以下を行う。
アニメーション化される地図の数を設定する。
データセットの最初から最後まで等間隔の日付で構成されたベクトルを作成する。
n <- 25 # アニメーション化する地図の数
dates <- seq(from = min(walmart$opendate),
to = max(walmart$opendate), length.out = n)基本的には、animation パッケージを使うことと、時間の経過にしたがって一連の地図を作成するループを作ることとの間に大差はない。
実際、もう1つ saveHTML() 関数を追加して、ループ全体をそれでくるむだけでよい。
この関数は R のコードをメインの入力として波括弧 {} の中にとり、ループ中に作成されたすべての図をHTMLファイルに挿入する。
できあがったHTMLファイルは、ウェブブラウザでアニメーション表示できる。
saveHTML() 関数には次のような便利な引数がある。
htmlfile:HTMLファイルの名前を指定
title:アニメーションのタイトルを指定
outdir:完成したファイルが保存されるディレクトリ (フォルダ) 名を指定
autobrouwse:出力が自動でブラウザに表示されるかを管理
次の一連のコードは、アニメーションを作成し、walmart.html という名のHTMLファイルと他のすべてのファイルを作業ディレクトリに保存する。
saveHTML() 関数はループ中に先ほど作成した walmart.map() 関数を繰り返し呼び出す。
作業ディレクトリへのパスを返す getwd() 関数を引数 outdir への入力として指定することで、すべての出力ファイルがそのディレクトリへ保存される。
## Warning: package 'animation' was built under R version 3.6.2
saveHTML({
for (i in 1:length(dates)) {
walmart.map(walmart, dates[i])
title(dates[i])
}
}, title = "Wal-Mart Expansion", htmlfile = "walmart.html",
outdir = getwd(), autobrowse = FALSE)## HTML file created at: walmart.html
アニメーションは出来上がった walmart.html ファイルをウェブブラウザで開くことで再生できる。
HTMLに加えて利用可能なフォーマットにはビデオファイルのための saveVideo() 関数がある。
次の一連のコードで walmart.mp4 というMP4ファイルが作業ディレクトリに作成される。
上記コードの saveHTML を saveVideo に変更
video.name でビデオファイルの名前を指定
ffmpeg という動画を変換、編集できるフリーソフトをインストールする必要がある。
## library("animation")
## saveVideo({
## for (i in 1:length(dates)) {
## walmart.map(walmart, dates[i])
## title(dates[i])
## }
## }, video.name = "walmart.mp4",
## outdir = getwd(), autobrowse = FALSE)アニメーションを見ると、ウォルマートのフランチャイズについて、次のようなことがはっきりとわかる。
南部発祥
1970年代と1980年代に次第に地域全体に広がっていく様子
1990年代中頃からの国内の残りの地域への急速な出店拡大
出店拡大を見込んだ新しい流通センター設立のタイミングと場所
コーヒーチェーン Starbucks の店舗拡大を時空間データを用いて分析する。
1996年から2020年までのデータをコピーしてスプレッド・シートに貼り付け、不要なデータを削除して変数名を変更したファイル starbucks20.csv を読み込む。
## id opendate
## 1 1 1996-08-02
## 2 2 1996-09-05
## 3 3 1996-11-12
## 4 4 1997-02-28
## 5 5 1997-03-18
## 6 6 1997-07-18
## address
## 1 東京都 中央区 銀座3-7-14 ESKビル 1F
## 2 東京都 千代田区 神田駿河台2-5 村田ビルディング 1F
## 3 東京都 中央区 八重洲2-1 八重洲地下街 中3号
## 4 東京都 町田市 原町田6-4-1 町田東急ツインズ ウエスト3階 W306
## 5 東京都 千代田区 内幸町2-2-3 日比谷国際ビルヂング B1F(B132)
## 6 神奈川県 横浜市西区 みなとみらい2-3-9 クイーンズスクエア横浜[アット!]1F
## prefecture
## 1 東京都
## 2 東京都
## 3 東京都
## 4 東京都
## 5 東京都
## 6 神奈川県
## note
## 1 日本1号店
## 2 日本2号店
## 3 日本3号店
## 4 日本4号店 旧称:まちだ東急店、TOKYUまちだandYOU店 2015/06/26リニューアル
## 5 日本5号店 2018/05リニューアル
## 6 旧称:横浜[アット!]店(-2017/10/26) 神奈川県1号店 2005/09/30リニューアル
starbucks20.csv の address をコピーして谷謙二研究室(埼玉大学教育学部人文地理学)が提供している KTGIX.net の 地名・施設名からジオコーディング・地図化 を利用して緯度と経度を取得する。
取得結果をコピーしてスプレッド・シートに貼り付け、不要なデータを削除して変数名を変更したファイル starbucks20longlat.csv を読み込む。
## id long lat
## 1 1 139.7667 35.67164
## 2 2 139.7608 35.70039
## 3 3 139.7696 35.67987
## 4 4 139.4465 35.54240
## 5 5 139.7544 35.67037
## 6 6 139.6338 35.45609
## address
## 1 東京都 中央区 銀座3-7-14 ESKビル 1F
## 2 東京都 千代田区 神田駿河台2-5 村田ビルディング 1F
## 3 東京都 中央区 八重洲2-1 八重洲地下街 中3号
## 4 東京都 町田市 原町田6-4-1 町田東急ツインズ ウエスト3階 W306
## 5 東京都 千代田区 内幸町2-2-3 日比谷国際ビルヂング B1F(B132)
## 6 神奈川県 横浜市西区 みなとみらい2-3-9 クイーンズスクエア横浜[アット!]1F
## address.match
## 1 東京都中央区銀座3丁目7-14
## 2 東京都千代田区神田駿河台2丁目5
## 3 東京都中央区八重洲2丁目1
## 4 東京都町田市原町田6丁目4-1
## 5 東京都千代田区内幸町2丁目2-3
## 6 神奈川県横浜市西区みなとみらい2丁目3-9
## note
## 1 <NA>
## 2 他候補;東京都千代田区神田駿河台2丁目5-4;東京都千代田区神田駿河台2丁目5-5
## 3 他候補;東京都中央区八重洲2丁目1-10;東京都中央区八重洲2丁目1-4
## 4 <NA>
## 5 <NA>
## 6 <NA>
住所によってはエラーになり緯度と経度が取得できない場合がある。
starbucks20longlat.csv では、エラーの場合に long と lat が -1 になるように修正している。## [1] FALSE FALSE FALSE FALSE FALSE FALSE
## id long lat
## 50 50 -1 -1
## 52 52 -1 -1
## 68 68 -1 -1
## 82 82 -1 -1
## 116 116 -1 -1
## 159 159 -1 -1
## address
## 50 京都府 京都市下京区 四条通柳馬場西入ル 立売中之町106 ヤサカ四条ビル
## 52 大阪府泉佐野市泉州空港北一番地 関西国際空港旅客ターミナルビル
## 68 京都府 京都市中京区 三条通河原町東入ル中島町113 近江屋ビル 1F
## 82 京都府 京都市中京区 三条通烏丸西入ル 御倉町85-1 KDX京都烏丸ビル 1F
## 116 大阪府枚方市市岡東町8-6
## 159 大分県 大分市 玉沢楠本755-1 トキハわさだタウン 1F
## address.match note
## 50 <NA> <NA>
## 52 <NA> <NA>
## 68 <NA> <NA>
## 82 <NA> <NA>
## 116 <NA> <NA>
## 159 <NA> <NA>
店舗データ starbucks20 と緯度経度データ longlat20 をmerge 関数を用いて結合する。
2つのデータフレームに含まれる同じ変数を用いて結合する場合は、その変数名(例えば id)をオプション by を用いて(例えば by = "id" のように)指定する
変数名が異なる場合は、by.x と by.yという引数を用いて、それぞれのデータフレームで結合用の変数名を指定することもできる。
デフォルトでは結合されたデータフレームには引数 by.x で指定されたデータフレーム x の変数名が保存される.
ここでは、2つのデータフレームに共通の id を用いて次のようにデータを結合する。
## id opendate
## 1 1 1996-08-02
## 2 2 1996-09-05
## 3 3 1996-11-12
## 4 4 1997-02-28
## 5 5 1997-03-18
## 6 6 1997-07-18
## address.x
## 1 東京都 中央区 銀座3-7-14 ESKビル 1F
## 2 東京都 千代田区 神田駿河台2-5 村田ビルディング 1F
## 3 東京都 中央区 八重洲2-1 八重洲地下街 中3号
## 4 東京都 町田市 原町田6-4-1 町田東急ツインズ ウエスト3階 W306
## 5 東京都 千代田区 内幸町2-2-3 日比谷国際ビルヂング B1F(B132)
## 6 神奈川県 横浜市西区 みなとみらい2-3-9 クイーンズスクエア横浜[アット!]1F
## prefecture
## 1 東京都
## 2 東京都
## 3 東京都
## 4 東京都
## 5 東京都
## 6 神奈川県
## note.x
## 1 日本1号店
## 2 日本2号店
## 3 日本3号店
## 4 日本4号店 旧称:まちだ東急店、TOKYUまちだandYOU店 2015/06/26リニューアル
## 5 日本5号店 2018/05リニューアル
## 6 旧称:横浜[アット!]店(-2017/10/26) 神奈川県1号店 2005/09/30リニューアル
## long lat
## 1 139.7667 35.67164
## 2 139.7608 35.70039
## 3 139.7696 35.67987
## 4 139.4465 35.54240
## 5 139.7544 35.67037
## 6 139.6338 35.45609
## address.y
## 1 東京都 中央区 銀座3-7-14 ESKビル 1F
## 2 東京都 千代田区 神田駿河台2-5 村田ビルディング 1F
## 3 東京都 中央区 八重洲2-1 八重洲地下街 中3号
## 4 東京都 町田市 原町田6-4-1 町田東急ツインズ ウエスト3階 W306
## 5 東京都 千代田区 内幸町2-2-3 日比谷国際ビルヂング B1F(B132)
## 6 神奈川県 横浜市西区 みなとみらい2-3-9 クイーンズスクエア横浜[アット!]1F
## address.match
## 1 東京都中央区銀座3丁目7-14
## 2 東京都千代田区神田駿河台2丁目5
## 3 東京都中央区八重洲2丁目1
## 4 東京都町田市原町田6丁目4-1
## 5 東京都千代田区内幸町2丁目2-3
## 6 神奈川県横浜市西区みなとみらい2丁目3-9
## note.y
## 1 <NA>
## 2 他候補;東京都千代田区神田駿河台2丁目5-4;東京都千代田区神田駿河台2丁目5-5
## 3 他候補;東京都中央区八重洲2丁目1-10;東京都中央区八重洲2丁目1-4
## 4 <NA>
## 5 <NA>
## 6 <NA>
データフレーム同士が同じ名前の変数を含んでいれば、結合されたデータフレームの当該変数には末尾に.xや.yが加えられ、それぞれの変数がどちらのデータフレームのものかが示される。
subset 関数を用いて、エラー (long と lat の値が -1) ではないデータを抽出し、必要な変数のみを残す。
starbucks <- subset(starbucks, lat >=0)
starbucks <- subset(starbucks, select = c(id, opendate, address.match, prefecture, long, lat))
head(starbucks)## id opendate address.match prefecture long
## 1 1 1996-08-02 東京都中央区銀座3丁目7-14 東京都 139.7667
## 2 2 1996-09-05 東京都千代田区神田駿河台2丁目5 東京都 139.7608
## 3 3 1996-11-12 東京都中央区八重洲2丁目1 東京都 139.7696
## 4 4 1997-02-28 東京都町田市原町田6丁目4-1 東京都 139.4465
## 5 5 1997-03-18 東京都千代田区内幸町2丁目2-3 東京都 139.7544
## 6 6 1997-07-18 神奈川県横浜市西区みなとみらい2丁目3-9 神奈川県 139.6338
## lat
## 1 35.67164
## 2 35.70039
## 3 35.67987
## 4 35.54240
## 5 35.67037
## 6 35.45609
mapdata パッケージを用いて、日本地図に店舗を表示する。
ここ を参考に Starbucks ロゴの色を指定する。
最小値と最大値のベクトルを返す range 関数を用いて、店舗がある緯度と経度の範囲±1度に地図を拡大する。
library(mapdata)
## starbucksロゴの色
starbucks$color <- rgb(red = 0.0118, green = 0.4, blue = 0.2078, alpha = 1/3)
starbucks$color[1]## [1] "#03663555"
## 地図の範囲
x.range <- range(starbucks$long) + c(-1, 1)
y.range <- range(starbucks$lat) + c(-1, 1)
## 地図を表示
map("japan", interior = FALSE, xlim = x.range, ylim = y.range)
map("japan", boundary = FALSE, lty = 2, add = TRUE)
points(starbucks$long, starbucks$lat, col = starbucks$color, pch = 19, cex = 0.5)
map.axes()今回の「Rにおけるアニメーション」は下巻の第5章の内容に基づく。
原著 Quantitative Social Science (Princeton University Press) のウェブ・ページでデータなどをダウンロードできる。