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

    View full-size slide

  2. このセッションの位置づけ
    中級者セッションのつもりでやっているシリーズです。
    1. データセットの紹介(前回)
    2. データクリーニング(今回)
    3. 探索的データ分析(EDA)と可視化
    4. 分析例
    ○ シンプソンのパラドクス
    ○ 次元縮約
    ○ クラスタリング
    ○ 判別モデル
    ○ などなど

    View full-size slide

  3. データクリーニング
    ● データクリーニングとは生のデータを分析しやすい形に整えること。

    ● データクレンジング、データエディティングとも呼ばれる。

    ● データ前処理の一部。


    View full-size slide

  4. パーマーステーションのペンギンたち
    前回に引き続き、palmerpenguinsパッ
    ケージのデータセットを使ってRと戯れま
    す。

    前回資料も参考にしてください。

    とりあえず、いますぐ

    install.packages("palmerpenguins")
    しましょう!

    Artwork by @allison_horst

    View full-size slide

  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)

    View full-size slide

  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

    View full-size slide

  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
    今日使うのは
    こっち。

    View full-size slide

  8. まずはデータを確認
    library(palmerpenguins) #データセット
    library(summarytools) #サマリー確認用
    penguins_raw |>
    dfSummary() |>
    view()
    palmerpenguinsパッケージ。
    今回使うデータセット。
    summarytoolsパッケージ。
    データの概要を確認するのに非常に便利。

    View full-size slide

  9. 値が1種類しかない。
    値が1種類しかない。
    種の名前が長い。

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. penguins_rawをキレイに整形する。
    1. 分析に不要な列を除外する
    a. コメント列
    b. 値が1つしか無い列
    2. 変数名(列名)を調整する
    a. 小文字に統一
    b. 空白を削除
    c. 命名規則を統一
    d. 単語の置き換え
    e. 単位の削除
    3. 水準名を日本語化する
    4. 調査年を追加し、調査日は割愛す

    5. 既存の変数を加工して新たな変数
    を追加する
    6. NA(欠測値)は特に処理せず残す

    View full-size slide

  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) # 観測日を削除

    View full-size slide

  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パッケージ。
    日付のデータをいい感じに処理して
    くれるパッケージ。

    View full-size slide

  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を削除。
    コメント行など分析に使
    わない列を削除。

    View full-size slide

  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) # 観測日を削除
    単語をアンダースコアでつなぐ形式
    に変換。
    キャメルケースなど他の形式に変換
    も可能。

    View full-size slide

  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()で関数を使った規則
    的な変数名の変換ができる。

    View full-size slide

  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) # 観測日を削除
    変数名を空白で分割し、最初の文字列を残す。

    View full-size slide

  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) # 観測日を削除

    View full-size slide

  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()で日付から年だけを取り出す。

    View full-size slide

  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) # 観測日を削除

    View full-size slide

  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) # 観測日を削除

    View full-size slide

  23. to be continued...
    今後の予定:
    1. データセットの紹介(前回)
    2. データクリーニング(今回)
    3. 探索的データ分析(EDA)と可視化
    4. 分析例
    ○ シンプソンのパラドクス
    ○ 次元縮約
    ○ クラスタリング
    ○ 判別モデル
    ○ などなど
    次回もお楽しみに!

    View full-size slide