1 目的

  • OECDの主要統計から住宅価格に関連するデータを抽出し,実質住宅価格指数(real house price indices)をNatural Earthの世界地図に可視化.

  • バブルマップをアニメーション化.

    • OECDのデータを扱うパッケージが用意されているため,それを利用する.
      • パッケージをインストールする場合はinstall.packages("OECD")ではななく,下記の方がよいかも(作成日現在).
#インストールが必要な場合
library(devtools)
install_github("expersso/OECD")

ライブラリ:sftidyverseOECDrnaturalearthgganimate

library(sf)
library(tidyverse)
#OECDのデータ利用
library(OECD)
#Natural Earth(世界地図) 
library(rnaturalearth)
#アニメーション作成
library(gganimate)

2 データアクセス

  • Eric Persson氏作成サイトを参考に,OECDのデータにアクセス.データのダウンロード時間を短くするため,興味のあるデータに絞る.
  1. get_datasets():OECDに掲載されているすべてのデータにアクセス.
  2. 膨大なデータであるため,search_dataset()を用いて必要なデータを検索.ここでは,キーワードとして「住宅価格(house price)」に関わるデータを検索.
oecd <- get_datasets()
search_dataset("house price", data=oecd)
  •  3つの指標があり,それぞれの説明が記されている.
  1. 以下ではHOUSE_PRICESを利用.hpと名付ける.
  2. get_data_structure():指定されたデータ(hp)のリストを返す.各リストの観測数,変数の数を確認できる.hpstrと名付ける.
  3. str()hpstrのデータ構造を表示.そのうち,最初の階層のみ(max.level=1)表示.
hp <- "HOUSE_PRICES"
hpstr <- get_data_structure(hp)
str(hpstr, max.level=1)
## List of 9
##  $ VAR_DESC       :'data.frame': 9 obs. of  2 variables:
##  $ COU            :'data.frame': 52 obs. of  2 variables:
##  $ IND            :'data.frame': 7 obs. of  2 variables:
##  $ TIME           :'data.frame': 476 obs. of  2 variables:
##  $ OBS_STATUS     :'data.frame': 16 obs. of  2 variables:
##  $ UNIT           :'data.frame': 323 obs. of  2 variables:
##  $ POWERCODE      :'data.frame': 32 obs. of  2 variables:
##  $ REFERENCEPERIOD:'data.frame': 112 obs. of  2 variables:
##  $ TIME_FORMAT    :'data.frame': 5 obs. of  2 variables:
  • VAR_DESCの中身を表示.
    • INDが住宅価格指標.
hpstr$VAR_DESC
  • INDの中身を表示.
    • このうちRHP(実質住宅価格指数)を利用.
    • 2015年が100.
hpstr$IND
  • COUの中身を表示.
    • このうち日本(JPN),ドイツ(DEU),アメリカ(USA),イギリス(GBR),ニュージーランド(NZL)を利用.
hpstr$COU
  1. list()を用いて,可視化する変数や要素をフィルターの条件としてリスト化.filter_listと名付ける.
  • 5カ国をc()でベクトルとして扱う.
  • 他の国も選択したいときは,表のidから3文字の国名コードを加える.
filter_list <- 
  list(c("JPN", "DEU", "USA", "GBR", "NZL"),
       "RHP")
  1. get_dataset():データを指定し,フィルターをかけて,データを抽出.dfと名付ける.
df <- 
  get_dataset(dataset=hp,
              filter=filter_list)

#最初の6行
df %>% 
  head()
  •  Time列に四半期データが含まれている.このままだと年次データと識別できない.
    • TIME_FORMATの表示().
      • P1Yが年次データ,P3Mが四半期データとされているが,TIME_FORMATはすべてP1Yと表示...(なぜ?)
hpstr$TIME_FORMAT 
  • 仕方ないので,dfから利用する列を選抜(select())し,Time列で「-」表記のある要素(例えば,1970-Q1)を取り除く(fliter()!で取り除くことが可能).
df <- 
  df %>%
  select(COU, Time, ObsValue) %>%
  filter(!str_detect(Time, "-")) 

#最初の6行
df %>% 
  head()

8. 実質住宅価格の値(ObsValue)が文字なので数値に変更.

  • 準備完了.
df <- 
  df %>% 
  mutate(ObsValue=as.numeric(ObsValue))

3 可視化

3.1 折れ線グラフ

  • 世界地図にする前に,折れ線グラフ(geom_line())で可視化.
    • 国ごとにまとめ(group=COU),色(color)と折れ線の形状(linetype)で識別.
#図を見やすくするための工夫
my_breaks <-
  c(1960, 1965, 1970, 1975, 1980, 1985, 
    1990,1995, 2000, 2005, 2010, 2015, 2020)

my_color <-
  c("#0B0405FF", "#38AAACFF", "#3B2F5EFF",
    "#366A9FFF", "#A0DFB9FF")

my_line <-
  c("dotted", "dashed", "solid",
    "dotdash", "longdash")

