LG DX DATA SCHOOL

01/07 확률 분포 (t- 검정 vs 카이제곱 검정 )

getfeelingsfrom 2026. 1. 7. 16:48

t-분포

  • 표본의 크기 nn이 충분히 크다는 것은 표본평균의 분포가 정규분포에 근사한다는 의미를 내포한다.
  • t분포는 형태가 정규분포와 매우 유사하며, 자유도(degree of freedom)가 증가할수록 표준정규분포에 수렴한다.

p-value 

: 귀무가설 H0이 참이라고 가정했을 때,

현재 관측된 검정통계량보다 같거나 더 극단적인 값이 나올 확률이다.

즉,

  • p-value가 작다 → 지금 관측된 결과가 우연으로 보기 어렵다
  • p-value가 크다 → 이 정도 결과는 충분히 우연히 발생 가능

t-분포를 활용한 두 집단의 평균 검정 

두 집단이 독립적일 때 ! ! ( 실험군 <--> 대조군)

합동표준편차 sps_p

: 두 집단이 같은 분산을 가진 하나의 모집단에서 나왔다고 보고

두 표본분산을 표본 크기로 가중 평균한 값

**합동표준편차 sps_p**를 사용하려면 -> 두 모집단의 분산이 동일하다는 등분산 가정이 필요

 

 

 

문제 

t-분포를 따르니까 =>> 뮤는 항상 0 => 두 집단의 평균 차이는 0이다 ! ( 𝑋ˉ - Yˉ =0) == 귀무 가설 !! 

 

getwd()
setwd("C:\\Users\\user\\Desktop\\Rwork")
df <-read.csv("two_sample.csv", header= TRUE)
head(df)
str(df)
summary(df)

결측치가 73개가 있지만, str을 통해 확인한게 300개의 object가 있으므로 없어도 괜찮을 수도 

-> 그치만 어느 한 데이터만 없는거라면 편향될 수도 있으므로 전처리 시 확인해 볼 필요 존재 

 

result<-subset(df, !is.na(score), c(method, score))
str(result)

 

우리가 뽑아야되는거 method- score 그리고, 결측치 없게 

=> subset() 함수를 이용하면 행을 추출할 수 있다 

 

추출할 때 score에 결측치가 아닌 것만 뽑아달라는 의미 (!is.na(score)),

마지막 인수를 컴바인을 통해 method,score만 뽑아달라는 의미 

 

length(result$score)
length(m1$score)
length(m2$score)

m1<-subset(result, method==1)
m2<-subset(result, method==2)

str(m1)
str(m2)
#----------------------------------------
#각 그룹별 통계량 확인 

# 정규성 검정 
#method ==1일 때 정규성 = o
shapiro.test(m1$score)
#m1 p-value = 0.7242 => 0.05보다 크니까 정규성 따름 

#method ==2일 때 정규성 = x
shapiro.test(m2$score)
#m2 p-value = 0.008546 => 0.05보다 작아서 정규성 안 따름 

hist(m1$score)
hist(m2$score)

 

method ==1일 때 p-value = 0.7242 => 0.05보다 크니까 정규성을 만족한다. 

method ==2일 때 p-value = 0.008546 => 0.05보다 작아서 정규성을 만족하지 않는다 

따라서 정규성을 맞춰보자 ! 

-> log를 이용할 수 있다

 

#정규성을 맞춰보자 
#로그 변환 예시 
# 1. 전체 데이터에 대해 로그 변환 (모든 행에 동일하게 적용)
result$log_score <- log(result$score) # 그룹별로 로그 취하는 거 아님 
str(result)
hist(result$log_score)

# 2. 변환된 데이터를 다시 그룹별로 나눔
m1_log <- subset(result, method == 1)
m2_log <- subset(result, method == 2)

hist(m1_log$log_score)
hist(m2_log$log_score)

# 3. 각 그룹에 대해 다시 정규성 검정 수행
shapiro.test(m1_log$log_score)
shapiro.test(m2_log$log_score)

 

 

로그를 적용해버리니 오히려 

method1이 정규성을 만족하지 않고, method2가 정규성을 만족한다

\=> 이 방법은 실패 ㅠㅠ  

 

어떤 데이터는 변환 전 데이터를 사용하고, 어떤 데이터는 변환 후 데이터를 사용하는 이런건 절대 불가능 !

 

 

