12  추정

추정(estimation)은 표본 데이터를 기반으로 모집단의 특성, 즉 모수를 추론하는 통계적 과정이다. 현실 세계에서는 모집단 전체를 조사하는 것이 비용, 시간, 자원 등의 제약으로 인해 불가능하거나 비효율적인 경우가 대부분이기 때문에 표본을 통해 모집단의 특성을 파악하는 것이 필수적이다. 또한, 추정 결과는 가설 검정과 예측의 기초가 된다. 모수에 대한 추정값을 바탕으로 통계적 가설을 검정하고, 미래 관측값을 예측할 수 있다.

추정의 주요 목적은 제한된 표본 데이터로부터 모집단에 대한 정확한 정보를 획득하는 것이다. 추정을 통해서 전체 모집단에 대한 이해를 높이고, 의사 결정에 필요한 정보를 제공할 수 있을 뿐만 아니라, 모집단 전체를 조사할 때 소요되는 비용과 시간을 절감할 수 있다. 표본을 사용한 추정은 자원의 소모를 줄이면서도 신속하게 신뢰할 수 있는 결과를 얻을 수 있는 방법이다.

현대의 데이터 분석 환경에서는 신속한 의사 결정이 요구되는데, 추정은 데이터를 실시간으로 분석하고 해석할 수 있는 방법을 제공한다. 추정 결과는 불확실성을 내포하고 있지만, 추정 방법론은 신뢰구간 등을 통해 불확실성을 정량화하고 관리할 수 있는 도구를 제공한다.

추정과 검정

추정은 표본 데이터를 기반으로 모집단의 특성(모수)을 추론하는 과정으로 추정의 목적은 모집단에 대한 정보를 얻는 것이다. 점 추정은 단일 값으로 모수를 추정하는 것이고, 구간 추정은 모수가 포함될 가능성이 높은 구간을 제시하는 것이다. 예를 들어, 표본 평균을 이용해 모평균을 추정하거나, 표본 비율을 이용해 모비율을 추정한다.

검정은 모집단에 대한 가설을 세우고, 표본 데이터를 기반으로 그 가설을 검증하는 과정으로 검정의 목적은 가설의 타당성을 판단하는 것이다. 귀무가설과 대립가설을 설정하고, 표본 데이터가 귀무가설과 일치하는지 여부를 평가한다. 유의 수준을 설정하고, p-값을 계산하여 귀무가설을 기각할 것인지 결정한다. 예를 들어, 두 집단 간 평균 차이가 있는지 검정하는 t-검정, 범주형 변수 간 관계가 있는지 검정하는 카이제곱 검정 등이 있다.

12.1 점추정의 개념

점추정은 표본 데이터를 바탕으로 모수(parameter) 단일 값을 추정하는 방법이다. 모수는 모집단의 특성을 나타내는 값으로, 예를 들어 모평균(\(\mu\)), 모분산(\(\sigma^2\)), 모비율(\(p\)) 등이 있다. 점추정은 이러한 모수를 하나의 값으로 추정한다.

점추정값은 표본통계량(sample statistic)을 사용하여 계산한다. 표본통계량은 표본 데이터로부터 계산된 값으로, 모수를 추정하는 데 사용된다. 예를 들어, 표본평균(\(\bar{X}\))은 모평균(\(\mu\))의 점추정값으로 사용될 수 있다.

편향과 분산은 추정량의 특성을 나타내는 척도다. 편향과 분산이 가능한 한 작고 정확도가 가능한 높은 추정량을 “좋은” 추정량으로 간주한다.

그림 12.1: 좋은 추정량

12.2 좋은 추정량

추정(estimation)은 표본 데이터를 사용해 모집단의 특성을 추론하는 과정으로 통계량(Statistic)은 표본 데이터로부터 계산된 값으로, 모집단의 모수(예: 평균, 분산)를 추정하는 데 사용된다. 추정량으로 사용될 때 이를 추정량(estimator)이라고 하고 추정량을 사용해서 계산된 값을 추정치(estimate)라고 한다. 좋은 추정량이 되기 위해 갖춰야할 주요 성질은 다음과 같다.

  1. 불편성 (Unbiasedness)
    • 추정량의 기대값이 추정하고자 하는 모수의 참값과 같아야 한다. 추정량이 모수를 정확하게 표현한다는 의미가 된다.
    • 수식: \(E(\hat{\theta}) = \theta\)
    • \(\hat{\theta}\)는 모수 \(\theta\)의 추정량이다.
  2. 일치성 (Consistency)
    • 표본의 크기가 증가함에 따라 추정량이 모수의 참값에 점점 더 가까워져야 한다. 추정량이 무한한 표본 크기에서 모수를 정확하게 포착한다는 의미다.
    • 수식: \(\hat{\theta}_n \rightarrow \theta\) \(\qquad n \rightarrow \infty\)
    • \(n\) 은 표본 크기다.
  3. 효율성 (Efficiency)
    • 주어진 표본 크기에 대해 가장 작은 분산을 가진 추정량을 가장 효율적인 것으로 간주한다. 추정량의 변동성이 낮고, 따라서 더 정확하다는 의미다.
    • 수식: 추정량 \(\hat{\theta}_1\)이 추정량 \(\hat{\theta}_2\)보다 더 효율적이라면, \(Var(\hat{\theta}_1) < Var(\hat{\theta}_2)\)

