Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

データクリーニング ● データクリーニングとは生のデータを分析しやすい形に整えること。
 ● データクレンジング、データエディティングとも呼ばれる。
 ● データ前処理の一部。


Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

どんなデータ? ● 南極に生息するペンギンの生態調査。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) 


Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

完成したスクリプト 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) # 観測日を削除

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

水準の調整 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) # 観測日を削除

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

変数の加工と追加 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) # 観測日を削除

Slide 22

Slide 22 text

不要になった変数を削除 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) # 観測日を削除

Slide 23

Slide 23 text

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