지금 편차가 일정하지 않아서 -> t-test를 진행할 수 없다 

이상치가 존재할 수도 있다는 이야기 ! 

이럴 경우 위의 사진에서 처럼 중위수를 가지고 검정하는 방법인 wilcox.test()를 진행해야된다. 

=> 중위수로 비모수 추정을 진행하는 셈 

# 순위를 이용한 평균차이 검정
# wilcox.test: "한 집단의 데이터가 다른 집단보다 전반적으로 더 큰 순위에 몰려 있는가?"
wilcox.test(score ~ method, data = result)

 

p-value = 0.1042 > 0.05 -> 귀무가설을 기각할 수 없음 ( 대립가설 채택 불가) 
중앙값 또는 전체 분포의 위치 차이를 비교하는 비모수 검정을 진행한 것인데

이 결과는

  • method 2가 조금 높아 보일 수는 있으나
  • 그 차이가 우연으로도 충분히 발생 가능한 수준

이라고 볼 수 있다. 

 

 

 

문제2

 

1개월 후 = 대응표본 

 

// 코드 넣기 

 

 

 

 

 

 

 

 

//결과 

 

카이제곱 분포 (x^2-분포) 

분산에 대한 분포 

- 모집단의 모분산에 대한 가설 검정

- 두 집단간의 동질성 검정에 활용

- 이 N개의 표본들을 단순히 더하는 것이 아니라 제곱을 하여 더하면 양수값 만을 가지는 분포가 된다

Z값은 표준화된 편차 값 

=> V= Z의 제곱의 합 : 자유도가 높아질 수록 카이제곱 분포도는 그 자유도 평균을 중심으로 종모양의 형태로 구성된다

=> 정상적인 분산 값이라면 저 그래프 위에 있어야한다 

 

 

어느범위까지 오차를 인정해줄 것인지를 설정하는 단계 ( 유의수준 α를 설정하여 귀무가설을 기각할 임계 영역을 정하는 단계)

ㅇ원래 데이터가 정규분포일 때 특징 

= -> 모수 추정, 가설 검정 둘 다 가능 

 

명목형 데이터는 그대로 수치형이 되는 것이 아니라, ‘도수(빈도)’를 수치로 삼아 교차 분석 

 

=> 교차분석 

 

#H1 : 전과 후(각 쌍의 차이값) 가 다르다  

#H0 : 각 개별치의 편차의 평균값은 차이가 없다 -> 평균이 0이라고 주장 가능 

 

모집단 간의 편차가 있을 수도 있으( 존재감)
 기대치부터 평균치를 알

 

 

표본의 분산을 알고 있음ㄴ -> 카이제곱(독립적) -- 명목형 데이터에 적용 == 교차분석 ~ 통상적이라면 

