기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

R 데이터의 재구성

내용

데이터 변환

기본

library(nycflights13)
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.0      ✔ purrr   0.3.5 
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.1      ✔ stringr 1.4.1 
## ✔ readr   2.1.3      ✔ forcats 0.5.2
## Warning: 패키지 'ggplot2'는 R 버전 4.2.2에서 작성되었습니다
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(rstatix)
## Warning: 패키지 'rstatix'는 R 버전 4.2.2에서 작성되었습니다
## 
## 다음의 패키지를 부착합니다: 'rstatix'
## 
## The following object is masked from 'package:stats':
## 
##     filter

flights 데이터 : tibble 구조로 처음 몇 행만을 출력합니다. 전체를 보기 위해서는 View(flignts)를 실행

dplyr을 사용한 데이터 변환 기본 코드 형태는 다음과 같이 파이프라인을 사용하여 데이터를 함수에 전달하는 것입니다.

적용할 데이터는 flights에서 변수 month의 각 수준 별로 5개를 추출한 데이터 fly입니다. 이러한 추출을 위해 rstatix 라이브러리의 sample_n_by(data, grouping var, size)를 사용합니다.

flights
## # A tibble: 336,776 × 19
##     year month   day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
##    <int> <int> <int>    <int>      <int>   <dbl>   <int>   <int>   <dbl> <chr>  
##  1  2013     1     1      517        515       2     830     819      11 UA     
##  2  2013     1     1      533        529       4     850     830      20 UA     
##  3  2013     1     1      542        540       2     923     850      33 AA     
##  4  2013     1     1      544        545      -1    1004    1022     -18 B6     
##  5  2013     1     1      554        600      -6     812     837     -25 DL     
##  6  2013     1     1      554        558      -4     740     728      12 UA     
##  7  2013     1     1      555        600      -5     913     854      19 B6     
##  8  2013     1     1      557        600      -3     709     723     -14 EV     
##  9  2013     1     1      557        600      -3     838     846      -8 B6     
## 10  2013     1     1      558        600      -2     753     745       8 AA     
## # … with 336,766 more rows, 9 more variables: flight <int>, 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
fly<-flights %>% sample_n_by(month, size=10)
fly
## # A tibble: 120 × 19
##     year month   day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
##    <int> <int> <int>    <int>      <int>   <dbl>   <int>   <int>   <dbl> <chr>  
##  1  2013     1    17     1215       1221      -6    1521    1555     -34 UA     
##  2  2013     1    30      844        805      39    1018     915      63 EV     
##  3  2013     1    17     2106       2038      28    2155    2139      16 EV     
##  4  2013     1    28      655        700      -5     800     807      -7 US     
##  5  2013     1    25     2104       2100       4    2254    2225      29 WN     
##  6  2013     1    27     2001       2000       1    2234    2305     -31 B6     
##  7  2013     1    30     1807       1758       9    1936    1936       0 UA     
##  8  2013     1    29     1250       1250       0    1518    1520      -2 WN     
##  9  2013     1    26     1051       1000      51    1323    1251      32 UA     
## 10  2013     1    13     1803       1810      -7    2034    2037      -3 9E     
## # … with 110 more rows, 9 more variables: flight <int>, 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

함수에 적용할 데이터를 전달하기 위해 파이프 ’%>%’을 사용합니다. “%>%”는 파이프라인을 위한 코딩 기호로 ctrl+Shift+M으로 입력됩니다.

행에 영향을 주는 함수

filter(dataframe, 조건)함수는 열들을 기준으로 행을 선택

fly %>% filter(arr_delay >120)
## # A tibble: 2 × 19
##    year month   day dep_time sched_dep…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
##   <int> <int> <int>    <int>       <int>   <dbl>   <int>   <int>   <dbl> <chr>  
## 1  2013     6     2     2236        1940     176      16    2130     166 MQ     
## 2  2013    10     7     2142        1815     207    2306    2015     171 WN     
## # … with 9 more variables: flight <int>, 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

“&(and)”, “|(or)”을 사용하여 여러 조건을 조합할 수 있습니다.

