イントロ

ひきつづき、T-3にてお送りします。

初心者でも始めやすいをモットーに、IRUMA.Rでも初心者セッションをやります!

内容は徐々によくしていきたい。なんならRStudio IDEの使い方はハンズオンでもいい・・・

R言語はじめ時ですよ!

  • 初心者に優しい!

  • Tokyo.R

  • r-wakalang @ slack

  • tidyverseが成熟して大きな変更がなくなった。枯れた=使う側は安心。

この資料もRMarkdown(Quartoじゃなくてごめんなさいね…)で作られています。

凝ったスライドじゃなくても大丈夫!むしろ結果が眺められて素のhtml出力もいいものですよ。

R言語は何が出来るの?

だいたいなんでも!

  • 様々な図(グラフ)
    • 棒グラフ、折れ線グラフ、散布図、などなど
  • 統計的な分析、モデリング、機械学習なども
    • 前段階の
  • ブログやサイト
  • ドキュメント、書籍、名刺、発表用スライド

入門編

RStudio 使い方

ここからはRStudio IDE上で操作をします(ややハンズオン)

左下

Console: Rを実行するための領域。改行ごとにコードが実行され、一行ずつ対話的に作業ができる。複数行コピーして貼り付ければ一度に複数行実行できる。Shift+Enterで複数行入力も可能。

左上

Source: ファイルの編集のタブ。Rのコードをファイルにまとめておくと、都度コードを打たずに次回同じコードを正しい順序で実行できる。

右下

Files: 今のディレクトリ(フォルダ)にあるファイルが見える Plots: グラフを描画した際に出力される。 Help: help(関数名)や ?関数名 などで表示されるHelpの内容が表示される。

右上

Environment: 今ある変数の一覧。値も表示される。データフレームなどは選択すると左上に内容が表示される。 History: Consoleで入力した履歴が見れる。To ConsoleやTo Sourceで選択した内容をConsoleやSourceのファイルに追加することができる。

Consoleでいろいろ触ってみる。

以下追加。

plot(AirPassengers)

hist(airmiles)

plot(mtcars)

View(mtcars)

Environmentタブのデータを見てみる

View()と同じ結果

Filesタブからデータを読み込んでみる

xlsxやcsvのファイルをクリックするとデータの入力用のUIが出てくる 設定がいろいろとできるので、Consoleで書かなくても(とりあえず)使うことができる 細かい制御をするならreadrパッケージの使い方を覚えていこう(後述します)

コンソール上でRを動かして見る

  • Rの簡単なコマンド、文法など
# 足し算
# ここはコメントなので実行されない。
1+1
## [1] 2
# 1から10までのベクトルをつくる
c(1:10)
##  [1]  1  2  3  4  5  6  7  8  9 10
# 4番目と5番目を選ぶ
C(1:10)[c(4,5)]
## [1] 4 5
## attr(,"contrasts")
##       unordered 
## contr.treatment 
## Levels: 1 2 3 4 5 6 7 8 9 10
# 1から10までの合計を計算する
sum(1:10)
## [1] 55
# 変数xに代入して表示
x <- 5
print(x)
## [1] 5
# ()でくくると表示出来る
(x <- 10)
## [1] 10
# こういうのも
y <- x <- 20
print(y)
## [1] 20

Consoleに書いたものをRスクリプトに残していく。

プロジェクト

  • File -> New Project
  • Project毎に設定するものはTools Project Options

パッケージ、CRAN

Rは便利なライブラリが揃っているので、上手く使うと手数を減らしたりミスが減る。

install.packages("パッケージ名")

でCRANに登録されているライブラリをインストールできる。

GitHubにもパッケージはあるが、CRANのチェックは入っていない。自己責任で使用する。 開発バージョンとして、最新の機能を試す時などに。自分でパッケージを作ることも出来る。

tidyverse

  • tidyverseパッケージは便利なライブラリの集合。

  • データの前処理、ハンドリング、可視化まで基本的なことはほとんどこれで対応できる。 モデリングは tidymodelsに

  • readr

  • dplyr

  • 主にデータフレームの操作について

