---
title: "Confidence Intervals and Hypothesis Testing"
subtitle: "FMB819: R을 이용한 데이터분석"
author: "고려대학교 경영대학 정지웅"
format: 
  revealjs:
    theme: simple
    transition: fade
    transition-speed: fast
    scrollable: true
    chalkboard: true
    slide-number: true
revealjs-plugins:
  - revealjs-text-resizer 
---


```{r setup, include=FALSE,warning=FALSE,message=FALSE}
options(htmltools.dir.version = FALSE)
knitr::opts_chunk$set(
  message = FALSE,
  warning = FALSE,
  dev = "svg",
  cache = TRUE,
  fig.align = "center"
)

om = par("mar")
lowtop = c(om[1],om[2],0.1,om[4])

library(magrittr)
library(moderndive)
library(dplyr)
library(tidyverse)
library(infer)
library(cowplot)   # plot_grid() 사용을 위해 추가
library(countdown)

library(showtext)

font_add_google("Nanum Gothic", "nanumgothic")
showtext_auto()      # 모든 그래픽 디바이스에 자동 적용

theme_set(
  theme_bw(base_size = 14) +
  theme(text = element_text(family = "nanumgothic"))
)


countdown(
  color_border              = "#d90502",
  color_text                = "black",
  color_running_background  = "#d90502",
  color_running_text        = "white",
  color_finished_background = "white",
  color_finished_text       = "#d90502",
  color_finished_border     = "#d90502"
)

overwrite = FALSE
```

------------------------------------------------------------------------

## Today's Agenda

**Part 1 — 신뢰 구간 (Confidence Intervals)**

-   점 추정치의 한계: 왜 범위가 필요한가?
-   부트스트랩(Bootstrap)을 이용한 신뢰 구간 구축
-   신뢰 구간의 정확한 해석

**Part 2 — 가설 검정 (Hypothesis Testing)**

-   귀무가설과 대립가설
-   순열 검정(Permutation Test)을 이용한 귀무분포 생성
-   p-값과 유의수준: 언제 귀무가설을 기각하는가?
-   검정 오류(Type I / II Error)

> **핵심 질문**: 표본에서 얻은 숫자를 얼마나 믿을 수 있는가? 그리고 두 그룹 간 차이가 "진짜" 차이인가?

------------------------------------------------------------------------

## 표본이 하나뿐이라면?

-   지난 시간: 표본을 ***1,000번*** 반복 추출하여 표본 분포를 시뮬레이션했음.

-   **현실**: 모집단에서 단 ***하나의 표본***만 얻을 수 있음. 비용과 시간 때문.

-   또한, 모집단의 ***진짜 모수***는 알 수 없음.

<br>

> **그렇다면 지난 시간에 한 것은 의미가 없었나?**

-   아니다. 관찰할 수는 없지만 ***표본 분포는 실제로 존재***하며,
    우리는 CLT 덕분에 그것이 어떻게 행동하는지 알고 있음.

-   이제 이 지식을 ***단 하나의 표본***에서 활용하는 방법을 배움.

    -   **신뢰 구간**: 추정값의 불확실성을 범위로 표현
    -   **가설 검정**: "이 차이가 우연인가?"를 확률로 판단

# Confidence Intervals

------------------------------------------------------------------------

## 점 추정에서 신뢰 구간으로

-   지금까지 표본에서 ***점 추정치***만 계산했음: 표본 평균, 표본 비율, 회귀 계수 등.

-   이 ***표본 통계량***은 ***표본 변동성*** 때문에 진짜 모집단 모수와 다를 수 있음.

-   점 추정치 대신, 모집단 모수에 대한 ***가능한 값의 범위***를 제공할 수 있음.

-   이것이 바로 ***신뢰 구간 (Confidence Interval)*** 이 하는 일.

<br>

**비유 — 낚시**

| 방법 | 도구 | 비유 |
|:---|:---:|:---|
| 점 추정 | 작살 | 한 점을 정확히 겨냥 — 맞으면 좋지만 빗나가면 끝 |
| 신뢰 구간 | 그물 | 범위를 감싸서 잡음 — 더 믿을 수 있음 |

> 여기서 "물고기"는 모집단의 참값 $(p)$

