Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TokyoR#101 パーマーステーションのペンギンたち2 データクリーニング編

bob3bob3
September 16, 2022

TokyoR#101 パーマーステーションのペンギンたち2 データクリーニング編

R言語を用いたデータクリーニング、前処理の話です。
Tokyo.R #101

bob3bob3

September 16, 2022
Tweet

More Decks by bob3bob3

Other Decks in Technology

Transcript

  1. パーマーステーションの ペンギンたち #2 データクリーニング編 Tokyo.R #101 (2022/09/17) @bob3bob3 Artwork by

    @allison_horst
  2. このセッションの位置づけ 中級者セッションのつもりでやっているシリーズです。 1. データセットの紹介(前回) 2. データクリーニング(今回) 3. 探索的データ分析(EDA)と可視化 4. 分析例

    ◦ シンプソンのパラドクス ◦ 次元縮約 ◦ クラスタリング ◦ 判別モデル ◦ などなど
  3. データクリーニング • データクリーニングとは生のデータを分析しやすい形に整えること。
 • データクレンジング、データエディティングとも呼ばれる。
 • データ前処理の一部。


  4. パーマーステーションのペンギンたち 前回に引き続き、palmerpenguinsパッ ケージのデータセットを使ってRと戯れま す。
 前回資料も参考にしてください。
 とりあえず、いますぐ
 install.packages("palmerpenguins") しましょう!
 Artwork by

    @allison_horst
  5. どんなデータ? • 南極に生息するペンギンの生態調査。2007年、08年、09年の3回の調査。
 • 南極のビスコー諸島、ドリーム島、トージャーセン島の3か所。
 • アデリーペンギン、ヒゲペンギン、ジェンツーペンギンの3種のペンギン。
 • 嘴の長さ、高さ、翼の長さ、体重、性別、血液検査の結果などが含まれる。
 アデリー(Adelie)


    ジェンツー(Gentoo)
 ヒゲ(Chinstrap)
 Stan Shebs (CC BY-SA 3.0) 
 Andrew Shiva(CC BY-SA 4.0)
 Stan Shebs (CC BY-SA 3.0) 

  6. 2つのデータセット penguins_raw 生のデータ
 • 17変数
 • studyName: 研究名(越冬隊ごと?) 
 •

    Sample Number: 標本番号(連番) 
 • Species: ペンギンの種(学名付き) 
 • Region: 調査した地域 
 • Island: 調査した島 
 • Stage: 発育段階 
 • Individual ID: 個体ID 
 • Clutch Completion: 巣の完成度 
 • Date Egg: 巣に1個以上の卵が確認された日? 
 • Culmen Length (mm): くちばしの長さ 
 • Culmen Depth (mm): くちばしの高さ 
 • Flipper Length (mm): 翼の長さ 
 • Body Mass (g): 体重 
 • Sex: 性別
 • Delta 15 N (o/oo): 窒素同位体比(δ15N) 
 • Delta 13 C (o/oo): 炭素同位体比(δ13C) 
 • Comments: コメント 
 penguins 使いやすく加工されたデータ 
 • 8変数
 • species: ペンギンの種 
 • island: 調査した島 
 • bill_length_mm: くちばしの長さ 
 • bill_depth_mm: くちばしの高さ 
 • flipper_length_mm: 翼の長さ 
 • body_mass_g: 体重 
 • sex: 性別
 • year: 調査した年 
 Artwork by @allison_horst
  7. 2つのデータセット penguins_raw 生のデータ
 • 17変数
 • studyName: 研究名(越冬隊ごと?) 
 •

    Sample Number: 標本番号(連番) 
 • Species: ペンギンの種(学名付き) 
 • Region: 調査した地域 
 • Island: 調査した島 
 • Stage: 発育段階 
 • Individual ID: 個体ID 
 • Clutch Completion: 巣の完成度 
 • Date Egg: 巣に1個以上の卵が確認された日? 
 • Culmen Length (mm): くちばしの長さ 
 • Culmen Depth (mm): くちばしの高さ 
 • Flipper Length (mm): 翼の長さ 
 • Body Mass (g): 体重 
 • Sex: 性別
 • Delta 15 N (o/oo): 窒素同位体比(δ15N) 
 • Delta 13 C (o/oo): 炭素同位体比(δ13C) 
 • Comments: コメント 
 penguins 使いやすく加工されたデータ 
 • 8変数
 • species: ペンギンの種 
 • island: 調査した島 
 • bill_length_mm: くちばしの長さ 
 • bill_depth_mm: くちばしの高さ 
 • flipper_length_mm: 翼の長さ 
 • body_mass_g: 体重 
 • sex: 性別
 • year: 調査した年 
 Artwork by @allison_horst 今日使うのは こっち。
  8. まずはデータを確認 library(palmerpenguins) #データセット library(summarytools) #サマリー確認用 penguins_raw |> dfSummary() |> view()

    palmerpenguinsパッケージ。 今回使うデータセット。 summarytoolsパッケージ。 データの概要を確認するのに非常に便利。
  9. 値が1種類しかない。 値が1種類しかない。 種の名前が長い。

  10. 変数名に空白や記号 を含む。 三か所に偏ってる。

  11. 今回、コメント行は使わ ない。 欠測値が多い。

  12. penguins_rawをキレイに整形する。 1. 分析に不要な列を除外する a. コメント列 b. 値が1つしか無い列 2. 変数名(列名)を調整する a.

    小文字に統一 b. 空白を削除 c. 命名規則を統一 d. 単語の置き換え e. 単位の削除 3. 水準名を日本語化する 4. 調査年を追加し、調査日は割愛す る 5. 既存の変数を加工して新たな変数 を追加する 6. NA(欠測値)は特に処理せず残す
  13. 完成したスクリプト library(tidyverse) # データ処理全般 library(palmerpenguins) # データセット library(janitor) # データクリーニング用

    library(lubridate) # 日時データ処理用 penguins_edit <- penguins_raw |> remove_constant() |> # すべて同じ値の列を削除 select(!c(studyName, `Sample Number`, `Clutch Completion`, Comments)) |> # 不要列削除 clean_names() |> # 命名規則をスネークケースに統一 rename_with(~ str_replace(., "culmen", "bill")) |> # 単語の置き換え rename_with(~ str_remove(., "_mm|_g|_o_oo")) |> # 単位の削除 rename_with(~ str_remove_all(., "_"), starts_with("delta")) |> # deltaの_を削除 mutate( species = species |> str_split(" ") |> map_chr(1), # 種を最初の単語に短縮 sex = sex |> recode(MALE = "オス", FEMALE = "メス"), # 性別をオス、メスに year = date_egg |> year(), # 観測日から調査年を抽出 bill_length_to_depth_ratio = bill_length / bill_depth # クチバシの長さ÷高さ ) |> select(!date_egg) # 観測日を削除
  14. 各種パッケージの呼び出し library(tidyverse) # データ処理全般 library(palmerpenguins) # データセット library(janitor) # データクリーニング用

    library(lubridate) # 日時データ処理用 penguins_edit <- penguins_raw |> remove_constant() |> # すべて同じ値の列を削除 select(!c(studyName, `Sample Number`, `Clutch Completion`, Comments)) |> # 不要列削除 clean_names() |> # 命名規則をスネークケースに統一 rename_with(~ str_replace(., "culmen", "bill")) |> # 単語の置き換え rename_with(~ str_remove(., "_mm|_g|_o_oo")) |> # 単位の削除 rename_with(~ str_remove_all(., "_"), starts_with("delta")) |> # deltaの_を削除 mutate( species = species |> str_split(" ") |> map_chr(1), # 種を最初の単語に短縮 sex = sex |> recode(MALE = "オス", FEMALE = "メス"), # 性別をオス、メスに year = date_egg |> year(), # 観測日から調査年を抽出 bill_length_to_depth_ratio = bill_length / bill_depth # クチバシの長さ÷高さ ) |> select(!date_egg) # 観測日を削除 tidyverseパッケージ。 モダンなRのためのメタパッケージ。 ggplot2, purrr, tibble, dplyr, tidyr, stringr, readr, forcatsの各パッケージを一度に呼び出す。 janitorパッケージ。 整備されていないデータの確認とクリーニ ングのためのパッケージ。 lubridateパッケージ。 日付のデータをいい感じに処理して くれるパッケージ。
  15. 不要な列の削除 library(tidyverse) # データ処理全般 library(palmerpenguins) # データセット library(janitor) # データクリーニング用

    library(lubridate) # 日時データ処理用 penguins_edit <- penguins_raw |> remove_constant() |> # すべて同じ値の列を削除 select(!c(studyName, `Sample Number`, `Clutch Completion`, Comments)) |> # 不要列削除 clean_names() |> # 命名規則をスネークケースに統一 rename_with(~ str_replace(., "culmen", "bill")) |> # 単語の置き換え rename_with(~ str_remove(., "_mm|_g|_o_oo")) |> # 単位の削除 rename_with(~ str_remove_all(., "_"), starts_with("delta")) |> # deltaの_を削除 mutate( species = species |> str_split(" ") |> map_chr(1), # 種を最初の単語に短縮 sex = sex |> recode(MALE = "オス", FEMALE = "メス"), # 性別をオス、メスに year = date_egg |> year(), # 観測日から調査年を抽出 bill_length_to_depth_ratio = bill_length / bill_depth # クチバシの長さ÷高さ ) |> select(!date_egg) # 観測日を削除 RegionとStageを削除。 コメント行など分析に使 わない列を削除。
  16. 変数名の統一 library(tidyverse) # データ処理全般 library(palmerpenguins) # データセット library(janitor) # データクリーニング用

    library(lubridate) # 日時データ処理用 penguins_edit <- penguins_raw |> remove_constant() |> # すべて同じ値の列を削除 select(!c(studyName, `Sample Number`, `Clutch Completion`, Comments)) |> # 不要列削除 clean_names() |> # 命名規則をスネークケースに統一 rename_with(~ str_replace(., "culmen", "bill")) |> # 単語の置き換え rename_with(~ str_remove(., "_mm|_g|_o_oo")) |> # 単位の削除 rename_with(~ str_remove_all(., "_"), starts_with("delta")) |> # deltaの_を削除 mutate( species = species |> str_split(" ") |> map_chr(1), # 種を最初の単語に短縮 sex = sex |> recode(MALE = "オス", FEMALE = "メス"), # 性別をオス、メスに year = date_egg |> year(), # 観測日から調査年を抽出 bill_length_to_depth_ratio = bill_length / bill_depth # クチバシの長さ÷高さ ) |> select(!date_egg) # 観測日を削除 単語をアンダースコアでつなぐ形式 に変換。 キャメルケースなど他の形式に変換 も可能。
  17. 変数名の調整 library(tidyverse) # データ処理全般 library(palmerpenguins) # データセット library(janitor) # データクリーニング用

    library(lubridate) # 日時データ処理用 penguins_edit <- penguins_raw |> remove_constant() |> # すべて同じ値の列を削除 select(!c(studyName, `Sample Number`, `Clutch Completion`, Comments)) |> # 不要列削除 clean_names() |> # 命名規則をスネークケースに統一 rename_with(~ str_replace(., "culmen", "bill")) |> # 単語の置き換え rename_with(~ str_remove(., "_mm|_g|_o_oo")) |> # 単位の削除 rename_with(~ str_remove_all(., "_"), starts_with("delta")) |> # deltaの_を削除 mutate( species = species |> str_split(" ") |> map_chr(1), # 種を最初の単語に短縮 sex = sex |> recode(MALE = "オス", FEMALE = "メス"), # 性別をオス、メスに year = date_egg |> year(), # 観測日から調査年を抽出 bill_length_to_depth_ratio = bill_length / bill_depth # クチバシの長さ÷高さ ) |> select(!date_egg) # 観測日を削除 rename_with()で関数を使った規則 的な変数名の変換ができる。
  18. 水準の調整 library(tidyverse) # データ処理全般 library(palmerpenguins) # データセット library(janitor) # データクリーニング用

    library(lubridate) # 日時データ処理用 penguins_edit <- penguins_raw |> remove_constant() |> # すべて同じ値の列を削除 select(!c(studyName, `Sample Number`, `Clutch Completion`, Comments)) |> # 不要列削除 clean_names() |> # 命名規則をスネークケースに統一 rename_with(~ str_replace(., "culmen", "bill")) |> # 単語の置き換え rename_with(~ str_remove(., "_mm|_g|_o_oo")) |> # 単位の削除 rename_with(~ str_remove_all(., "_"), starts_with("delta")) |> # deltaの_を削除 mutate( species = species |> str_split(" ") |> map_chr(1), # 種を最初の単語に短縮 sex = sex |> recode(MALE = "オス", FEMALE = "メス"), # 性別をオス、メスに year = date_egg |> year(), # 観測日から調査年を抽出 bill_length_to_depth_ratio = bill_length / bill_depth # クチバシの長さ÷高さ ) |> select(!date_egg) # 観測日を削除 変数名を空白で分割し、最初の文字列を残す。
  19. 水準の調整 library(tidyverse) # データ処理全般 library(palmerpenguins) # データセット library(janitor) # データクリーニング用

    library(lubridate) # 日時データ処理用 penguins_edit <- penguins_raw |> remove_constant() |> # すべて同じ値の列を削除 select(!c(studyName, `Sample Number`, `Clutch Completion`, Comments)) |> # 不要列削除 clean_names() |> # 命名規則をスネークケースに統一 rename_with(~ str_replace(., "culmen", "bill")) |> # 単語の置き換え rename_with(~ str_remove(., "_mm|_g|_o_oo")) |> # 単位の削除 rename_with(~ str_remove_all(., "_"), starts_with("delta")) |> # deltaの_を削除 mutate( species = species |> str_split(" ") |> map_chr(1), # 種を最初の単語に短縮 sex = sex |> recode(MALE = "オス", FEMALE = "メス"), # 性別をオス、メスに year = date_egg |> year(), # 観測日から調査年を抽出 bill_length_to_depth_ratio = bill_length / bill_depth # クチバシの長さ÷高さ ) |> select(!date_egg) # 観測日を削除
  20. 水準の調整 library(tidyverse) # データ処理全般 library(palmerpenguins) # データセット library(janitor) # データクリーニング用

    library(lubridate) # 日時データ処理用 penguins_edit <- penguins_raw |> remove_constant() |> # すべて同じ値の列を削除 select(!c(studyName, `Sample Number`, `Clutch Completion`, Comments)) |> # 不要列削除 clean_names() |> # 命名規則をスネークケースに統一 rename_with(~ str_replace(., "culmen", "bill")) |> # 単語の置き換え rename_with(~ str_remove(., "_mm|_g|_o_oo")) |> # 単位の削除 rename_with(~ str_remove_all(., "_"), starts_with("delta")) |> # deltaの_を削除 mutate( species = species |> str_split(" ") |> map_chr(1), # 種を最初の単語に短縮 sex = sex |> recode(MALE = "オス", FEMALE = "メス"), # 性別をオス、メスに year = date_egg |> year(), # 観測日から調査年を抽出 bill_length_to_depth_ratio = bill_length / bill_depth # クチバシの長さ÷高さ ) |> select(!date_egg) # 観測日を削除 year()で日付から年だけを取り出す。
  21. 変数の加工と追加 library(tidyverse) # データ処理全般 library(palmerpenguins) # データセット library(janitor) # データクリーニング用

    library(lubridate) # 日時データ処理用 penguins_edit <- penguins_raw |> remove_constant() |> # すべて同じ値の列を削除 select(!c(studyName, `Sample Number`, `Clutch Completion`, Comments)) |> # 不要列削除 clean_names() |> # 命名規則をスネークケースに統一 rename_with(~ str_replace(., "culmen", "bill")) |> # 単語の置き換え rename_with(~ str_remove(., "_mm|_g|_o_oo")) |> # 単位の削除 rename_with(~ str_remove_all(., "_"), starts_with("delta")) |> # deltaの_を削除 mutate( species = species |> str_split(" ") |> map_chr(1), # 種を最初の単語に短縮 sex = sex |> recode(MALE = "オス", FEMALE = "メス"), # 性別をオス、メスに year = date_egg |> year(), # 観測日から調査年を抽出 bill_length_to_depth_ratio = bill_length / bill_depth # クチバシの長さ÷高さ ) |> select(!date_egg) # 観測日を削除
  22. 不要になった変数を削除 library(tidyverse) # データ処理全般 library(palmerpenguins) # データセット library(janitor) # データクリーニング用

    library(lubridate) # 日時データ処理用 penguins_edit <- penguins_raw |> remove_constant() |> # すべて同じ値の列を削除 select(!c(studyName, `Sample Number`, `Clutch Completion`, Comments)) |> # 不要列削除 clean_names() |> # 命名規則をスネークケースに統一 rename_with(~ str_replace(., "culmen", "bill")) |> # 単語の置き換え rename_with(~ str_remove(., "_mm|_g|_o_oo")) |> # 単位の削除 rename_with(~ str_remove_all(., "_"), starts_with("delta")) |> # deltaの_を削除 mutate( species = species |> str_split(" ") |> map_chr(1), # 種を最初の単語に短縮 sex = sex |> recode(MALE = "オス", FEMALE = "メス"), # 性別をオス、メスに year = date_egg |> year(), # 観測日から調査年を抽出 bill_length_to_depth_ratio = bill_length / bill_depth # クチバシの長さ÷高さ ) |> select(!date_egg) # 観測日を削除
  23. to be continued... 今後の予定: 1. データセットの紹介(前回) 2. データクリーニング(今回) 3. 探索的データ分析(EDA)と可視化

    4. 分析例 ◦ シンプソンのパラドクス ◦ 次元縮約 ◦ クラスタリング ◦ 判別モデル ◦ などなど 次回もお楽しみに!