Statistics/[강의정리] 확률의이해

[확률의이해] R을 이용한 주사위 확률과 그래프

눈곱만큼도모름 2024. 4. 21. 08:43
728x90
반응형

R을 확률을 계산해서 주사위의 확률을 시각화 하기

par(mfrow=c(2,2))
# 2x2로 그림을 나눔
# par = parameters
# mfrow = multi-frame row

dice12 <- sample(1:6, 12, replace = TRUE)
# 1,6까지 숫자중 12번을 무작위로 복원추출해서 변수 dice12에 저장

barplot(table(dice12)/12, ylim=c(0,0.3), main="(a) n=12")
#빈도수를 계산하는 함수 table를 이용해서 빈도를 계산하고 전체 합으로 나눈후 막대 그래프를 그린다.
#ylim은 y축의 범위

abline(b=0, a=1/6, col=2)
#주어진 기울기와 y절편으로 직선을 그리는 함수, 각면이 나올 확률 1/6를 표기

dice120 <- sample(1:6, 120, replace = TRUE)
barplot(table(dice120)/120, ylim=c(0,0.3), main="(b) n=120")
abline(b=0, a=1/6, col=2)
dice1200 <- sample(1:6, 1200, replace = TRUE)
barplot(table(dice1200)/1200, ylim=c(0,0.5), main="(c) n=1,200")
abline(b=0, a=1/6, col=2)
dice12000 <- sample(1:6, 12000, replace = TRUE)
barplot(table(dice12000)/12000, ylim=c(0,0.5), main="(d) n=12,000")
abline(b=0, a=1/6, col=2)


---------------------------------------------
# for문을 활용해서 간결하게 만들면 아래와 같습니다

sample_size <- c(12, 120, 1200, 12000)

# 한 그래픽 창에 2x2 배열로 그래프를 배치
par(mfrow = c(2, 2))

for (i in sample_size) {
  c <- sample(1:6, i, replace = TRUE)
  barplot(table(c) / i, main = paste("Sample size:", i), xlab = "Value", ylab = "Proportion")
  abline(b=0, a=1/6, col=2)
}

# 그래프 창 설정을 원래대로 되돌림
par(mfrow = c(1, 1))

만약 주사위 중에 한번도 안나온 요소를 그래프에 표기 하고 싶다면 아래와 같이 factor을 이용한다.



set.seed(42)
dice12 <- sample(1:6, 12, replace = TRUE)

# Ensure all dice faces (1 through 6) are included in the table
dice12_table <- table(factor(dice12, levels = 1:6))

barplot(dice12_table / 12, ylim = c(0, 1))
abline(h = 1/6, col = 2)

par(mfrow=c(2,2))

par 함수는 R에서 그래픽 장치의 매개변수를 설정하는 데 사용됩니다. 여러 가지 명령어를 사용하여 그래픽 장치의 여러 속성을 조정할 수 있습니다. 몇 가지 주요한 par 명령어는 다음과 같습니다:

mfrow: 그래프를 여러 패널로 배열합니다. 예를 들어, par(mfrow=c(2, 2))는 2x2 패널 그리드로 설정합니다.
mfcol: mfrow와 유사하지만 패널이 열 방향으로 채워집니다.
mar: 마진의 크기를 설정합니다. 마진은 그래프 주변의 여백을 나타냅니다.
oma: 외부 마진의 크기를 설정합니다. 외부 마진은 그래프 바깥쪽 여백을 의미합니다.
pty: 그래프의 종횡비를 조정합니다.
las: 레이블의 방향을 설정합니다.
cex: 문자 크기를 조정합니다.
col: 플롯의 색상을 설정합니다.
pch: 점의 모양을 설정합니다.
xlim, ylim: x축과 y축의 범위를 설정합니다.
등등 다양한 속성을 조정할 수 있습니다. 이러한 명령어를 사용하여 그래픽을 더욱 자세하게 제어할 수 있습니다.

 

table(dice12)


table() 함수는 R에서 벡터의 빈도수를 계산하여 표로 만드는 함수입니다. 주어진 데이터에서 각각의 값이 나타나는 빈도를 계산하고 그것을 표 형태로 반환합니다.

예를 들어, 다음과 같은 벡터가 있다고 가정합시다:

x <- c("A", "B", "A", "C", "A", "B", "B")

table(x)

#결과
x
A B C 
3 3 1

ggplot2

install.packages("ggplot2")
library(ggplot2)
library(magrittr)

# 함수 정의: nn번의 주사위 던지기 시뮬레이션 결과 반환
RDice <- function(nn) {
  sample(1:6, nn, replace=TRUE) %>% table() / nn
}

# 난수 생성 시드 설정
set.seed(1234567)

# 주사위 던지기 시뮬레이션 실행
dice_1 <- RDice(12)
dice_2 <- RDice(120)
dice_3 <- RDice(1200)
dice_4 <- RDice(120000)

# 데이터 변환
dice <- c(as.numeric(dice_1), as.numeric(dice_2), as.numeric(dice_3),
          as.numeric(dice_4))
nn <- c(rep("(a) n=12", 6), rep("(b) n=120", 6), rep("(c) n=1,200", 6),
         rep("(d) n=12,000", 6))
         
# 데이터 프레임 생성
dice_result <- data.frame(nn, num = rep(1:6, 4), dice)

# ggplot2를 사용하여 결과 시각화
ggplot(data = dice_result, aes(x = num, y = dice)) +  # x축은 주사위 눈, y축은 상대 도수
  geom_bar(stat = "identity", alpha = 0.8) +  # 막대 그래프 생성
  xlab("\nResult on Die") + ylab("Relative Frequency\n") +  # x축 및 y축 레이블 설정
  geom_hline(yintercept = 1/6, colour = 2, lty = 2) +  # 기대되는 확률값에 대한 수평선 추가
  ylim(0, 0.3) +  # y축 범위 설정
  facet_wrap(~nn, ncol = 2)  # 패널 분할

728x90
반응형