第4回:データの整理

2024-04-23

https://data-science-chiba-2024.github.io/day4/

RStudioのデフォルト設定を
変えましょう

前のセッションのデータが残っていることは
再現的にダメ

Tools → Global Options → General → Workspace

  • “Restore .RData into workspace at startup” → 外す
  • “Save workspace to .RData on exit:” → “Never”

RStudioのデフォルト設定を
変えましょう

前のセッションのデータが残っていることは再現の観点
からダメ!

Screenshot showing how to change Rstudio settings for .RData

データの整理(Data Wrangling)

  • データが手に入る時、まだ解析に使いえない状態が多い

  • データの整理(「wrangling」)は解析に使えるように整えるプロセス

    • 元々はカウボーイが牛を扱う技術から来る

Getty Images

data wrangling monsters

Image by Allison Horst

今日のデータセット

  • R4DS第3章で使われているデータは2013年にニューヨーク市発着のフライト

  • このデータはncyflights13というパッケージに入っている

チャレンジ

ncyflights13パッケージをインストールして、nycflights.Rというスクリプトでパッケージをロードしてください

install.packages("ncyflights13")
nycflights.R
library(nycflights13)

今日のデータセット

データはflightsというデータフレームに入っている:

library(nycflights13)
library(tidyverse)

flights
# A tibble: 336,776 × 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
 1  2013     1     1      517            515         2      830            819
 2  2013     1     1      533            529         4      850            830
 3  2013     1     1      542            540         2      923            850
 4  2013     1     1      544            545        -1     1004           1022
 5  2013     1     1      554            600        -6      812            837
 6  2013     1     1      554            558        -4      740            728
 7  2013     1     1      555            600        -5      913            854
 8  2013     1     1      557            600        -3      709            723
 9  2013     1     1      557            600        -3      838            846
10  2013     1     1      558            600        -2      753            745
# ℹ 336,766 more rows
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
#   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>
  • flightsにはいくつの列(変数)がある?

  • flightsにはいくつの行(観察)がある?

データ整理の関数

これから学ぶ関数の共通点:

  • データフレームをインプットとし、データフレームを返す
  • 最初の引数がインプットのデータフレーム
  • 他の引数は詳細(行の名前に引用符を使わない)

filter()で行を絞り込む

  • 生データが必要以上に多い場合がよくある(特に、「ビッグデータ」を扱っているとき)

  • filter()で条件を定めて、その行だけに絞り込む

# 出発が2時間以上遅れたフライトに絞り込む
filter(flights, dep_delay > 120)
# A tibble: 9,723 × 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
 1  2013     1     1      848           1835       853     1001           1950
 2  2013     1     1      957            733       144     1056            853
 3  2013     1     1     1114            900       134     1447           1222
 4  2013     1     1     1540           1338       122     2020           1825
 5  2013     1     1     1815           1325       290     2120           1542
 6  2013     1     1     1842           1422       260     1958           1535
 7  2013     1     1     1856           1645       131     2212           2005
 8  2013     1     1     1934           1725       129     2126           1855
 9  2013     1     1     1938           1703       155     2109           1823
10  2013     1     1     1942           1705       157     2124           1830
# ℹ 9,713 more rows
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
#   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>
  • 行の数がどれくらい変わった?

filter()で行を絞り込む

  • 元のデータは変わっていない

  • filter()の出力を保存したい時は<-を使う

flights_delay_120 <- filter(flights, dep_delay > 120)

データの比較

データの比較を行う主な記号:

  • > より大きい
  • < より小さい
  • == イコール (=ではない!)
  • | あるいは
  • & そして(複数条件の指定)

比較の記号のアウトプットは論理ベクトル

11 > 10
[1] TRUE
c(11, 6) > c(10, 6)
[1]  TRUE FALSE
c(11, 6) == c(10, 6)
[1] FALSE  TRUE
c(5, 6) = c(10, 6)
Error in c(5, 6) = c(10, 6): target of assignment expands to non-language object

チャレンジ

何故11 = 10がエラーになってしまう?

チャレンジ

  • 1月のフライトに絞っとください
filter(flights, month == 1)
# A tibble: 27,004 × 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
 1  2013     1     1      517            515         2      830            819
 2  2013     1     1      533            529         4      850            830
 3  2013     1     1      542            540         2      923            850
 4  2013     1     1      544            545        -1     1004           1022
 5  2013     1     1      554            600        -6      812            837
 6  2013     1     1      554            558        -4      740            728
 7  2013     1     1      555            600        -5      913            854
 8  2013     1     1      557            600        -3      709            723
 9  2013     1     1      557            600        -3      838            846
