こんにちは,shun(@datasciencemore)です!!
前回まででようやくtidyverseの8つのコアパッケージすべてについて解説し終えました.
これまででだいぶ前処理で困ることはなくなると思うんですが,大事なことがあと2つ,NA処理と時間処理が残っています.
今回はNA処理についてやっていきます.
実務ではNA処理がよくあるのでここを避けては通れません.
もうちょっと頑張っていきましょう!
0.NA処理ってなに??
データの欠損値に対する処理のことだよ.
欠損値はNAで表されて,NAのままだと扱いづらいから処理する必要があるんだ.
処理の方法は色々あるから1つずつ見てみよう.
我々が扱うデータは,前処理をする前の段階できれいであることは残念ながらめったにありません.(というか,絶対ないかな笑)
データの列がずれていたり,半角全角が入り混じっていたり,訳の分からないところにスペースが入っていたり...
そんな前処理前の汚いデータですが,その中でもよく目にするのがNAと表示される欠損値です.
NAは,not applicableもしくはnot availableの略語で,数値自体はあるはずだけどそれが欠損していることを表しています.
NAのままだと計算ができなかったり,予期しないエラーが発生したりといいことがありません.
よって,NAを処理してデータをきれいにする必要があるのです.
そのNAの処理の仕方を学んでいきましょう.
今回は以下のデータフレームを使用します.
1 2 3 4 5 6 |
# データフレームを定義 df = tibble( x = c(1, 3, 2, 8, 10), y = c(10, 4, NA, 6, NA), z = c(NA, 8, 7, 8, NA) ) |
1 2 3 4 5 6 7 8 9 |
> df # A tibble: 5 x 3 x y z <dbl> <dbl> <dbl> 1 1 10 NA 2 3 4 8 3 2 NA 7 4 8 6 8 5 10 NA NA |
1.NA削除 drop_na
drop_naでNAがある行を削除できます.
シンプルですが,NAが少ないならこれが一番よく使います.
1 2 3 |
# NAがある行を削除 df %>% drop_na() |
1 2 3 4 5 |
# A tibble: 2 x 3 x y z <dbl> <dbl> <dbl> 1 3 4 8 2 8 6 8 |
NAがある行が消えていますね.
drop_naの()内に列を指定すると,指定した列のNA行を削除します.
1 2 3 |
# Z列にNAがある行を削除 df %>% drop_na(z) |
1 2 3 4 5 6 |
# A tibble: 3 x 3 x y z <dbl> <dbl> <dbl> 1 3 4 8 2 2 NA 7 3 8 6 8 |
先ほどとは違い,y列にはNAがありますが,削除されていないですね. z列を指定しているので,z列のNA行のみを削除していることが確認できました.
2.NA置換 replace_na
replace_naでNAを指定した値に置換できます.
replace_naの()内は名前付きリストで指定します.
1 2 3 |
# y列のNAを5に,z列のNAを3に置換 df %>% replace_na(list(y = 5, z = 3)) |
1 2 3 4 5 6 7 8 |
# A tibble: 5 x 3 x y z <dbl> <dbl> <dbl> 1 1 10 3 2 3 4 8 3 2 5 7 4 8 6 8 5 10 5 3 |
こんな感じで各列のNA以外の値の平均に置換することもできます.
1 2 3 4 5 6 7 8 |
# y列,Z列のNAを各列のNA以外の値の平均に置換 df %>% replace_na( list( y = mean(.$y, na.rm = TRUE), z = mean(.$z, na.rm = TRUE) ) ) |
1 2 3 4 5 6 7 8 |
# A tibble: 5 x 3 x y z <dbl> <dbl> <dbl> 1 1 10 7.67 2 3 4 8 3 2 6.67 7 4 8 6 8 5 10 6.67 7.67 |
3.NAパディング fill
fillは,NAを,NAの上下どちらかの値でパディングします.
上下どちらにするかは,引数.direction("up"か"down")によって決定します.
1 2 3 |
# y列,z列のNAを直前の値を下げることで置換 df %>% fill(y, z, .direction = "down") |
1 2 3 4 5 6 7 8 |
# A tibble: 5 x 3 x y z <dbl> <dbl> <dbl> 1 1 10 NA 2 3 4 8 3 2 4 7 4 8 6 8 5 10 6 8 |
1 2 3 |
# y列,z列のNAを直後の値を上げることで置換 df %>% fill(y, z, .direction = "up") |
1 2 3 4 5 6 7 8 |
# A tibble: 5 x 3 x y z <dbl> <dbl> <dbl> 1 1 10 8 2 3 4 8 3 2 6 7 4 8 6 8 5 10 NA NA |
まとめ
今回はNA処理について,以下のことを学習しました.
- NA削除 drop_na
- NA置換 replace_na
- NAパディング fill
今回はNA処理の中でも特に頻出の関数を紹介しました.
できたらNAは出てきてほしくないですが,残念ながら結構でてきちゃいます.
ってなわけで,泣く泣く学習しましょう笑
大丈夫,慣れればサクッとできますよ.
さぁ,次回はついに最後の最後,時間処理です.
こいつは頻出でかつかなり難しいので,ラストにふさわしいですよ!
最後の最後,頑張っていきましょう!
それじゃ,お疲れさまでした!!