------------------------------------------------------------------------

## 신뢰 구간 구축 방법

신뢰 구간을 구축하는 두 가지 주요 접근법:

| 방법 | 원리 | 특징 |
|:---|:---|:---|
| **이론적 접근** | CLT + 수학 공식 | R이 기본으로 사용하는 방식 |
| **시뮬레이션 접근** | 부트스트래핑 (Bootstrapping) | 직관적, 가정이 적음 |

-   오늘은 **시뮬레이션 접근(부트스트랩)** 에 집중하여 개념을 직관적으로 이해.

------------------------------------------------------------------------

## 다시 파스타로: 단 하나의 표본

-   파스타 그릇에서 ***단 하나의 랜덤 표본*** $(n=50)$ 만 얻을 수 있다고 가정.

-   단일 표본으로 표본 변동성을 어떻게 분석할 수 있을까?
    `👉` ***Bootstrap Resampling*** 사용!

```{r, echo = FALSE}
bowl <- read.csv("https://www.dropbox.com/s/qpjsk0rfgc0gx80/pasta.csv?dl=1")

set.seed(1234)

sample_size = 50

my_sample = bowl %>%
  mutate(color = as.factor(ifelse(color == "green","green","non-green"))) %>%
  rep_sample_n(size = sample_size) %>%
  ungroup() %>%
  select(pasta_ID, color) %>%
  arrange(pasta_ID)
```

```{r, echo=TRUE, eval = FALSE}
library(tidyverse)
bowl <- read.csv("https://www.dropbox.com/s/qpjsk0rfgc0gx80/pasta.csv?dl=1")

my_sample = bowl %>%
  mutate(color = ifelse(color == "green","green","non-green")) %>%
  rep_sample_n(size = 50) %>%
  ungroup() %>%
  select(pasta_ID, color)
```

::::: columns
::: {.column width="50%"}
```{r, echo=TRUE}
head(my_sample, 3)
```
:::

::: {.column width="50%"}
```{r, echo=TRUE}
p_hat = mean(my_sample$color == "green")
p_hat
```

이 표본에서 녹색 파스타의 비율: $\hat{p} = `r p_hat`$.

이것이 최선의 추정값이지만, 얼마나 불확실한가?
:::
:::::

------------------------------------------------------------------------

## 부트스트랩 아이디어: 표본에서 표본 만들기

**핵심 아이디어**: 모집단이 없으면, 내 표본을 "모집단처럼" 쓰면 된다.

::::: columns
::: {.column width="50%"}
**부트스트랩 표본 추출 절차**

1.  표본에서 파스타 1개를 무작위 선택 → 색상 기록
2.  선택한 파스타를 표본에 **다시 넣음** (복원추출)
3.  1–2를 반복 → 원래 표본 크기($n=50$)와 동일한 새 표본
4.  새 표본에서 $\hat{p}$ 계산
5.  이 과정을 1,000번 반복 → **부트스트랩 분포**
:::

::: {.column width="50%"}
**왜 복원추출인가?**

-   복원 없이 뽑으면 항상 같은 표본 → 변동성 없음
-   복원 추출이어야 표본마다 조금씩 다른 $\hat{p}$가 생성됨
-   이 변동성이 ***표본 변동성을 근사***함

> 핵심: 부트스트랩은 "단 하나의 표본"으로 표본 분포를 *흉내낸다*.
:::
:::::

------------------------------------------------------------------------

## 표본 재추출(Resampling)하기

::::: columns
::: {.column width="50%"}
-   하나의 부트스트랩 표본 예시

```{r echo=TRUE}
one_bootstrap = my_sample %>%
  rep_sample_n(size = 50, replace = TRUE) %>%
  arrange(pasta_ID)

head(one_bootstrap, 8)

nrow(one_bootstrap)
```
:::

::: {.column width="50%"}
-   같은 `pasta_ID`가 여러 번 등장함 → 복원추출의 특징

```{r echo=TRUE}
mean(one_bootstrap$color == "green")
```

-   원래 표본의 $\hat{p} = `r p_hat`$ 과 조금 다름.

-   이 과정을 1,000번 반복하면 → 매번 조금씩 다른 $\hat{p}$ 를 얻음.

