01 교차분석
-01 적합도 검정
-02 독립성 검정
02 변수 선택
-01 분석
-02 상관관계 분석
-03 카이제곱 통계량
-04 t.test
-05 변수선택 방법
01 교차분석
- 범주형 자료들의 교차빈도를 기반으로 분석하는 기법
- 카이제곱 검정 (모분산 검정시에도 쓰이나, 실무적으로는 교차분석에 가장 많이 사용한다.)
- 적합도 검정, 독립성 검정(동질성 검정)
-01 적합도 검정
- 기대분포와 표본분포가 일치하는가?
- 표본분포가 알려진 기대분포와 일치하는지를 검정
가설)
H0 : 표본분포가 기대분포와 일치한다.
H1 : 표본분포가 기대분포와 일치하지 않는다.
검정통계량)
카이제곱 통계량 = Σ((기대도수 - 실제도수)² / 기대도수) ~ Chisq(k-1)
(k-1)에서의 카이제곱 분포에서 가설검정 진행
| 멘델의 유전법칙 | ||||
| 비율 | 9 | 3 | 3 | 1 |
| 관찰도수 | 100 | 30 | 20 | 10 |
| 기대도수 | 90 | 30 | 30 | 10 |
| x² | 10² / 90 | 0 ² / 30 | 10² / 30 | 0² / 10 |
| = 4.44444.... | ||||
예제) 4개 반을 모집, 각 반의 정원이 모두 동일하였으면 한다.
모집된 인원이 각각 32, 29, 28, 31이라고 할 때 각 반의 정원이 유사하다고 볼 수 있는가?에 대한 유의수준 5% 수준에서의 가설검정 진행
# 가설수립
H0 : 네 반의 정원이 동일하다.
H0 : 네 반의 정원이 동일하지 않다.
# 카이제곱 통계량
Σ((기대도수 - 실제도수)² / 기대도수) ~ Chisq(k-1)
= (32-30)^2/30 + (29-30)^2/30 + (28-30)^2/30 + (31-30)^2/30
= 0.3333333
# 임계값(오른쪽검정)
qchisq(1 - 0.05, df = 3) # 7.814728
기각역 : [7.814728, inf]
채택역 : [0, 7.814728]
=> 카이제곱 통계량이 채택역 내 위치하므로 귀무가설이 채택되었다.
=> 네 반의 정원이 동일하다고 말할 수 있다.
# p-value
P(X² > 0.3333333) = 1 - p(X² < 0.3333333)
= 1 - pchisq(0.3333333, df = 3)
= 0.9536422
# chisq.test
chisq.test(c(32,29,28,31), p=c(0.25, 0.25, 0.25, 0.25))
> chisq.test(c(32,29,28,31), p=c(0.25, 0.25, 0.25, 0.25))
Chi-squared test for given probabilities
data: c(32, 29, 28, 31)
X-squared = 0.33333, df = 3, p-value = 0.9536
-02 독립성 검정
- 두 범주형 변수의 교차빈도를 사용하여 두 변수의 상관관계 유무를 파악하는 검정기법
- 상관관계 여부만 파악 가능, 강도는 확인 불가
H0 : 두 변수는 서로 독립적이다.
H1 : 두 변수는 서로 독립적이지 않다.
* 상관관계 분석시 데이터 타입에 따른 고려사항
1) 수치형 데이터 : 피어슨 상관계수, 공분산(방향)
2) 순서형 : 스피어만 상관계수
3) 범주형 : 독립성 검정 (카이제곱 검정)
4) 수치형 - 범주형 : 두 독립집단에 대한 모평균 가설검정(t-test)
검정통계량)
카이제곱 통계량 = Σ((기대도수 - 실제도수)² / 기대도수) ~ Chisq((k-1),(r-1))
* k : 첫번째 범주의 수
r : 두번째 범주의 수
예제) 성별별 통신사 선호도 차이
| SKT | KT | LGU | 총계 | |
| 남자 | 100 | 80 | 20 | 200 |
| 여자 | 120 | 60 | 10 | 190 |
| 220 | 140 | 30 | 390 |
# 통신사와 관계없이 남자의 경우 200/390으로, 여자의 경우 190/390이 관찰되었다. (성별에 대한 기대확률)
# 기대확률이 교차표의 형태를 가지게 되면 마진값이 가지고 있는 전체 중의 도수로 확인된다.
# 따라서 우선 성별에 대한 기대확률(마진값 기준)을 구한 뒤 각 통신사/성별별 도수를 구하게 된다.
| SKT(기대도수) | KT(기대도수) | LGU(기대도수) | 총계 | |
| 남자 | 100(220*200/390) | 80(140*200/390) | 20(30*200/390) | 200 |
| 여자 | 120(190*190/390) | 60(140*190/390) | 10(30*190/390) | 190 |
| 220 | 140 | 30 | 390 |
# 카이제곱통계량 (자유도 : (3-1)*(2-1) =2)
(100 - (220*200/390))^2 / (220*200/390) +
(120 - (220*190/390))^2 / (220*190/390) +
(80 - (140*200/390))^2 / (140*200/390) +
(60 - (140*190/390))^2 / (140*190/390) +
(20 - (30*200/390))^2 / (30*200/390) +
(10 - (30*190/390))^2 / (30*190/390)
# 7.757348
# 임계값
qchisq(1-0.05, df =2) # 5.991465
# 기각역 : [5.991465, inf]
# 채택역 : [0, 5.991465]
# => 귀무가설 기각! 성별별 통신사의 선호도 차이는 유의하게 발생하는 것으로 보인다.
# 유의확률
P(X^2 > 7.757348) = 1 - P(X^2 < 7.757348)
= 1 - pchisq(7.757348, df = 2)
= 0.02067823 < 0.05 => 귀무가설 기각
* 교차표 만들기
df1 <- data.frame(수=c(100,80,20,120,60,10),
성별=c(1,1,1,2,2,2),
통신사=c(1,2,3,1,2,3))
> df1
수 성별 통신사
1 100 1 1
2 80 1 2
3 20 1 3
4 120 2 1
5 60 2 2
6 10 2 3
tab1 <- xtabs(수 ~ 성별 + 통신사 , data= df1)
> tab1
통신사
성별 1 2 3
1 100 80 20
2 120 60 10
# 독립성 검정일때는 교차표를 만들어 사용하면 된다.
chisq.test(tab1, correct = F)
* correct 옵션은 연속성 보정 여부 : 이산형 자료를 강제적으로 연속형 자료로 근사하여 추정하는 과정에서 보정
(유의확률을 조금 크게 보정한다.)
특히 2 X 2 교차표일 때 (도수가 5보다 작은 소표본일 경우) 가급적 연속성 보정을 하는 것이 좋다.
예제는 2 X 3으로 correct = F 로 설정하여 본래 유의확률 계산을 진행하였다.
> chisq.test(tab1, correct = F)
Pearson's Chi-squared test
data: tab1
X-squared = 7.7573, df = 2, p-value = 0.02068
[ 연습문제 - 독립성 검정 ]
타이타닉 데이터를 사용하여 성별, 생존여부 변수의 상관관계가 있는지를 5% 가설검정
H0 : 서로 독립적이다.
H1 : 서로 독립적이지 않다.
# 성별, 생존여부만 추출
df1 <- margin.table(Titanic, c('Sex', 'Survived'))
> df1
Survived
Sex No Yes
Male 1364 367
Female 126 344
# 카이제곱 통계량 (자유도 : (2-1)*(2-1) = 1)
(1364 - (1490*1731/2201))^2 / (1490*1731/2201) +
(126 - (1490*470/2201))^2 / (1490*470/2201) +
(367 - (711*1731/2201))^2 / (711*1731/2201) +
(344 - (711*470/2201))^2 / (711*470/2201) # 456.8742
# 임계값
qchisq(1 - 0.05, df = 1) # 3.841459
# 기각역 : [3.841459, inf]
# 채택역 : [0, 3.841459]
# 유의확률
P(X^2 > 456.8742) = 1 - P(X^2 < 456.8742)
= 1 - pchisq(456.8742, df = 1)
= 0.0000.... <<< 0.05 => 귀무가설 기각
# chisq.test
chisq.test(df1, correct = T)
> chisq.test(df1, correct = F)
Pearson's Chi-squared test
data: df1
X-squared = 456.87, df = 1, p-value < 2.2e-16
[ 문제풀이 ]
apply(df1, 1, sum)
apply(df1, 2, sum)
sum(df1)
## 교차표
# Survived
# Sex No Yes 총합 기대확률
# Male 1364 367 1731 1731/2201
# Female 126 344 470 470/2201
# 총합 1490 711 2201
## 기대도수
# Survived
# Sex No Yes
# Male 1171.826(1490*1741/2201) 599.1736(711*1731/2201)
# Female 318.1736(1490*470/2201) 151.8264(711*470/2201)
# 검정통계량
(1364 - 1171.826)^2 / 1171.826 +
(126 - 318.1736)^2 / 318.1736 +
(367 - 599.1736)^2 / 599.1736 +
(344 - 151.8264)^2 / 151.8264 # 456.8745
# 임계값
qchisq(1 - 0.05, df = 1) # 3.841459
# 기각역 : [3.841459, inf]
# 채택역 : [0, 3.841459]
# => 귀무가설 기각 : 서로 독립적이지 않다 - 성별과 생존확률은 관계가 있다.
# 유의확률
P(X^2 > 456.8745) = 1 - P(X^2 < 456.8745)
= 1 - pchisq(456.8745, df = 1)
= 0
# chisq.test
result <- chisq.test(df1, correct = F)
result$expected
> chisq.test(df1, correct = F)
Pearson's Chi-squared test
data: df1
X-squared = 456.87, df = 1, p-value < 2.2e-16
* 기대도수 확인하기
> result$expected
Survived
Sex No Yes
Male 1171.8264 559.1736
Female 318.1736 151.8264
* 기대도수의 경우 어느 범위에서 가장 크게 차이가 벌어졌는지에 대한 부분도 확인 가능 (각 구간별 잔차확인)
* 모집단에 대한 오차를 오차라고 표현, 내가 샘플로 뽑은 표본집단에 대한 오차를 잔차라고 표현하나 참고로 알아두기만 하면 됨
> result$residuals
Survived
Sex No Yes
Male 5.613865 -8.126814
Female -10.773618 15.596240
# 모자이크 플롯
- 두 범주의 자료의 빈도를 시각화
mosaicplot(df1, # 플롯
col = T)

