Rにおけるtidyなデータ処理

石田基広

2019年09月03日

自己紹介

石田基広

  • 徳島大学社会産業理工学研究部
  • 総合科学教育部
  • テキストマイニング
    • テキストの時系列解析
  • ネットワークセキュリティ
    • トラフィックの時系列解析

チュートリアル

  • 第一部
    • コードによる操作
    • tidyなデータ処理
    • ggplot2による描画
  • 第二部
    • 探索的分析の効率化
    • 機械学習

第一部

RとRStudio

コード

  • Console
  • Script
  • Markdown

趣旨

効率的なデータ操作とは?

Rにおけるデータ操作

コードで操作するとは

すべて名前を指定して実行する

  • オブジェクト
    • df : データの名前
  • データとの紐付け:<-
    • df <- read.csv(“file.csv”)

コードで操作するとは

データを関数で操作

  • 関数
    • head() : 処理の名前
  • head(df) : データの冒頭表示

データ

  TERM   POS1   POS2 文書1 文書2 文書3
1   、   記号   読点     2     5     3
2   。   記号   句点     2     2     2
3 ある   動詞   自立     0     0     2
4 いく   動詞 非自立     0     1     0
5 いる   動詞 非自立     1     1     0
6   う 助動詞      *     0     1     0

データの構造

  • ベクトル
    • c(1, 3, 5, 7, 9)
  • データフレーム
    • TERM POS FREQ
      企業 名詞 2
      伝える 動詞 3
      高い 形容詞 4

分析でよくある操作

特定の列(変数)の指定 : $

 [1] "、"       "。"       "ある"     "いく"     "いる"     "う"      
 [7] "か"       "が"       "くる"     "こと"     "これ"     "する"    
[13] "その道"   "た"       "たとえる" "だ"       "だけ"     "つける"  
[19] "づくり"   "て"      

条件抽出

添字( [行の指定 , 列の指定] )を駆使

   TERM POS1 POS2 文書1 文書2 文書3
81 理工 名詞 一般     1     0     2

条件抽出

各テキストでの出現回数を合算すると5を超える単語

   TERM POS1   POS2 文書1 文書2 文書3
1    、 記号   読点     2     5     3
2    。 記号   句点     2     2     2
31   の 助詞 連体化     3     5     1
32   は 助詞 係助詞     2     4     2
39   を 助詞 格助詞     2     3     5
91   者 名詞   接尾     1     5     2

列の追加

各テキストでの出現回数を合算した列

  TERM 文書1 文書2 文書3 合計
1   、     2     5     3   10
2   。     2     2     2    6
3 ある     0     0     2    2
4 いく     0     1     0    1
5 いる     1     1     0    2
6   う     0     1     0    1

変数の加工

合計頻度列を標準化

  TERM 文書1 文書2 文書3      標準化
1   、     2     5     3  4.14854297
2   。     2     2     2  2.08459124
3 ある     0     0     2  0.02063952
4 いく     0     1     0 -0.49534841
5 いる     1     1     0  0.02063952
6   う     0     1     0 -0.49534841

tidyなデータ処理

tidy data

Hadley Wickham

  • Each variable forms a column.
  • Each observation forms a row.
  • Each type of observational unit forms a table.

tidyverse

tidy data

messy data

  TERM   POS1 文書1 文書2 文書3
1   、   記号     2     5     3
2   。   記号     2     2     2
3 ある   動詞     0     0     2
4 いく   動詞     0     1     0
5 いる   動詞     1     1     0
6   う 助動詞     0     1     0

tidy data

# A tibble: 300 x 4
   TERM  POS1   Doc    FREQ
   <chr> <chr>  <chr> <int>
 1 、    記号   文書1     2
 2 。    記号   文書1     2
 3 ある  動詞   文書1     0
 4 いく  動詞   文書1     0
 5 いる  動詞   文書1     1
 6 う    助動詞 文書1     0
 7 か    助詞   文書1     0
 8 が    助詞   文書1     0
 9 くる  動詞   文書1     0
