こんにちは,shun(@datasciencemore)です!!
今回は,tidyverseのコアパッケージ,7番目の{forcats}についてやっていきます.
{forcats}は,ファクター処理をするうえで非常に役に立つパッケージがです.
今までと同様に,ファクター処理とはどのような処理なのかからじっくり見ていきましょう.
目次
0.{forcats}ってなに??
ファクターでは,普通に文字列にはない水準という概念があることは覚えているかな?
その水準があるために,色々な処理をする必要があるんだ.
今回は,以下のように架空の企業の人事データを作成します.
name:名前
group:企業
age:年齢
1 2 3 4 5 6 7 |
# データフレームを定義 df = tibble( name = c("nanami", "rina", "kumi", "mizu", "rika", "hiyori", "yuna", "hina", "risa", "yui", "hikaru", "karin") %>% factor(), group = c("nogi", "sakura", "hinata", "sakura", "sakura", "hinata", "nogi", "hinata", "sakura", "sakura", "sakura", "sakura") %>% factor(), age = c(27, 23, 24, 23, 25, 18, 17, 19, 22, 21, 19, 19) ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
> df # A tibble: 12 x 3 name group age <fct> <fct> <dbl> 1 nanami nogi 27 2 rina sakura 23 3 kumi hinata 24 4 mizu sakura 23 5 rika sakura 25 6 hiyori hinata 18 7 yuna nogi 17 8 hina hinata 19 9 risa sakura 22 10 yui sakura 21 11 hikaru sakura 19 12 karin sakura 19 |
name列とgroup列がファクターですね.
それぞれのファクターは次のとおりです.
1 |
df$name |
1 2 |
[1] nanami rina kumi mizu rika hiyori yuna hina risa yui hikaru karin Levels: hikaru hina hiyori karin kumi mizu nanami rika rina risa yui yuna |
1 |
df$group |
1 2 |
[1] nogi sakura hinata sakura sakura hinata nogi hinata sakura sakura sakura sakura Levels: hinata nogi sakura |
こんな感じで普通にfactorを使用してファクターを作成すると,水準の順番が辞書順になります.
{forcats}は主に以下の用途で使用します.
- 水準の順番の変更
- 水準の値の変更
それぞれの使い方について,詳細にみていきましょう.
1.水準の順番の変更
1.1.出現順にする. fct_inorder
dfのgroup列はファクターで,水準が"hinata", "nogi", "sakura"の順番になっていますね.
この水準の順番をデータの出現順("nogi", "sakura", "hinata")にしたい場合,fct_inorderを使用します.
1 2 3 |
# fct_inorder:出現順にする. df$group %>% fct_inorder() |
1 2 |
[1] nogi sakura hinata sakura sakura hinata nogi hinata sakura sakura sakura sakura Levels: nogi sakura hinata |
1.2.度数順にする. fct_infreq
今度は,出てきた度数に応じて,水準を変えてみましょう.
fct_infreqを使用すると,度数が大きい順に水準を変えてくれます.
1 2 3 |
# fct_infreq:度数順にする. df$group %>% fct_infreq() |
1 2 |
[1] nogi sakura hinata sakura sakura hinata nogi hinata sakura sakura sakura sakura Levels: sakura hinata nogi |
1.3.逆順にする. fct_rev
fct_revを使用すると,水準を逆順にすることができます.
1 2 3 |
# fct_rev:逆順にする. df$group %>% fct_rev() |
1 2 |
[1] nogi sakura hinata sakura sakura hinata nogi hinata sakura sakura sakura sakura Levels: sakura nogi hinata |
元の水準は,Levels: hinata nogi sakuraだったので,確かに逆順になっていますね.
1.4.シフトする. fct_shift
fct_shiftで,水準をシフトさせることができます. 引数nでどれくらいシフトさせるかを指定できます.
nが正だと左に,負だと右にシフトします.
1 2 3 |
# fct_shift:左に2,シフトする. df$group %>% fct_shift(n = 2) |
1 2 |
[1] nogi sakura hinata sakura sakura hinata nogi hinata sakura sakura sakura sakura Levels: sakura hinata nogi |
1 2 3 |
# fct_shift:右に-1,シフトする. df$group %>% fct_shift(n = -1) |
1 2 |
[1] nogi sakura hinata sakura sakura hinata nogi hinata sakura sakura sakura sakura Levels: sakura hinata nogi |
1.5.指定する. fct_relevel
fct_relevelで指定したとおりに水準の順番を変更できます.
1 2 3 |
# fct_relevel:水準を指定する. df$group %>% fct_relevel("nogi", "hinata", "sakura") |
1 2 |
[1] nogi sakura hinata sakura sakura hinata nogi hinata sakura sakura sakura sakura Levels: nogi hinata sakura |
なお,全部指定する必要はなく,指定しなかった要素は後ろに回されます.
1 2 3 |
# fct_relevel:水準を指定する.途中まででもOK df$group %>% fct_relevel("nogi") |
1 2 |
[1] nogi sakura hinata sakura sakura hinata nogi hinata sakura sakura sakura sakura Levels: nogi hinata sakura |
1.6.他変数によるソート fct_reorder
他の変数の値によって,水準をソートします. 例えば,name列のファクターの水準をage列の小さい順にしたいときは,次のようになります.
1 2 3 |
# fct_reorder:水準をageの順番にする. df$name %>% fct_reorder(df$age) |
1 2 |
[1] nanami rina kumi mizu rika hiyori yuna hina risa yui hikaru karin Levels: yuna hiyori hikaru hina karin yui risa mizu rina kumi rika nanami |
これは,グラフにしたときにファクターの水準を変えたいときに便利です.
例えば,nameとageの散布図を描くと次のようになります.
1 2 3 4 5 6 7 8 |
# x:nameとy:ageの散布図 df %>% ggplot(aes(x = name, y = age)) + geom_point() + theme( axis.text = element_text(size = 15), axis.title = element_text(size = 15) ) |
全体の傾向がよくつかめませんね.
これは,nameのファクターが辞書順であることが原因です.
グラフでは,ファクターの水準の順番で並ぶのでこのようになるのです.
fct_reorderを使って,水準の順番を変えると以下のようになります.
1 2 3 4 5 6 7 8 |
# x:nameとy:ageの散布図 水準をageの順番に変更 df %>% ggplot(aes(x = fct_reorder(name, age), y = age)) + geom_point() + theme( axis.text = element_text(size = 15), axis.title = element_text(size = 15) ) |
nameのファクターの水準がageの順番になったことで,傾向が見やすくなりました.
このような感じでfct_reorderは可視化のときによく使うことが多いです.
2.水準の値の変更
今度は,水準の順番ではなく,値の変更について考えてみましょう.
2.1.指定する. fct_recode
fct_recodeで指定したとおりに水準の値を変更できます.
1 2 3 4 5 6 7 |
# fct_recode:水準の値を大文字に変更する. df$group %>% fct_recode( "NOGI" = "nogi", "SAKURA" = "sakura", "HINATA" = "hinata" ) |
1 2 |
[1] NOGI SAKURA HINATA SAKURA SAKURA HINATA NOGI HINATA SAKURA SAKURA SAKURA SAKURA Levels: HINATA NOGI SAKURA |
2.2.まとめる. fct_collapse
今度は水準をまとめることを考えましょう.
sakuraとhinataが合併して,新しい企業keyakiになったとしましょう.
そのような場合,元のsakuraとhinataをまとめてkeyakiにしたいと考えるでしょう.
このように別々の水準を1つの水準にまとめるときに便利なのがfct_collapseです.
1 2 3 4 5 |
# fct_collapse:別々の水準(sakura, hinata)を1つの水準(keyaki)にまとめる. df$group %>% fct_collapse( keyaki = c("sakura", "hinata") ) |
1 2 |
[1] nogi keyaki keyaki keyaki keyaki keyaki nogi keyaki keyaki keyaki keyaki keyaki Levels: keyaki nogi |
2.3.度数の少ない水準をまとめる. fct_lump
groupの度数を見てみましょう.
1 2 3 |
# groupの度数 df %>% count(group) |
1 2 3 4 5 6 |
# A tibble: 3 x 2 group n <fct> <int> 1 hinata 3 2 nogi 2 3 sakura 7 |
sakuraが7に対して,hinataが3,nogiが2と少ないです.
この少ない複数のグループを1つにするときに使用する関数がfct_lumpです.
このような感じで使います.
1 2 3 |
# fct_lump:度数の少ない水準(nogi, hinata)を1つの水準(noginata)にまとめる. df$group %>% fct_lump(other_level = "noginata", n = 1) |
1 2 3 |
[1] noginata sakura noginata sakura sakura noginata noginata noginata sakura sakura sakura [12] sakura Levels: sakura noginata |
まとめ
今回はファクター処理の{forcats}の使い方として,以下の2点を勉強しました.
- 水準の順番の変更
- 水準の列の変更
ちなみにここで扱った関数はごく一部です.
かなりマニアックな関数もあるので興味がある方はぜひ調べてみてください.
正直,水準を変更することはあまりないと思います.
ただ,いざ変えたくなった時に{forcats}の存在を知っているかどうかの違いは大きいです.
もし水準を変更する必要が出てきたら,まずはこのページを参考に見てくださいね.
それじゃ,お疲れ様でした!!