9  기술통계량

기술통계(descriptive statistics)는 데이터의 특징을 요약하고 이해하는 데 유용한 도구이다. 데이터는 범주형과 연속형으로 크게 나누어 데이터 특성에 맞는 기술통계기법을 활용하여 데이터의 특징을 파악할 수 있다.

범주형 데이터의 경우, 빈도 분석과 교차 분석이 주로 사용된다. 단변량 빈도 분석은 각 범주별 빈도와 비율을 계산하여 데이터의 분포를 파악하는 방법이다. 교차 분석은 두 개의 범주형 변수 간의 관계를 파악하기 위해 사용되며, 변수 간의 연관성과 패턴을 탐색할 수 있다.

연속형 데이터의 경우, 중심 경향 측정, 산포도 측정, 백분위수 등이 주로 사용된다. 중심 경향 측정은 데이터의 중심 위치를 나타내는 값으로, 평균, 중앙값 등이 있다. 평균은 데이터의 전반적인 수준을 파악할 수 있으며, 중앙값은 이상치의 영향을 받지 않는 강건한 중심 경향 측정치이다.

데이터의 특성상 산포가 발생될 수 밖에 없다. 산포도 측정은 데이터의 변동성과 퍼짐 정도를 나타내는 값으로, 범위, 분산, 표준편차 등이 있다. 범위는 최댓값과 최솟값의 차이로, 데이터의 퍼짐 정도를 나타낸다. 분산은 데이터가 평균에서 얼마나 떨어져 있는지를 측정하는 값이며, 표준편차는 분산의 제곱근으로 데이터의 변동성을 평균과의 거리로 나타낸다.

백분위수는 데이터를 크기 순으로 정렬했을 때, 특정 백분율에 해당하는 값을 나타낸다. 예를 들어, 제1사분위수(Q1)는 25%의 데이터 값을, 제3사분위수(Q3)는 75%의 데이터 값을 의미한다.

그림 9.1: 기술통계 흐름도

9.1 수식

수식으로 기술통계를 활용한 데이터의 특징 파악을 수식으로 표현할 수 있다. 먼저 범주형 데이터 범주 \(i\)의 빈도 \(n_i\)는 전체 데이터의 개수 \(N\)로 나눈 비율 \(p_i\)로 나타낼 수 있다.

\[p_i = \frac{n_i}{N}\] 한걸은 더 나아가 교차 분석을 통해 범주 \(i\)와 범주 \(j\)의 결합 빈도 \(n_{ij}\)를 전체 데이터의 개수 \(N\)로 나누면 결합 비율 \(p_{ij}\)을 구할 수 있다.

\[p_{ij} = \frac{n_{ij}}{N}\]

연속형 데이터의 경우, 중심 경향 측정을 위해 평균과 중앙값을 사용한다. 평균(\(\overline{X}\))은 전체 데이터의 합\(\sum_{i=1}^{n}\)을 데이터의 개수\(n\)로 나눈 값으로 정의된다.

\[\overline{X} = \frac{1}{n}\sum_{i=1}^{n} x_i\]

중앙값은 데이터를 크기 순으로 정렬했을 때 중앙에 위치하는 값이다. 중앙값은 정렬된 데이터 세트에서 가운데에 위치하는 값으로 데이터의 크기가 홀수일 경우, 중앙값은 정확히 중간에 있는 단일 값이 되고 짝수 개의 데이터가 있는 경우에는 중간에 있는 두 값의 평균으로 정의된다. 전체 \(n\) 개 데이터가 정렬되어 \(x\)라는 데이터 세트를 구성한다고 가정하면, 중앙값은 다음과 같이 계산된다.

  1. 홀수 개의 데이터를 가진 경우: \[ \text{중앙값} = x_{\left(\frac{n+1}{2}\right)} \]

  2. 짝수 개의 데이터를 가진 경우: \[ \text{중앙값} = \frac{x_{\left(\frac{n}{2}\right)} + x_{\left(\frac{n}{2} + 1\right)}}{2} \]

    여기서, \(x_{\left(\frac{n}{2}\right)}\)\(x_{\left(\frac{n}{2} + 1\right)}\)는 정렬된 데이터에서 중간에 위치하는 두 값이다.

산포도 측정을 위해 범위, 분산, 표준편차가 많이 사용된다. 범위는 최댓값과 최솟값의 차이로, 분산은 데이터가 평균에서 얼마나 떨어져 있는지를 측정하는 값이며, 표준편차는 분산의 제곱근으로 데이터의 변동성을 평균과의 거리로 나타낸다.