データハンドリングのための前知識 * エクセルのシートのイメージ

readr::read_csvで読める形式にするまで(前処理、文字列処理)→応用にて データフレームの操作

概念 データの前処理、可視化 base Rは文法的に統一されていなかった。洗練。

パイプ

特にtidyverseの関数群は第一引数にデータフレームを与え、引数に与えられた元のデータフレームに対して変更を加えず、データフレームを返す。第二引数はそのデータフレームに対して操作をするための条件となるものを与える。

このデータをつぎつぎと次の関数に与えていく考え方と記法がマッチしている。

元々はmagrittrパッケージにある %>% であったが、R自体に |> として取り込まれた。

RStudio上のショートカットキー、Ctrl+Mでパイプ演算子を挿入できるが、“Global Options”の”Code”を選び”Use native pipe operator, |>“にチェックを入れるとCtrl+Mで出るパイプが”%>%“ではなく”|>“になる

ただし、細かい違いがあるので注意。 %>%が廃止されるわけではないのでつかい続けても良いとおもう。

列の選択

skimr::skim(datasets::mtcars)
skimr::skim() の結果は長いので折り畳み
Data summary
Name datasets::mtcars
Number of rows 32
Number of columns 11
_______________________
Column type frequency:
numeric 11
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
mpg 0 1 20.09 6.03 10.40 15.43 19.20 22.80 33.90 ▃▇▅▁▂
cyl 0 1 6.19 1.79 4.00 4.00 6.00 8.00 8.00 ▆▁▃▁▇
disp 0 1 230.72 123.94 71.10 120.83 196.30 326.00 472.00 ▇▃▃▃▂
hp 0 1 146.69 68.56 52.00 96.50 123.00 180.00 335.00 ▇▇▆▃▁
drat 0 1 3.60 0.53 2.76 3.08 3.70 3.92 4.93 ▇▃▇▅▁
wt 0 1 3.22 0.98 1.51 2.58 3.33 3.61 5.42 ▃▃▇▁▂
qsec 0 1 17.85 1.79 14.50 16.89 17.71 18.90 22.90 ▃▇▇▂▁
vs 0 1 0.44 0.50 0.00 0.00 0.00 1.00 1.00 ▇▁▁▁▆
am 0 1 0.41 0.50 0.00 0.00 0.00 1.00 1.00 ▇▁▁▁▆
gear 0 1 3.69 0.74 3.00 3.00 4.00 4.00 5.00 ▇▁▆▁▂
carb 0 1 2.81 1.62 1.00 2.00 2.00 4.00 8.00 ▇▂▅▁▁
datasets::mtcars %>% select(mpg)

行の選択

datasets::mtcars %>% filter(cyl==4)
##                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Datsun 710     22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Merc 240D      24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230       22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Fiat 128       32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic    30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Fiat X1-9      27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

応用編1

実際のデータを見てみよう

Open Data Saitamaにある入間市のデータ

csvファイルだが、CP932、いわゆるShift-JISで書かれている(MS Excelの場合、逆にUTF-8だと文字化けするので、OpenDataとしては多分この方が良い) そのままでread_csvすると文字化けするため、エンコーディングの指定をする。

政府推奨フォーマットは自治体標準オープンデータセット(正式版)が公開されたので今後形式が変わる可能性がある点に注意。

df <- read_csv("kankouti-irumashi.csv", locale = locale(encoding = "CP932"))
## Rows: 8 Columns: 23
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (10): 団体名, 観光地_名称, 観光地_紹介文, 観光地_住所, 観光地_種別, 観光地_利用可能時間情報, 観光地_休業情報, 日時備考...
## dbl  (2): 識別情報, 団体コード
## lgl (11): 観光地_緯度, 観光地_経度, 観光地_収容人数[総定員]人数, 開始時間, 終了時間, 観光地_自由記述欄, 観光地_連絡先, 観...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

データフレームの確認