-   이 1,000개의 $\hat{p}$ 분포 = ***부트스트랩 분포***.
:::
:::::

------------------------------------------------------------------------

## 부트스트랩 분포 생성하기

::::: columns
::: {.column width="50%"}
`infer` 패키지로 부트스트랩 수행

```{r, echo=FALSE}
bootstrap_distrib = my_sample %>%
  specify(response = color, success = "green") %>%
  generate(reps = 1000, type = "bootstrap") %>%
  calculate(stat = "prop")

percentile_95ci = get_confidence_interval(bootstrap_distrib, level = 0.95, type = "percentile")
percentile_95lb = percentile_95ci[[1]]
percentile_95ub = percentile_95ci[[2]]
```

```{r, echo=TRUE, eval = FALSE}
library(infer)

bootstrap_distrib = my_sample %>%
  # 관심 변수와 성공 수준 지정
  specify(response = color, success = "green") %>% 
  # 부트스트랩 표본 1,000개 생성
  generate(reps = 1000, type = "bootstrap") %>% 
  # 각 표본에서 녹색 파스타 비율 계산
  calculate(stat = "prop") 
```
:::

::: {.column width="50%"}
부트스트랩 결과 확인

```{r}
head(bootstrap_distrib)
nrow(bootstrap_distrib)
```

1,000개의 $\hat{p}$ 값이 생성됨.\
이 분포를 시각화하면?
:::
:::::

------------------------------------------------------------------------

## 부트스트랩 분포

```{r, echo = FALSE, fig.height = 4.75, fig.width = 8}
boot_distrib_plot = bootstrap_distrib %>%
  ggplot(aes(x = stat)) +
  geom_histogram(boundary = 0.39, binwidth = 0.02, col = "white", fill = "darkgreen") +
  labs(x = "Proportion of green pasta",
       y = "Frequency") +
  theme_bw(base_size = 14)
boot_distrib_plot
```

-   ***부트스트랩 분포***는 ***표본 분포***를 근사하는 역할을 함.
-   분포의 중심은 원래 표본 $\hat{p}$에 가깝고, 퍼짐 정도가 추정의 불확실성을 나타냄.

------------------------------------------------------------------------

## 부트스트랩 분포와 평균

```{r, echo = FALSE, fig.height = 4.75, fig.width = 8}
boot_distrib_plot +
  geom_vline(xintercept = mean(bootstrap_distrib$stat), linetype = "dashed", linewidth = 1) +
  annotate("text", x = 0.375, y = 127, label = "bootstrap distribution mean", size = 4)
```

-   부트스트랩 분포의 평균은 원래 표본 비율 $\hat{p} = `r p_hat`$과 매우 가까움.
-   이제 이 분포에서 ***중앙 95%의 범위***를 신뢰 구간으로 사용하자.

------------------------------------------------------------------------

## 백분위수 방법: 95% 신뢰 구간

-   부트스트랩 분포에서 **중앙 95%**의 값을 사용하여 신뢰 구간 생성.
-   2.5% 및 97.5% 백분위수를 계산:

::::: columns
::: {.column width="50%"}
```{r, echo=TRUE}
quantile(bootstrap_distrib$stat, 0.025)
```
:::

::: {.column width="50%"}
```{r, echo=TRUE}
quantile(bootstrap_distrib$stat, 0.975)
```
:::
:::::

-   **95% 신뢰 구간**: $[`r round(percentile_95lb, 2)`,\; `r round(percentile_95ub, 2)`]$

<br>

**`infer` 패키지로 한 번에 계산**

```{r, echo=TRUE}
ci_95 <- get_confidence_interval(bootstrap_distrib, level = 0.95, type = "percentile")
ci_95
```

------------------------------------------------------------------------

## 95% 신뢰 구간 시각화: 참값 포함 여부