특히, 불편성과 효율성을 모두 만족하는 추정량을 최량불편추정량(MVUE, Minimum Variance Unbiased Estimator)이라고 하며, MVUE는 모든 불편추정량 중에서 분산이 가장 작은 추정량으로 정의된다. 예를 들어, 모평균 \(\mu\)를 추정할 때, 표본평균 \(\bar{X}\)는 MVUE가 된다.

  1. 불편성:

\[ E(\bar{X}) = E\left(\frac{1}{n}\sum_{i=1}^{n} X_i\right) = \frac{1}{n}\sum_{i=1}^{n} E(X_i) = \frac{1}{n}\sum_{i=1}^{n} \mu = \mu \]

  1. 효율성

모평균의 불편추정량 \(\tilde{\mu}\)에 대해, \(Var(\bar{X}) \leq Var(\tilde{\mu})\)임을 증명할 수 있어 표본평균은 모평균의 MVUE가 된다. 라오-블랙웰 정리(Rao-Blackwell Theorem)와 레만-셰페 정리(Lehmann-Scheffé Theorem)를 통해서 불편 추정량이 완비 충분 통계량의 함수로 표현될 때, 추정량이 불편성을 유지하면서도 분산을 최소화하는 최적의 추정량(UMVUE)이 될 것임을 의미한다. 라오-블랙웰 정리는 주어진 불편 추정량의 분산을 줄이기 위해 충분 통계량을 활용하는 방법을 제공하고, 레만-셰페 정리는 완비 충분 통계량을 사용하여 주어진 불편 추정량이 최소 분산을 가지는 UMVUE임이 증명된다.

12.3 나쁜 추정량

통계량 중에서 불편성, 일치성, 효율성을 만족하지 않는 다양한 추정량에 대해 살펴보면 좋은 추정량에 대한 이해를 높일 수 있다.

불편성을 만족하지 않는 추정량으로 표본 최소값을 예로 들 수 있다. 모집단이 [0, 1] 범위의 연속 균등 분포를 따르고 있다고 가정할 때, 표본 최소값을 모집단의 최소값 0의 추정량으로 사용하는 경우를 고려해본다. 표본 최소값은 모집단 최소값보다 항상 크거나 같으므로, 이 추정량은 모집단의 최소값을 과대평가하는 경향이 있다. 반대로 최대값은 과소평가하는 경향이 있다. 따라서 이 추정량은 불편성을 만족하지 않는다.

  • 모집단: 연속 균등 분포 \(U[0, 1]\)
  • 추정량: 표본 최소값 \(X_{(1)} = \min(X_1, \dots, X_n)\)
  • \(E(X_{(1)}) = \frac{1}{n+1}\)

일치성을 만족하지 않는 추정량으로 첫 번째 표본값을 예로 들 수 있다. 모집단이 베르누이 분포 \(Bern(p)\)를 따르는 경우, 첫 번째 표본값 \(X_1\)을 모수 \(p\)의 추정량으로 사용하는 상황을 고려해본다. 베르누이 분포에서 표본 크기가 증가하더라도 첫 번째 표본값은 항상 0 또는 1 중 하나의 값을 가진다. 따라서 첫 번째 표본값은 모수 \(p\)의 값과 일치하지 않을 확률이 높다. 표본 크기가 증가하더라도 첫 번째 표본값은 모수 \(p\)로 수렴하지 않기 때문에 일치성을 만족하지 않는 추정량이다.

  • 모집단: 베르누이 분포 \(Bern(p)\)
  • 추정량: 첫 번째 표본값 \(X_1\)
  • \(P(\lim_{n \to \infty} X_1 = p) \neq 1\)

효율성을 만족하지 않는 추정량으로 표본 범위(최대값 - 최소값)를 예로 들 수 있다. 모집단이 연속 균등 분포를 따르고, 표본 범위를 모분산의 추정량으로 사용하는 경우를 살펴본다. 표본 범위는 모분산을 추정하기에 너무 민감하며, 표본 간의 변동이 클 때 매우 높은 분산을 보인다. 다른 가능한 추정량에 비해 상대적으로 높은 분산을 가지기 때문에 효율성을 만족하지 않는다. 표본 범위는 추정 대상인 모분산의 실제 변동을 과대평가할 수 있으므로, 표본범위를 통한 추정은 비효율적이다.

  • 모집단: 연속 균등 분포 \(U[0, 1]\)
  • 추정량: 표본 범위 \(R = X_{(n)} - X_{(1)}\)
  • \(Var(R) = \frac{n-1}{(n+1)^2 (n+2)}\)

12.3.1 사례

어떤 공장에서 생산되는 제품의 무게를 추정하고자 한다. 제품의 무게는 평균이 \(\mu\)이고 분산이 \(\sigma^2\)인 정규분포를 따른다고 가정한다. 평균 \(\mu\) 를 추정하기 위해 표본평균을 제외하고 다른 3가지 추정량을 사용하여 비교해보자.

  1. 모집단과 확률분포: \(X \sim N(\mu, \sigma^2)\)
  2. 표본: \(X_1, X_2, \ldots, X_n\), 이때 \(n=100\)
  3. 추정량:
  • 표본평균: \(\bar{X} = \frac{1}{100}\sum_{i=1}^{100} X_i\)
  • 첫 번째 표본값: \(X_1\)
  • 표본 중앙값: \(\mathrm{Med}(X)\)
  • 절사평균(25% 절사): \(\bar{X}_{tr} = \frac{1}{n/2} \sum_{i=n/4+1}^{3n/4} X_{(i)}\), 여기서 \(X_{(i)}\)\(i\)번째 순서통계량입니다.