fly%>%filter(month==1 & day==1)
## # A tibble: 0 × 19
## # … with 19 variables: year <int>, month <int>, day <int>, dep_time <int>,
## #   sched_dep_time <int>, dep_delay <dbl>, arr_time <int>,
## #   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>
fly%>%filter(month==1 | month==2)
## # A tibble: 20 × 19
##     year month   day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
##    <int> <int> <int>    <int>      <int>   <dbl>   <int>   <int>   <dbl> <chr>  
##  1  2013     1    17     1215       1221      -6    1521    1555     -34 UA     
##  2  2013     1    30      844        805      39    1018     915      63 EV     
##  3  2013     1    17     2106       2038      28    2155    2139      16 EV     
##  4  2013     1    28      655        700      -5     800     807      -7 US     
##  5  2013     1    25     2104       2100       4    2254    2225      29 WN     
##  6  2013     1    27     2001       2000       1    2234    2305     -31 B6     
##  7  2013     1    30     1807       1758       9    1936    1936       0 UA     
##  8  2013     1    29     1250       1250       0    1518    1520      -2 WN     
##  9  2013     1    26     1051       1000      51    1323    1251      32 UA     
## 10  2013     1    13     1803       1810      -7    2034    2037      -3 9E     
## 11  2013     2    28      905        910      -5    1016    1032     -16 B6     
## 12  2013     2    24     1914       1920      -6    2237    2246      -9 DL     
## 13  2013     2     8       NA       1705      NA      NA    1905      NA WN     
## 14  2013     2    24     1904       1905      -1    2159    2217     -18 UA     
## 15  2013     2    12     1821       1720      61    2117    2033      44 DL     
## 16  2013     2    28     1154       1200      -6    1253    1309     -16 US     
## 17  2013     2    19     1813       1810       3    2129    2130      -1 AA     
## 18  2013     2    27      855        859      -4    1149    1145       4 DL     
## 19  2013     2    25      851        859      -8    1119    1119       0 EV     
## 20  2013     2     1     1255       1259      -4    1453    1456      -3 US     
## # … with 9 more variables: flight <int>, 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

‘|’와’==‘를 조합하는 경우 연산자’%in%’을 사용할 수 있습니다.

fly %>% filter(month %in% c(1,2))
## # A tibble: 20 × 19
##     year month   day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
##    <int> <int> <int>    <int>      <int>   <dbl>   <int>   <int>   <dbl> <chr>  
##  1  2013     1    17     1215       1221      -6    1521    1555     -34 UA     
##  2  2013     1    30      844        805      39    1018     915      63 EV     
##  3  2013     1    17     2106       2038      28    2155    2139      16 EV     
##  4  2013     1    28      655        700      -5     800     807      -7 US     
##  5  2013     1    25     2104       2100       4    2254    2225      29 WN     
##  6  2013     1    27     2001       2000       1    2234    2305     -31 B6     
##  7  2013     1    30     1807       1758       9    1936    1936       0 UA     
##  8  2013     1    29     1250       1250       0    1518    1520      -2 WN     
##  9  2013     1    26     1051       1000      51    1323    1251      32 UA     
## 10  2013     1    13     1803       1810      -7    2034    2037      -3 9E     
## 11  2013     2    28      905        910      -5    1016    1032     -16 B6     
## 12  2013     2    24     1914       1920      -6    2237    2246      -9 DL     
## 13  2013     2     8       NA       1705      NA      NA    1905      NA WN     
## 14  2013     2    24     1904       1905      -1    2159    2217     -18 UA     
## 15  2013     2    12     1821       1720      61    2117    2033      44 DL     
## 16  2013     2    28     1154       1200      -6    1253    1309     -16 US     
## 17  2013     2    19     1813       1810       3    2129    2130      -1 AA     
## 18  2013     2    27      855        859      -4    1149    1145       4 DL     
## 19  2013     2    25      851        859      -8    1119    1119       0 EV     
## 20  2013     2     1     1255       1259      -4    1453    1456      -3 US     
## # … with 9 more variables: flight <int>, 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

