R言語を用いたデータクリーニング、前処理の話です。 Tokyo.R #101
パーマーステーションのペンギンたち #2データクリーニング編Tokyo.R #101 (2022/09/17)@bob3bob3Artwork by @allison_horst
View Slide
このセッションの位置づけ中級者セッションのつもりでやっているシリーズです。1. データセットの紹介(前回)2. データクリーニング(今回)3. 探索的データ分析(EDA)と可視化4. 分析例○ シンプソンのパラドクス○ 次元縮約○ クラスタリング○ 判別モデル○ などなど
データクリーニング● データクリーニングとは生のデータを分析しやすい形に整えること。 ● データクレンジング、データエディティングとも呼ばれる。 ● データ前処理の一部。
パーマーステーションのペンギンたち前回に引き続き、palmerpenguinsパッケージのデータセットを使ってRと戯れます。 前回資料も参考にしてください。 とりあえず、いますぐ install.packages("palmerpenguins")しましょう! Artwork by @allison_horst
どんなデータ?● 南極に生息するペンギンの生態調査。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)
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
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今日使うのはこっち。
まずはデータを確認library(palmerpenguins) #データセットlibrary(summarytools) #サマリー確認用penguins_raw |>dfSummary() |>view()palmerpenguinsパッケージ。今回使うデータセット。summarytoolsパッケージ。データの概要を確認するのに非常に便利。
値が1種類しかない。値が1種類しかない。種の名前が長い。
変数名に空白や記号を含む。三か所に偏ってる。
今回、コメント行は使わない。欠測値が多い。
penguins_rawをキレイに整形する。1. 分析に不要な列を除外するa. コメント列b. 値が1つしか無い列2. 変数名(列名)を調整するa. 小文字に統一b. 空白を削除c. 命名規則を統一d. 単語の置き換えe. 単位の削除3. 水準名を日本語化する4. 調査年を追加し、調査日は割愛する5. 既存の変数を加工して新たな変数を追加する6. NA(欠測値)は特に処理せず残す
完成したスクリプト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) # 観測日を削除
各種パッケージの呼び出し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パッケージ。日付のデータをいい感じに処理してくれるパッケージ。
不要な列の削除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を削除。コメント行など分析に使わない列を削除。
変数名の統一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) # 観測日を削除単語をアンダースコアでつなぐ形式に変換。キャメルケースなど他の形式に変換も可能。
変数名の調整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()で関数を使った規則的な変数名の変換ができる。
水準の調整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) # 観測日を削除変数名を空白で分割し、最初の文字列を残す。
水準の調整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) # 観測日を削除
水準の調整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()で日付から年だけを取り出す。
変数の加工と追加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) # 観測日を削除
不要になった変数を削除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) # 観測日を削除
to be continued...今後の予定:1. データセットの紹介(前回)2. データクリーニング(今回)3. 探索的データ分析(EDA)と可視化4. 分析例○ シンプソンのパラドクス○ 次元縮約○ クラスタリング○ 判別モデル○ などなど次回もお楽しみに!