```{r, echo = FALSE, fig.height = 4.75, fig.width = 8}
percentile_95lb = quantile(bootstrap_distrib$stat, 0.025)
percentile_95ub = quantile(bootstrap_distrib$stat, 0.975)

p = mean(bowl$color == "green")

boot_distrib_plot_ci = boot_distrib_plot +
  geom_vline(xintercept = percentile_95lb, linetype = "dashed", linewidth = 1.5) +
  geom_vline(xintercept = percentile_95ub, linetype = "dashed", linewidth = 1.5) +
  annotate("rect", xmin=percentile_95lb, xmax=percentile_95ub, ymin=0, ymax=Inf, fill = "#d90502", alpha=0.4)

boot_distrib_plot_ci +
  geom_vline(xintercept = p, col = "black", linewidth = 1.25) +
  annotate("text", x = 0.56, y = 125, label = "population proportion (p)", size = 4)
```

-   붉은 영역이 95% 신뢰 구간. 실제 모집단 비율 $p$가 구간 내에 포함됨.
-   항상 포함될까? 다음 슬라이드에서 확인.

------------------------------------------------------------------------

## 신뢰 구간의 올바른 해석

```{r, echo=FALSE, fig.width=10, fig.height = 4}
library(purrr)
library(tidyr)
if(!file.exists("../rds/pasta_percentile_cis.rds")){
    set.seed(5)
    
    bootstrap_pipeline <- function(sample_data){
        sample_data %>% 
            specify(formula = color ~ NULL, success = "green") %>% 
            generate(reps = 1000, type = "bootstrap") %>% 
            calculate(stat = "prop")
    }
    
    pasta_percentile_cis <- bowl %>% 
        mutate(color = as.factor(ifelse(color == "green","green","non-green"))) %>%
        rep_sample_n(size = 40, reps = 100, replace = FALSE) %>% 
        group_by(replicate) %>% 
        nest() %>% 
        mutate(sample_prop = map_dbl(data, ~mean(.x$color == "green"))) %>%
        mutate(bootstraps = map(data, bootstrap_pipeline)) %>% 
        group_by(replicate) %>% 
        mutate(percentile_ci = map(bootstraps, get_ci, type = "percentile", level = 0.95))
    
    saveRDS(object = pasta_percentile_cis, "../rds/pasta_percentile_cis.rds")
} else {
    pasta_percentile_cis <- readRDS("../rds/pasta_percentile_cis.rds")
}

percentile_cis <- pasta_percentile_cis %>% 
    unnest(percentile_ci) %>% 
    mutate(captured = `2.5%` <= p & p <= `97.5%`)

ggplot(percentile_cis) +
    geom_segment(aes(
        y = replicate, yend = replicate, x = `2.5%`, xend = `97.5%`, 
        alpha = factor(captured, levels = c("TRUE", "FALSE"))
    )) +
    labs(x = "Proportion of green pasta", y = "Confidence interval number", 
         alpha = "Contains Truth") +
    geom_vline(xintercept = p, color = "#d90502", linewidth = 1, linetype = "dashed") +
    annotate("text", x = 0.47, y = 5, label = "population proportion", col = "#d90502") +
    geom_point(aes(y = replicate, x = sample_prop,
                   alpha = factor(captured, levels = c("TRUE", "FALSE")))) +
    coord_cartesian(xlim = c(0.2, 0.8)) + 
    coord_flip() +
    theme_bw(base_size = 14) +
    theme(panel.grid.major.y = element_blank(), panel.grid.minor.y = element_blank(),
          panel.grid.minor.x = element_blank(),
          legend.position = "top")
```

100개의 신뢰 구간 중 ***약 95개***가 실제 모수 $p$를 포함함.

------------------------------------------------------------------------

## 신뢰 구간 해석

> *해석**: 동일한 방법으로 신뢰 구간을 반복 생성하면, 그 중 **약 95%가 모집단 모수를 포함**할 것으로 기대된다.

<br>

**신뢰 구간의 폭에 영향을 주는 요인**

| 변화 | 구간 폭 | 이유 |
|:---|:---:|:---|
| 신뢰수준 ↑ (95% → 99%) | 넓어짐 | 더 많이 포함해야 하므로 |
| 표본 크기 ↑ | 좁아짐 | 표본 변동성 감소 → $SE$ 감소 |

------------------------------------------------------------------------

## 신뢰구간에서 가설검정으로

-   신뢰 구간은 **"모집단 모수가 어떤 범위에 있을까?"** 라는 질문에 답함.