OpenDataは整備されているので、読み込みでトラブルになることはないが、データを作るところから始める場合、まずデータを正しく読み込めるか?意図した形式になっているか?が1つのチェックポイントになる。 A * read_csvの出力を見る * str(df) # 上記の詳細版 * View(df) # Viewer Pane上で実際のデータが目視確認出来る

緯度経度の情報がないことが確認出来た(leafletで扱うときに何も表示されない) 可視化はうまくいかなかったときのデバッグのために、元データまで戻って確認することが多いので、あらかじめチェックすべき項目を作ってデータ読み込み時にある程度確認できた方が良い。

エクセルファイルの読み込み

Open Data Saitama【入間市】文化財一覧(政府推奨フォーマット)を使用する(CC-BYライセンスで公開)

readxlパッケージでエクセルファイルも読める 日本語の列でも読み込める

readxl::read_excel("112259culturalproperty.xlsx") -> df
# RStudio上ではView()を使うことで、Viewer Paneにデータを表示出来る。
# データフレーム以外のlistやオブジェクトにも対応しているので、目視確認したいときに。
View(df)

要約系パッケージ

データをいじる前に、対象のデータフレームの概要を掴んでおくのは大事。summaryでもシンプルなデータは見れるが、列が多かったり数字や文字列など色々な型があると見づらい。

summary(df) の結果は長いので折り畳み
summary(df)
##  都道府県コード\r\n又は市区町村コード    NO           都道府県名       
##  Min.   :112259                       Mode:logical   Length:78         
##  1st Qu.:112259                       NA's:78        Class :character  
##  Median :112259                                      Mode  :character  
##  Mean   :112259                                                        
##  3rd Qu.:112259                                                        
##  Max.   :112259                                                        
##                                                                        
##   市区町村名            名称            名称_カナ         名称_通称     
##  Length:78          Length:78          Length:78          Mode:logical  
##  Class :character   Class :character   Class :character   NA's:78       
##  Mode  :character   Mode  :character   Mode  :character                 
##                                                                         
##                                                                         
##                                                                         
##                                                                         
##  名称_英語       文化財分類            種類             場所名称        
##  Mode:logical   Length:78          Length:78          Length:78         
##  NA's:78        Class :character   Class :character   Class :character  
##                 Mode  :character   Mode  :character   Mode  :character  
##                                                                         
##                                                                         
##                                                                         
##                                                                         
##      住所             方書              緯度            経度          
##  Length:78          Mode:logical   Min.   :35.79   Min.   :      139  
##  Class :character   NA's:78        1st Qu.:35.80   1st Qu.:      139  
##  Mode  :character                  Median :35.82   Median :      139  
##                                    Mean   :35.82   Mean   :  2112076  
##                                    3rd Qu.:35.84   3rd Qu.:      139  
##                                    Max.   :35.85   Max.   :139387937  
##                                    NA's   :12      NA's   :12         
##  電話番号       内線番号         員数(数)      員数(単位)      
##  Mode:logical   Mode:logical   Min.   :   1.00   Length:78         
##  NA's:78        NA's:78        1st Qu.:   1.00   Class :character  
##                                Median :   1.00   Mode  :character  
##                                Mean   :  56.06                     
##                                3rd Qu.:   2.75                     
##                                Max.   :1207.00                     
##                                NA's   :16                          
##  法人番号         所有者等         文化財指定日       利用可能曜日      
##  Mode:logical   Length:78          Length:78          Length:78         
##  NA's:78        Class :character   Class :character   Class :character  
##                 Mode  :character   Mode  :character   Mode  :character  
##                                                                         
##                                                                         
##                                                                         
##                                                                         
##     開始時間                      終了時間                  
##  Min.   :1899-12-31 09:00:00   Min.   :1899-12-31 17:00:00  
##  1st Qu.:1899-12-31 09:00:00   1st Qu.:1899-12-31 17:00:00  
##  Median :1899-12-31 09:00:00   Median :1899-12-31 17:00:00  
##  Mean   :1899-12-31 09:00:00   Mean   :1899-12-31 17:00:00  
##  3rd Qu.:1899-12-31 09:00:00   3rd Qu.:1899-12-31 17:00:00  
##  Max.   :1899-12-31 09:00:00   Max.   :1899-12-31 17:00:00  
##  NA's   :75                    NA's   :75                   
##  利用可能日時特記事項   画像         画像_ライセンス   概要        
##  Length:78            Mode:logical   Mode:logical    Mode:logical  
##  Class :character     NA's:78        NA's:78         NA's:78       
##  Mode  :character                                                  
##                                                                    
##                                                                    
##                                                                    
##                                                                    
##  概要_英語        説明         説明_英語          URL              備考        
##  Mode:logical   Mode:logical   Mode:logical   Length:78          Mode:logical  
##  NA's:78        NA's:78        NA's:78        Class :character   NA's:78       
##                                               Mode  :character                 
##                                                                                
##                                                                                
##                                                                                
## 

