R study

데이터 변형(Filter rows with filter())

발킴이 2023. 2. 24. 13:25

1. Find all flights that

 오늘은 flights 데이터를 분석해 봤다. 분석이라기보다는 데이터를 알아보는 것에 더 초점을 맞췄다. 전공시간을 생각해 보면 함수만 배웠지 데이터의 구조를 보고 어떤 정보를 담고 있는지 알아보는 시간은 부족했던 것 같다. 이번 기회에 flights 데이터를 집중적으로 살펴보고자 한다.

 flights 데이터는 "nycflights13" 이라는 패키지안에 있는 데이터이다. 이 데이터에 대한 소개를 잠시 알아보자.

On-time data for all flights that departed NYC (i.e. JFK, LGA or EWR) in 2013

 번역해보면 2013년 기준으로 뉴욕의 3개 공항에 있었던 모든 비행 데이터이다. 

> flights
# A tibble: 336,776 × 19
    year month   day dep_time sched_dep_t…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier flight
   <int> <int> <int>    <int>         <int>   <dbl>   <int>   <int>   <dbl> <chr>    <int>
 1  2013     1     1      517           515       2     830     819      11 UA        1545
 2  2013     1     1      533           529       4     850     830      20 UA        1714
 3  2013     1     1      542           540       2     923     850      33 AA        1141
 4  2013     1     1      544           545      -1    1004    1022     -18 B6         725
 5  2013     1     1      554           600      -6     812     837     -25 DL         461
 6  2013     1     1      554           558      -4     740     728      12 UA        1696
 7  2013     1     1      555           600      -5     913     854      19 B6         507
 8  2013     1     1      557           600      -3     709     723     -14 EV        5708
 9  2013     1     1      557           600      -3     838     846      -8 B6          79
10  2013     1     1      558           600      -2     753     745       8 AA         301
# … with 336,766 more rows, 8 more variables: tailnum <chr>, origin <chr>, dest <chr>,
#   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>, and
#   abbreviated variable names ¹​sched_dep_time, ²​dep_delay, ³​arr_time, ⁴​sched_arr_time,
#   ⁵​arr_delay
# ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names

 데이터가 굉장히 많아서 한 번에 다 볼 수 없다. 행이 336,776개나 되며 열도 19개이다. 결국 이런 데이터를 학습하기 위해서는 R의 help 기능을 사용할 수밖에 없다. 데이터에 여러 가지 포맷이 존재했고 여러 가지 정보가 있었다. filter를 사용해 보면서 데이터에 대해서 학습해 보도록 하자.

 

1) Had an arrival delay of two or more hours

library(nycflights13)
library(tidyverse)
(filter(flights,arr_delay >= 2))

 간단하게 도착시간이 2시간이상 딜레이 된 비행 편을 조사해 봤다. 여기서 딜레이 된 도착시간을 나타내는 포맷명은 arr_delay였다. 꽤 직관적으로 잘 표현한 것 같다.

 

2) Flew to Houston (IAH or HOU)

(filter(flights,dest=="IAH"|dest=="HOU"))

 

 휴스턴으로 운항된 비행편을 찾는 문제였다. 데이터에 대한 정보 없이 이 문제를 처음 보면 당황할 수 있다. 왜냐하면 dest라는 포맷 명은 그냥 눈으로 확인할 수 없기 때문이다. ?flights를 통해서 flights데이터에 대한 사전 학습이 되어 있어야지 이 문제를 풀 수 있다. 데이터가 거대해질수록 이 과정이 중요해질 것 같다는 생각이 들었다.

 

3) Were operated by United, American, or Delta

(filter(flights,carrier %in% c("UA","AA","DL")))

 이것도 그냥 확인 할 수 없었다. ?flights를 사용해서 풀어야 했다. 문제는 United 항공, American항공, Delta항공에서 운항된 비행 편을 찾는 것이었다. 두 번째 문제보다 더 난이도 있었던 이유는 항공사 이름이 약자로 표기되어 있는데 ?flights로는 항공사를 표현한 약자를 알 수 없었기 때문이다. 

 자세히 보니 flights라는 데이터 셋을 만들기 위해 다른 데이터 셋들이 사용되고 있었다. 예를 들어 비행기 기체 번호를 표현하기 위해 "planes"라는 다른 데이터 셋의 도움을 받고 있었고, 목적지와 출발지 공항 정보를 위해 "airports"라는 데이터 셋을 사용하고 있었다. 항공사 이름 약자는 "airlines"라는 데이터 셋 안에서 확인할 수 있었다.

 

4) Departed in summer (July, August, and September)

(filter(flights,month %in% c(7,8,9)))

 

 R이 벡터 연산을 한다는 개념을 알고 있으면 굳이 3가지 조건을 따로 하지 않아도 된다는 것을 알 수 있다. %in%과 c()를 이용하여 쉽게 필터링하였다.

5) Arrived more than two hours late, but didn’t leave late

(filter(flights,arr_delay>=2&dep_delay<=0))

 데이터 포맷의 의미와 정보를 파악할 수 있다면 쉽게 풀 수 있는 문제이다.

 

 오늘은 filter()라는 함수를 사용해 보는 것으로 시작해 flights 데이터를 알아보는 것으로 마무리한 것 같다. 얼마나 코드를 잘 짜서 분석을 잘하느냐 보다 그 데이터가 무엇을 조사했는지, 무슨 의미를 가지고 있는지, 어떤 용도로 쓰일 수 있는지 고민해 보는 것도 굉장히 중요한 것 같다.