#> # A tibble: 4 × 2
#>   추정량         편향
#>   <chr>         <dbl>
#> 1 Bias_X_tr  -0.00120
#> 2 Bias_X_bar  0.00176
#> 3 Bias_X_med  0.00574
#> 4 Bias_X_1   -0.126
#> # A tibble: 4 × 2
#>   추정량      분산
#>   <chr>      <dbl>
#> 1 Var_X_bar 0.0379
#> 2 Var_X_med 0.0590
#> 3 Var_X_tr  0.0860
#> 4 Var_X_1   3.99

효율성 측면에서, 표본평균 \(\bar{X}\)이 가장 작은 분산을 보여주고 있어 다른 추정량에 비해 가장 효율적임을 시사한다. 표본 중앙값 \(\mathrm{Med}(X)\)와 절사평균 \(\bar{X}_{tr}\)도 비교적 작은 분산을 보이지만, 표본평균보다는 효율성이 떨어진다.

편향성 측면에서, 절사평균 \(\bar{X}_{tr}\)이 가장 작은 편향을 보이고 있어, 절사평균 추정량이 모평균에 가장 가깝게 수렴함을 알 수 있다. 표본평균 \(\bar{X}\)와 표본 중앙값 \(\mathrm{Med}(X)\)도 비교적 작은 편향을 보이지만, 절사평균보다는 편향성이 낮다.

한편, 첫 번째 표본값 \(X_1\)은 효율성과 일치성 모두 매우 낮은 것으로 나타났다. 이 추정량은 분산과 편향 모두 다른 추정량에 비해 현저히 큰 값을 보이고 있어, 모평균을 추정하는 데 적합하지 않음을 시사한다.

따라서, 모의실험 결과는 표본평균 \(\bar{X}\)가 효율성 측면에서 가장 우수한 추정량이며, 절사평균 \(\bar{X}_{tr}\)이 편향성 측면에서 가장 우수한 추정량임을 보여준다. 반면, 첫 번째 표본값 \(X_1\)은 모평균을 추정하는 데 적합하지 않은 것으로 나타났다. 표본 중앙값 \(\mathrm{Med}(X)\)는 효율성과 일치성 모두 중간 정도의 성능을 보였다.

12.4 추정과정

표본 데이터를 수집한 후, 점 추정 또는 구간 추정 방법을 선택한다. 점 추정은 모수의 단일 값을 추정하는 반면, 구간 추정은 모수가 포함될 가능성이 높은 구간을 제시한다.

점 추정에서는 추정량을 계산하고, 불편성, 효율성, 일치성 측면에서 평가한다. 불편 추정량은 평균적으로 모수의 참값과 같고, 효율적인 추정량은 분산이 작다. 일치 추정량은 표본 크기가 커질수록 모수의 참값에 수렴한다.

구간 추정에서는 신뢰구간을 계산하고, 신뢰수준과 구간의 폭을 고려하여 해석한다. 신뢰수준은 반복적인 표본 추출에서 신뢰구간이 모수를 포함할 확률을 나타낸다.

점 추정과 구간 추정의 결과는 가설 검정과 예측에 활용된다. 가설 검정에서는 추정값을 바탕으로 모수에 대한 가설을 검증하고, 예측에서는 추정값을 사용하여 미래 관측값을 예측한다.

표본 데이터 수집을 위해서는 먼저 연구 설계 단계에서 연구 목적과 모집단을 정의하고, 변수를 선정하며 조작적으로 정의해야 한다. 그 다음 표본 설계 단계에서는 표본 추출 방법을 결정하고 표본 크기를 정한다. 이후 데이터 수집 준비 단계에서는 데이터 수집 방법과 도구를 준비하고 예비 조사를 실시한다. 마지막으로 표본 데이터 수집 단계에서 실제로 데이터를 수집한다. 이렇게 수집된 표본 데이터는 이후 추정 과정에서 활용된다.

변수 선정이란 연구 목적에 부합하는 변수를 선택하는 것을 의미한다. 연구자는 연구 질문이나 가설을 바탕으로 관심 있는 특성이나 속성을 나타내는 변수를 선정한다. 선정된 변수는 연구의 핵심 개념을 적절히 반영해야 하며 측정 가능해야 한다.

조작적 정의는 선정된 변수를 실제로 측정 가능한 형태로 정의하는 과정이다. 추상적인 개념을 구체적이고 측정 가능한 형태로 변환하는 것이다. 조작적 정의는 변수의 측정 방법과 척도를 명확히 하여 데이터 수집 일관성과 신뢰성을 높인다. 예를 들어, “지능”이라는 변수를 “IQ 검사 점수”로 조작적으로 정의할 수 있다.

변수 선정과 조작적 정의는 상호 보완적인 과정이다. 변수 선정 시 해당 변수의 조작적 정의 가능성을 고려해야 하며, 조작적 정의는 선정된 변수의 개념적 특성을 충실히 반영해야 한다.

변수 잘된 조작적 정의 사례 잘못된 조작적 정의 사례
학업 성취도 학기말 시험 점수 출석률
신체 활동량 일일 평균 걸음 수 하루 중 앉아있는 시간
우울감 벡 우울증 척도(BDI) 점수 하루 중 우는 횟수
표 12.1: 조작정 정의 사례