tibble は列が多いと省略してしまうので、headでは全体を確認しづらいが、glimpseは見やすい。

head(df) の結果は長いので折り畳み
head(df)
## # A tibble: 6 × 34
##   都道府県コード\r\n又は…¹ NO    都道府県名 市区町村名 名称  名称_カナ 名称_通称
##                      <dbl> <lgl> <chr>      <chr>      <chr> <chr>     <lgl>    
## 1                   112259 NA    埼玉県     入間市     高倉… コウソウ… NA       
## 2                   112259 NA    埼玉県     入間市     円照… エンショ… NA       
## 3                   112259 NA    埼玉県     入間市     円照… エンショ… NA       
## 4                   112259 NA    埼玉県     入間市     西久… ニシクボ… NA       
## 5                   112259 NA    埼玉県     入間市     刀銘… トウメイ… NA       
## 6                   112259 NA    埼玉県     入間市     東光… トウコウ… NA       
## # ℹ abbreviated name: ¹​`都道府県コード\r\n又は市区町村コード`
## # ℹ 27 more variables: 名称_英語 <lgl>, 文化財分類 <chr>, 種類 <chr>,
## #   場所名称 <chr>, 住所 <chr>, 方書 <lgl>, 緯度 <dbl>, 経度 <dbl>,
## #   電話番号 <lgl>, 内線番号 <lgl>, `員数(数)` <dbl>, `員数(単位)` <chr>,
## #   法人番号 <lgl>, 所有者等 <chr>, 文化財指定日 <chr>, 利用可能曜日 <chr>,
## #   開始時間 <dttm>, 終了時間 <dttm>, 利用可能日時特記事項 <chr>, 画像 <lgl>,
## #   画像_ライセンス <lgl>, 概要 <lgl>, 概要_英語 <lgl>, 説明 <lgl>, …
dplyr::glimpse(df)
dplyr::glimpse(df) の結果は長いので折り畳み
## Rows: 78
## Columns: 34
## $ `都道府県コード\r\n又は市区町村コード` <dbl> 112259, 112259, 112259, 112259,…
## $ NO                                     <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ 都道府県名                             <chr> "埼玉県", "埼玉県", "埼玉県", "…
## $ 市区町村名                             <chr> "入間市", "入間市", "入間市", "…
## $ 名称                                   <chr> "高倉寺観音堂附棟札一枚", "円照…
## $ 名称_カナ                              <chr> "コウソウジカンノンドウツケタリ…
## $ 名称_通称                              <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ 名称_英語                              <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ 文化財分類                             <chr> "重要文化財", "重要文化財", "県…
## $ 種類                                   <chr> "建造物", "その他", "その他", N…
## $ 場所名称                               <chr> "高倉寺", "円照寺", "入間市博物…
## $ 住所                                   <chr> "埼玉県入間市高倉三丁目3-4", "…
## $ 方書                                   <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ 緯度                                   <dbl> 35.83950, 35.83952, 35.81905, 3…
## $ 経度                                   <dbl> 139.3785, 139.3465, 139.4037, 1…
## $ 電話番号                               <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ 内線番号                               <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ `員数(数)`                           <dbl> 1, 6, 6, NA, 1, 1, NA, 11, 2, N…
## $ `員数(単位)`                         <chr> "棟", "基", "個", NA, "口", "口…
## $ 法人番号                               <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ 所有者等                               <chr> NA, NA, NA, NA, "個人", NA, NA,…
## $ 文化財指定日                           <chr> "1949-05-30", "1963-02-14", "19…
## $ 利用可能曜日                           <chr> "月火水木金土日 ※外観のみ", "…
## $ 開始時間                               <dttm> NA, NA, 1899-12-31 09:00:00, N…
## $ 終了時間                               <dttm> NA, NA, 1899-12-31 17:00:00, N…
## $ 利用可能日時特記事項                   <chr> NA, NA, "祝日の場合は全て利用可…
## $ 画像                                   <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ 画像_ライセンス                        <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ 概要                                   <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ 概要_英語                              <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ 説明                                   <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ 説明_英語                              <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…
## $ URL                                    <chr> NA, NA, "https://www.alit.city.…
## $ 備考                                   <lgl> NA, NA, NA, NA, NA, NA, NA, NA,…

