1 目的

官民データ活用推進基本法(2016年)において,地方自治体はオープンデータに取り組むことが義務付けられた.オープンデータの活用により地方自治体の課題解決や活性化が期待されている.

通行量調査地点周辺地図 1

ライブラリ:sftidyverseggspatial

library(sf)
library(tidyverse)

#OpenStreetMap利用のため
library(ggspatial)

2 オープンデータ

2.1 オープンデータのダウンロード

  • オープンデータたかまつ > データセット > 交通 > 商店街通行量情報 > data.csv (アクセス日:2024-03-16)2

  • read.csv()でデータ読込.文字化け防止のため,fileEncoding="utf8"を指示.

    • read_sf:データ読込.pedestrian_trafficと名付ける.
pedestrian_traffic<-
  read.csv("data.csv", fileEncoding="utf8")

データの加工1

  • 平日及び休日の平均歩行者数を計算する.歩行者数は男女で分かれているため足し合わせる.
    • mutate()を用いて,新しい列を追加. 
pedestrian_traffic %>%
  mutate("平日"=manWeekdaysAverage+womanWeekdaysAverage,
         "休日"=manHolidayAverage+womanHolidayAverage) ->
  pedestrian_traffic

2.2 sfクラス

  • st_as_sf()を利用して,sfクラスのデータ作成.
pedestrian_traffic %>% 
  st_as_sf(coords=c("longitude", "latitude"), 
           crs="EPSG:6668") ->
  pedestrian_traffic

作成したデータの中身確認と歩行者数の可視化

  • データの中身(最初の6行)を確認.
    • データ(データフレーム)は横方向にまとめられたワイドフォーマット
    • 必要な変数を抽出し,中身を確認.
    • Geometry typeがポイント(POINT),CRSJGD2011であることが確認できる.
pedestrian_traffic %>%
  select(name, 平日, 休日) %>% 
  head()
## Simple feature collection with 6 features and 3 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 134.0474 ymin: 34.34566 xmax: 134.0534 ymax: 34.34656
## Geodetic CRS:  JGD2011
##             name  平日  休日                  geometry
## 1   兵庫町(西)  4626  3536 POINT (134.0474 34.34656)
## 2   兵庫町(東)  8671  9667 POINT (134.0503 34.34612)
## 3 片原町西(西) 10294 14154 POINT (134.0506 34.34624)
## 4 片原町西(東)  5718  7126 POINT (134.0508 34.34605)
## 5 片原町東(西)  3328  3439 POINT (134.0534 34.34566)
## 6   丸亀町(北) 10200 15044 POINT (134.0505 34.34594)

とりあえず,平日の歩行者数を可視化.

ggplot()+
  geom_sf(data=pedestrian_traffic,
          aes(color=平日), size=3)+
  scale_color_viridis_c(option="G", direction=-1)

データの加工2(ワイド→ロング)

平日と休日の違いをわかりやすくするためにデータを加工.

  • 複数の地図の並べ方を指示できるfacet_wrap()が比較のためには有効.
    • このためには,平日と休日の歩行者数を現在のような横方向に並べるのではなく,縦方向に並び変える必要がある.
    • 縦方向にまとめられたデータ(データフレーム)はロングフォーマットとよばれる.
  • gather():ワイドフォーマットをロングフォーマットに変更.
  • dayと名付けた列を新しくつくる(key=day).dayの列で平日と休日を識別する.
  • 平日の歩行者と休日の歩行者数を一つの列(ptと名付ける)にまとめる.
    • value=ptの後に縦方向に並ばせたい列名(ここでは「平日」,「休日」)を記入.
    • 作成したデータをpedestrian_traffic1と名付ける.
    • 9 データハンドリング(アクセス日:2022-07-08) を参照した.
pedestrian_traffic %>%
  gather(key=day, value=pt, "平日", "休日") ->
  pedestrian_traffic1

作成したデータの中身確認

  • 中身を確認し易いように,ここでは3列だけ抽出.pedestrian_traffic2と名付ける.
pedestrian_traffic1 %>%
  select(day, pt, geometry) ->
  pedestrian_traffic2
  • head()tail()を用いて,最初の6行と最後の6行を表示.
    • ロングフォーマットに変更されたことを確認.
#最初の6行
pedestrian_traffic2 %>% 
  head()  
