아이티윌_데이터 분석 55기/강의내용 필기_통계 및 분석

#9 9일차_교차분석, 변수 선택

ecosso 2026. 4. 23. 16:06

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
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 변수의 제거를 결정하면 안된다.