평균 값 알고 있으면, 편차가 중요한지 아닌지 -> T검정 -- 연속형 ( 0.05보다 커야 

내가 가지고 있는 편차의 정상/비정상 찾을 수 있응ㅁ 

 

가설검정 하는 이유 귀무가설이 틀렷길바라면서

 

 

 

 

 

명목형 데이터는 수치형으로 변환되는 것은 아니지만,
범주별 도수(빈도)를 수치로 활용하여 카이제곱 검정을 통해 분석할 수 있다.
이를 교차분석이라 하며, 관측 빈도와 기대 빈도의 차이를 비교한다.
반면 연속형 데이터에서는 평균이나 분산을 중심으로 가설검정을 수행한다.
대응표본의 경우 개인별 차이값을 산출하고,
그 평균이 0이라는 귀무가설을 검정한다.
가설검정의 목적은 관측된 차이가 표본 오차인지,
아니면 모집단 수준의 실제 차이인지를 판단하는 데 있다.  

 

부모 학력 수준과 자녀 진학 여부는 서로 관련(연관) 있는가?

여기서 변수 둘 다 명목형이므로 평균 비교(t-test) 같은 게 아니라 빈도(도수)로 비교하는 교차분석 + χ² 검정을 씀.

위 표에서 '교수법 A이면서 합격한 사람'의 실제 관측값은 40입니다. 
그럼 이 칸의 기대치는 얼마일까요?

install.packages("gmodels")
library(gmodels) # CrossTable() 함수 사용

setwd("C:\\Users\\user\\Desktop\\Rwork")
df <- read.csv("cleanDescriptive.csv", header=TRUE, fileEncoding = "EUC-KR")
df # 확인

summary(df)

x <- df$level2 # 부모의 학력수준 리코딩 변수
y <- df$pass2 # 자녀의 진학여부 리코딩 변수

# 데이터프레임 생성 
result<-data.frame(Level=x, Pass=y) #필드명 : Level, Pass
dim(result) #차원 찾기

#---------------------------
table(result) #도수분포표--> 명목형 데이터에서만 사용 가능 
#카이제곱의 가치를 찾으려면 옵션 추가 필요(chisq= TRUE)
CrossTable(x,y,chisq= TRUE) #교차분석결과표 

#----- 카이제곱 : 빼기-> 제곱 -> 더하기 
# p>0.05 통계학적 유의미성 없다 => 귀무가설 채택 
#카이제곱의 가치를 찾으려면 옵션 추가 필요

# => 상관관계가 없다 -> 독립적이다
#== 카이제곱 따르려면 독립적 (편차가 크지 않다)== 분포도 균질하다 
#교차분석, 독립적 검사, 연관 검사 모두 가능 
# 비즈니스 인사이트 분석 --> 머신러닝 크기 줄이기 위해서

 

χ² 검정은 정확히 뭘 검정하나? (가설)

독립성 검정(=연관성 검정) 기준으로:

  • H₀(귀무가설): 부모 학력과 자녀 진학 여부는 독립이다
  • H₁(대립가설): 두 변수는 독립이 아니다

출력:

  • Chi² = 2.766951
  • df = 2
  • p-value = 0.2507057

유의수준 α=0.05 기준:

  • p = 0.2507 > 0.05
    ➡ 귀무가설을 기각할 수 없음
    ➡ 통계적으로는: 부모 학력과 자녀 진학 여부 사이에 유의한 연관이 있다고 보기 어렵다 


 

t-검정과 카이제곱 검정을 어떻게 분류해서 사용해야할까??

A. 종속변수(결과 Y)가 무엇인가?

  • 숫자(연속형): 점수, 키, 비용, 시간, 만족도 점수(1~10처럼 ‘점수’로 해석)
  • 범주(명목형): 합격/불합격, 남/여, 구매/미구매, 지역(서울/부산…)

B. 비교/관계의 목적이 무엇인가?

  • 평균이 다른가? → t-검정
  • 비율/분포가 다른가? 또는 독립인가? → 카이제곱(χ²) 검정

 


t-검정은 언제 쓰나? (연속형 평균 비교)

쓰는 상황

  • Y가 **연속형(숫자)**이고,
  • “평균이 0(또는 특정 값)과 다른가 / 두 집단 평균이 다른가 / 전후 평균이 다른가”를 볼 때

대표 유형 3개
(1) 단일표본 t-test
예: 우리 반 평균 점수가 5.2인가?

t.test(x, mu = 5.2)



(2) 독립 2표본 t-test (두 집단이 다른 사람들)
예: method1 vs method2 평균 점수 차이

t.test(score ~ method, data = df)  # Welch가 기본(권장)


(3) 대응표본 t-test (같은 사람 전/후)
예: before vs after (같은 학생)

t.test(after, before, paired = TRUE)


t-검정에서 “정규성”은 무엇을 보나?

  • 독립 2집단: 각 집단이 대체로 정규(대표본이면 완화)
  • 대응표본: 차이값(diff = after-before) 이 정규인지 확인

대응 표본 : paired t-검정 ! ! 

 

 

1. 결측 제거(쌍 유지)

result <- subset(df, !is.na(after), c(before, after))
x_before <- result$before
x_after  <- result$after
 
  • after에 NA가 있는 행(학생)은 쌍이 깨지므로 통째로 제거
  • 그래서 100명 중 4명 제거 → 96쌍 남음

 

2. 차이값 생성 

diff <- x_after - x_before
summary(diff)

 

  • mean(diff) ≈ 1.052
  • median(diff) = 1.050
  • 대체로 양수 → after가 before보다 대체로 큼

 

3. 차이값 정규성 검정 

shapiro.test(diff)

 

  • p-value = 0.05705
    • 유의수준 α = 0.05라하면  -> p = 0.05705 > 0.05
    • 정규성을 “기각할 수 없다”
      • 즉, “diff가 정규분포가 아니라고 말할 근거가 부족”
      •  paired t-test를 적용해도 됨
  • 왜 before/ after 정규성이 아니라 diff 정규성을 볼까? : 본질이 두 집단 비교가 아니라 차이값 1개짜리 검정이기 때문

4. paired t-test 실행 

t.test(x_after, x_before, paired = TRUE)

 

  • t = 13.642, df = 95, p-value < 2.2e-16
  • mean difference = 1.052083
  • 95% CI: [0.899, 1.205]

 

5. 가정-검정-결론으로 정리해보자

 

(1) 가정 확인

  • paired t-test 가정: diff 정규성
  • Shapiro: p=0.057 → 가정 위반 증거 없음

(2) 검정 수행

  • paired t-test 결과 p < 2.2e-16

(3) 결론

  • 귀무가설 H0: 평균 차이(=after-before)=0 기각
  • 교수법 적용 후 점수가 유의하게 증가
  • 평균 증가량 약 1.05점
  • 95% CI가 0을 포함하지 않음(0.899~1.205) → 증가가 더 확실

 


카이제곱(χ²) 검정은 언제 쓰나? (명목형 빈도/비율 비교)

 

 

쓰는 상황

  • Y가 **명목형(범주)**이거나,
  • 두 범주형 변수의 독립성(연관성) 또는 분포(비율) 차이를 볼 때

대표 유형
(1) 독립성 검정 (교차분석)
예: 부모 학력(level2)과 합격(pass2)은 관련 있는가?

tab <- table(level2, pass2)
chisq.test(tab)
# 또는
CrossTable(level2, pass2, chisq = TRUE)

 

(2) 적합도 검정
예: 관측 비율이 기대 비율과 같은가?

chisq.test(obs_counts, p = expected_probs)

 

카이제곱 검정의 핵심 조건

  • 셀의 기대빈도(Expected count)가 너무 작으면 정확도가 떨어짐
    (보통 기대빈도 5 미만 셀이 많으면 Fisher 검정 고려)
chisq.test(tab)$expected
fisher.test(tab)  # 2x2 또는 소표본일 때

 

 

 


 

“어떤 걸 써야 하지?”를 즉시 결정하는 체크리스트


① 결과가 숫자(점수/시간/비용)인가?

  • 예 → t-test 계열
  • 아니오(합격/실패/성별/학력 등 범주) → χ² 계열

② 비교 구조는?

  • 한 집단 vs 기준값 → one-sample t-test
  • 서로 다른 두 집단 평균 비교 → two-sample t-test (Welch)
  • 같은 대상 전/후 → paired t-test
  • 두 범주형 변수의 관계 → χ² 독립성
  • 범주 분포가 기대비율과 일치? → χ² 적합도

 


 

 

오늘 내가 확인 데이터를 예시로 기억하면 될 듯 

 

(1) paired_sample.csv (before/after 점수)

  • 결과: 점수(연속형)
  • 구조: 같은 사람 전/후
    → paired t-test
diff <- after - before
shapiro.test(diff)      # 차이값 정규성
t.test(after, before, paired = TRUE)

 

 

(2) cleanDescriptive.csv (level2 vs pass2)

  • 둘 다 범주(학력/합격여부)
    → 교차분석 + χ² 독립성 검정
tab <- table(level2, pass2)
chisq.test(tab)

 

 

R 템플릿 

  • t-test(연속형 평균)
# 독립 두 집단 평균 비교(권장: Welch)
t.test(y ~ group, data=df)

# 대응표본 전후
t.test(after, before, paired=TRUE)

 

  • χ²(명목형 빈도)
tab <- table(x, y)
chisq.test(tab)
chisq.test(tab)$expected  # 기대빈도 확인

'LG DX DATA SCHOOL' 카테고리의 다른 글

01/12 회귀 분석 마무리  (0) 2026.01.12
01/08 가설 검정  (0) 2026.01.08
01/06 가설 검정 (정규 분포, t-분포)  (0) 2026.01.06
01/05 통계 분석의 이해  (1) 2026.01.05
12/31 데이터 시각화 라이브러리  (0) 2025.12.31