arrange(dataframe, colnames)는 인자로 전달한 열의 값들에 따라 올림차순으로 정렬합니다. desc()를 함께 사용하여 내림차순으로 정렬할 수 있습니다.

fly %>% arrange(year, month, day, dep_time)
## # A tibble: 120 × 19
##     year month   day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
##    <int> <int> <int>    <int>      <int>   <dbl>   <int>   <int>   <dbl> <chr>  
##  1  2013     1    13     1803       1810      -7    2034    2037      -3 9E     
##  2  2013     1    17     1215       1221      -6    1521    1555     -34 UA     
##  3  2013     1    17     2106       2038      28    2155    2139      16 EV     
##  4  2013     1    25     2104       2100       4    2254    2225      29 WN     
##  5  2013     1    26     1051       1000      51    1323    1251      32 UA     
##  6  2013     1    27     2001       2000       1    2234    2305     -31 B6     
##  7  2013     1    28      655        700      -5     800     807      -7 US     
##  8  2013     1    29     1250       1250       0    1518    1520      -2 WN     
##  9  2013     1    30      844        805      39    1018     915      63 EV     
## 10  2013     1    30     1807       1758       9    1936    1936       0 UA     
## # … with 110 more rows, 9 more variables: flight <int>, 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

fly %>% arrange(dec(dep_dekay))

두 함수를 조합하여 사용할 수 있습니다. 다음은 dep_delay가 [-10, 10]인 상태에서 arr_delay에 대해 올림차순으로 정렬한 예입니다.

fly%>%filter(dep_delay <= 10 & dep_delay>=-10) %>% 
arrange(arr_delay)
## # A tibble: 90 × 19
##     year month   day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
##    <int> <int> <int>    <int>      <int>   <dbl>   <int>   <int>   <dbl> <chr>  
##  1  2013     3     9     1857       1900      -3    2146    2236     -50 DL     
##  2  2013     9     9     1929       1930      -1    2150    2234     -44 UA     
##  3  2013    10    11     1658       1700      -2    1816    1855     -39 AA     
##  4  2013    11     3     1240       1245      -5    1516    1555     -39 WN     
##  5  2013     5    15     1120       1125      -5    1352    1427     -35 UA     
##  6  2013     1    17     1215       1221      -6    1521    1555     -34 UA     
##  7  2013     5    20     1600       1600       0    1841    1915     -34 DL     
##  8  2013     3    15     1050       1050       0    1329    1402     -33 DL     
##  9  2013     1    27     2001       2000       1    2234    2305     -31 B6     
## 10  2013     4     7      728        729      -1    1011    1039     -28 UA     
## # … with 80 more rows, 9 more variables: flight <int>, 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

열에 영향을 주는 함수

  • mutate(), select(), renames(), relocate() 는 현재 변수들의 함수관계를 이용하여 새로운 변수들을 생성합니다.
  • select(), rename(), relocate()은 변수이름과 위치를 변화시킵니다.

mutate(data, …)은 열들 사이의 연산 또는 함수에 의한 결과를 새로운 변수로 추가합니다. 추가된 열은 오른쪽 끝에 위치하는 것이 기본이며 .before.after인수에 의해 그 위치를 지정할 수 있습니다. 두 인수에서 ’.’는 함수의 인수라는 것을 의미합니다.

trans1<-fly %>% mutate(gain=dep_delay-arr_delay, speed=distance/air_time*60)
colnames(trans1)
##  [1] "year"           "month"          "day"            "dep_time"      
##  [5] "sched_dep_time" "dep_delay"      "arr_time"       "sched_arr_time"
##  [9] "arr_delay"      "carrier"        "flight"         "tailnum"       
## [13] "origin"         "dest"           "air_time"       "distance"      
## [17] "hour"           "minute"         "time_hour"      "gain"          
## [21] "speed"

.before를 사용하여 위치를 지정합니다. 다음 코드와 같이 .before의 인수는 인덱스(정수)로 전달하지만 열이름을 직접 입력할 수 있습니다.