-   그런데 경영 현장의 질문은 종종 이런 형태:

    -   남성과 여성의 평균 임금 차이가 **통계적으로 유의미**한가?
    -   신제품 출시 후 고객 전환율이 **실제로 올랐는가**, 아니면 우연인가?
    -   A안과 B안 중 어느 쪽이 **진짜 더 효과적**인가?

-   이런 질문에 답하는 도구: ***가설 검정 (Hypothesis Testing)***

<br>

| | 신뢰 구간 | 가설 검정 |
|:---|:---|:---|
| 질문 | 모수의 범위는? | 이 차이가 우연인가? |
| 결과 | 값의 범위 | 기각 / 기각 불가 |
| 활용 | 추정, 불확실성 정량화 | 의사결정, 차이 검증 |

# Hypothesis Testing

------------------------------------------------------------------------

## 은행 승진에서 성차별이 존재하는가?

-   1974년 *Journal of Applied Psychology* 연구: 은행 여직원 차별 여부 조사.

-   48명의 (남성) 관리자에게 **동일한 이력서** 제공, 지원자 이름만 남성/여성으로 구분.

    -   이력서: *"지점장 승진 여부를 결정하는 요청 메모"* 형식.

-   **검증하고자 하는 가설**: 승진에서 성차별이 존재하는가?

::::: columns
::: {.column width="50%"}
실험 데이터: `moderndive` 패키지의 `promotions` 데이터셋

```{r, echo=TRUE}
library(moderndive)
head(promotions)
```
:::

::: {.column width="50%"}
**이 실험이 중요한 이유**

-   이력서 내용이 **동일** → 성별 외 다른 변수 통제
-   즉, 승진 결정의 차이는 오직 **성별 때문**이어야 함
-   오늘날에도 A/B 테스트, 임금 감사 등 동일한 논리 적용
:::
:::::

------------------------------------------------------------------------

## 차별의 증거가 있는가?

::::: columns
::: {.column width="50%"}
성별별 승진 결정 집계

```{r, echo=FALSE}
promotions %>% 
  group_by(gender, decision) %>% 
  tally() %>%
  mutate(percentage = 100 * n / sum(n))
```

-   남성 승진율: **87.5%**, 여성 승진율: **58.3%**
-   차이: **29.2%포인트**

:::

::: {.column width="50%"}
```{r, echo=FALSE, fig.height=8}
ggplot(promotions, aes(x = gender, fill = decision)) +
  geom_bar(width = 0.75) +
  labs(x = "Gender of name on resume",
       y = "Frequency",
       title = "Promotion decision by gender") +
  theme_bw(base_size = 20) +
  theme(legend.position = "top")
```
:::
:::::

> ***핵심 질문***: 이 29.2%p 차이가 성차별의 증거인가, 아니면 **우연**히 발생한 것인가?

------------------------------------------------------------------------

## 가상의 세계: 성차별이 없다면?

-   만약 성차별이 **존재하지 않는** 세상이라면, 승진 결정은 성별과 ***완전히 독립적***이어야 함.

-   이를 시뮬레이션하는 방법: `gender` 변수를 **무작위로 섞어** 재할당.

::::: columns
::: {.column width="50%"}
```{r, echo = TRUE}
promotions %>%
  left_join(promotions_shuffled %>%
              rename(shuffled_gender = gender)) %>%
  head()
```
:::

::: {.column width="50%"}
```{r}
promotions_shuffled %>% 
  group_by(gender, decision) %>% 
  tally() %>%
  mutate(percentage = 100 * n / sum(n))
```

-   무작위로 섞은 후 차이: **4.2%포인트** (원래 29.2%p → 대폭 감소)
:::
:::::

------------------------------------------------------------------------

## 표본 변동성을 고려해야 한다

-   "성차별 없는 세계"에서 한 번 섞었을 때 4.2%p가 나왔음.

-   그런데 **다시 섞으면** 4.2%p가 또 나올까? 아니면 다른 값?

-   표본 변동성 때문에 매번 다른 값이 나옴 → 한 번의 결과만으로 판단 불가.

**우리가 알아야 할 것**:

> 성차별이 **없는** 세계에서, "무작위로 섞었을 때 29.2%p 이상의 차이가 나올 가능성"이 얼마나 되는가?