02 변수 선택
- 모델링 전 변인 연구시 종속변수 <-> 설명변수와의 관계 파악!
-01 분석
1) 머신러닝
1-1) 예측분석 = 지도학습 (X -> Y)
- 예측할 대상이 존재하는 유형의 분석 기법
- 여러 요인(X, 설명변수, 독립변수)으로 Y를 설명, 예측하는 분석
- 예측대상(Y) : target, 종속변수, 결과변수
(1) 회귀분석 : Y가 수치형(연속형, 이산형)인 경우
ex) 내년 매출 예측, 아들의 키 예측, 주택 가격 예측 등
(2) 분류분석 : Y가 범주형인 경우
ex) 수술 후 생존여부 예측, 이탈예측, 구매여부 예측 등
1-2) 비지도학습
- 종속변수가 존재하지 않는 기계학습 기법
- 군집분류(군집분석), 장바구니 분석(연관분석)
2) 데이터 마이닝
- 예측할 대상이 존재하지 않는 형태의 분석
- 데이터로부터 유의미한 정보를 얻는 작업
ex) 경제가 어려울수록 여성의 미니스커트 구매 비율 상승
-02 상관관계 분석
- 두 변수의 상관성(한 변수의 움직임에 따른 또 다른 변수의 특이점이 발견)
1) 산점도
2) 공분산 (공통분산 : 한 쪽이 증가하면 다른 한 쪽도 증가 혹은 감소 추세가 있는가) : 상관관계 방향 파악, 크기 확인 불가
3) 피어슨 상관계수 : 선형 상관관계 파악
-1 < r < 1로 추정되므로 절댓값이 1에 가까울수록 상관관계가 크다라는 해석 가능
4) 스피어만 상관계수 : 순서형 변수끼리의 상관관게 파악 , 비선형 상관관계 파악
5) 상관관계 분석 : 확률적으로 상관관계가 있고 없음을 가설검정
-03 카이제곱 통계량
- 범주형-범주형 변수의 독립성 검정을 통해 두 변수의 독립성 여부를 확인
ex) 1년 내 퇴사여부 예측 모델링 시 (분류분석)
성별, 연령대(20대, 30대, 40대, 50대, 60대 이상) 변수가 의미가 있는지?
→ 성별 vs 퇴사여부 독립성 검정
→ 연령대 vs 퇴사여부 독립성 검정
-04 t.test
- 수치형-범주형 변수의 독립성 검정을 통해 두 변수의 관계 확인
ex) 경력과 퇴사여부의 관계 파악
| 퇴사를 한 집단 | 퇴사를 하지 않은 집단 |
| 경력의 평균 1 | 경력의 평균 2 |
| > 두 모평균의 차이가 유의미하게 발생하는가? | |
-05 변수선택 방법
1) 필터 기법
- 변수 하나씩 종속변수와의 관계를 파악하는 방식
- 상관계수, 카이제곱 통계량(교차분석), 피셔의 정확검정(독립성 검정 시 기대도수가 5 이하일 때 수행)
- 정보소득(Information Gain, IG) : 의사결정나무에서 변수 중요도 계산 시 사용 (분류분석일때만 사용한)
2) 래퍼 기법
- 모델에 여러 변수를 동시에 고려하여 그 중 유의한 변수를 선택하는 과정
(1) 전진선택법
- 상수항만 존재하는 모델에서 시작(모든 변수가 없는 상태)하여 가장 중요한 변수를 순서대로 하나씩 추가하는 과정 반복
-> 더 이상 추가 후의 모델의 설명력이 추가 전보다 개선되지 않으면 정지
(2) 후진제거법
- 모든 변수가 삽입된 모델에서 시작, 가장 중요하지 않은 변수 순서대로 하나씩 제거과정을 반복
-> 더 이상 변수 제거 후 모델의 설명력이 제거 전보다 개선되지 않으면 정지
(3) 단계적선택법(stepwise)
- 모든 변수가 삽입된 모델에서 시작, 가장 중요하지 않은 변수 순서대로 하나씩 제거과정을 반복
-> 변수제거 후 이미 제거된 변수의 삽입을 다시 고려(해당 과정을 계속 반복)
-> 더 이상 모델의 설명력 개선이 없을 때까지 계속 반복
3) 임베디드 기법
- 일부 머신러닝 기법을 사용해서 모델 자체가 가지고 있는 변수의 중요도를 토대로 변수를 선택하는 기준을 찾는 기법
- 회귀분석, tree 기반 모델들이 변수의 중요도를 제공함
* 회귀분석 진행 회귀계수의 절댓값의 크기로 상관관계를 판단하며,
각 설명 변수간의 단위, 크기 등이 다른 경우 문제가 발생할 수 있음 -> 표준화, 정규화 작업 필요
* tree 기반 모델은 IG기반으로 변수의 중요도를 측정 (노드간 불순도 차이)
> 트리구조를 가진 분류모델의 목적 - 리프 노드에서 한 분류가 한 집단으로 분류되게 함 (오분류율을 낮추는 것이 목적)
> 따라서 뿌리노드가 불순도가 가장 높으며, 다음 노드로 넘어갔을 때 적절한 질문을 하게 되면 불순도가 크게 낮아진다. 이 gap을 정보소득이라고 한다.
[ 예제 - 종속변수와의 상관관계 파악 ]
install.packages('MASS')
library(MASS)
head(Boston)
# medv : 주택가격
# y가 연속형 : 수치 - 수치 간의 관계를 보기 위함이므로 상관계수를 보아야 한다.
# 스피어만은 순서, 피어슨이 수치
# medv와 crim의 상관관계 확인
cor(Boston$medv, Boston$crim) # 피어슨 상관계수 출력
> cor(Boston$medv, Boston$crim)
[1] -0.3883046
# 상관계수 행렬 출력
cor(Boston)
> cor(Boston)
crim zn indus chas nox rm age dis
crim 1.00000000 -0.20046922 0.40658341 -0.055891582 0.42097171 -0.21924670 0.35273425 -0.37967009
zn -0.20046922 1.00000000 -0.53382819 -0.042696719 -0.51660371 0.31199059 -0.56953734 0.66440822
indus 0.40658341 -0.53382819 1.00000000 0.062938027 0.76365145 -0.39167585 0.64477851 -0.70802699
chas -0.05589158 -0.04269672 0.06293803 1.000000000 0.09120281 0.09125123 0.08651777 -0.09917578
nox 0.42097171 -0.51660371 0.76365145 0.091202807 1.00000000 -0.30218819 0.73147010 -0.76923011
rm -0.21924670 0.31199059 -0.39167585 0.091251225 -0.30218819 1.00000000 -0.24026493 0.20524621
age 0.35273425 -0.56953734 0.64477851 0.086517774 0.73147010 -0.24026493 1.00000000 -0.74788054
dis -0.37967009 0.66440822 -0.70802699 -0.099175780 -0.76923011 0.20524621 -0.74788054 1.00000000
rad 0.62550515 -0.31194783 0.59512927 -0.007368241 0.61144056 -0.20984667 0.45602245 -0.49458793
tax 0.58276431 -0.31456332 0.72076018 -0.035586518 0.66802320 -0.29204783 0.50645559 -0.53443158
ptratio 0.28994558 -0.39167855 0.38324756 -0.121515174 0.18893268 -0.35550149 0.26151501 -0.23247054
black -0.38506394 0.17552032 -0.35697654 0.048788485 -0.38005064 0.12806864 -0.27353398 0.29151167
lstat 0.45562148 -0.41299457 0.60379972 -0.053929298 0.59087892 -0.61380827 0.60233853 -0.49699583
medv -0.38830461 0.36044534 -0.48372516 0.175260177 -0.42732077 0.69535995 -0.37695457 0.24992873
rad tax ptratio black lstat medv
crim 0.625505145 0.58276431 0.2899456 -0.38506394 0.4556215 -0.3883046
zn -0.311947826 -0.31456332 -0.3916785 0.17552032 -0.4129946 0.3604453
indus 0.595129275 0.72076018 0.3832476 -0.35697654 0.6037997 -0.4837252
chas -0.007368241 -0.03558652 -0.1215152 0.04878848 -0.0539293 0.1752602
nox 0.611440563 0.66802320 0.1889327 -0.38005064 0.5908789 -0.4273208
rm -0.209846668 -0.29204783 -0.3555015 0.12806864 -0.6138083 0.6953599
age 0.456022452 0.50645559 0.2615150 -0.27353398 0.6023385 -0.3769546
dis -0.494587930 -0.53443158 -0.2324705 0.29151167 -0.4969958 0.2499287
rad 1.000000000 0.91022819 0.4647412 -0.44441282 0.4886763 -0.3816262
tax 0.910228189 1.00000000 0.4608530 -0.44180801 0.5439934 -0.4685359
ptratio 0.464741179 0.46085304 1.0000000 -0.17738330 0.3740443 -0.5077867
black -0.444412816 -0.44180801 -0.1773833 1.00000000 -0.3660869 0.3334608
lstat 0.488676335 0.54399341 0.3740443 -0.36608690 1.0000000 -0.7376627
medv -0.381626231 -0.46853593 -0.5077867 0.33346082 -0.7376627 1.0000000
# 종속변수와 각 설명변수의 상관계수만 추출
cor(Boston)[, 'medv']
> cor(Boston)[, 'medv']
crim zn indus chas nox rm age dis rad tax
-0.3883046 0.3604453 -0.4837252 0.1752602 -0.4273208 0.6953599 -0.3769546 0.2499287 -0.3816262 -0.4685359
ptratio black lstat medv
-0.5077867 0.3334608 -0.7376627 1.0000000
# '상관계수가 가장 높은 변수' 의 경우 절댓값으로 확인해야한다.
corr_y <- cor(Boston)[, 'medv']
corr_y <- corr_y[-length(corr_y)]
max(corr_y) # rm
max(abs(corr_y)) # lstat
> max(corr_y) # rm
[1] 0.6953599
> max(abs(corr_y)) # lstat
[1] 0.7376627
# 상관계수 크기 순서대로 정렬
sort(abs(corr_y), decreasing = T)
> sort(abs(corr_y), decreasing = T)
lstat rm ptratio indus tax nox crim rad age zn black
0.7376627 0.6953599 0.5077867 0.4837252 0.4685359 0.4273208 0.3883046 0.3816262 0.3769546 0.3604453 0.3334608
dis chas
0.2499287 0.1752602
# 상관계수 시각화
barplot(sort(corr_y), col = 'lightblue', las = 2)