新しく列を作る(dplyr::mutate())

他のOpenDataについて見てみる。【入間市】子育て施設一覧(政府推奨フォーマット)は緯度と経度が文字列になっている。

変数には型がある。論理型(True/False)、整数型、Double、複素数、Raw、文字列、ファクタ型などなど。

readxl::read_excel("112259preschool.xlsx") -> df3
df3 %>% mutate(緯度 = as.numeric(緯度)) %>% mutate(経度 = as.numeric(経度)) -> df3

異常値や欠測値を見つけたい(要約系パッケージを使う)

ただし、これらは欠測値や異常値のチェックは難しい。色々なパッケージがあるが、skimr::skim()がおススメ。

df %>% skimr::skim()
skimr::skim() の結果は長いので折り畳み
Data summary
Name Piped data
Number of rows 78
Number of columns 34
_______________________
Column type frequency:
character 14
logical 14
numeric 4
POSIXct 2
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
都道府県名 0 1.00 3 3 0 1 0
市区町村名 0 1.00 3 3 0 1 0
名称 0 1.00 4 29 0 78 0
名称_カナ 0 1.00 5 53 0 78 0
文化財分類 0 1.00 5 10 0 12 0
種類 37 0.53 3 5 0 3 0
場所名称 35 0.55 3 15 0 24 0
住所 0 1.00 6 20 0 50 0
員数(単位) 13 0.83 1 3 0 17 0
所有者等 77 0.01 2 2 0 1 0
文化財指定日 0 1.00 10 10 0 32 0
利用可能曜日 25 0.68 6 13 0 5 0
利用可能日時特記事項 73 0.06 9 57 0 2 0
URL 66 0.15 39 39 0 1 0

Variable type: logical

skim_variable n_missing complete_rate mean count
NO 78 0 NaN :
名称_通称 78 0 NaN :
名称_英語 78 0 NaN :
方書 78 0 NaN :
電話番号 78 0 NaN :
内線番号 78 0 NaN :
法人番号 78 0 NaN :
画像 78 0 NaN :
画像_ライセンス 78 0 NaN :
概要 78 0 NaN :
概要_英語 78 0 NaN :
説明 78 0 NaN :
説明_英語 78 0 NaN :
備考 78 0 NaN :

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
都道府県コード
又は市区町村コード 0 1.00 112259.00 0.00 112259.00 112259.00 112259.00 112259.00 112259.00 ▁▁▇▁▁
緯度 12 0.85 35.82 0.02 35.79 35.80 35.82 35.84 35.85 ▃▃▆▃▇
経度 12 0.85 2112075.70 17157451.83 139.32 139.36 139.38 139.39 139387937.00 ▇▁▁▁▁
員数(数) 16 0.79 56.06 206.44 1.00 1.00 1.00 2.75 1207.00 ▇▁▁▁▁

Variable type: POSIXct

skim_variable n_missing complete_rate min max median n_unique
開始時間 75 0.04 1899-12-31 09:00:00 1899-12-31 09:00:00 1899-12-31 09:00:00 1
終了時間 75 0.04 1899-12-31 17:00:00 1899-12-31 17:00:00 1899-12-31 17:00:00 1