**방법**: 무작위 재배열을 **1,000번** 반복 → 각 번마다 차이 계산 → 분포 생성.

-   이것이 ***귀무분포 (Null Distribution)*** 임.

------------------------------------------------------------------------

## 가설 검정의 표기법 정의

**두 개의 경쟁 가설**

-   ***귀무가설*** $H_0$: 기본 가설. 일반적으로 "차이 없음", "효과 없음".
-   ***대립가설*** $H_A$: 연구자가 주장하는 가설.

**승진 실험의 가설**

$$H_0: p_m - p_f = 0 \quad \text{(성별 간 승진율 차이 없음)}$$
$$H_A: p_m - p_f > 0 \quad \text{(남성의 승진율이 더 높음)}$$

여기서 $p_m$ = 남성 승진 비율, $p_f$ = 여성 승진 비율.

-   위의 $H_A$는 ***단측 검정 (one-sided test)***: 방향이 있음 ($p_m > p_f$).
-   ***양측 검정 (two-sided test)***: $H_A: p_m - p_f \neq 0$ (방향 무관, 차이만 검정).

------------------------------------------------------------------------

## 핵심 용어 정의

| 용어 | 정의 | 이 예시에서 |
|:---|:---|:---|
| **검정 통계량** (Test statistic) | 가설 검정에 사용되는 표본 통계량 | $\hat{p}_m - \hat{p}_f$ |
| **관측된 검정 통계량** (Observed test statistic) | 실제 데이터에서 관측된 값 | $0.292$ (29.2%p) |
| **귀무분포** (Null distribution) | $H_0$이 참일 때 검정 통계량의 분포 | 1,000번 섞어서 얻은 차이의 분포 |
| **p-값** (p-value) | $H_0$이 참일 때, 관측값이 나올 확률 | 아래에서 계산 |
| **유의수준** (Significance level, $\alpha$) | 귀무가설 기각의 컷오프 기준 | 통상 0.05 |

------------------------------------------------------------------------

## 귀무분포 생성: 1,000번의 무작위 재배열

```{r, echo = FALSE, fig.height = 4.75, fig.width = 8}
set.seed(2)
null_distribution <- promotions %>% 
  specify(formula = decision ~ gender, success = "promoted") %>% 
  hypothesize(null = "independence") %>% 
  generate(reps = 1000, type = "permute") %>% 
  calculate(stat = "diff in props", order = c("male", "female"))

visualize(null_distribution, bins = 10, fill = "darkred") + 
  geom_vline(xintercept = 0.292, linewidth = 1.25) +
  labs(x = "Difference in promotion rates (male - female)", 
       y = "Frequency") +
  xlim(-0.4, 0.4) +
  annotate("text", x = 0.17, y = 485, label = "observed statistic (0.292)", size = 4) +
  theme_bw(base_size = 14) 
```

-   분포의 중심은 **0** 근처: 성차별이 없으면 차이가 0에 가까워야 함.
-   실제 관측값 **0.292**는 분포의 오른쪽 끝에 위치 → 매우 드문 값.

------------------------------------------------------------------------

## p-값 시각화

```{r, fig.height = 4.75, fig.width = 8, echo = FALSE}
obs_diff_prop <- promotions %>%
  specify(decision ~ gender, success = "promoted") %>%
  calculate(stat = "diff in props", order = c("male", "female"))

visualize(null_distribution, bins = 10, fill = "#d90502") + 
  shade_p_value(obs_stat = obs_diff_prop,
                size = 0.5,
                direction = "right", 
                fill = "blue") +
  labs(x = "Differences in sample proportions (male - female)",
       y = "Frequency") +
  xlim(-0.4, 0.4) +
  theme_bw(base_size = 14) +
  geom_vline(xintercept = 0.292, linewidth = 1.25) +
  annotate("text", x = 0.19, y = 485, label = "observed test statistic (0.292)", size = 4)
```

-   **파란 영역** = p-값: $H_0$ 하에서 0.292 이상의 차이가 나올 확률.

------------------------------------------------------------------------

## p-값 계산 및 의사 결정

> ***p-값***: $H_0$이 참일 때, 관측된 검정 통계량과 **같거나 더 극단적인** 값을 관측할 확률.

