TokyoR 72 LT
skimrとsummarytoolsパッケージの紹介

niszet

2018/09/01

自己紹介

こんな人です

名前:niszet*
Rおじさん歴:3年目?
趣味:R、楽器(?)、そろそろ自作HWをですね…

self

Blog URL: https://niszet.hatenablog.com/

普段は回路設計などしています
技術書典5にniszet工房として出ます…

Rradio.12

可視化の前に集計・要約する…

分析の流れ(?)

とりあえずdata.frameが手に入ったとして(その前に色々やる)、

  1. 値の範囲や平均・分散や欠測の有無の確認など
  2. プロットしてデータを見ていく…

プロットする前にデータ全体を俯瞰(概観)出来れば便利

(普通の)summaryを使う

##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

普通のsummaryの落とし穴

NA(欠測) の存在に気づけない(メッセージ等なく表示されてしまう)
結果の使い回しが出来ない(data.frameではない)

# [1] NA
# [1] 37
# [1] 42.12931
# [1] "Mean   : 42.13  "

skimrパッケージ

skimr::skim()を使う

summary()の強力版。各変数ごとに、

  • 型 (numeric, factor, etc)
  • 要素数(NAの数もmissingとして得られる)
  • mean、sd、min, 25%, median, 75%, max
  • ヒストグラム(numericのみ)

を見れる。表示項目のカスタマイズもできる。

結果を実際に見たほうが早い...

type variable missing complete n mean sd p0 p25 p50 p75 p100 hist
numeric am 0 32 32 0.41 0.5 0 0 0 1 1 ▇▁▁▁▁▁▁▆
numeric carb 0 32 32 2.81 1.62 1 2 2 4 8 ▆▇▂▇▁▁▁▁
numeric cyl 0 32 32 6.19 1.79 4 4 6 8 8 ▆▁▁▃▁▁▁▇
numeric disp 0 32 32 230.72 123.94 71.1 120.83 196.3 326 472 ▇▆▁▂▅▃▁▂
numeric drat 0 32 32 3.6 0.53 2.76 3.08 3.7 3.92 4.93 ▃▇▁▅▇▂▁▁
numeric gear 0 32 32 3.69 0.74 3 3 4 4 5 ▇▁▁▆▁▁▁▂
numeric hp 0 32 32 146.69 68.56 52 96.5 123 180 335 ▃▇▃▅▂▃▁▁
numeric mpg 0 32 32 20.09 6.03 10.4 15.43 19.2 22.8 33.9 ▃▇▇▇▃▂▂▂
numeric qsec 0 32 32 17.85 1.79 14.5 16.89 17.71 18.9 22.9 ▃▂▇▆▃▃▁▁
numeric vs 0 32 32 0.44 0.5 0 0 0 1 1 ▇▁▁▁▁▁▁▆
numeric wt 0 32 32 3.22 0.98 1.51 2.58 3.33 3.61 5.42 ▃▃▃▇▆▁▁▂

skimrパッケージの注意点

  • Windows上のR Markdown中ではskimr::skim()してもヒストグラムが表示できない。
# <U+2582><U+2587><U+2585><U+2587><U+2586><U+2585><U+2582><U+2582>
  • data.frame形式であればknitr::kable()で表示すれば文字化けしない。
    • skim_to_wide()は見たままの形のdata.frameで出力する
x
▂▇▅▇▆▅▂▂
  • skimr::fix_windows_histograms()という関数があるが、Localeを変えてしまう&対話的な使用が前提なのでお勧めしない。

skim()の中身

## # A tibble: 3 x 6
##   variable     type    stat     level value formatted
##   <chr>        <chr>   <chr>    <chr> <dbl> <chr>    
## 1 Sepal.Length numeric missing  .all      0 0        
## 2 Sepal.Length numeric complete .all    150 150      
## 3 Sepal.Length numeric n        .all    150 150

