기본 콘텐츠로 건너뛰기

통계관련 함수와 메서드 사전

A B C d E F G H I K L M N O P Q R S T U V W Z A statsmodels.ap.stats.anova_lm(x) statsmodels.formula.api.ols 에 의해 생성되는 모형 즉, 클래스 인스턴스(x)를 인수로 받아 anova를 실행합니다. np.argsort(x, axis=-1, kind=None) 객체 x를 정렬할 경우 각 값에 대응하는 인덱스를 반환합니다. Axis는 기준 축을 지정하기 위한 매개변수로서 정렬의 방향을 조정할 수 있음(-1은 기본값으로 마지막 축) pandas.Series.autocorr(lag=1) lag에 전달한 지연수에 따른 값들 사이의 자기상관을 계산 B scipy.stats.bernoulli(x, p) 베르누이분포에 관련된 통계량을 계산하기 위한 클래스를 생성합니다. x: 랜덤변수 p: 단일 시행에서의 확률 scipy.stats.binom(x, n, p) 이항분포에 관련된 통계량을 계산하기 위한 클래스를 생성합니다. x: 랜덤변수 n: 총 시행횟수 p: 단일 시행에서의 확률 C scipy.stats.chi2.pdf(x, df, loc=0, scale=1) 카이제곱분포의 확률밀도함수를 계산 $$f(x, k) =\frac{1}{2^{\frac{k}{2}−1}Γ(\frac{k}{2})}x^{k−1}\exp\left(−\frac{x^2}{2}\right)$$ x: 확률변수 df: 자유도 pd.concat(objs, axis=0, join=’outer’, …) 두 개이상의 객체를 결합한 새로운 객체를 반환. objs: Series, DataFrame 객체. Axis=0은 행단위 즉, 열 방향으로 결합, Axis=1은 열단위 즉, 행 방향으

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

댓글

이 블로그의 인기 게시물

matplotlib의 그래프 종류

1. 산포도(scatter plot) plt.scatter(x, y) >>> import matplotlib.pyplot as plt >>> import numpy as np >>> data=np.random.rand(1024, 2) >>> data[:3, :] >>> plt.scatter(data[:,0], data[:,1]) >>> plt.show() 2. 막대그래프(bar chart) plt.bar(x, hight, width, align='center') 매개변수중 width에 인수를 전달하여 막대의 두께를 조절할 수 있다. 또한 align의 인수는 'center'와 'edge' 이다. 기본값은 'center'이다. 이 값은 x축의 레이블이 막대의 중간에 위치(center) 또는 왼쪽 가장자리에 위치(edge)시킨다. 코드에서 np.random.randint 는 특정한 범위내에서 지정한 갯수의 랜덤수를 생성 np.unique(배열, retrun_counts=False, axis=None) : 객체 내의 중복되지 않은 수들을 반환한다. return_counts=True이면 각 수에 대한 빈도수를 반환한다. axis를 통해 행(1), 열(0)을 선택한다. >>> x=np.random.randint(1, 6, size=100) >>> uni,count=np.unique(x, return_counts=True) >>> uni array([1, 2, 3, 4, 5]) >>> count array([25, 17, 23, 16, 19], dtype=int64) >>> plt.bar(uni, count) >>> plt.show() 위의 막대그래프의 막대의

유사변환과 대각화

내용 유사변환 유사행렬의 특성 대각화(Diagonalization) 유사변환(Similarity transformation) 유사변환 n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사하다고 하며 이 변환을 유사 변환 (similarity transformation)이라고 합니다. $$\begin{equation}\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B \end{equation}$$ 식 1의 유사 변환은 다음과 같이 고유값을 적용하여 특성 방정식 형태로 정리할 수 있습니다. $$\begin{align} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align}$$ 위 식의 행렬식은 다음과 같이 정리됩니다. $$\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)\\ &= \t

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수