```{r, echo=TRUE}
p_value <- mean(null_distribution$stat >= 0.292)
p_value
```

-   성차별이 없는 세계에서 $\hat{p}_m - \hat{p}_f \geq 0.292$ 일 확률: **`r 100*p_value`%**

**의사 결정** (유의수준 $\alpha = 0.05$)

| 비교 | 판단 |
|:---|:---|
| p-값 $(`r p_value`)$ $<$ $\alpha$ $(0.05)$ | $H_0$ **기각** |
| 해석 | 29.2%p 차이는 우연이 아닐 가능성이 높음 → 성차별의 통계적 증거 존재 |

> **만약 $\alpha = 0.01$로 설정했다면?** p-값이 0.01보다 작은지 확인 후 동일하게 판단.

------------------------------------------------------------------------

## 검정 오류 (Testing Errors)

-   확률을 다루기 때문에 **오류**를 피할 수 없음.
-   0.292의 차이는 $H_0$ 하에서 *드물지만* **불가능하지는 않음**.

::::: columns
::: {.column width="50%"}
![](../img/photos/gt_error_table_ht.png)
:::

::: {.column width="50%"}
**제1종 오류 (Type I Error)**\
$H_0$이 *참인데* 기각 → **False Positive**\
*예: 실제로 차별이 없는데 "있다"고 결론*

유의수준 $\alpha$로 제어: $\alpha = 0.05$이면\
5% 이하의 확률로만 이 오류를 범함.

**제2종 오류 (Type II Error)**\
$H_0$이 *거짓인데* 기각 못함 → **False Negative**\
*예: 실제 차별이 있는데 "없다"고 결론*

:::
:::::

------------------------------------------------------------------------

## 통계적 추론과 회귀 분석의 연결

-   지금까지 배운 신뢰 구간·가설 검정 = ***통계적 추론 (Statistical Inference)***의 핵심 도구.

-   회귀 분석도 **표본 데이터**를 기반으로 하므로, 동일한 논리가 적용됨:

| 회귀 분석 출력값 | 통계적 추론 연결 |
|:---|:---|
| 회귀 계수 $\hat{\beta}_1$ | 점 추정량 — 표본 변동성에 영향받음 |
| 표준 오차 (Std. Error) | $\hat{\beta}_1$의 표본분포의 표준편차 |
| p-값 (Pr(>\|t\|)) | $H_0: \beta_1 = 0$ 하에서의 p-값 |
| 95% 신뢰 구간 | $\hat{\beta}_1 \pm 1.96 \times SE$ |
| t-값 (t-statistic) | 검정 통계량: $t = \hat{\beta}_1 / SE$ |

> **핵심**: 회귀 계수가 "유의미하다" = p-값 $< \alpha$ = 해당 변수가 결과에 **실제 영향을 미칠 가능성이 높음**.


# THE END!

------------------------------------------------------------------------

## Appendix: `infer` 파이프라인 전체 코드

::::: columns
::: {.column width="50%"}
```{r, echo=TRUE, eval = FALSE}
# 귀무분포 생성
null_distribution <- promotions %>% 
  # 변수와 성공 기준 지정
  specify(formula = decision ~ gender,
          success = "promoted") %>%
  # 귀무가설: 성별과 승진 독립
  hypothesize(null = "independence") %>% 
  # 1,000번 무작위 재배열
  generate(reps = 1000, type = "permute") %>% 
  # 각 재배열에서 p_m - p_f 계산
  calculate(stat = "diff in props",
            order = c("male", "female"))

# 귀무분포 시각화
visualize(null_distribution,
          bins = 10,
          fill = "#d90502") + 
  labs(x = "Difference in promotion rates (male - female)",
       y = "Frequency") +
  xlim(-0.4, 0.4) +
  theme_bw(base_size = 14)
```
:::

::: {.column width="50%"}
```{r, echo = FALSE, fig.height=6}
visualize(null_distribution, bins = 10, fill = "#d90502") + 
  labs(x = "Difference in promotion rates (male - female)", 
       y = "Frequency") +
  xlim(-0.4, 0.4) +
  theme_bw(base_size = 14)
```
:::
:::::
