분포의 이름
R에는 모든 확률분포의 축약형 이름이 따로 존재한다. 이름을 가지고 그 분포와 관계된 함수들을 식별 해낼수 있다.
예를 들어, 정규분포의 이름은 norm이다.
함수 | 용도 |
dnorm | 정규분포 확률 밀도(normal density) |
pnorm | 정규분포함수(normal distribution function) |
qnorm | 정규분포 분위수 함수(normal quantile function) |
rnorm | 정규분포 난수(normal random variates) |
일반적인 이산분포
이산분포 이름 | R에서의 이름 | 매개변수(인자) |
이항(binomial) | binom | n = 시행 횟수.p = 시행 한번당 성공 확률 |
기하(geometric) | geom | p = 시행 한번당 성공확률 |
초기하(hypergeometric) | hyper | m = 흰색 공 갯수 n = 검은색 공 갯수 k = 꺼낸 공 갯수 |
음이항(negative binomial) | nbinom | size = 성공한 시행 횟수 prob = 성공한 시행 확률 |
포아송(Poisson) | pois | lambda = 평균 |
일반적인 연속분포
연속분포 이름 | R에서의 이름 | 매개변수(인자) |
베타(beta) | beta | shape1 shape2 |
코쉬(Cauchy) | cauchy | location scale |
카이제곱(Chi-sqaured) | chisq | df = 자유도 |
지수(exponential) | exp | rate |
F | f | df1 df2=자유도 |
감마(gamma) | gamma | rate 또는 scale |
로그정규(log-normal) | lnorm | meanlog = 로그척도 평균 |
로지스틱(logistic) | logis | location scale |
정규(normal) | norm | mean sd= 표준편차 |
t(TDist) | t | df = 자유도 |
균등(uniform) | unif | min = 하한 max = 상한 |
와이블(Weibull) | weibull | shape scale |
윌콕슨(Wilcoxon) | wilcox | m = 첫 표본에 있는 관찰값들의 개수 n= 둘쨰 표본에 있는 관찰값들의 개수 |
1) 조합의 개수 세기 및 생성하기
choose 함수를 사용한다.
전체 n개의 항목중 크기가 k인 개별 부분집합들의 개수를 세는 것을 말한다.
choose(n,k)
# 예시
> choose(5, 3)
[1] 10
> choose(50,30)
[1] 4.712921e+13
> choose(500,300)
[1] 5.05495e+144
생성할 때에는 combn 함수를 사용한다. 이 함수는 숫자뿐만 아니라 문자열들의 조합도 생성가능하다.
> items <- 2:5
> k <- 2
> combn(items, k)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 2 2 2 3 3 4
[2,] 3 4 5 4 5 5
# 1~5까지 숫자를 한 번에 세 개씩 선택하는 조합
> combn(1:5, 3)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 1 1 1 1 1 2 2 2 3
[2,] 2 2 2 3 3 4 3 3 4 4
[3,] 3 4 5 4 5 5 4 5 5 5
# 문자열들의 조합
> combn(c("A", "B", "C","D","E"),3)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "A" "A" "A" "A" "A" "A" "B" "B" "B" "C"
[2,] "B" "B" "B" "C" "C" "D" "C" "C" "D" "D"
[3,] "C" "D" "E" "D" "E" "E" "D" "E" "E" "E"
2) 난수 생성하기
0과 1사이의 난수 생성하려는 경우는 runif함수를 사용하면 된다.
이때 runif(random uniform)을 뜻한다. 균등분포뿐만 아니라 다른 분포들에서도 사용이 가능하다.
예를 들어 , 정규분포의 난수 생성기는 rnorm이다.
R에는 내장된 모든 분포에 대해서 각각의 난수 생성기가 존재한다. 분포 이름 앞에 r만 붙이기만 하면 된다.
> runif(1)
[1] 0.8924416
# -5~5사이의 균일분포 난수 한 개
> runif(1, min = -5, max = 5)
[1] -1.734704
# 표준정규분포 난수 한 개
> rnorm(1)
[1] 0.9908498
# 포아송분포 난수 한 개
> rpois(1, lambda = 10)
[1] 6
# 지수분포 난수 한 개
> rexp(1, rate = 0.1)
[1] 8.924906
set.seed함수를 통해 난수 생성기를 알려진 초기 상태로 설정할 수 있다.
이렇게 되면 항상 동일한 무작위 숫자들을 다시 만들어 낼 수 있다.
어떠한 정수인 인자를 하나를 받되 동일한 초기 상태를 만드려면 항상 같은 숫자를 사용해야 한다
> set.seed(165)
> runif(10)
[1] 0.1159132 0.4498443 0.9955451 0.6106368 0.6159386 0.4261986 0.6664884 0.1680676 0.7878783 0.4421021
> set.seed(165)
> runif(10)
[1] 0.1159132 0.4498443 0.9955451 0.6106368 0.6159386 0.4261986 0.6664884 0.1680676 0.7878783 0.4421021
3) 랜덤 수열 생성하기
sample 함수를 사용하여 가능한 값들의 집합에서 표본을 추출하며 replace=TRUE로 설정한다(같은 항목들을 여러 번 선택할수 있게 해주기 때문)
sample 함수는 어떤 집합에서 랜덤으로 항목을 선택하고 replace=TRUE를 이용하여 복원 추출을 하게 해준다.
sample(set, n, replace = TRUE)
# 동전 10번 던진 시뮬레이션을 랜덤 수열로 생성
> sample(c("H", "T"), 10,replace = TRUE)
[1] "H" "T" "T" "H" "H" "H" "H" "T" "T" "H"
# 30번의 베르누이 시행, 성공 or 실패가 무작위로 발생하는 수열
> sample(c("FALSE", "TRUE"), 30, replace = TRUE)
[1] "FALSE" "TRUE" "TRUE" "FALSE" "FALSE" "TRUE" "TRUE" "TRUE" "TRUE" "TRUE" "FALSE" "FALSE" "TRUE"
[14] "FALSE" "FALSE" "FALSE" "FALSE" "TRUE" "TRUE" "TRUE" "FALSE" "FALSE" "TRUE" "FALSE" "TRUE" "TRUE"
[27] "TRUE" "FALSE" "FALSE" "TRUE"
# prob인자를 넣어주어 편향된 수열을 만들 수 있다.
> sample(c("FALSE", "TRUE"), 30, replace = TRUE, prob =c(0.2, 0.8))
[1] "TRUE" "FALSE" "TRUE" "TRUE" "TRUE" "TRUE" "TRUE" "TRUE" "FALSE" "TRUE" "FALSE" "FALSE" "TRUE"
[14] "FALSE" "TRUE" "FALSE" "TRUE" "TRUE" "FALSE" "TRUE" "TRUE" "TRUE" "FALSE" "TRUE" "TRUE" "FALSE"
[27] "TRUE" "FALSE" "TRUE" "FALSE"
4) 이산분포의 확률 계산하기
확률 P(X = x)에는 밀도 함수를 사용한다. 내장된 모든 함수에는 밀도 함수가 있는데, 분포 이름 앞에 'd'가 붙어 있다. 예로 dbinom은 이항분포의 밀도 함수이다.
누적확률 P(X<=x)에는 분포 함수를 사용한다. 마찬가지로 모든 함수에는 밀도 함수가 있고 분포 이름 앞에 'p'가 붙는다. pbinom은 이항분포의 분포 함수다.
# 성공 확률이 1/2인 베르누이 시행을 10번 시행할 때 성공의 개수를 X라 한다.
# 그때 x = 7을 관찰할 확률
> dbinom(7, size = 10, prob = 0.5)
[1] 0.1171875
# x = 7인 누적확률(P(X <= 7))
> pbinom(7, size = 10, prob =0.5)
[1] 0.9453125
누적 확률의 반대는 생존함수(P(X > x))라고 한다. lower.tail = FALSE를 지정하여 모든 분포 함수에서 오른쪽 꼬리 확률을 찾을 수 있다.
또한 구간을 지정하여 구간 확률을 구할 수도 있다.
> pbinom(7, size = 10, prob =0.5, lower.tail = FALSE)
[1] 0.0546875
# P(5< X <= 8)를 계산
> pbinom(8, size = 10, prob =0.5) - pbinom(5, size = 10, prob = 0.5)
[1] 0.3662109
5) 연속분포의 확률 계산하기
P(X <= x)를 계산하는 분포 함수를 사용한다. 즉 'p'가 붙은 분포함수를 사용한다.X- N(mean, sd) -> 정규분포의 표현식을 말한다.
# 표준정규분포로부터 무작위로 추출된 값이 0.8 이하일 확률
> pnorm(q = 0.8, mean = 0, sd = 1)
[1] 0.7881446
# pnorm으로 X - N(70, 3)이 주어 졌을 때 P(X<=66)을 구할 때
> pnorm(66, mean = 70, sd = 3)
[1] 0.09121122
# pexp를 사용해서 평균 40일 떄 지수분포의 확률변수가 20보다 작을 확률
> pexp(20, rate = 1/40)
[1] 0.3934693
6) 확률을 분위수로 변환하기
내장된 모든 분포에는 확률을 분위수로 변환해 주는 분위수 함수가 있다. 각 분포의 이름에 'q'를 붙인 것이다. 예로 qnorm은 정규분포의 분위수 함수이다.
분위수 함수의 첫 번째 인자는 확률, 나머지 인자들은 해당 분포의 모수이다(mean, rate등)
> qnorm(0.05, mean = 100, sd = 15)
[1] 75.3272 # 3분위수
# 95% 신뢰구간(a = 0.05)을 알고 싶을 때에는 a/2 = 0.025 즉 0.975인 확률을 토대로 나온 분위수가 필요하다.
> qnorm(0.025)
[1] -1.959964
> qnorm(0.975)
[1] 1.959964 # Z 값을 의미
7) 밀도 함수 그래프 그리기
관심 영역 벡터 x를 정의하고 해당 분포의 밀도 함수를 x에 적용, 그 결과를 그린다. 이후 d______ 밀도 함수 중 한 가지를 사용해 밀도를 계산후 ggplot으로 그래프를 그린다.
> library(ggplot2)
> x <- seq(-5,5, 0.1)
> dens <- data.frame(x = x, y = dnorm(x))
> ggplot(dens, aes(x, y)) + geom_line()
'데이터분석 > R' 카테고리의 다른 글
R언어 공부 - 6 (0) | 2022.12.30 |
---|---|
R언어 공부 - 5 (3) | 2022.12.29 |
R언어 공부 - 4 (0) | 2022.12.27 |
R언어 공부 - 3 (0) | 2022.12.27 |
R언어 공부 - 2 (0) | 2022.12.26 |