데이터분석/R

R언어 공부 - 7

환성 2022. 12. 30. 15:31
728x90

분포의 이름

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