histplotで軽く確認するのも良い。後述。

欠測や異常値を削除

dplyr::filter 条件を指定して行を選択する。

下記で緯度や経度の列にある値がNAではない行だけを取り出す

df %>% filter(!is.na(緯度)) %>% filter(!is.na(経度)) %>% filter(経度>1000) %>% glimpse
## Rows: 1
## Columns: 34
## $ `都道府県コード\r\n又は市区町村コード` <dbl> 112259
## $ NO                                     <lgl> NA
## $ 都道府県名                             <chr> "埼玉県"
## $ 市区町村名                             <chr> "入間市"
## $ 名称                                   <chr> "蓮花院観音堂付勧進帳"
## $ 名称_カナ                              <chr> "レンゲインカンノンドウツケタリ…
## $ 名称_通称                              <lgl> NA
## $ 名称_英語                              <lgl> NA
## $ 文化財分類                             <chr> "市指定有形文化財"
## $ 種類                                   <chr> "建造物"
## $ 場所名称                               <chr> "蓮花院"
## $ 住所                                   <chr> "埼玉県入間市春日町2-9-1"
## $ 方書                                   <lgl> NA
## $ 緯度                                   <dbl> 35.84835
## $ 経度                                   <dbl> 139387937
## $ 電話番号                               <lgl> NA
## $ 内線番号                               <lgl> NA
## $ `員数(数)`                           <dbl> 1
## $ `員数(単位)`                         <chr> "棟"
## $ 法人番号                               <lgl> NA
## $ 所有者等                               <chr> NA
## $ 文化財指定日                           <chr> "1991-08-01"
## $ 利用可能曜日                           <chr> "月火水木金土日 ※外観のみ"
## $ 開始時間                               <dttm> NA
## $ 終了時間                               <dttm> NA
## $ 利用可能日時特記事項                   <chr> NA
## $ 画像                                   <lgl> NA
## $ 画像_ライセンス                        <lgl> NA
## $ 概要                                   <lgl> NA
## $ 概要_英語                              <lgl> NA
## $ 説明                                   <lgl> NA
## $ 説明_英語                              <lgl> NA
## $ URL                                    <chr> NA
## $ 備考                                   <lgl> NA

蓮花院観音堂付勧進帳 の経度に小数点付け忘れ?がある。 今回は除去する。(作成者に報告と確認)

skimr::skim() の結果は長いので折り畳み
df %>% filter(!is.na(緯度)) %>% filter(!is.na(経度)) %>% filter(経度<1000) -> df # →でも代入
skimr::skim(df) # missingとmean, histをチェック
Data summary
Name df
Number of rows 65
Number of columns 34
_______________________
Column type frequency:
character 14
logical 14
numeric 4
POSIXct 2
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
都道府県名 0 1.00 3 3 0 1 0
市区町村名 0 1.00 3 3 0 1 0
名称 0 1.00 4 29 0 65 0
名称_カナ 0 1.00 5 53 0 65 0
文化財分類 0 1.00 5 10 0 11 0
種類 35 0.46 3 5 0 3 0
場所名称 24 0.63 3 15 0 24 0
住所 0 1.00 8 20 0 48 0
員数(単位) 12 0.82 1 3 0 17 0
所有者等 65 0.00 NA NA 0 0 0
文化財指定日 0 1.00 10 10 0 30 0
利用可能曜日 16 0.75 6 13 0 5 0
利用可能日時特記事項 60 0.08 9 57 0 2 0
URL 54 0.17 39 39 0 1 0

Variable type: logical