# 음의 상관관계로는 lstat, 양의 상관관계로는 rm이 가장 높음이 알 수 있다.
heatmap(corr)

install.packages('corrplot')
library(corrplot)
# crim : 지역별 범죄율
# zn : 25,000 sqft 이상 대형 주택 비율
# indus : 비소매 상업지역 면적 비율
# chas : 찰스강 인접 여부 (1 = 인접, 0 = 비인접)
# nox : 일산화질소 농도 (대기오염 수준)
# rm : 주택당 평균 방 개수
# age : 1940년 이전 건축된 주택 비율
# dis : 주요 고용 중심지까지 거리
# rad : 고속도로 접근성 지수
# tax : 재산세율
# ptratio : 학생-교사 비율
# black : 흑인 인구 비율 기반 지표 (1000(Bk - 0.63)^2)
# lstat : 저소득층 비율
# medv : 주택 가격 중앙값 (단위: $1000)
corrplot(corr,
method = 'color',
type = 'upper', # 대각행렬 위쪽 출력
addCoef.col = 'black', # 상관계수 숫자 표기
tl.col = 'black', # 변수명 색상
tl.srt = 45) # 글자 기울기

# 만약 범주형 자료인 'chas'
# chas 변수 포함/미포함 여부를 어떻게 결정해야 하는가?
# 상관계수만으로 변수중요도를 파악하면 안 돼! 라는 조언만 들었을 때 가정
# factor : 수치이므로 t.test
y1 <- Boston[Boston$chas == 0, 'medv']
y2 <- Boston[Boston$chas == 1, 'medv']
# 등분산성 가설 검정
var.test(y1, y2)
> var.test(y1, y2)
F test to compare two variances
data: y1 and y2
F = 0.55856, num df = 470, denom df = 34, p-value = 0.009539
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
0.3212709 0.8718106
sample estimates:
ratio of variances
0.5585566
# p-value = 0.009539 로 기각이기 때문에 영가설 기각
# '두 집합의 분산이 같지 않다.'
# 따라서 var.equal = F
t.test(y1, y2, data = Boston, var.equal = F)
t.test(medv ~ chas, data = Boston)
> t.test(y1, y2, data = Boston, var.equal = F)
Welch Two Sample t-test
data: y1 and y2
t = -3.1133, df = 36.876, p-value = 0.003567
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-10.476831 -2.215483
sample estimates:
mean of x mean of y
22.09384 28.44000
=> p-value = 0.003567로 귀무가설이 기각된다.
=> chas는 수치형 데이터가 아니기에 chas에 따라 medv의 평균에 차이가 있는지를 확인하기 위해 t.test를 수행하였으며,
chas와 medv 사이에 유의한 평균 차이가 존재함을 확인하였다.
=> 따라서 변수 중요도 분석에 있어 chas를 고려해야하며, 단순히 상관계수를 보고 chas 변수의 제거를 결정하면 안된다.
'아이티윌_데이터 분석 55기 > 강의내용 필기_통계 및 분석' 카테고리의 다른 글
| #11 11일차_분석 과정, 앙상블 모형, 랜덤포레스트 (0) | 2026.04.27 |
|---|---|
| #10 10일차_분류분석 (0) | 2026.04.24 |
| #8 8일차_가설검정 절차, 문제풀이 (0) | 2026.04.22 |
| #7 7일차_카이제곱검정, F분포, ANOVA (0) | 2026.04.21 |
| #6 6일차_모비율 차이 검정 (0) | 2026.04.20 |