10  2013     1     1      558            600        -2      753            745
# ℹ 26,994 more rows
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
#   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>

チャレンジ

  • 1月1日のフライトに絞っとください
filter(flights, month == 1 & day == 1)
# A tibble: 842 × 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
 1  2013     1     1      517            515         2      830            819
 2  2013     1     1      533            529         4      850            830
 3  2013     1     1      542            540         2      923            850
 4  2013     1     1      544            545        -1     1004           1022
 5  2013     1     1      554            600        -6      812            837
 6  2013     1     1      554            558        -4      740            728
 7  2013     1     1      555            600        -5      913            854
 8  2013     1     1      557            600        -3      709            723
 9  2013     1     1      557            600        -3      838            846
10  2013     1     1      558            600        -2      753            745
# ℹ 832 more rows
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
#   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>

filter()で行を絞り込む

もう一つの複数条件を設定方法:,で条件を加える(filter()だけ)

filter(flights, month == 1, day == 1)
# A tibble: 842 × 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
 1  2013     1     1      517            515         2      830            819
 2  2013     1     1      533            529         4      850            830
 3  2013     1     1      542            540         2      923            850
 4  2013     1     1      544            545        -1     1004           1022
 5  2013     1     1      554            600        -6      812            837
 6  2013     1     1      554            558        -4      740            728
 7  2013     1     1      555            600        -5      913            854
 8  2013     1     1      557            600        -3      709            723
 9  2013     1     1      557            600        -3      838            846
10  2013     1     1      558            600        -2      753            745
# ℹ 832 more rows
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
#   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>

arrange()で行を並べ替える

# 出発の日と時間で並べ替える
arrange(flights, year, month, day, dep_time)
# A tibble: 336,776 × 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
 1  2013     1     1      517            515         2      830            819
 2  2013     1     1      533            529         4      850            830
 3  2013     1     1      542            540         2      923            850
 4  2013     1     1      544            545        -1     1004           1022
 5  2013     1     1      554            600        -6      812            837
 6  2013     1     1      554            558        -4      740            728
 7  2013     1     1      555            600        -5      913            854
 8  2013     1     1      557            600        -3      709            723
 9  2013     1     1      557            600        -3      838            846
10  2013     1     1      558            600        -2      753            745
# ℹ 336,766 more rows
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
#   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>

arrange()で行を並べ替える

  • arrange()はデフォルトで小さい方からの順になっている

  • 大きい方から並べたい時はdesc()(「descend」、「降りる」)を使う:

# 大きく遅れた順で並べる
arrange(flights, desc(dep_delay))
# A tibble: 336,776 × 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
 1  2013     1     9      641            900      1301     1242           1530
 2  2013     6    15     1432           1935      1137     1607           2120
 3  2013     1    10     1121           1635      1126     1239           1810
 4  2013     9    20     1139           1845      1014     1457           2210
 5  2013     7    22      845           1600      1005     1044           1815
 6  2013     4    10     1100           1900       960     1342           2211
 7  2013     3    17     2321            810       911      135           1020
 8  2013     6    27      959           1900       899     1236           2226
 9  2013     7    22     2257            759       898      121           1026
10  2013    12     5      756           1700       896     1058           2020
# ℹ 336,766 more rows
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
#   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>

チャレンジ

  • filter()arrange()を使って、12月のフライトに絞ってから、遠く飛んだ順に並べ替えてください

パイプにつて

  • filter(データ, 条件)というような書き方をしてきたが、また別の書き方がある:

データ |> filter(条件)

パイプにつて

  • |>は「パイプ」と呼ばれる

  • 左にある物を右の方に渡す

  • 「それから」と読む

いつパイプを使う?

  • 複数の作業を施すに便利
    • 「パイプライン」
# flightsから始まって、12月のデータに絞ってから、遠く飛んだ距離の順で並べる
flights |>
  filter(month == 12) |>
  arrange(desc(distance))