long形式のtibbleをskimr:::print.skim_df()で整形して表示してる。

そのため、%>%で次の関数に渡すこともできる。
skimr()の結果を表示しつつ次に渡すならskim_tee()を使う。

skim亜種つづき

## $factor
## # A tibble: 1 x 7
##   variable missing complete n     n_unique top_counts              ordered
## * <chr>    <chr>   <chr>    <chr> <chr>    <chr>                   <chr>  
## 1 Species  0       150      150   3        set: 50, ver: 50, vir:~ FALSE
## # A tibble: 3 x 16
##   type  variable missing complete n     n_unique top_counts ordered mean 
##   <chr> <chr>    <chr>   <chr>    <chr> <chr>    <chr>      <chr>   <chr>
## 1 fact~ Species  0       150      150   3        set: 50, ~ FALSE   <NA> 
## 2 nume~ Petal.L~ 0       150      150   <NA>     <NA>       <NA>    3.76 
## 3 nume~ Petal.W~ 0       150      150   <NA>     <NA>       <NA>    "1.2~
## # ... with 7 more variables: sd <chr>, p0 <chr>, p25 <chr>, p50 <chr>,
## #   p75 <chr>, p100 <chr>, hist <chr>

表示のカスタマイズ

skimr::skim()は表示のカスタマイズ性が高い。

詳しくはvignettesやhelpを読むべし。

カスタマイズ例

skim_with()で型ごとにどの関数を使用するか設定を更新する。

type variable missing complete n n_unique top_counts ordered sum
factor Species 0 3 3 1 set: 3, ver: 0, vir: 0, NA: 0 FALSE NA
numeric Petal.Length NA NA NA NA NA NA 4.1
numeric Sepal.Length NA NA NA NA NA NA 14.7
numeric Sepal.Width NA NA NA NA NA NA 9.7
  • skim_format_defaults()でデフォルト設定に戻することが出来る
  • get_skimmers()で型ごとに設定された関数をlistで得られる
    • これをベースにカスタマイズすればよい。

カスタマイズ例2

  • skim_format()で表示桁数などをカスタマイズできる。
  • show_formats()で設定されているフォーマットの確認が出来る。
  • skim_format_defaults()で元に戻せる
type variable sum
numeric Petal.Length 563.7
numeric Petal.Width 179.9
numeric Sepal.Length 876.5
numeric Sepal.Width 458.6

summarytoolsパッケージ

見栄えが良い

  • dfSummary()skimr::skim()と同様に強力なsummary()を使える。
  • RStudio上でview()するとViewerペインを使って見やすく表示できる
    • 大文字のView()ではないので注意。
  • factorの割合が見やすい
  • カスタマイズ性は低い

これも見たほうがはやい

Variable Stats / Values Freqs (% of Valid) Graph Valid Missing
Sepal.Length [numeric] mean (sd) : 5.84 (0.83) min < med < max : 4.3 < 5.8 < 7.9 IQR (CV) : 1.3 (0.14) 35 distinct val. 150 (100%) 0 (0%)
Species [factor] 1. setosa 2. versicolor 3. virginica 50 (33.3%) 50 (33.3%) 50 (33.3%) 150 (100%) 0 (0%)
スライドに埋め込むにはGraph列が見づらい

summarytoolsのメリット

  • factorの割合が見えるので便利
  • ヒストグラムが見やすい
  • NAの数もわかる。
  • Viewer Paneで見るともう少し見やすいが、ほかの数値はちょっと見づらい気も。

まとめ

skimrとsummarytoolsは使い分けるとよさそう

強力なsummary()としてどちらも有用。

  • skimr
    • ドキュメントにもいい感じに埋め込めて便利
    • カスタマイズ性が高いので自分の好みの出力形式にできる
  • summarytools
    • factorが多いデータならこちらの方が良い。
    • 対話的に使うには便利。ドキュメントには入れづらい。

EOF

self

Enjoy!!