#可視化
ggplot()+
  geom_line(data=df, 
            aes(x=Time, y=ObsValue,
                group=COU, color=COU,
                linetype=COU),
                linewidth=0.7)+
  scale_color_manual(values=my_color)+
  scale_linetype_manual(values=my_line)+
  geom_vline(xintercept="2015",  
             linewidth=0.5)+
  scale_x_discrete(breaks=my_breaks)+ 
  labs(color="国", linetype="国",
       x="年", y="実質住宅価格指数, 2015=100",
       caption="出典: OECD")+
  ggtitle("実質住宅価格指数(1960年~2022年)")+
  theme_bw()

3.2 世界地図

3.2.1 世界地図の読込

  • 詳細はNatural Earthの地理空間データの可視化参照.
    • ne_countries()で読込.
    • 地物(オブジェクト)とその属性をもつデータであるためsfクラスを指定.
    • 地図の解像度(scale)はmediumを指示.World_mapと名付ける.
    • 座標参照系(CRS):EPSG:4326:WGS84.
World_map<-
  ne_countries(scale="medium",
               returnclass="sf")

#南極大陸削除(好み)
World_map %>% 
  filter(iso_a3!="ATA") ->
  World_map

3.2.2 データ結合

  • World_mapiso_a3が3文字の国名コード.
    • left_join():データ結合(横方向).
hp_map<-
  left_join(World_map, df,
            by=c("iso_a3"="COU"))

3.2.3 コロプレスマップのアニメ化

choropleth_map <- 
  ggplot()+
  geom_sf(data=World_map, fill="gray",
          alpha=0.4, color="white",
          linewidth=0.001)+
  geom_sf(data=hp_map, aes(fill=ObsValue), 
          color="white", linewidth=0.001)+
  scale_fill_viridis_c(option="G")+
  labs(fill="2015=100",
       subtitle="年:{current_frame}",
       caption="出典:Natural Earth, OECD")+
  ggtitle("実質住宅価格指数")+
  coord_sf(crs=st_crs("ESRI:54030"))+
  theme_bw()+
  theme(legend.position="bottom")
  • transition_manual():作成された地図(フレーム)をTimeで連続して変化させるように指示.anime_と名付ける.
    • animate():作成したanimeをアニメーション化.
anime_choropleth <-
  choropleth_map+
  transition_manual(Time) 

anime_choropleth  %>% 
  animate()

3.2.4 バブルマップのアニメ化

  • 最終目標であるバブルマップを作成し,アニメーション化.
    • 実質住宅価格指数を点データとして表現する必要あり.
    • そこで,各国の首都の位置情報を取得.
      • ここでは,自由に使える首都名・位置情報データから取得.ただし,ダウンロードしたデータの首都名が入る列名nameをデータ結合上capital_nameに変更.
      • hp_mapに首都の位置情報を追加するために,データ結合.
    • 世界地図は背景として利用.
#首都の位置情報
capital <-
  read.csv("capital_cities_2022_0.csv",
           sep=",", header=TRUE)

#データ結合
hp_map <-
  left_join(hp_map, capital,
            by=c("iso_a3"="adm0_a3"))

#データの一部中身,位置情報
hp_map %>%
  select(iso_a3, Time, capital_name, 
         x, y) %>%
  filter(Time=="2022") ->
  hp_map_XY

hp_map_XY %>%
  head()  
#6年分抽出
hp_map %>%
  filter(Time=="1975" | Time=="1985" |
           Time=="1995" | Time=="2005" | 
           Time=="2015" | Time=="2022") ->
  hp_map2

#可視化
ggplot()+
  geom_sf(data=World_map, fill="gray")+
  geom_point(data=hp_map2, aes(x=x, y=y, 
              color=ObsValue,
              size=ObsValue), alpha=0.8)+
  scale_color_viridis_c(option="G",
                      guide="legend")+
  scale_size_area(max_size=10)+ 
  geom_sf(data=World_map, fill="NA")+
  labs(color="実質住宅価格指数",
       size="実質住宅価格指数", 
       x="", y="")+
  facet_wrap(~Time, ncol=2)+
  ggtitle("実質住宅価格指数(1975年~2022年)")+
  theme_void()+
  theme(legend.position="bottom")

  • アニメーション作成.
#bubble_mapと名付けて地図を格納
bubble_map <-
  ggplot()+
  geom_sf(data=World_map, fill="gray")+
  geom_point(data=hp_map, 
             aes(x=x, y=y, 
              color=ObsValue,
              size=ObsValue),
             alpha=0.8)+
  scale_color_viridis_c(option="G",
                        guide="legend")+
  scale_size_area(max_size=16)+ 
  geom_sf(data=World_map, fill="NA")+
  labs(color="実質住宅価格指数",
       size="実質住宅価格指数", 
       subtitle="年:{current_frame}",
       caption="出典:Natural Earth, OECD",
       x="", y="")+
  ggtitle("実質住宅価格指数(2015=100)")+
  theme_void()+
  theme(legend.position="bottom")
#アニメーション化準備
anime_bubble <-
  bubble_map+
  transition_manual(Time) 

#アニメーション化
anime_bubble %>% 
  animate() 

4 参考ウェブサイト・文献

Rによる地理空間データの可視化