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 Slide

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

    View Slide

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

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

    ● データ前処理の一部。


    View Slide

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

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

    とりあえず、いますぐ

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

    Artwork by @allison_horst

    View 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 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 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

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

    View 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 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 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 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 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 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 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 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 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 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 Slide

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

    View Slide