trans1<-fly %>% mutate(gain=dep_delay-arr_delay, speed=distance/air_time*60, .before=1)
colnames(trans1)
##  [1] "gain"           "speed"          "year"           "month"         
##  [5] "day"            "dep_time"       "sched_dep_time" "dep_delay"     
##  [9] "arr_time"       "sched_arr_time" "arr_delay"      "carrier"       
## [13] "flight"         "tailnum"        "origin"         "dest"          
## [17] "air_time"       "distance"       "hour"           "minute"        
## [21] "time_hour"

이 함수의 인수 .keep에 의해 출력되는 데이터의 열을 조정할 수 있습니다.

  • all: 모든 열을 출력
  • used: 함수에 사용된 열만 출력
  • unused: 함수에 사용되지 않은 열만 출력
  • none: 추가 열을 유지하지 않습니다.
trans1<-fly %>% mutate(gain=dep_delay-arr_delay, speed=distance/air_time*60, .before=1, .keep="used")
colnames(trans1)
## [1] "gain"      "speed"     "dep_delay" "arr_delay" "air_time"  "distance"

select() 지정한 열만을 선택합니다.

fly %>% select(year, month, day)
## # A tibble: 120 × 3
##     year month   day
##    <int> <int> <int>
##  1  2013     1    17
##  2  2013     1    30
##  3  2013     1    17
##  4  2013     1    28
##  5  2013     1    25
##  6  2013     1    27
##  7  2013     1    30
##  8  2013     1    29
##  9  2013     1    26
## 10  2013     1    13
## # … with 110 more rows

위 코드의 인수는 ’year:day’와 같이 나타낼 수 있습니다. 즉, 인수의 전달은 인덱스 형식으로 나타낼 수 있습니다. 또한 다음의 함수들을 slect()의 인수로 전달하여 사용할 수 있습니다.

  • starts_with(‘abc’): ’abc’로 시작하는 이름
  • ends_with(‘xyz’):’xyz’으로 끝나는 이름
  • contains(‘ijk’):’ijk’를 포함하는 이름
  • num_range(“x”, 1:3):x1, x2, x3
fly %>% select(ends_with("time"))
## # A tibble: 120 × 5
##    dep_time sched_dep_time arr_time sched_arr_time air_time
##       <int>          <int>    <int>          <int>    <dbl>
##  1     1215           1221     1521           1555      348
##  2      844            805     1018            915       39
##  3     2106           2038     2155           2139       30
##  4      655            700      800            807       46
##  5     2104           2100     2254           2225      115
##  6     2001           2000     2234           2305      139
##  7     1807           1758     1936           1936      120
##  8     1250           1250     1518           1520      250
##  9     1051           1000     1323           1251      253
## 10     1803           1810     2034           2037      157
## # … with 110 more rows

열이름을 변환하기 위해서는 “새이름 = 기존 이름” 연산자를 사용합니다.

fly %>% select(tail_num=tailnum)
## # A tibble: 120 × 1
##    tail_num
##    <chr>   
##  1 N808UA  
##  2 N16918  
##  3 N16976  
##  4 N767UW  
##  5 N222WN  
##  6 N659JB  
##  7 N17719  
##  8 N432WN  
##  9 N39728  
## 10 N602LR  
## # … with 110 more rows

위 코드는 fly에서 tailnum변수를 추출하여 이름을 tail_num으로 변환한 것입니다. 즉, 새로운 객체를 생성한 것입니다. 그러나 기존 객체에 특정한 이름만을 변형하기 위해서는 rename(새이름 = 기존 이름) 함수를 사용합니다.

trans<-fly %>% rename(tail_num = tailnum)
colnames(trans)
##  [1] "year"           "month"          "day"            "dep_time"      
##  [5] "sched_dep_time" "dep_delay"      "arr_time"       "sched_arr_time"
##  [9] "arr_delay"      "carrier"        "flight"         "tail_num"      
## [13] "origin"         "dest"           "air_time"       "distance"      
## [17] "hour"           "minute"         "time_hour"

relocate() 함수는 데이터의 열 위치를 새롭게 지정하기 위해 사용합니다. 이 함수에 전달한 열이름은 기본적으로 첫번째 열부터 위치합니다. 위치를 지정하기 위해서는 .before, .after 인수를 사용합니다.