학업 성취도로 학기말 시험 점수는 학업 성취도를 직접적으로 측정할 수 있는 지표가 되지만, 출석률은 학업 성취도와 어느 정도 관련이 있을 수 있으나 직접적인 측정 지표로 보기는 어렵다.

신체 활동량으로 일일 평균 걸음 수는 실제 신체 활동량을 직접 측정할 수 있는 지표가 되지만, 하루 중 앉아있는 시간은 신체 활동량의 부재를 간접적으로 나타낼 뿐 실제 신체 활동량을 측정하지는 못한다.

우울감으로 벡 우울증 척도(BDI) 점수는 우울감을 평가하는 신뢰도와 타당도가 높은 도구가 될 수 있으나, 하루 중 우는 횟수는 우울감을 나타내는 한 가지 증상일 수는 있으나 우울감을 포괄적으로 측정하기에는 부적절하다.

“데이터 수집 방법과 도구 준비” 단계에서 데이터 수집 방법은 연구 목적, 변수의 특성, 표본의 특성 등을 고려하여 선택한다. 주요 데이터 수집 방법으로는 설문조사, 면접, 관찰, 실험, 문헌조사 등이 있다. 예를 들어, 인구통계학적 변수와 주관적 인식을 측정하기 위해서는 설문조사가 적합할 수 있고, 행동 변화를 관찰하기 위해서는 관찰이나 실험이 적합할 수 있다.

데이터 수집 도구는 선택한 방법에 따라 준비한다. 설문조사를 위해서는 설문지를, 면접을 위해서는 면접 질문지를, 관찰을 위해서는 관찰 기록지나 체크리스트 등을 준비한다. 이때 도구는 측정하고자 하는 변수를 적절히 반영해야 하며, 신뢰도와 타당도가 확보되어야 한다. 데이터 수집 방법과 도구를 준비할 때는 다음과 같은 사항을 고려해야 한다.

  1. 변수의 조작적 정의와의 일치성: 데이터 수집 방법과 도구는 변수의 조작적 정의에 부합해야 한다.
  2. 표본 특성과의 적합성: 데이터 수집 방법과 도구는 표본의 특성(예: 연령, 교육 수준 등)을 고려하여 선택해야 한다.
  3. 현실적 제약 조건: 시간, 비용, 인력 등의 제약 조건을 고려하여 현실적으로 가능한 방법과 도구를 선택해야 한다.
  4. 윤리적 고려 사항: 데이터 수집 과정에서 연구 참여자의 권리와 복지를 보호할 수 있는 방법과 도구를 사용해야 한다.

“예비 조사 실시” 단계에서는 데이터 수집 전에 예비 조사를 실시하여 데이터 수집 방법과 도구의 타당성과 신뢰성을 검증한다. 예비 조사는 연구 참여자의 특성, 데이터 수집 방법과 도구의 적합성, 데이터 수집 과정의 문제점 등을 사전에 파악하여 데이터 수집의 효율성과 유효성을 높인다. 예비 조사를 통해 데이터 수집 방법과 도구의 개선점을 찾아내고, 데이터 수집 과정에서 발생할 수 있는 문제점을 사전에 대비할 수 있다.

12.5 추정사례

국회의원 여론조사는 국민의 대표를 선출하는 중요한 과정에서 유권자의 의사를 파악하기 위한 핵심적인 수단이다. 따라서 여론조사 결과가 왜곡되거나 편향되면, 이는 선거 결과와 민주주의 과정 전반에 부정적인 영향을 미칠 수 있다. 객관적이고 과학적인 여론조사를 통해 유권자의 의사를 정확히 파악하여 공정한 선거와 대의 민주주의의 건전한 작동을 도모할 수 있다. 이를 위해 표본 설계, 설문 설계, 자료 수집과 분석 등 여론조사의 전 과정에서 객관성과 과학성이 엄격히 유지되어야 한다.

국회의원 여론조사의 작업 흐름은 다음과 같다. 연구 설계 단계에서는 해당 선거구의 만 18세 이상 유권자를 모집단으로 정의하고, 양당 후보자 지지 여부를 변수로 선정한다. 후보 지지 질문에 대한 응답을 변수의 조작적 정의로 설정한다. 표본 설계 단계에서는 층화 무작위 추출을 사용하여 표본을 추출하고, 1,000명의 표본 크기와 3%p의 오차한계를 설정한다.

데이터 수집 준비 단계에서는 전화 여론조사를 수집 방법으로 선택하고, 후보 지지와 인구통계 문항을 포함한 설문지를 설계한다. 30명을 대상으로 예비 조사를 실시하여 설문지를 점검하고 수정한다. 표본 데이터 수집 단계에서 2일 동안 500명을 대상으로 전화 여론조사를 실시하고, 무응답이나 불성실 응답을 제거하는 데이터 전처리 작업을 수행한다.

추정 단계에서는 각 후보의 지지율에 대한 응답 비율을 계산하고, 사후 층화 가중치를 적용하여 표본을 보정한다. 최종적으로 지지율 추정치와 95% 신뢰구간을 계산한다.

