연속형 분포

연속형 분포
확률분포
균등분포
정규분포
지수분포
감마분포
베타분포
저자

이광춘

공개

2024-05-07

연속확률분포를 시각화하고 상호작용하는 Shiny 애플리케이션과 관련 코드를 설명합니다.

  1. Shiny 앱: 사용자가 주요 연속확률분포(균등, 정규, 지수, 감마, 베타 분포) 중 하나를 선택하고 해당 분포의 매개변수를 조정할 수 있는 웹 기반 인터페이스를 제공합니다. 사용자는 선택한 분포에 따라 확률밀도함수(PDF)와 누적밀도함수(CDF)를 그래프로 시각화할 수 있습니다.

  2. 코딩: 분석 대상 데이터가 어떤 분포를 따르는지를 이해하고, 이를 그래픽으로 표현하여 데이터의 분포 형태와 경향을 확인할 수 있습니다. continuous_dist_summary 함수는 주어진 분포와 매개변수를 기반으로 요약통계량과 검정통계량, 히스토그램, 확률밀도함수(PDF)와 누적분포함수(CDF)를 계산하고 시각화합니다.

1 Shiny 앱

#| label: shinylive-discrete-distribution
#| viewerWidth: 800
#| viewerHeight: 700
#| standalone: true

library(shiny)
library(ggplot2)

ui <- fluidPage(
  titlePanel("Continuous Distributions"),
  sidebarLayout(
    sidebarPanel(
      radioButtons("dist", "Select Distribution:",
                   choices = c("Uniform", "Normal", "Exponential", "Gamma", "Beta"),
                   inline = TRUE),
      conditionalPanel(
        condition = "input.dist == 'Uniform'",
        sliderInput("unif_min", "Minimum (a):", min = -10, max = 0, value = -1, step = 0.1),
        sliderInput("unif_max", "Maximum (b):", min = 0, max = 10, value = 1, step = 0.1)
      ),
      conditionalPanel(
        condition = "input.dist == 'Normal'",
        sliderInput("norm_mean", "Mean (μ):", min = -10, max = 10, value = 0, step = 0.1),
        sliderInput("norm_sd", "Standard Deviation (σ):", min = 0.1, max = 5, value = 1, step = 0.1),
        sliderInput("x_range_norm", "Range of x:", min = -10, max = 10, value = c(-5, 5), step = 0.1)
      ),
      conditionalPanel(
        condition = "input.dist == 'Exponential'",
        sliderInput("exp_rate", "Rate (λ):", min = 0.1, max = 5, value = 1, step = 0.1),
        sliderInput("x_range_exp", "Range of x:", min = 0, max = 10, value = c(0, 5), step = 0.1)
      ),
      conditionalPanel(
        condition = "input.dist == 'Gamma'",
        sliderInput("gamma_shape", "Shape (α):", min = 0.1, max = 5, value = 1, step = 0.1),
        sliderInput("gamma_rate", "Rate (β):", min = 0.1, max = 5, value = 1, step = 0.1),
        sliderInput("x_range_gamma", "Range of x:", min = 0, max = 10, value = c(0, 5), step = 0.1)
      ),
      conditionalPanel(
        condition = "input.dist == 'Beta'",
        sliderInput("beta_shape1", "Shape 1 (α):", min = 0.1, max = 5, value = 1, step = 0.1),
        sliderInput("beta_shape2", "Shape 2 (β):", min = 0.1, max = 5, value = 1, step = 0.1),
        sliderInput("x_range_beta", "Range of x:", min = 0, max = 1, value = c(0, 1), step = 0.01)
      )
    ),
    mainPanel(
      tabsetPanel(
        tabPanel("PDF Plot", plotOutput("pdf_plot")),
        tabPanel("CDF Plot", plotOutput("cdf_plot"))
      ),
      h4("Usage Instructions:"),
      tags$ol(
        tags$li("Select a distribution type using the radio buttons."),
        tags$li("Adjust the parameters of the selected distribution using the sliders."),
        tags$li("Use the 'Range of x' slider to control the range of the x-axis."),
        tags$li("Explore the PDF and CDF plots in their respective tabs.")
      )
    )
  )
)

server <- function(input, output) {

  dist_data <- reactive({
    if (input$dist == "Uniform") {
      x <- seq(input$unif_min-1, input$unif_max+1, length.out = 500)
      data.frame(x = x, pdf = dunif(x, min = input$unif_min, max = input$unif_max),
                 cdf = punif(x, min = input$unif_min, max = input$unif_max))
    } else if (input$dist == "Normal") {
      x <- seq(input$x_range_norm[1], input$x_range_norm[2], length.out = 500)
      data.frame(x = x, pdf = dnorm(x, mean = input$norm_mean, sd = input$norm_sd),
                 cdf = pnorm(x, mean = input$norm_mean, sd = input$norm_sd))
    } else if (input$dist == "Exponential") {
      x <- seq(input$x_range_exp[1], input$x_range_exp[2], length.out = 500)
      data.frame(x = x, pdf = dexp(x, rate = input$exp_rate),
                 cdf = pexp(x, rate = input$exp_rate))
    } else if (input$dist == "Gamma") {
      x <- seq(input$x_range_gamma[1], input$x_range_gamma[2], length.out = 500)
      data.frame(x = x, pdf = dgamma(x, shape = input$gamma_shape, rate = input$gamma_rate),
                 cdf = pgamma(x, shape = input$gamma_shape, rate = input$gamma_rate))
    } else if (input$dist == "Beta") {
      x <- seq(input$x_range_beta[1], input$x_range_beta[2], length.out = 500)
      data.frame(x = x, pdf = dbeta(x, shape1 = input$beta_shape1, shape2 = input$beta_shape2),
                 cdf = pbeta(x, shape1 = input$beta_shape1, shape2 = input$beta_shape2))
    }
  })

  output$pdf_plot <- renderPlot({
    ggplot(dist_data(), aes(x = x, y = pdf)) +
      geom_line(color = "steelblue") +
      labs(title = paste(input$dist, "Distribution - PDF"),
           x = "x", y = "Density")
  })

  output$cdf_plot <- renderPlot({
    ggplot(dist_data(), aes(x = x, y = cdf)) +
      geom_line(color = "steelblue") +
      labs(title = paste(input$dist, "Distribution - CDF"),
           x = "x", y = "Cumulative Probability")
  })
}

shinyApp(ui, server)

2 코딩

라이센스

CC BY-SA-NC & GPL-3