fly%>%relocate(time_hour)%>% colnames()
##  [1] "time_hour"      "year"           "month"          "day"           
##  [5] "dep_time"       "sched_dep_time" "dep_delay"      "arr_time"      
##  [9] "sched_arr_time" "arr_delay"      "carrier"        "flight"        
## [13] "tailnum"        "origin"         "dest"           "air_time"      
## [17] "distance"       "hour"           "minute"
colnames(fly)
##  [1] "year"           "month"          "day"            "dep_time"      
##  [5] "sched_dep_time" "dep_delay"      "arr_time"       "sched_arr_time"
##  [9] "arr_delay"      "carrier"        "flight"         "tailnum"       
## [13] "origin"         "dest"           "air_time"       "distance"      
## [17] "hour"           "minute"         "time_hour"
flights%>%relocate(c(time_hour, carrier),.after = day) %>% colnames()
##  [1] "year"           "month"          "day"            "time_hour"     
##  [5] "carrier"        "dep_time"       "sched_dep_time" "dep_delay"     
##  [9] "arr_time"       "sched_arr_time" "arr_delay"      "flight"        
## [13] "tailnum"        "origin"         "dest"           "air_time"      
## [17] "distance"       "hour"           "minute"

위에서 소개한 starts_with()등의 함수를 적용할 수 있습니다.

fly%>%relocate(ends_with('time'))%>%colnames()
##  [1] "dep_time"       "sched_dep_time" "arr_time"       "sched_arr_time"
##  [5] "air_time"       "year"           "month"          "day"           
##  [9] "dep_delay"      "arr_delay"      "carrier"        "flight"        
## [13] "tailnum"        "origin"         "dest"           "distance"      
## [17] "hour"           "minute"         "time_hour"

그룹화 함수

group_by() 함수는 인수로 전달한 변수이름의 각 수준별로 모든 데이터를 구분합니다. 다음은 변수 month에 의해 그룹화한 것입니다.

trans<-group_by(fly, month)
unique(trans["month"])
## # A tibble: 12 × 1
## # Groups:   month [12]
##    month
##    <int>
##  1     1
##  2     2
##  3     3
##  4     4
##  5     5
##  6     6
##  7     7
##  8     8
##  9     9
## 10    10
## 11    11
## 12    12

위와 같이 그룹화한 데이터에서 ’dep_delay’의 평균값을 반환합니다.

fly%>%group_by(month) %>% summarise(delay=mean(dep_delay))
## # A tibble: 12 × 2
##    month delay
##    <int> <dbl>
##  1     1  11.4
##  2     2  NA  
##  3     3   0.6
##  4     4  NA  
##  5     5   2  
##  6     6  19.4
##  7     7  26.4
##  8     8  NA  
##  9     9  NA  
## 10    10  20.1
## 11    11   2.2
## 12    12  -2.5

위 결과와 같이 결측값이 반환하는 경우 데이터 자체의 결측값을 제거하기 위한 옵션을 선택합니다.

fly%>%group_by(month) %>% summarise(delay=mean(dep_delay, na.rm=TRUE), n=n())
## # A tibble: 12 × 3
##    month delay     n
##    <int> <dbl> <int>
##  1     1 11.4     10
##  2     2  3.33    10
##  3     3  0.6     10
##  4     4 14.7     10
##  5     5  2       10
##  6     6 19.4     10
##  7     7 26.4     10
##  8     8  5.67    10
##  9     9 -1.11    10
## 10    10 20.1     10
## 11    11  2.2     10
## 12    12 -2.5     10

summarise()함수에 적용되는 함수로 n()는 데이터 갯수를 반환합니다. 빈도수를 반환하는 count()group_by()+summarise(n=n())와 같습니다.