그림 12.2: 국회의원 여론조사 작업 흐름
  1. 귀하의 성별은 무엇입니까?
    1. 남성
    2. 여성
  2. 귀하의 연령대는 어떻게 되십니까?
    1. 18-29세
    2. 30-39세
    3. 40-49세
    4. 50-59세
    5. 60세 이상
  3. 귀하의 거주지역(동)은 어디입니까?
    1. 가산동
    2. 나리동
    3. 다람동
    4. 라안동
    5. 마포동
    6. 바당동
    7. 사정동
    8. 아름동
    9. 자이동
    10. 차오동
  4. 귀하의 직업은 무엇입니까?
    1. 회사원
    2. 공무원
    3. 자영업
    4. 전문직
    5. 학생
    6. 주부
    7. 무직
  5. 이번 국회의원 선거에서 어느 후보를 지지하십니까?
    1. A당 후보
    2. B당 후보
    3. 지지 후보 없음
응답자 성별 연령대 거주지역 직업 지지후보
1 남성 30-39세 가산동 회사원 A당 후보
2 여성 50-59세 라안동 주부 B당 후보
3 남성 18-29세 다람동 학생 지지 후보 없음
4 여성 40-49세 바당동 전문직 A당 후보
5 남성 60세 이상 사정동 무직 B당 후보
6 여성 30-39세 아름동 자영업 A당 후보
7 남성 50-59세 차오동 공무원 지지 후보 없음
8 여성 18-29세 마포동 학생 B당 후보
9 남성 40-49세 자이동 회사원 A당 후보
10 여성 60세 이상 나리동 주부 지지 후보 없음

12.5.1 합성 데이터

#> # A tibble: 500 × 5
#>    성별  연령대    거주지역 직업   지지후보      
#>    <chr> <chr>     <chr>    <chr>  <chr>         
#>  1 여성  50-59세   가산동   회사원 B당 후보      
#>  2 남성  50-59세   나리동   학생   B당 후보      
#>  3 여성  30-39세   마포동   자영업 B당 후보      
#>  4 여성  18-29세   가산동   무직   A당 후보      
#>  5 여성  18-29세   나리동   자영업 A당 후보      
#>  6 여성  60세 이상 마포동   학생   B당 후보      
#>  7 남성  18-29세   가산동   자영업 A당 후보      
#>  8 여성  18-29세   마포동   회사원 A당 후보      
#>  9 여성  50-59세   라안동   주부   지지 후보 없음
#> 10 여성  40-49세   가산동   회사원 A당 후보      
#> # ℹ 490 more rows
#| label: fig-shiny-inference-data
#| viewerHeight: 500
#| standalone: true

library(shiny)
library(ggplot2)
library(dplyr)

ui <- fluidPage(
  titlePanel("XX 지역구 여론조사 데이터"),
  sidebarLayout(
    sidebarPanel(
      numericInput("n", "표본 크기", value = 10, min = 1, max = 1000),
      sliderInput("prob_A", "A당 후보 지지율", value = 0.475, min = 0, max = 1, step = 0.01),
      sliderInput("prob_B", "B당 후보 지지율", value = 0.425, min = 0, max = 1, step = 0.01),
      sliderInput("prob_no", "지지 후보 없음 비율", value = 0.1, min = 0, max = 1, step = 0.01),
      actionButton("generate", "데이터 생성")
    ),
    mainPanel(
      tabsetPanel(
        tabPanel("여론조사 데이터", tableOutput("synthetic_data")),
        tabPanel("기술 통계",
                 fluidRow(
                   column(6, tableOutput("descriptive_stats")),
                   column(6, plotOutput("descriptive_plot"))
                 )
        )
      )
    )
  )
)

server <- function(input, output, session) {
  observeEvent(c(input$prob_A, input$prob_B, input$prob_no), {
    probs <- c(input$prob_A, input$prob_B, input$prob_no)
    if (sum(probs) > 1) {
      probs <- probs / sum(probs)
      updateSliderInput(session, "prob_A", value = probs[1])
      updateSliderInput(session, "prob_B", value = probs[2])
      updateSliderInput(session, "prob_no", value = probs[3])
    }
  })

  synthetic_data <- eventReactive(input$generate, {
    set.seed(777)
    probs <- c(input$prob_A, input$prob_B, input$prob_no)
    tibble(
      성별 = sample(c("남성", "여성"), input$n, replace = TRUE),
      연령대 = sample(c("18-29세", "30-39세", "40-49세", "50-59세", "60세 이상"), input$n, replace = TRUE),
      거주지역 = sample(c("가산동", "나리동", "다람동", "라안동", "마포동"), input$n, replace = TRUE),
      직업 = sample(c("회사원", "자영업", "전문직", "학생", "주부", "무직"), input$n, replace = TRUE),
      지지후보 = sample(c("A당 후보", "B당 후보", "지지 후보 없음"), input$n, prob = probs, replace = TRUE)
    )
  })

  output$synthetic_data <- renderTable({
    synthetic_data()
  })

  output$descriptive_stats <- renderTable({
    synthetic_data() %>%
      group_by(성별, 연령대, 거주지역, 직업, 지지후보) %>%
      summarise(빈도 = n()) %>%
      ungroup() %>%
      pivot_wider(names_from = 지지후보, values_from = 빈도, values_fill = 0) |>
      relocate(`B당 후보`, .after = `A당 후보`)
  })

  output$descriptive_plot <- renderPlot({
    synthetic_data() %>%
      ggplot(aes(x = 지지후보, fill = 지지후보)) +
      geom_bar() +
      scale_fill_manual(values = c("A당 후보" = "skyblue", "B당 후보" = "lightgreen", "지지 후보 없음" = "gray")) +
      labs(title = "지지 후보 분포", x = "지지 후보", y = "빈도") +
      theme_minimal()
  })
}

