初心者でも始めやすいをモットーに、IRUMA.Rでも初心者セッションをやります!
内容は徐々によくしていきたい。なんならRStudio IDEの使い方はハンズオンでもいい・・・
初心者に優しい!
Tokyo.R
r-wakalang @ slack
tidyverseが成熟して大きな変更がなくなった。枯れた=使う側は安心。
この資料もRMarkdown(Quartoじゃなくてごめんなさいね…)で作られています。
凝ったスライドじゃなくても大丈夫!むしろ結果が眺められて素のhtml出力もいいものですよ。
だいたいなんでも!
ここからはRStudio IDE上で操作をします(ややハンズオン)
Console: Rを実行するための領域。改行ごとにコードが実行され、一行ずつ対話的に作業ができる。複数行コピーして貼り付ければ一度に複数行実行できる。Shift+Enterで複数行入力も可能。
Source: ファイルの編集のタブ。Rのコードをファイルにまとめておくと、都度コードを打たずに次回同じコードを正しい順序で実行できる。
Files: 今のディレクトリ(フォルダ)にあるファイルが見える Plots: グラフを描画した際に出力される。 Help: help(関数名)や ?関数名 などで表示されるHelpの内容が表示される。
Environment: 今ある変数の一覧。値も表示される。データフレームなどは選択すると左上に内容が表示される。 History: Consoleで入力した履歴が見れる。To ConsoleやTo Sourceで選択した内容をConsoleやSourceのファイルに追加することができる。
以下追加。
plot(AirPassengers)
hist(airmiles)
plot(mtcars)
View(mtcars)
View()と同じ結果
xlsxやcsvのファイルをクリックするとデータの入力用のUIが出てくる 設定がいろいろとできるので、Consoleで書かなくても(とりあえず)使うことができる 細かい制御をするならreadrパッケージの使い方を覚えていこう(後述します)
# 足し算
# ここはコメントなので実行されない。
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スクリプトに残していく。
Rは便利なライブラリが揃っているので、上手く使うと手数を減らしたりミスが減る。
install.packages("パッケージ名")
でCRANに登録されているライブラリをインストールできる。
GitHubにもパッケージはあるが、CRANのチェックは入っていない。自己責任で使用する。 開発バージョンとして、最新の機能を試す時などに。自分でパッケージを作ることも出来る。
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() の結果は長いので折り畳み
| 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
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() の結果は長いので折り畳み
| 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 |
histやplotで軽く確認するのも良い。後述。
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をチェック
| 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 |
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))
最後に、やや発展的な内容に入りますが、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()
| 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言語はデータを楽して扱うことが出来るので、まずはやってみましょう!
すでにある機能を使いこなす ≒ ライブラリとその関数を使いこなす
関数の使い方は習うより慣れろ
helpを読もう。{felp}パッケージも良いよ。
TokyoRの過去の資料がWeb上に沢山あり、わかりやすい。
ブログも同様に。
ChatGPTが色々答えてくれるので沢山効いてみよう(これは3.5の方)。雑に聞いても親切。