daily<-fly%>%group_by(year, month, day)
daily
## # A tibble: 120 × 19
## # Groups:   year, month, day [100]
##     year month   day dep_time sched_de…¹ dep_d…² arr_t…³ sched…⁴ arr_d…⁵ carrier
##    <int> <int> <int>    <int>      <int>   <dbl>   <int>   <int>   <dbl> <chr>  
##  1  2013     1    17     1215       1221      -6    1521    1555     -34 UA     
##  2  2013     1    30      844        805      39    1018     915      63 EV     
##  3  2013     1    17     2106       2038      28    2155    2139      16 EV     
##  4  2013     1    28      655        700      -5     800     807      -7 US     
##  5  2013     1    25     2104       2100       4    2254    2225      29 WN     
##  6  2013     1    27     2001       2000       1    2234    2305     -31 B6     
##  7  2013     1    30     1807       1758       9    1936    1936       0 UA     
##  8  2013     1    29     1250       1250       0    1518    1520      -2 WN     
##  9  2013     1    26     1051       1000      51    1323    1251      32 UA     
## 10  2013     1    13     1803       1810      -7    2034    2037      -3 9E     
## # … with 110 more rows, 9 more variables: flight <int>, 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
daily%>%summarise(n=n())
## `summarise()` has grouped output by 'year', 'month'. You can override using the
## `.groups` argument.
## # A tibble: 100 × 4
## # Groups:   year, month [12]
##     year month   day     n
##    <int> <int> <int> <int>
##  1  2013     1    13     1
##  2  2013     1    17     2
##  3  2013     1    25     1
##  4  2013     1    26     1
##  5  2013     1    27     1
##  6  2013     1    28     1
##  7  2013     1    29     1
##  8  2013     1    30     2
##  9  2013     2     1     1
## 10  2013     2     8     1
## # … with 90 more rows

그룹화된 데이터를 원 상태로 환원하기 위해 ungroup()를 사용합니다. 즉 모든 데이터는 하나의 그룹이므로 결과는 다음과 같습니다.

daily %>% ungroup()%>% summarise(delay=mean(dep_delay, na.rm=TRUE), flight=n())
## # A tibble: 1 × 2
##   delay flight
##   <dbl>  <int>
## 1  8.61    120

피봇팅(Pivotting)

데이터의 배열이 다음과 같을 경우 피봇을 사용하여 정렬할 수 있습니다.

  • 하나의 변수가 여러 열에 분산되어 있음
  • 하나의 관측값이 여러 행에 흩어져 있음

이 경우 pivot_longer(), pivot_wider()를 사용합니다.

pivot_longer()

tidyverse 라이브러리의 데이터 table4a는 두열이 모두 년도로 구성되어 있습니다.

table4a
# A tibble: 3 × 3
  country     `1999` `2000`
* <chr>        <int>  <int>
1 Afghanistan    745   2666
2 Brazil       37737  80488
3 China       212258 213766

위 '1999', '2000'은 하나의 열로 결합하고 각각의 값을 다른 열로 구조를 변경합니다. 이를 위해 pivot_longer(결합할 열들, 열이름, 값들이 위치할 열이름)함수를 사용합니다.

t4a<-table4a |> 
+   pivot_longer(c(`1999`, `2000`), names_to = "year", values_to = "cases")
t4a
# A tibble: 6 × 3
  country     year   cases
  <chr>        <chr>   <int>
1 Afghanistan 1999     745
2 Afghanistan 2000    2666
3 Brazil      1999   37737
4 Brazil      2000   80488
5 China       1999  212258
6 China       2000  213766

위 결과 year의 값들은 열이름으로 부터 이동된 것으로 문자형입니다. 이를 숫자형으로 변환하기 위해 mutate()를 사용할 수 있습니다.

mutate(t4a, year=parse_integer(year))
# A tibble: 6 × 3
  country      year  cases
   <chr>       <int>   <int>
1 Afghanistan  1999    745
2 Afghanistan  2000   2666
3 Brazil       1999  37737
4 Brazil       2000  80488
5 China        1999 212258
6 China        2000 213766

데이터 table4b는 table4a와 같은 구성이지만 각 샘플에 반영된 값은 다른 객체입니다. 이를 year 열, case1, case2로 결합합니다. dplyr::keft_join()함수를 적용합니다.

