Section 01. 확률
> ## 01) prob 패키지를 이용한 확률 계산
>
> library(prob)
> # 동전던지기 실험의 표본공간을 생성
> tosscoin(1)
toss1
1 H
2 T
> # 주사위 굴리기 실험의 표본공간을 생성
> rolldie(1)
X1
1 1
2 2
3 3
4 4
5 5
6 6
> # 사용자가 입력한 벡터 값의 개별 원소들로 구성된 표본공간을 생성, size = 실험횟수
> urnsamples(1:3, size = 2)
X1 X2
1 1 2
2 1 3
3 2 3
> # replace = T일 경우 복원추출, 기본값은 비복원추출(F)이다.
> urnsamples(1:3, size = 2, replace = T)
X1 X2
1 1 1
2 1 2
3 1 3
4 2 2
5 2 3
6 3 3
> # 붉은 구슬 3개, 파란 구슬 2개로 구성된 주머니에서 구슬을 추출하는 실험을 가정
> urnsamples(c(rep("R", 3), rep("B", 2)), size = 2)
X1 X2
1 R R
2 R R
3 R B
4 R B
5 R R
6 R B
7 R B
8 R B
9 R B
10 B B
> # 동전을 2번 던지는 실험의 표본공간에 확률을 부여
> tosscoin(2, makespace = T)
toss1 toss2 probs
1 H H 0.25
2 T H 0.25
3 H T 0.25
4 T T 0.25
>
> ## 02) 확률변수의 평균(기대값)과 분산
>
> x <- c(0, 1, 2)
> px <- c(1/4, 2/4, 1/4)
> # 기대값
> EX <- sum(x * px)
> EX
[1] 1
> # 분산
> VX <- sum(x^2 * px) - EX^2
> VX
[1] 0.5
>
> ## 03) R을 이용한 이항분포 계산
>
> n <- 6
> p <- 1/3
> x <- 0:n
>
> # 확률질량함수 : dbinom()
> # P(X=2)
> ( dbinom(2, size = n, prob = p) )
[1] 0.3292181
> # P(X=4)
> ( dbinom(4, size = n, prob = p) )
[1] 0.08230453
> (px <- dbinom(x, size = n, prob = p))
[1] 0.087791495 0.263374486 0.329218107 0.219478738 0.082304527 0.016460905 0.001371742
> plot(x, px, type = "s", xlab = "성공 횟수(x)", ylab = "확률(P[X=x])",
+ main = "B(6, 1/3)") # type = "s"로 할 경우, 시작 값(0.087791495)을 수평으로 먼저 그린다.
Section 02. 분포함수
>
> # 분포함수 : pbinom()
> # P(X<=2)
> pbinom(2, size = n, prob = p)
[1] 0.6803841
> # P(X<=4)
> pbinom(4, size = n, prob = p)
[1] 0.9821674
> # P(2<X<=4)
> pbinom(4, size = n, prob = p) - pbinom(2, size = n, prob = p)
[1] 0.3017833
>
> # 분위수 : qbinom()
> # 10% x값
> qbinom(0.1, size = n, prob = p)
[1] 1
> # 50% x값
> qbinom(0.5, size = n, prob = p)
[1] 2
>
> # 난수 생성 : rbinom()
> # B(6, 1/3)을 따르는 모집단으로부터 10개의 확률표본 추출
> rbinom(10, size = n, prob = p)
[1] 2 1 4 0 0 2 1 4 1 2
>
> ## 04) R의 분포함수를 이용한 기대값과 분산
>
> n <- 6
> p <- 1/3
> x <- 0:n
> px <- dbinom(x, size = n, prob = p)
> (ex <- sum(x * px))
[1] 2
> (varx <- sum(x^2 * px) - ex^2)
[1] 1.3333
>
> # n의 변화에 따른 이항분포의 변화
>
> n1 <- 5
> n2 <- 10
> n3 <- 30
> p <- 0.3
>
> x1 <- 1:n1
> x2 <- 1:n2
> x3 <- 1:n3
>
> b1 <- dbinom(x1, size=n1, prob=p)
> b2 <- dbinom(x2, size=n2, prob=p)
> b3 <- dbinom(x3, size=n3, prob=p)
>
> par(mar=c(4,4,0,0))
> plot(x3, b3, type="l", ylim=c(0, 0.4), col="red",
+ main="", xlab="x", ylab="P[X=x]")
> points(x3, b3, pch=16, col="red")
> lines(x2, b2, col="blue")
> points(x2, b2, pch=17, col="blue")
> lines(x1, b1, col="black")
> points(x1, b1, pch=15, col="black")
> legends=c("n=30", "n=10", "n=5")
> legend("topright", legend=legends, pch=c(16, 17, 15), col=c("red", "blue", "black"))
>
> # 표준정규분포 : 평균이 0이고 표준편차가 1인 정규분포
>
> x <- seq(-4, 4, by=0.01)
> p <- dnorm(x, mean=0, sd=1)
> plot(x, p, type="l", xlab="x", ylab="P(X=x)", lwd=2, col="red")
>
> # N(170, 4^2)인 모집단으로부터 10000개의 표본을 추출한 히스토그램
>
> set.seed(1)
> x <- rnorm(10000, mean=170, sd=4)
> hist(x, breaks=seq(150, 190, 1), right=F, freq=F)
>
> ## 05) R을 이용한 정규분포 계산
>
> # 정규분포 N(170, 6^2)
> options(digits = 5)
> mu <- 170
> sigma <- 6
> ll <- mu - 3*sigma
> ul <- mu + 3*sigma
>
> # 확률밀도함수 : dnorm()
> x <- seq(ll, ul, by = 0.01)
> nd <- dnorm(x, mean = mu, sd = sigma)
> plot(x, nd, type = "l", xlab = "x", ylab = "P(X=x)", lwd = 2, col = "red")
>
> # 분포함수 : pnorm()
> # P(X<=170)
> pnorm(mu, mean = mu, sd = sigma)
[1] 0.5
> # P(X<=158)
> pnorm(158, mean = mu, sd = sigma)
[1] 0.02275
> # P(160<X<=180)
> pnorm(180, mean = mu, sd = sigma) - pnorm(160, mean = mu, sd = sigma)
[1] 0.90442
>
> # 분위수 : qnorm()
> # 25% x값
> qnorm(0.25, mean = mu, sd = sigma)
[1] 165.95
> # 50% x값
> qnorm(0.5, mean = mu, sd = sigma)
[1] 170
> # 75% x값
> qnorm(0.75, mean = mu, sd = sigma)
[1] 174.05
>
> # 난수 생성 : rnorm()
> # N(170, 6^2)을 따르는 모집단으로부터 400개의 확률표본 추출
> options(digits = 5)
> set.seed(5)
> smp <- rnorm(400, mean = mu, sd = sigma)
> c(mean(smp), sd(smp))
[1] 170.0165 6.0054
> hist(smp, probability = T,
+ main = "N(170, 6^2)로부터 추출한 표본의 분포(n=400)",
+ xlab = "", ylab = "", col = "white", border = "black")
> lines(x, nd, lty = 2, col = "red")
> # 모집단의 분포와 차이는 있지만 많이 닮았음을 알 수 있다.
>
> ## 06) R을 이용해 정규분포의 특징 알아보기
>
> options(digits = 4)
> mu <- 0
> sigma <- 1
>
> (p0.05 <- qnorm(0.05, mean = mu, sd = sigma))
[1] -1.645
> (p0.025 <- qnorm(0.025, mean = mu, sd = sigma))
[1] -1.96
>
> pnorm(1.645) - pnorm(-1.645)
[1] 0.9
> pnorm(1.96) - pnorm(-1.96)
[1] 0.95
>
> # 표준정규분포 그래프 그리기
>
> z <- seq(-3, 3, by=0.001)
> z.p <- dnorm(z)
>
> plot(z, z.p, axes=F, type="l", main="표준정규분포 (90%)", ylab="", ylim=c(-0.04, 0.4))
> axis(1)
> lines(c(-3, 3), c(0, 0))
>
> points(-1.645, -0.02, pch=17, col="red")
> text(-1.645, -0.035, "-1.645", col="red")
> points(1.645, -0.02, pch=17, col="red")
> text(1.645, -0.035, "1.645", col="red")
>
> s <- seq(-1.645, 1.645, by=0.001)
> s.z <- dnorm(s, mean=0, sd=1)
> s <- c(-1.645, s, 1.645)
> s.z <- c(0, s.z, 0)
> polygon(s, s.z, density=10, col="red")
>
> plot(z, z.p, axes=F, type="l", main="표준정규분포 (95%)", ylab="", ylim=c(-0.04, 0.4))
> axis(1)
> lines(c(-3, 3), c(0, 0))
>
> points(-1.96, -0.02, pch=17, col="red")
> text(-1.96, -0.035, "-1.96", col="red")
> points(1.96, -0.02, pch=17, col="red")
> text(1.96, -0.035, "1.96", col="red")
>
> s <- seq(-1.96, 1.96, by=0.001)
> s.z <- dnorm(s, mean=0, sd=1)
> s <- c(-1.96, s, 1.96)
> s.z <- c(0, s.z, 0)
> polygon(s, s.z, col="red", density=10, angle=305)
출처 : 이윤환, ⌜제대로 알고 쓰는 R 통계분석⌟, 한빛아카데미, 2020
'데이터분석 > R' 카테고리의 다른 글
[R 통계분석] 추정 (0) | 2022.08.11 |
---|---|
[R 통계분석] 표본분포 (0) | 2022.08.10 |
[R 통계분석] 기술통계학 (0) | 2022.08.09 |
[R 데이터분석 with 샤이니] 교통 카드 데이터 분석 사례 04 - 종합 분석 (0) | 2022.08.06 |
[R 데이터분석 with 샤이니] 교통 카드 데이터 분석 사례 03 - 교통 흐름 분석 (0) | 2022.08.04 |