## Simple feature collection with 6 features and 2 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 134.0474 ymin: 34.34566 xmax: 134.0534 ymax: 34.34656
## Geodetic CRS:  JGD2011
##    day    pt                  geometry
## 1 平日  4626 POINT (134.0474 34.34656)
## 2 平日  8671 POINT (134.0503 34.34612)
## 3 平日 10294 POINT (134.0506 34.34624)
## 4 平日  5718 POINT (134.0508 34.34605)
## 5 平日  3328 POINT (134.0534 34.34566)
## 6 平日 10200 POINT (134.0505 34.34594)
#最後の6行
pedestrian_traffic2 %>%
  tail()
## Simple feature collection with 6 features and 2 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 134.0489 ymin: 34.33753 xmax: 134.0513 ymax: 34.33991
## Geodetic CRS:  JGD2011
##     day   pt                  geometry
## 25 休日 9784 POINT (134.0492 34.33956)
## 26 休日 7874 POINT (134.0493 34.33893)
## 27 休日 5264 POINT (134.0513 34.33865)
## 28 休日 3819 POINT (134.0489 34.33753)
## 29 休日 1870 POINT (134.0502 34.33962)
## 30 休日 4282 POINT (134.0493 34.33991)

3 完成図

「平日」,「休日」の順番に並べたいが,何も指示しないと「休日」,「平日」の順番になってしまう.意図した順番と異なり,意図したい順番に並べ替えたい場合は,factor()を利用.

#必要に応じて,並び替え
pedestrian_traffic1 %>%
  mutate(day=factor(day, levels=c("平日", "休日"))) ->
  pedestrian_traffic1

背景としてOpenStreetMap(OSM)を利用.

  • OSM利用に関してはOpenStreetMapを背景にした情報通信業事業所数の可視化参照.
    • annotation_map_tile():背景にOSMのタイルを使う.
    • labs()に出典を記入.
    • coord_sf():座標参照系を設定.設定しなくても問題はないが,設定したことにより背景の地図が鮮明になった.
    • facet_wrap():複数の地図の並べ方を指示.
      • ~day:平日と休日の地図を作成.
      • ncol=2:1行に地図を2枚並列.
    • キャプション(plot.caption)は左寄せ.
    • 文字サイズ(text)を拡大(size=12).
ggplot()+
  annotation_map_tile(type="cartolight",
                      zoomin=0)+
  geom_sf(data=pedestrian_traffic1,
          aes(color=pt), size=3)+
  scale_color_viridis_c(option="G",
                        direction=-1,
                        alpha=0.8)+
  facet_wrap(~day, ncol=2)+
  labs(color="人", 
       caption="\U00a9 OpenStreetMap contributors \U00a9 CARTO
出典:オープンデータたかまつ")+
  ggtitle("高松市商店街歩行者通行量(2023年)")+
  coord_sf(crs="EPSG:6668")+
  theme_void()+
  theme(plot.caption=element_text(hjust=0),
        text=element_text(size=12))

4 応用

  • の地図をバブルマップで作成.
    • バブルマップの作成方法はバブルマップによる地価の可視化を参照.
    • ここでは,st_coordinates()で座標を再取得するように指示.
      • 括弧内の1番目の数値(経度)をx,2番目の数値(緯度)をyとするように指示.
    • ポイントcoord_sf():座標参照系を設定しなかった場合,背景地図が示されなかった.このため設定. 
#もとのデータで作業
pedestrian_traffic1 %>%
  mutate(x=st_coordinates(geometry)[, 1],
         y=st_coordinates(geometry)[, 2]) -> 
  pedestrian_traffic
ggplot()+
  annotation_map_tile(type="cartolight",
                      zoomin=0)+
  geom_point(data=pedestrian_traffic, 
             aes(x=x, y=y, 
              color=pt,
              size=pt))+
  scale_color_viridis_c(option="G",
                      direction=-1,
                      guide="legend",
                      alpha=0.7)+
  scale_size_area(max_size=6)+
  facet_wrap(~day, ncol=2)+
  labs(color="人", size="人", 
       x="", y="",  
       caption="\U00a9 OpenStreetMap contributors \U00a9 CARTO
出典:オープンデータたかまつ")+
  ggtitle("高松市商店街歩行者通行量(2023年)")+
  coord_sf(crs = "EPSG:6668")+
  theme_void()+
  theme(plot.caption=element_text(hjust=0),
        text=element_text(size=12))

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


  1. この地図はmapview()を用いた作成.mapview()地理空間データの可視化についてはインタラクティブな地図によるデータの可視化参照.↩︎

  2. 作成日(2022-07-06)時点では2021年の商店街通行量情報がテキストファイルとEXCELファイルであったが,改定日(2024-03-16)現在は2023年の商店街通行量情報がcsvファイルとGeoJSONファイルに変更された模様.↩︎