10 こと  名詞   文書1     1
# … with 290 more rows

tibble

data.frameの拡張

パイプ演算子

%>%

https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf

ドット

Why Pipe

Name列がBのレコードのYの最大値

[1] 4

Why Pipe

一時ファイルを作成しない方法

[1] 4

Use Pipe

tidyverse流: filterとselectで抽出

[1] 4

列選択

select(列)

# A tibble: 5 x 2
  Name      Y
  <chr> <dbl>
1 E        25
2 D        16
3 C         9
4 B         4
5 A         1

列選択

  • R本来の書き方
    • tb $ Y : (ベクトル)
  • dplyr流
    • tb %>% select(Y) : (データフレーム)

返り値はデータフレーム

[1] 3
[1] NA
[1] 3

条件抽出

# A tibble: 3 x 3
  Name      X     Y
  <chr> <int> <dbl>
1 C         3     9
2 D         4    16
3 E         5    25

条件抽出

  • R本来
    • tb [ tb $ Y >= 5, ]
  • dplyr
    • tb %>% filter(Y >= 5)

変数変換

変数変換

# A tibble: 5 x 3
  Name      X     Y
  <chr> <int> <dbl>
1 A         1  0   
2 B         2  1.39
3 C         3  2.20
4 D         4  2.77
5 E         5  3.22

条件付き変換

  Y X1 X2
1 A  2  3
2 A  3  4
3 B  4  5
4 B  5  6
5 C  6  7
6 C  7  8

条件付き変換

数値列だけ対数化

  Y        X1       X2
1 A 0.6931472 1.098612
2 A 1.0986123 1.386294
3 B 1.3862944 1.609438
4 B 1.6094379 1.791759
5 C 1.7917595 1.945910
6 C 1.9459101 2.079442

要約

  X1_mean    X1_sd
1     4.5 1.870829

要約

数値列だけ平均を求める

   X1  X2
1 4.5 5.5

要約

平均と分散

  X1_fn1 X2_fn1 X1_fn2 X2_fn2
1    4.5    5.5    3.5    3.5

要約

出力の列名を調整

  X1_mean X2_mean    X1_sd    X2_sd
1     4.5     5.5 1.870829 1.870829

横型データ

# A tibble: 8 x 4
  Name  Time1 Time2 Time3
  <chr> <dbl> <dbl> <dbl>
1 A      0.1   0.18  0.11
2 B      0.3   0.33  0.35
3 C      0.2   0.22  0.26
4 D      0.44  0.47  0.43
5 E      0.51  0.56  0.55
6 F      0.6   0.66  0.68
7 G      0.77  0.78  0.72
8 H      0.81  0.88  0.86

縦型データへ

gather

文書データを縦型へ

  TERM   POS1   POS2 文書1 文書2 文書3
1   、   記号   読点     2     5     3
2   。   記号   句点     2     2     2
3 ある   動詞   自立     0     0     2
4 いく   動詞 非自立     0     1     0
5 いる   動詞 非自立     1     1     0
6   う 助動詞      *     0     1     0

文書データを縦型へ

変換結果

  TERM POS1 POS2   Doc FREQ
1   。 記号 句点 文書1    2
2   。 記号 句点 文書2    2
3   。 記号 句点 文書3    2

実践

退屈なことはRにやらよう

たくさんのExcelファイルを採点

Excelファイル採点

ファイル一覧

ファイル一覧

採点用原簿

原簿と結合

作業ファイルを、学生番号で原簿ファイルと結合

リスト読み込み

提出ファイルXLConnectで読み込み

ファイル名処理

  • 番号と名前を抽出
  • 全角の場合が多い
  • 1018051458石田.xlsx

文字処理

stringrパッケージ, stringiパッケージ