퍼짐정도를 측정하는 가장 직관적인 방법은 범위로 최대값에서 최소값을 뺀 값이다. 범위는 데이터의 산포도를 측정하는 가장 간단한 방법이지만, 이상치에 민감하게 반응한다.

\[\text{범위} = x_{max} - x_{min}\]

평균 중심에서 데이터가 평균적으로 얼마나 떨어져 있는지를 측정하는 대표적인 지표는 표준편차(Standard Deviation)다. 표준편차는 데이터의 변동성 또는 퍼짐 정도를 나타내며, 데이터 값이 평균 중심으로부터 얼마나 멀리 떨어져 있는지를 숫자로 표현할 수 있다. 표준편차(\(\sigma\))를 정의하는데, 전체 데이터수(\(N\)), 개별 데이터(\(x_i\)), 평균(\(\mu\))이 필요하다.

\[\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)^2}\]

각 개별 데이터와 평균 값의 차이를 제곱하여 합산한 뒤, 전체 데이터수로 나누고, 그 결과의 제곱근을 취하면 표준편차를 구할 수 있다. 표준편차가 크면 데이터가 평균으로부터 넓게 퍼져있음을, 표준편차가 작으면 데이터가 평균에 가깝게 모여있음을 의미한다. 분산(\(s^2\))은 표준편차를 제곱한 값으로, 표준편차와 마찬가지로 데이터의 퍼짐 정도를 나타내는 지표다.

\[s^2 = \frac{1}{n-1}\sum_{i=1}^{n} (x_i - \bar{x})^2\]

9.2 평균과 표준편차

기술통계에서 수식으로 정의된 평균과 실제 데이터 예시를 들어 시각화하는 방법을 통해 직관적으로 이해해보자. 평균\(\mu\)은 데이터의 중심 값을 나타내며, 모든 데이터의 합을 데이터의 수로 나눈 값으로 데이터가 \(\{1, 3, 5, 7, 9\}\)인 경우, 평균은 다음과 같이 구할 수 있다.

\[ \begin{aligned} \text{평균} (\mu) &= \frac{1}{n} \sum_{i=1}^{n} x_i\\ &= \frac{1 + 3 + 5 + 7 + 9}{5} &= \frac{25}{5} = 5 \end{aligned} \]

표준편차(\(\sigma\))는 데이터가 평균(\(\mu\))으로부터 얼마나 퍼져 있는지 나타내는 값으로 평균과 각 데이터의 차이를 제곱하여 합한 뒤, 데이터수로 나눈 값의 제곱근으로 계산된다.

\[ \begin{aligned} \text{표준편차} (\sigma) &= \sqrt{\frac{1}{n} \sum_{i=1}^{n} (x_i - \mu)^2}\\ &= \sqrt{\frac{(1-5)^2 + (3-5)^2 + (5-5)^2 + (7-5)^2 + (9-5)^2}{5}} \\ &= \sqrt{\frac{4 + 4 + 0 + 4 + 16}{5}} \\ &= \sqrt{\frac{28}{5}} \\ &\approx 2.37 \end{aligned} \]

데이터(\({1, 3, 5, 7, 9}\))와 평균(\(\mu\)), 표준편차($$)를 한번에 시각화하면 그림 fig-mean-sd와 같이 나타낼 수 있다.

그림 9.2: 평균과 표준편차 시각화

데이터는 검정색으로 표시하고 파란색 선으로 평균값을 나타내고 붉은색은 표준편차를 나타낸다. 데이터가 평균으로부터 얼마나 퍼져 있는지를 시각적으로 확인할 수 있다.

9.2.1 실습

기술통계량에 대한 기본 개념과 수식, 평균과 표준편차에 대한 사례를 바탕으로 숫자 1 ~ 100 사이 숫자를 무작위로 중복없이 X개만을 추출했을 경우 추출한 데이터로부터 평균과 표준편차를 체험해보자.

#| label: fig-shiny-spline
#| viewerHeight: 800
#| standalone: true

library(shiny)
library(ggplot2)

# UI 정의
ui <- fluidPage(
  titlePanel("기술통계"),
  sidebarLayout(
    sidebarPanel(
      selectInput("numSelect",
                  "1~100 사이 무작위 추출할 데이터수:",
                  choices = 1:100,
                  selected = 10)
    ),
    mainPanel(
      plotOutput("numberPlot"),
      uiOutput("stats")
    )
  )
)