t4a<-table4a |> 
+   pivot_longer(c(`1999`, `2000`), names_to = "year", values_to = "cases1") |> mutate(year=parse_integer(year))
t4b<-table4b |> 
+   pivot_longer(c(`1999`, `2000`), names_to = "year", values_to = "cases2") |> mutate(year=parse_integer(year))
left_join(t4a, t4b)
Joining, by = c("country", "year")
# A tibble: 6 × 4
  country      year cases1     cases2
  <chr>       <int>  <int>      <int>
1 Afghanistan  1999    745   19987071
2 Afghanistan  2000   2666   20595360
3 Brazil       1999  37737  172006362
4 Brazil       2000  80488  174504898
5 China        1999 212258 1272915272
6 China        2000 213766 1280428583

pivot_wider()

함수 pivot_wider()는 관측값이 여러 행에 분포되어 있을 경우 동일한 관측값들을 하나의 열로 취합하기 위해 사용합니다. 데이터 table2는 이러한 구조입니다.

table2
# A tibble: 12 × 4
   country      year type            count
   <chr>       <int> <chr>           <int>
 1 Afghanistan  1999 cases             745
 2 Afghanistan  1999 population   19987071
 3 Afghanistan  2000 cases            2666
 4 Afghanistan  2000 population   20595360
 5 Brazil       1999 cases           37737
 6 Brazil       1999 population  172006362
 7 Brazil       2000 cases           80488
 8 Brazil       2000 population  174504898
 9 China        1999 cases          212258
10 China        1999 population 1272915272
11 China        2000 cases          213766
12 China        2000 population 1280428583

위 데이터의 type은 cases와 population이 혼합되어 있으며 이들을 변수(열)로 분리하여 나타냅니다.

t2<-table2 |> pivot_wider(names_from=type, values_from=count)
t2
# A tibble: 6 × 4
  country      year  cases population
  <chr>       <int>  <int>      <int>
1 Afghanistan  1999    745   19987071
2 Afghanistan  2000   2666   20595360
3 Brazil       1999  37737  172006362
4 Brazil       2000  80488  174504898
5 China        1999 212258 1272915272
6 China        2000 213766 1280428583

위 데이터에 새로운 열을 추가해 봅니다.

mutate(t2, rate=cases/population)
# A tibble: 6 × 5
  country      year  cases population      rate
  <chr>       <int>  <int>      <int>     <dbl>
1 Afghanistan  1999    745   19987071 0.0000373
2 Afghanistan  2000   2666   20595360 0.000129 
3 Brazil       1999  37737  172006362 0.000219 
4 Brazil       2000  80488  174504898 0.000461 
5 China        1999 212258 1272915272 0.000167 
6 China        2000 213766 1280428583 0.000167 

위 결과를 나라별로 rate를 시각화합니다.

table2 %>% pivot_wider(names_from=type, values_from=count) %>%
mutate(rate=cases/population)%>%
ggplot(aes(x=year, y=rate))+
geom_line(aes(group=country, color=country))+
geom_point(aes(color=country, shape=country))+
scale_x_continuous(breaks=c(1999, 2000))

변환한 데이터 셋 t2의 cases, population, rate를 각 연도로 분리하여 봅니다. 이 변환은 원 데이터에 pivot_wider()함수를 두번 적용한 결과입니다.

table2 %>% pivot_wider(names_from=type, values_from=count) %>%
mutate(rate=cases/population)%>%
pivot_wider(names_from=year, values_from=c(cases, population, rate))%>% 
relocate(country, contains('1999'))
# A tibble: 3 × 7
  country     cases_1999 population_1999 rate_1999 cases_2000 populati…¹ rate_…²
  <chr>            <int>           <int>     <dbl>      <int>      <int>   <dbl>
1 Afghanistan        745        19987071 0.0000373       2666   20595360 1.29e-4
2 Brazil           37737       172006362 0.000219       80488  174504898 4.61e-4
3 China           212258      1272915272 0.000167      213766 1280428583 1.67e-4
# … with abbreviated variable names ¹​population_2000, ²​rate_2000

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b