shinyApp(ui, server)

12.5.2 지지율 추정

#> # A tibble: 3 × 2
#>   지지후보       지지율
#>   <chr>           <dbl>
#> 1 A당 후보        0.468
#> 2 B당 후보        0.44 
#> 3 지지 후보 없음  0.092
지지후보 지지율 지지율_하한 지지율_상한
A당 후보 46.8% 42.4% 51.2%
B당 후보 44.0% 39.6% 48.4%
지지 후보 없음 9.2% 6.7% 11.7%

12.5.3 지지율 차이 검정

#> 
#>  2-sample test for equality of proportions with continuity correction
#> 
#> data:  c(votes_A, votes_B) out of c(n, n)
#> X-squared = 0.68177, df = 1, p-value = 0.409
#> alternative hypothesis: two.sided
#> 95 percent confidence interval:
#>  -0.03569224  0.09169224
#> sample estimates:
#> prop 1 prop 2 
#>  0.468  0.440

비율 검정 결과, 검정 통계량인 카이제곱값(\(\chi^2\))은 0.68177이고, 자유도는 1이며, p-값은 0.409 다. 유의수준 0.05보다 크므로, 귀무가설을 기각할 수 없음을 의미한다. 즉, A당 후보와 B당 후보의 지지율에 통계적으로 유의한 차이가 없다고 할 수 있다. 또한, 95% 신뢰 구간은 -0.03569224부터 0.09169224까지의 범위를 가진다. 신뢰구간이 0을 포함하고 있으므로, 두 후보 간 지지율 차이가 통계적으로 유의하지 않다는 것을 뒷받침한다. 표본 추정값을 보면, A당 후보의 지지율은 0.468, B당 후보의 지지율은 0.440으로 나타난다. 비록 A당 후보의 지지율이 B당 후보보다 약 0.028 높게 나타나지만, 이 차이는 통계적으로 유의하지 않다.

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


library(tidyverse)
library(gt)
library(gtExtras)

ui <- fluidPage(
  titlePanel("지지율 추정과 검정"),
  sidebarLayout(
    sidebarPanel(
      numericInput("votes_A", "A당 후보 득표수", value = 51100, min = 0, step = 100), # 경남 창원진해
      numericInput("votes_B", "B당 후보 득표수", value = 50603, min = 0, step = 100),
      numericInput("votes_no", "지지 후보 없음 득표수", value = 1225, min = 0, step = 100),
      selectInput("conf_level", "신뢰수준", choices = c("0.99" = 0.99, "0.95" = 0.95), selected = 0.95),
      radioButtons("alternative", "귀무가설",
                   choices = c("A당 지지율 = B당 지지율" = "two.sided", "A당 지지율 <= B당 지지율" = "greater", "A당 지지율 >= B당 지지율" = "less"),
                   selected = "two.sided"),
      actionButton("run_analysis", "분석 실행")
    ),
    mainPanel(
      tabsetPanel(
        tabPanel("지지율 추정",
                 fluidRow(
                   column(6, tableOutput("support_ratio_table")),
                   column(6, plotOutput("support_ratio_plot"))
                 )
        ),
        tabPanel("지지율 차이 검정",
                 verbatimTextOutput("prop_test_result"),
                 htmlOutput("prop_test_explanation")
        )
      )
    )
  )
)