# A tibble: 28,135 × 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
 1  2013    12     1      928            930        -2     1532           1535
 2  2013    12     2      920            930       -10     1525           1535
 3  2013    12     4      933            930         3     1519           1535
 4  2013    12     5      920            930       -10     1609           1535
 5  2013    12     6      924            930        -6     1545           1535
 6  2013    12     7      927            930        -3     1549           1535
 7  2013    12     8      935            930         5     1520           1535
 8  2013    12     9      928            930        -2     1528           1535
 9  2013    12    11      930            930         0     1539           1535
10  2013    12    13      929            930        -1     1527           1535
# ℹ 28,125 more rows
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
#   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>

mutate()で新しい列を計算する

  • 新しい列は右側から追加される
    • 列が多い場合は見えないことも
flights |> 
  mutate(speed = distance / air_time * 60)
# A tibble: 336,776 × 20
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
 1  2013     1     1      517            515         2      830            819
 2  2013     1     1      533            529         4      850            830
 3  2013     1     1      542            540         2      923            850
 4  2013     1     1      544            545        -1     1004           1022
 5  2013     1     1      554            600        -6      812            837
 6  2013     1     1      554            558        -4      740            728
 7  2013     1     1      555            600        -5      913            854
 8  2013     1     1      557            600        -3      709            723
 9  2013     1     1      557            600        -3      838            846
10  2013     1     1      558            600        -2      753            745
# ℹ 336,766 more rows
# ℹ 12 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
#   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>, speed <dbl>

mutate()で新しい列を計算する

  • .beforeを使うと、新しい列が入る場所を指定できる
flights |> 
  mutate(
    speed = distance / air_time * 60,
    .before = 1)
# A tibble: 336,776 × 20
   speed  year month   day dep_time sched_dep_time dep_delay arr_time
   <dbl> <int> <int> <int>    <int>          <int>     <dbl>    <int>
 1  370.  2013     1     1      517            515         2      830
 2  374.  2013     1     1      533            529         4      850
 3  408.  2013     1     1      542            540         2      923
 4  517.  2013     1     1      544            545        -1     1004
 5  394.  2013     1     1      554            600        -6      812
 6  288.  2013     1     1      554            558        -4      740
 7  404.  2013     1     1      555            600        -5      913
 8  259.  2013     1     1      557            600        -3      709
 9  405.  2013     1     1      557            600        -3      838
10  319.  2013     1     1      558            600        -2      753
# ℹ 336,766 more rows
# ℹ 12 more variables: sched_arr_time <int>, arr_delay <dbl>, carrier <chr>,
#   flight <int>, tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
#   distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

mutate()で新しい列を計算する

  • filter()(と他のデータ整理用関数と同じように)、mutate()の出力は元のデータを触らない

  • 解析結果を保存したい時は<-を使う

select()で列を絞る

  • 生データにたくさんの列が入っている場合がよくある。解析に必要な列だけに絞った方が解析がやりやすい

  • 基本的な使い方:列名で選択する

flights |> 
  select(year, month, day)
# A tibble: 336,776 × 3
    year month   day
   <int> <int> <int>
 1  2013     1     1
 2  2013     1     1
 3  2013     1     1
 4  2013     1     1
 5  2013     1     1
 6  2013     1     1
 7  2013     1     1
 8  2013     1     1
 9  2013     1     1
10  2013     1     1
# ℹ 336,766 more rows

select()で列を絞る

  • 選択したい列が多い場合は、:を使ってどこから〜どこまでというふうに書くと便利:
flights |> 
  select(year:day)
# A tibble: 336,776 × 3
    year month   day
   <int> <int> <int>
 1  2013     1     1
 2  2013     1     1
 3  2013     1     1
 4  2013     1     1
 5  2013     1     1
 6  2013     1     1
 7  2013     1     1
 8  2013     1     1
 9  2013     1     1
10  2013     1     1
# ℹ 336,766 more rows

チャレンジ

JFKから出発したフライトに絞ってから、速度を計算してから、早い速度の順に並べ替えてください

まとめ:今日学んだ関数(動詞)

  • 行を扱う関数
    • filter()
    • arrange()
  • 列を扱う関数
    • mutate()
    • select()
  • 集計の関数
    • summarize()
    • group_by()
    • ungroup()

まとめ

  • |>とデータ整理用の関数を組み合わせることによって、すぐにでもかなり高度なデータ解析のパイプラインができるようなる。

  • 初めての方にはとてもコードの量が多いように思えるでしょうが、このようなツールを毎日使うって、慣れていくとそのうちどのようなデータでもRで扱えるようになる!