[1] "1018051458石田基広.xlsx"

シートとセル

式を取得

出力用データ

式の採点

if_else() : 正答ならば1さもなければ0

評価の重み

A11は38点、B11は36、C11は26点

評価の決定

採点ファイル

ファイルを結合

left_join(()

原簿と結合

left_join

join

単語頻度表からストップワード削除

# A tibble: 2 x 1
  TERM 
  <chr>
1 、   
2 。   

グラフ作成

日本語

Macでは必須

http://rmecab.jp/R/dot.Rprofile.txt

ggplot2

gapminderパッケージ

gapminder

tidyなデータ

横型はNG

# A tibble: 142 x 14
   country continent `1952` `1957` `1962` `1967` `1972` `1977` `1982`
   <fct>   <fct>      <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
 1 Afghan… Asia        28.8   30.3   32.0   34.0   36.1   38.4   39.9
 2 Albania Europe      55.2   59.3   64.8   66.2   67.7   68.9   70.4
 3 Algeria Africa      43.1   45.7   48.3   51.4   54.5   58.0   61.4
 4 Angola  Africa      30.0   32.0   34     36.0   37.9   39.5   39.9
 5 Argent… Americas    62.5   64.4   65.1   65.6   67.1   68.5   69.9
 6 Austra… Oceania     69.1   70.3   70.9   71.1   71.9   73.5   74.7
 7 Austria Europe      66.8   67.5   69.5   70.1   70.6   72.2   73.2
 8 Bahrain Asia        50.9   53.8   56.9   59.9   63.3   65.6   69.1
 9 Bangla… Asia        37.5   39.3   41.2   43.5   45.3   46.9   50.0
10 Belgium Europe      68     69.2   70.2   70.9   71.4   72.8   73.9
# … with 132 more rows, and 5 more variables: `1987` <dbl>, `1992` <dbl>,
#   `1997` <dbl>, `2002` <dbl>, `2007` <dbl>

基本的作画の流れ

  • ggplot で初期化
  • aes で変数を指定
  • geom_でグラフの種類

Gapminder

(簡単のため国を3つに絞る)

ggplo初期化

データセットをggplot2に指定

Aesthetic mappings

データと軸やカラーを対応させる

土台とデータ対応

ggplot() + aes(…) == ggplot( aes (…) )

aes で水準ごとの指定

散布図

aesの外で

色を指定

geom_族

geom_bar

geom_point

geom_line

geom_boxplot

バーチャート

各年の個人GDP平均

# A tibble: 12 x 2
    year    AVG
   <int>  <dbl>
 1  1952  1549.
 2  1957  2127.
 3  1962  2867.
 4  1967  4163.
 5  1972  6162.
 6  1977  7336.
 7  1982  8656.
 8  1987 10763.
 9  1992 13528.
10  1997 15700.
11  2002 16986.
12  2007 19988.

summary

stat = “summary”

geom_bar

もし集計済みデータだった場合

# A tibble: 12 x 2
    year    AVG
   <int>  <dbl>
 1  1952  1549.
 2  1957  2127.
 3  1962  2867.
 4  1967  4163.
 5  1972  6162.
 6  1977  7336.
 7  1982  8656.
 8  1987 10763.
 9  1992 13528.
10  1997 15700.
11  2002 16986.
12  2007 19988.

geom_bar

stat =“identity”

stat_summary

エラーバー

品詞の頻度

geom_histogram

中国人口

binの指定

bins, binwidth

密度指定

..density..

geom_line

geom_boxplot

facet

facet_grid, facet_wrap

face_wrap

facet_grid(行[縦軸] ~ 列[横軸])

facet_wrap(~ 変数)

grid or wrap

gridと wrapの違い

scales

no_scales

テーマ

背景を消したい theme_*

theme_bw() theme_light() theme_minimal()

referance

https://r4ds.had.co.nz/graphics-for-communication.html