server <- function(input, output) {
  observeEvent(input$run_analysis, {
    poll_data <- reactive({
      tibble(
        지지후보 = c("A당 후보", "B당 후보", "지지 후보 없음"),
        득표수 = c(input$votes_A, input$votes_B, input$votes_no)
      )
    })

    support_ratio <- reactive({
      poll_data() %>%
        mutate(지지율 = 득표수 / sum(득표수))
    })

    conf_interval <- function(p, n, conf_level) {
      z <- qnorm((1 + conf_level) / 2)
      margin_error <- z * sqrt(p * (1 - p) / n)
      c(p - margin_error, p + margin_error)
    }

    conf_intervals <- reactive({
      support_ratio() %>%
        mutate(conf_int = map2(지지율, sum(poll_data()$득표수), ~ conf_interval(.x, .y, as.numeric(input$conf_level)))) |>
        unnest_wider(conf_int, names_sep = "_") |>
        rename(지지율_하한 = conf_int_1, 지지율_상한 = conf_int_2)
    })

    output$support_ratio_table <- render_gt({
      conf_intervals() |>
        gt() |>
        fmt_percent(columns = c(지지율, 지지율_하한, 지지율_상한), decimals = 1) |>
        cols_align(columns = c(지지후보), align = "center") |>
        gtExtras::gt_theme_538()
    })

    output$support_ratio_plot <- renderPlot({
      conf_intervals() |>
        ggplot(aes(x = fct_reorder(지지후보, 지지율), y = 지지율, color = 지지후보)) +
        geom_point(size = 3) +
        geom_errorbar(aes(ymin = 지지율_하한, ymax = 지지율_상한, color = 지지후보), width = 0.1) +
        labs(x = NULL, y = "지지율", title = "후보별 지지율 추정", subtitle = paste0("(", as.numeric(input$conf_level) * 100, "% 신뢰 구간)")) +
        theme_minimal() +
        theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
              plot.subtitle = element_text(hjust = 0.5, size = 12),
              axis.title = element_text(size = 12),
              axis.text = element_text(size = 11),
              legend.position = "top") +
        coord_flip() +
        scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
        scale_color_manual(values = c("A당 후보" = "blue", "B당 후보" = "red", "지지 후보 없음" = "gray30")) +
        geom_text(aes(label = scales::percent(지지율), x = 지지후보, y = 지지율, color = 지지후보),
                  vjust = -1, size = 3.5, fontface = "bold", show.legend = FALSE)
    })

    observeEvent(input$run_analysis, {
      n <- sum(poll_data()$득표수)
      votes_A <- poll_data()$득표수[1]
      votes_B <- poll_data()$득표수[2]

      prop_test_result <- prop.test(x = c(votes_A, votes_B), n = c(n, n), conf.level = as.numeric(input$conf_level), alternative = input$alternative)

      output$prop_test_result <- renderPrint({
        prop_test_result
      })

      output$prop_test_explanation <- renderUI({
        null_hypothesis <- case_when(
          input$alternative == "two.sided" ~ "A당 지지율 = B당 지지율",
          input$alternative == "greater" ~ "A당 지지율 <= B당 지지율",
          input$alternative == "less" ~ "A당 지지율 >= B당 지지율"
        )

        conf_level_ko <- if (input$conf_level == 0.99) "99%" else "95%"

        hypothesis_result <- case_when(
          prop_test_result$p.value < (1 - as.numeric(input$conf_level)) ~ paste0("(p-value = ", round(prop_test_result$p.value, 3), "로, ", conf_level_ko, " 신뢰수준에서 귀무가설을 기각합니다)"),
          TRUE ~ paste0("(p-value = ", round(prop_test_result$p.value, 3), "로, ", conf_level_ko, " 신뢰수준에서 귀무가설을 기각할 수 없습니다)")
        )

        HTML(paste0("<p>귀무가설: ", null_hypothesis, "</p>", "<p>", hypothesis_result, "</p>", if (input$alternative == "two.sided") paste0("<p>", conf_level_ko, " 신뢰 구간은 [", round(prop_test_result$conf.int[1], 3), ", ", round(prop_test_result$conf.int[2], 3), "]입니다.</p>") else ""))
      })
    })
  })
}

shinyApp(ui, server)

12.6 점추정

통계학에서 추정(estimation)은 표본 데이터를 사용하여 모집단의 특성을 추론하는 과정으로 통계적 추론의 중요한 부분을 차지하며, 전체 모집단을 조사하는 것이 불가능하거나 비용이 많이 드는 상황에서 특히 유용하다. 추정의 주된 목적은 표본 데이터를 기반으로 모수의 값을 추론하는 것이다. 모수(parameter)란 모집단의 특성을 나타내는 값으로, 예를 들면 모평균(\(\mu\)), 모분산(\(\sigma^2\)), 모비율(\(p\)) 등이 있다. 추정 방법에는 점추정(point estimation)구간추정(interval estimation)이 있다.

12.6.1 추정량의 종류

추정에 사용되는 함수를 추정량(estimator)이라고 하며, 표본 데이터를 입력으로 받아 모수의 추정값을 계산한다. 대표적인 추정량으로는 다음과 같은 것들이 있다.

  1. 표본평균(\(\bar{X}\)): 모평균(\(\mu\))의 추정량
  2. 표본분산(\(S^2\)): 모분산(\(\sigma^2\))의 추정량
  3. 표본비율(\(\hat{p}\)): 모비율(\(p\))의 추정량

그림 12.3: 모수, 추정, 통계량, 추정량 관계도

“모집단과 확률분포”는 모집단, 확률분포, 모수의 관계를 나타낸다. 모집단이 특정 확률분포를 따르고, 해당 확률분포의 특성은 모수로 특정된다. 모집단 \(X\)는 확률분포 \(f(x;\theta)\)를 따르고, 모수 \(\theta\)는 확률분포 \(f(x;\theta)\)의 특성을 결정한다.

“표본과 통계량”은 모집단에서 표본을 추출하고, 표본 데이터를 요약 및 기술하는 과정을 나타낸다. 표본은 모집단에서 추출되며, 표본 데이터는 통계량을 사용하여 요약 및 기술된다. 표본 \(X_1, X_2, \ldots, X_n\)은 모집단 \(X\)에서 독립적으로 추출되고, 통계량 \(T\)는 표본 \(X_1, X_2, \ldots, X_n\)의 함수로 다음과 같이 표현된다.

\[T = t(X_1, X_2, \ldots, X_n)\]

“추정과 추정량”은 통계량을 사용하여 모수를 추정하는 과정을 표현한다. 통계량 중 일부는 추정량으로 사용되어 추정에 활용된다. 추정량 \(\hat{\theta}\)은 모수 \(\theta\)를 추정하기 위해 사용되는 통계량으로 추정은 추정량 \(\hat{\theta}\)을 사용하여 모수 \(\theta\)에 대한 정보를 얻는 과정이다.

\[\hat{\theta} = t(X_1, X_2, \ldots, X_n)\]