# 서버 로직
server <- function(input, output) {
  selectedNumbers <- reactive({
    sample(1:100, input$numSelect, replace = FALSE)
  })

  output$numberPlot <- renderPlot({
    data <- data.frame(value = selectedNumbers())
    mean_val <- mean(data$value)
    std_dev <- sd(data$value)

    ggplot(data, aes(x = factor(1), y = value)) +
      geom_point(stat = "identity", position = position_dodge(width = 0.2), size = 4) +
      annotate("segment", x = 0.8, xend = 1.2, y = mean_val, yend = mean_val, color = "blue", linewidth = 1.5) +
      geom_errorbar(aes(ymin = mean_val - std_dev, ymax = mean_val + std_dev, x = factor(1)), width = 0.2, color = "red") +
      labs(title = paste0("추출된", length(selectedNumbers()), "개 데이터와 통계"), y = "", x = "") +
      theme_minimal() +
      coord_flip() +
      theme(
        aspect.ratio = 1/5,
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank()
      )
  })

  output$stats <- renderUI({
    data <- selectedNumbers()
    if (length(data) > 0) {
      mean_val <- mean(data)
      sd_val <- sd(data)
      max_val <- max(data)
      min_val <- min(data)
      tags$ul(
        tags$li(HTML(paste("<b>추출된 숫자:</b>  ", paste(data, collapse = ", ")))),
        tags$li(HTML(paste("<b>평균:</b>  ", round(mean_val, 2)))),
        tags$li(HTML(paste("<b>표준편차:</b>  ", round(sd_val, 2)))),
        tags$li(HTML(paste("<b>최대값:</b>  ", max_val))),
        tags$li(HTML(paste("<b>최소값:</b>  ", min_val)))
      )
    } else {
      "숫자를 선택하세요."
    }
  })
}

# 앱 실행
shinyApp(ui, server)

9.3 코드 구현

각각 1부터 100 사이의 무작위로 해당 숫자를 추출하고 직관적으로 이해할 수 있도록 추출한 데이터를 시각화하고 기술통계 평균과 표준편차도 함께 표시한다.

ggplot2dplyr 라이브러리를 불러온 후, 1부터 100 사이에서 5개의 숫자를 무작위로 추출하여 sample_data에 저장한다. 기술통계로 데이터의 평균과 표준편차를 계산하고, ggplot을 사용하여 이 숫자들을 점으로 표시하고 평균값에 선을, 표준편차에 오차 막대를 추가하여 시각화한다.

동일한 데이터에서 평균, 표준편차, 최대값, 최소값을 계산하고 보기 좋은 형태로 출력한다. paste 함수를 사용하여 추출된 숫자들과 각 통계치들을 연결하고, 개행 문자를 사용하여 줄바꿈을 추가하여 결과를 cat 함수로 깔끔하게 출력한다.

9.4 shiny 앱

Shiny 앱은 기술통계를 체험할 수 있도록 연속형 변수와 범주형 변수 각각에 대한 시각화와 요약 통계량을 제공한다. 외부 데이터를 불러와 사용자가 선택한 변수에 대한 기술통계량을 계산하고 시각화하는 것도 가능하지만 연속형, 범주형 내장 데이터셋을 통해 빠르게 살펴보자.

연속형 변수를 대표하는 자동차 데이터셋과 범주형 변수를 대표하는 고객정보 데이터셋이 기본 제공되고 변수의 특성에 따라 적절한 기술통계량과 시각화 산출물이 제공된다.

  1. 데이터셋 선택
    • 앱에서는 R 내장 데이터셋인 “자동차” 데이터셋(cars)과 set.seed(123)으로 제작된 “고객정보” 범주형 데이터셋을 제공한다.
    • “데이터셋 선택” 드롭다운 메뉴에서 원하는 데이터셋을 선택할 수 있다.
  2. 변수 선택
    • 선택한 데이터셋의 변수 중 하나를 “변수 선택” 드롭다운 메뉴에서 선택한다.
    • 선택한 변수의 유형(범주형 또는 연속형)에 따라 적절한 시각화 방법과 요약 통계량이 자동으로 업데이트된다.
  3. 시각화
    • 범주형 변수의 경우:
      • 왼쪽에는 막대 그래프가 표시되어 각 범주의 빈도를 확인할 수 있다.
      • 오른쪽에는 원 그래프가 표시되어 각 범주의 상대적 비율을 파악할 수 있다.
    • 연속형 변수의 경우:
      • 히스토그램이 표시되어 변수의 분포를 확인할 수 있다.
  4. 요약 통계량
    • 범주형 변수의 경우:
      • 각 범주의 빈도, 비율, 총합이 테이블로 제시된다.
    • 연속형 변수의 경우:
      • 평균, 중앙값, 최솟값, 최댓값, 범위, 분산, 표준편차 등의 요약 통계량이 출력된다.
그림 9.3: 기술통계 (Shiny) 웹앱