skim_variable n_missing complete_rate mean count
NO 65 0 NaN :
名称_通称 65 0 NaN :
名称_英語 65 0 NaN :
方書 65 0 NaN :
電話番号 65 0 NaN :
内線番号 65 0 NaN :
法人番号 65 0 NaN :
画像 65 0 NaN :
画像_ライセンス 65 0 NaN :
概要 65 0 NaN :
概要_英語 65 0 NaN :
説明 65 0 NaN :
説明_英語 65 0 NaN :
備考 65 0 NaN :

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
都道府県コード
又は市区町村コード 0 1.0 112259.00 0.00 112259.00 112259.00 112259.00 112259.00 112259.00 ▁▁▇▁▁
緯度 0 1.0 35.82 0.02 35.79 35.80 35.82 35.84 35.85 ▃▃▆▃▇
経度 0 1.0 139.37 0.02 139.32 139.36 139.38 139.39 139.40 ▁▅▇▇▆
員数(数) 13 0.8 30.23 127.40 1.00 1.00 1.00 2.00 798.00 ▇▁▁▁▁

Variable type: POSIXct

skim_variable n_missing complete_rate min max median n_unique
開始時間 62 0.05 1899-12-31 09:00:00 1899-12-31 09:00:00 1899-12-31 09:00:00 1
終了時間 62 0.05 1899-12-31 17:00:00 1899-12-31 17:00:00 1899-12-31 17:00:00 1

列名の変更(dplyr::rename)

rename(新しい列名=元の列名) で指定する。日本語の列名でも問題は(ほぼ)起こらないけど、英数字の方が扱いやすい。

df %>% rename(lat=緯度) %>% rename(lng=経度) -> df 

baseのplotで散布図(外れ値の目視確認)

df %>% with(. ,plot(lat, lng))

もちろん、ggplot2 パッケージを使用してもOK。お好みで。パッとデータを確認するのはbaseのplotやhistなどを使うと記述が簡便です。

# library(tidyverse)でggplot2パッケージは一緒にロードされる
# 単体で使う場合はlibrary(ggplot2)で。
df %>% ggplot()+geom_point(aes(x=lat, y=lng))

応用編2

~データフレームを結合し、地図に表示してみる~

最後に、やや発展的な内容に入りますが、Open Data Saitamaのデータを使って地図上にマーカーを付けてみましょう。Rで地図の表示は {leaflet} パッケージを使います。

利用するのは、【入間市】文化財一覧(政府推奨フォーマット)と、【入間市】公共施設情報(図書館)(政府推奨フォーマット)と、 【入間市】子育て施設一覧(政府推奨フォーマット)です。

まずはこれらの3つのデータの座標情報を使うために、3つのデータを読み込んでひとつにまとめます。

dplyr::bind_row() を使うと、でデータフレームを縦につなげることができます。同じ列名なら列名が異なる場合は新しく追加されます。

結合したのち、欠測値と異常値を除去して地図にプロットします。

色分けのために、mutateで色とアイコン名を追加。全ての行にそれぞれの色が入ります(View()などで確認してみましょう)

df3 %>% mutate(緯度 = as.numeric(緯度)) %>% mutate(経度 = as.numeric(経度)) -> df3

dplyr::bind_rows(df1, df2) %>% dplyr::bind_rows(df3) %>% 
  filter(!is.na(緯度)) %>% filter(!is.na(経度)) %>% 
  filter(経度<1000) -> df
skimr::skim() の結果は長いので折り畳み
df %>% skimr::skim()
Data summary
Name Piped data
Number of rows 96
Number of columns 49
_______________________
Column type frequency:
character 31
logical 10
numeric 5
POSIXct 3
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
NO 65 0.32 10 10 0 26 0
都道府県名 0 1.00 3 3 0 1 0
市区町村名 0 1.00 3 3 0 1 0
名称 0 1.00 4 29 0 96 0
名称_カナ 0 1.00 5 53 0 96 0
文化財分類 31 0.68 5 10 0 11 0
種類 66 0.31 3 5 0 3 0
場所名称 55 0.43 3 15 0 24 0
住所 0 1.00 8 28 0 79 0
方書 91 0.05 6 12 0 5 0
電話番号 65 0.32 12 12 0 31 0
員数(単位) 43 0.55 1 3 0 17 0
法人番号 75 0.22 13 13 0 14 0
所有者等 96 0.00 NA NA 0 0 0
文化財指定日 31 0.68 10 10 0 30 0
利用可能曜日 16 0.83 5 13 0 7 0
利用可能日時特記事項 89 0.07 8 57 0 3 0
説明 91 0.05 2 13 0 3 0
URL 80 0.17 39 55 0 2 0
備考 91 0.05 24 99 0 5 0
color 0 1.00 4 9 0 3 0
icontext 0 1.00 527 977 0 3 0
都道府県コード又は市区町村コード 65 0.32 6 6 0 1 0
団体名 65 0.32 3 31 0 14 0
利用可能時間特記事項 91 0.05 113 176 0 4 0
種別 70 0.27 7 13 0 3 0
アクセス方法 70 0.27 9 24 0 20 0
駐車場情報 70 0.27 8 9 0 11 0
FAX番号 70 0.27 12 12 0 26 0
受入年齢 70 0.27 4 8 0 10 0
一時預かりの有無 70 0.27 1 1 0 2 0