“추정 결과”는 추정을 통해 얻은 결과와 모수와의 관계를 나타낸다. 추정 결과는 모수에 대한 추론에 사용되고, 점추정은 추정값을, 구간추정은 신뢰구간을 결과로 제공된다. 점추정 추정값은 점추정의 결과로 얻어지는 모수 \(\theta\)의 추정값 \(\hat{\theta}\)이다. 구간추정 신뢰구간은 구간추정의 결과로 얻어지는 구간 \([L(X_1, X_2, \ldots, X_n), U(X_1, X_2, \ldots, X_n)]\)으로 신뢰구간은 모수 \(\theta\)를 포함할 확률이 \((1-\alpha)\)으로 신뢰수준 \((1-\alpha)\)에 따라 신뢰구간이 결정된다. 추정 결과는 모수 \(\theta\) 에 대한 추론에 사용된다.

12.7 사례: 고객 만족도 조사

국내 유명 호텔 체인이 고객 만족도를 조사하기 위해 설문조사를 실시하기로 결정했다. 고객 만족도 점수가 0부터 10까지의 범위를 가지며, 호텔체인 대표는 평균 만족도 점수를 추정하는 데 관심을 갖고 있다. 평균 만족도를 고객 설문조사를 바탕으로 추정해보자.

  1. “모집단과 확률분포”
    • 모집단 \(X\): 호텔을 방문한 모든 고객의 만족도
    • 확률분포: 고객 만족도 \(X\) 0부터 10까지의 이산형 분포를 따르고 모평균을 \(\mu\)라 하면, \(E(X) = \mu\)
  2. “표본과 통계량”
    • 호텔은 지난 한 달 동안 호텔을 방문한 고객 중 500명을 무작위로 선택하여 설문조사를 실시.
    • 표본: \(X_1, X_2, \ldots, X_{500}\), 각 \(X_i\)\(i\)번째 고객의 만족도 점수
    • 통계량:
      • 표본평균 \(\bar{X} = \frac{1}{500}\sum_{i=1}^{500} X_i\)
      • 표본분산 \(S^2 = \frac{1}{499}\sum_{i=1}^{500} (X_i - \bar{X})^2\)
  3. “추정과 추정량”
    • 추정량:
      • 모평균 \(\mu\) 추정량: \(\hat{\mu} = \bar{X}\)
    • 추정:
      • 표본평균 \(\bar{X}\)를 사용하여 모평균 \(\mu\) 추정
      • 모평균 \(\mu\)의 추정량으로 표본평균 \(\bar{X}\)를 사용하는 것은 일반적인 접근 방식이며, 표본평균은 불편성과 일치성을 만족하는 좋은 추정량.
  4. “추정 결과”
    • 점추정
      • 모평균 \(\mu\)의 추정값: \(\hat{\mu} = 8.2\)
    • 구간추정 (95% 신뢰수준)
      • 모평균 \(\mu\)에 대한 신뢰구간: \(\left[\bar{X} - 1.96\frac{S}{\sqrt{500}}, \bar{X} + 1.96\frac{S}{\sqrt{500}}\right] = [7.9, 8.5]\)

점추정 결과, 호텔을 방문한 고객의 평균 만족도 점수는 약 8.2점으로 추정되고, 95% 신뢰구간 추정 결과, 실제 평균 만족도 점수는 7.9점에서 8.5점 사이에 있을 것으로 예상된다.

12.7.1 R 코드

12.8 점추정의 방법

12.8.1 모평균의 점추정

모평균(\(\mu\))은 가장 흔히 추정되는 모수 중 하나다. 모평균의 점추정값으로는 표본평균(\(\bar{X}\))이 사용된다. 표본평균은 수식을 통해 계산된다.

\[\bar{X} = \frac{1}{n}\sum_{i=1}^{n} X_i\]

\(X_i\)\(i\)번째 표본값, \(n\)은 표본의 크기이다.

표본평균은 모평균의 불편추정량이며, 분산은 \(\frac{\sigma^2}{n}\)이다. 따라서 표본의 크기가 커질수록 표본평균의 분산은 작아지고, 모평균에 더 가깝게 추정할 수 있다.

12.8.2 모분산의 점추정

모분산(\(\sigma^2\))의 점추정값으로는 표본분산(\(S^2\))이 사용된다. 표본분산은 다음 수식을 통해 계산된다.

\[S^2 = \frac{1}{n-1}\sum_{i=1}^{n} (X_i - \bar{X})^2\]

표본분산은 모분산의 불편추정량이 아니다. 대신 \(\frac{n-1}{n}S^2\)을 사용하면 모분산의 불편추정량을 얻을 수 있고 불편분산(unbiased variance)이라고 한다.

12.8.3 모비율의 점추정

모비율(\(p\))의 점추정값으로는 표본비율(\(\hat{p}\))이 사용된다. 표본비율은 다음 수식을 통해 계산된다.

\[\hat{p} = \frac{X}{n}\]

\(X\)는 표본에서 특정 범주에 속하는 개체의 수이다. 표본비율은 모비율의 불편추정량이며, 분산은 \(\frac{p(1-p)}{n}\)이다.

12.9 최대우도추정법

최대우도추정법(maximum likelihood estimation, MLE)은 표본 데이터가 관측될 우도(likelihood)를 최대화하는 모수 값을 추정값으로 사용하는 방법이다. 우도 함수(\(L(\theta)\))는 모수 \(\theta\)의 함수로, 표본 데이터가 실제로 관측될 확률을 나타낸다.

MLE에서는 우도 함수를 최대화하는 모수 값을 추정값으로 사용하고 최대가능도 추정량(maximum likelihood estimator)이라고 한다. 최대가능도 추정량은 표본 크기가 클 때 좋은 성질(일치성, 효율성, 충분성 등)을 가진다.