Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
장 활용2 R
수학 및 통계관련 함수2.1
이 절에서는 의 기본 함수로 수학 및 통계 관련 함수를 소개한다 이들 함수들은 프로그R . R래밍과 분석의 매 순간 유용하게 사용되므로 그 기능을 잘 익혀둘 필요가 있다.
유용한 수학 통계 함수2.1.1 /
통계 함수(a) R
에서 제공하는 기초적인 통계함수는 다음과 같다R .
> a <- c(2, 7, 5, 3, 1, 4, 6)
합> sum(a) #[1] 28
곱> prod(a) #[1] 5040
최댓값> max(a) #[1] 7
최솟값> min(a) #[1] 1
최솟값> pmin(c(2, 8, 3), c(3, 4, 5), c(5, 2, 9)) # parellel[1] 2 2 3
최댓값> pmax(c(2, 8, 3), c(3, 4, 5), c(1, 2, 3)) # parellel[1] 3 8 5
차분> diff(a) # (difference)[1] 5 -2 -2 -2 3 2
최댓값의 위치> which.max(a) #[1] 2
최솟값의 위치> which.min(a) #[1] 5
범위> range(a) #[1] 1 7
평균> mean(a) #[1] 4
중앙값> median(a) #[1] 4
표준편차> sd(a) # (standard deviation)[1] 2.16
분산> var(a) # (variance)[1] 4.667
분위수> quantile(a) #0% 25% 50% 75% 100%1.0 2.5 4.0 5.5 7.0
표준화 점수> scale(a) # (standardized)[,1]
[1,] -0.9258[2,] 1.3887[3,] 0.4629[4,] -0.4629[5,] -1.3887[6,] 0.0000[7,] 0.9258attr(,"scaled:center")[1] 4attr(,"scaled:scale")[1] 2.16
> mean(scale(a))[1] 0> var(scale(a))
[,1][1,] 1> sd(scale(a))[1] 1
수학 함수(b) R
에서 제공하는 유용한 수학함수는 다음과 같다R .
> a <- c(2, 7, 5, 3, 1, 4, 6)
크기순으로 배열> sort(a) #[1] 1 2 3 4 5 6 7
역순으로 배열> rev(a) #[1] 6 4 1 3 5 7 2
순위> rank(a) #[1] 2 7 5 3 1 4 6
크기순으로 나열 와 동일> order(a) # : sort.list()[1] 5 1 4 6 3 7 2> order(a, decreasing=TRUE)[1] 2 7 3 6 4 1 5
자연로그> log(a) #[1] 0.6931 1.9459 1.6094 1.0986 0.0000 1.3863 1.7918
상용로그> log(a, base=10) #[1] 0.3010 0.8451 0.6990 0.4771 0.0000 0.6021 0.7782
지수함수> exp(a) #[1] 7.389 1096.633 148.413 20.086 2.718 54.598 403.429
제곱근 함수> sqrt(a) # (square root)[1] 1.414 2.646 2.236 1.732 1.000 2.000 2.449
절대값> abs(a) # (absolute value)[1] 2 7 5 3 1 4 6
반올림 함수> round(sqrt(a), 2) #[1] 1.41 2.65 2.24 1.73 1.00 2.00 2.45
누적합> cumsum(a) # (cumulative sum)[1] 2 9 14 17 18 22 28
누적곱> cumprod(a) # (cumulative product)[1] 2 14 70 210 210 840 5040
누적최솟값> cummin(a) #[1] 2 2 2 2 1 1 1
누적최댓값> cummax(a) #[1] 2 7 7 7 7 7 7
가 의 몇 번째 원소에 매칭> match(c(2,4,6,8), 5:10) # match(x, y): x y[1] NA NA 2 4
합집합> union(a, c(1,2,10)) #[1] 2 7 5 3 1 4 6 10
교집합> intersect(a, c(1,2,10)) #[1] 2 1
에서 를 제외> setdiff(a, c(1,2,10)) # setdiff(x, y): x y[1] 7 5 3 4 6
가 의 원소인가> is.element(a, c(1,2,10)) # is.element(x, y): x y ?
[1] TRUE FALSE FALSE FALSE TRUE FALSE FALSE
조합 계산> choose(5,2) # (combination)[1] 10
행렬 연산 함수(c) R
에서 제공되는 행렬 연산 함수는 다음과 같다> ## R .
대각행렬 생성> m <- diag(10, 3, 4) # (diagonal matrix)> m
[,1] [,2] [,3] [,4][1,] 10 0 0 0[2,] 0 10 0 0[3,] 0 0 10 0
대각원소> diag(m) # (diagonal elements)[1] 10 10 10
전치 행렬> t(m) # (transpose)[,1] [,2] [,3]
[1,] 10 0 0[2,] 0 10 0[3,] 0 0 10[4,] 0 0 0
행의 수> nrow(m) #[1] 3
열의 수> ncol(m) #[1] 4
행렬의 곱> m%*%t(m) # %*%:[,1] [,2] [,3]
[1,] 100 0 0[2,] 0 100 0[3,] 0 0 100
> rbind(m, c(0,0,0,10))[,1] [,2] [,3] [,4]
[1,] 10 0 0 0[2,] 0 10 0 0[3,] 0 0 10 0[4,] 0 0 0 10
> cbind(m, c(1,2,3))[,1] [,2] [,3] [,4] [,5]
[1,] 10 0 0 0 1[2,] 0 10 0 0 2[3,] 0 0 10 0 3
> m1 <- matrix(1:4, 2, 2)> m1
[,1] [,2][1,] 1 3[2,] 2 4
> rowSums(m1)[1] 4 6
> rowMeans(m1)[1] 2 3
> colSums(m1)[1] 3 7
> colMeans(m1)[1] 1.5 3.5
방정식의 근> solve(m1, c(1,2)) # solve(A, b): Ax=b[1] 1 0
방정식 의 근 즉 역행렬> solve(m1) # solve(A): Ax=I ( , )[,1] [,2]
[1,] -2 1.5[2,] 1 -0.5
특이값 분해> svd(m1) # (singular value decomposition):
$d[1] 5.465 0.366
$u[,1] [,2]
[1,] -0.5760 -0.8174[2,] -0.8174 0.5760
$v[,1] [,2]
[1,] -0.4046 0.9145[2,] -0.9145 -0.4046
> a$u%*%diag(a$d)%*%t(a$v) # 을 확인[,1] [,2]
[1,] 1 3[2,] 2 4
고유치 고유벡터> eigen(m1) # (eigen value), (eigen vector)$values[1] 5.3723 -0.3723
$vectors[,1] [,2]
[1,] -0.5658 -0.9094[2,] -0.8246 0.4160
행렬식> det(m1) # (determinant)[1] -2
함수의 반복 적용 메타함수2.1.2 :
은 자료 객체의 원소에 대해 동일한 작업을 반복적으로 적용할 경우 계열의 함수를R apply이용하면 편리하다.
apply(), lapply(), sapply(), tapply()
또한 부집단별 로 통계를 내고자 할 경우 다음의 함수들이 유용하다(subgroup) .
by(), aggregate(), ave(), sweep()
계열 함수(a) apply
함수 행렬 또는 배열의 마진 에 적용> ## apply() : (margins)> x <- cbind(x1=3, x2=c(4:1, 2:5))
는 행렬 객체임> x # xx1 x2
[1,] 3 4[2,] 3 3[3,] 3 2[4,] 3 1[5,] 3 2[6,] 3 3[7,] 3 4[8,] 3 5
은 행을 의미함> apply(x, 1, sum) # 1[1] 7 6 5 4 5 6 7 8
는 열을 의미함> apply(x, 2, sum) # 2x1 x224 24
> apply(x, 1, function(x) x^2)[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
x1 9 9 9 9 9 9 9 9x2 16 9 4 1 4 9 16 25
함수 리스트 또는 벡터에 적용> ## lapply() :
> x <- list(a=1:10, beta=exp(-3:3), logic=c(TRUE,FALSE,FALSE,TRUE))> x$a[1] 1 2 3 4 5 6 7 8 9 10
$beta[1] 0.04979 0.13534 0.36788 1.00000 2.71828 7.38906 20.08554
$logic[1] TRUE FALSE FALSE TRUE
> lapply(x, mean)$a[1] 5.5
$beta[1] 4.535
$logic[1] 0.5
생성> lapply(x, quantile) # list$a
0% 25% 50% 75% 100%1.00 3.25 5.50 7.75 10.00
$beta0% 25% 50% 75% 100%
0.04978707 0.25160736 1.00000000 5.05366896 20.08553692
$logic0% 25% 50% 75% 100%0.0 0.0 0.5 1.0 1.0
함수 와 유사> ## sapply() : lapply()이름을 가진 행렬 형태로 결과 제공> ## (named matrix)
> sapply(x, quantile)a beta logic
0% 1.00 0.04979 0.0
25% 3.25 0.25161 0.050% 5.50 1.00000 0.575% 7.75 5.05367 1.0100% 10.00 20.08554 1.0
> colnames(temp)[1] "a" "beta" "logic"
> rownames(temp)[1] "0%" "25%" "50%" "75%" "100%"
함수 융단 배열 의 각 셀 특정 요인의 유일한 수준들의 조합에> ## tapply() : (ragged array) (의해 주어지는 값들의 그룹 에 함수를 적용)> n <- 17; fac <- factor(rep(1:3, length=n), levels=1:5)> fac[1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2Levels: 1 2 3 4 5
> table(fac)fac1 2 3 4 56 6 5 0 0
요인의 수준 에 따라 범주별 합을 계산> tapply(1:n, fac, sum) # (level) ( )1 2 3 4 551 57 45 NA NA # 51=1+4+7+10+13+16
함수 함수의 다변량 버전임> ## mapply() : sapply()와 동일> mapply(rep, 1:4, 4:1) # mapply(FUN=rep, x=1:4, times=4:1)
함수는 을 각 인자의 첫 번째 원소 두 번째 원소 세 번째 원소 순으로# mapply() FUN , , , ...적용함 인자는 필요시 재순환 됨.1.
[[1]][1] 1 1 1 1
[[2]][1] 2 2 2
[[3]]
[1] 3 3
[[4]][1] 4
부집단별 통계 함수(b)
부집단별 통계를 제공하는 의 기본함수에는 가 있다 이들 함수의R aggregate(), by(), ave() .적용 예는 다음과 같다.
함수의 적용 예> ## aggregate()> agg <- data.frame(v1=1:10, v2=c("c1", "c3", "c2", "c2", "c1", "c1", "c3", "c2", "c2","c1"))
> str(agg)'data.frame': 10 obs. of 2 variables:$ v1: int 1 2 3 4 5 6 7 8 9 10$ v2: Factor w/ 3 levels "c1","c2","c3": 1 3 2 2 1 1 3 2 2 1
수행 결과는 데이터프레임 객체임> aggregate(agg$v1, by=list(agg$v2), mean) #Group.1 x
1 c1 5.52 c2 6.03 c3 4.5
함수의 적용 예> ## by()배열 객체로 결과가 제공됨> by(agg$v1, agg$v2, sum) #
agg$v2: c1[1] 22--------------------------------------------------------------agg$v2: c2[1] 24--------------------------------------------------------------agg$v2: c3[1] 9
함수 적용 예> ## ave()벡터 객체로 결과가 제공됨> ave(agg$v1, agg$v2) #
[1] 5.5 4.5 6.0 6.0 5.5 5.5 4.5 6.0 6.0 5.5
연산자(c) sweep
함수는 행렬 객체의 각 원소가 열평균 또는 행평균 으로부터 벗어난 편차 등을 구할sweep() ( )때 유용하다 분산분석에서 변동의 분해 등에 유용하다. .
> s <- matrix(1:12, 3, 4)> s
[,1] [,2] [,3] [,4][1,] 1 4 7 10[2,] 2 5 8 11[3,] 3 6 9 12
와 동일> sweep(s, 2, colMeans(s)) # sweep(s, 2, apply(s, 2, mean))각 원소별로 열평균으로부터의 편차[,1] [,2] [,3] [,4] #
[1,] -1 -1 -1 -1[2,] 0 0 0 0[3,] 1 1 1 1
확률분포와 분포그리기2.2
확률분포와 확률계산2.2.1
은 기본적으로 다양한 확률분포에 대해 확률밀도 누적확률R (probability density),분위수 확률변량 또는 난수(cumulative probability), (quantiles), (random variates)( ,
를 제공한다random number) .
표준정규분포의 밀도함수값 누적확률 분위수 난수 생성 예> ## , , ,확률밀도> dnorm(0) # (probability density)
[1] 0.3989423
누적확률> pnorm(1.96) # (cumulative probability)[1] 0.9750021
분위수> qnorm(0.975) # (quantile)[1] 1.959964
확률변량 또는 난수 생성> rnorm(5) # (random variates) ( )[1] -0.5425200 1.2078678 1.1604026 0.7002136 1.5868335
함수 난수 발생 시 초기값을 지정하는 것으로 이를 이용하면 결과의 임의성을# set.seed() : ,없앨 수 있음
> set.seed(1000)적용 시 아래의 결과는 일정함> digitrnorm(5) # set.seed()
[1] -0.44577826 -1.20585657 0.04112631 0.63938841 -0.78655436
의 패키지에서 제공하는 분포는 다음 표와 같다 위의 정규분포의 예제와 같은 방법R {stats} .으로 함수 분포명 앞에 을 적용하여 사용한다R ( ) d, p, q, r .
표 에서 제공하는 확률분포와 함수[ 2.1] R
함수R 분포명 모수 디폴트값
norm 정규 mean, sd 0, 1
exp 지수 1/mean 1
gamma 감마 shape, 1/scale NA, 1
pois 포아송 lambda
weibull 와이블 shape
cauchy 코쉬 location, scale 0, 1
beta 베타 shape1, shape2
t student's t df
f Fisher's F df1, df2
chisq 카이제곱 df
binom 이항 size, prob
geom 기하 prob
hyper 초기하 m, n, k
logis 로지스틱 location, scale 0, 1
lnorm 로그정규 mean, sd 0, 1
nbinom 음이항
unif 균일 min, max 0, 1
wilcox 윌콕슨 순위합 통계량
signrank 윌콕슨 부호순위 통계량
다변량 정규분포는 패키지의 함수 또는 패키지의{MASS} mvnorm() {mnormt} rmnorm()함수 등을 이용한다.
확률분포 그리기2.2.2
에서 확률분포는 함수를 이용하여 쉽게 그릴 수 있다 아래의 예제에 사용된 그래픽R curve() .함수의 옵션에 대해서는 장에서 자세히 다루고 있다3 .
> curve(dnorm(x), from=-3, to=3, main="Density of N(0,1)", ylab="")
옵션은 그림을 추가하여 그려줌> ## add=TRUE> d <-c(1, 5, 10)> for(i in d) curve(dchisq(x, df=i), 0, 20, add=TRUE)