Variable type: logical

skim_variable n_missing complete_rate mean count
名称_通称 96 0 NaN :
名称_英語 96 0 NaN :
内線番号 96 0 NaN :
画像 96 0 NaN :
画像_ライセンス 96 0 NaN :
概要 96 0 NaN :
概要_英語 96 0 NaN :
説明_英語 96 0 NaN :
POIコード 96 0 NaN :
バリアフリー情報 96 0 NaN :

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
都道府県コード
又は市区町村コード 31 0.68 112259.00 0.00 112259.00 112259.00 112259.00 112259.00 112259.00 ▁▁▇▁▁
緯度 0 1.00 35.82 0.02 35.79 35.81 35.82 35.84 35.85 ▃▃▇▆▆
経度 0 1.00 139.37 0.02 139.32 139.36 139.38 139.39 139.41 ▁▂▅▇▃
員数(数) 44 0.54 30.23 127.40 1.00 1.00 1.00 2.00 798.00 ▇▁▁▁▁
収容定員 70 0.27 95.27 31.18 20.00 85.50 90.00 120.00 150.00 ▂▃▇▇▂

Variable type: POSIXct

skim_variable n_missing complete_rate min max median n_unique
開始時間 62 0.35 1899-12-31 07:00:00 1899-12-31 09:30:00 1899-12-31 07:30:00 4
終了時間 62 0.35 1899-12-31 16:00:00 1899-12-31 22:00:00 1899-12-31 18:45:00 7
認可等年月日 70 0.27 1926-04-06 00:00:00 2019-04-01 00:00:00 1975-06-01 00:00:00 23

地図にプロットするには {leaflet} パッケージを使う。あらかじめインストールとロードをしておく。

# library(leaflet)
# library(fontawesome)
# Iconまわりはちょっとクセがあるのでここではおまじないとして。

df %>% # mutate(icontext = fa(icontext)) %>% 
leaflet(options = leafletOptions(minZoom = 8, maxZoom = 18)) %>%
      addTiles() %>% 
       addAwesomeMarkers(lng = ~経度, lat = ~緯度, label = ~名称, icon= makeAwesomeIcon(text = ~icontext, library = "fa", markerColor= ~color))

無事に結合したデータフレームにある施設を地図上にプロットできた!

少し応用的な内容になってしまいましたが、思ったより少ない手順で結果を見れることに気づくと思います。R言語はデータを楽して扱うことが出来るので、まずはやってみましょう!

データフレームの操作はまだまだ色々ある。

Web上に色々な資料があるので、見てみましょう。

https://speakerdeck.com/yutannihilation/tidyr-pivot

https://ymattu.github.io/TokyoR103/slide.html#/inthiscase

フクザツ!!??

  • すでにある機能を使いこなす ≒ ライブラリとその関数を使いこなす

  • 関数の使い方は習うより慣れろ

  • helpを読もう。{felp}パッケージも良いよ。

  • TokyoRの過去の資料がWeb上に沢山あり、わかりやすい。

  • ブログも同様に。

  • ChatGPTが色々答えてくれるので沢山効いてみよう(これは3.5の方)。雑に聞いても親切。

  • たまに嘘を言ってくるので注意。
    • あまり有名じゃないライブラリの使い方は特に

Enjoy!!