[스크랩] 다중공선성은 생각하지마

2innnnn0·2022년 3월 30일
1

최근에 "전복 나이 예측 컴피티션"에 참가하면서 다중공선성을 찾아보게 되었었는데, 마침 좋은 글이 올라와서 스크랩 해왔다.

전복 나이를 예측하는 피쳐들에서도 전복의 무게를 크게 전체무게, 껍질, 내장, 내장을 뺀 무게로 무게만 4가지의 피쳐를 제공해준다.
잠깐만 생각을 해봐도 무게가 어떤 피쳐이길래 4가지나 주는지 이상하다고 느껴졌는데, 데이터를 탐색해볼때도 보면 너무나 당연하겠지만 무게들간의 상관성은 매우 높게 나온다. (껍질, 내장무게가 클수록 전체무게가 커지는 것...)

요약하면, 다중공선성은 선형회귀 분석에서 타겟에 미치는 인자들의 영향력을 혼란시킬 수 있기 때문에 제거하는 것이다. 바꿔 말하면 예측이 목적이면 제거할 필요가 없다는 이야기. 다중공선성을 무지성으로 빼지마라.


다중공선성은 생각하지마
선형 회귀를 공부하다 보면 꼭 빠지지 않고 나오는 주제 중 하나가 다중공선성입니다. 다중공선성이란 회귀 모델의 독립변수들이 서로 강한 상관 관계를 갖고 있는 상태를 말합니다. 보통 설명자료에서는 선형 회귀 모델은 독립변수들이 서로 독립이어야 한다는 가정이 있는데 이 가정을 위배하기 때문에 문제가 된다고 설명하죠. 그런데 이게 왜 문제가 될 수 있는지나 다중공선성이 있을 때 어떻게 해야하는지에 대한 설명이 대체로 미흡하다 보니 이에 대해 오해하거나 엉뚱한 조치를 취하는 경우를 종종 보곤 합니다.
이를테면, 간혹 데이터 분석 경진 대회 심사에 참여할 때가 있는데 참가팀 중에 아래와 같은 작업내용을 발표하는 경우가 있습니다.

  • 우리는 Y를 예측하기 위해 X1 ~ X100 의 피처를 추출했다. 예측 모델로는 랜덤 포레스트를 이용했는데 피처가 너무 많다고 생각해서 각 변수들 간의 상관 관계를 측정해 봤더니 상관 계수가 0.9 이상인 변수 쌍이 다수 발견되었다. 그래서 다중공선성 문제가 우려된다고 판단하여 이런 변수쌍 중에 하나만 남기는 방식으로 피처의 수를 줄였다.
    위 작업에는 최소한 3가지 오류가 있습니다.
    첫째, 모델링의 목적이 예측인 경우엔 다중공선성을 신경 쓸 필요가 없습니다. 다중공선성이 회귀 모델에 미치는 효과는 크게 두 가지 입니다. 1) 회귀 모델에 어떤 변수가 포함되는지 여부에 따라 특정 변수의 회귀 계수값이 크게 변동할 가능성이 높습니다. 2) 회귀 계수의 표준 오차가 커져서 통계적 유의성에 영향을 줍니다. 이렇듯 다중공선성은 독립변수의 회귀 계수 추정에 영향을 줄 뿐, 종속변수 예측에 영향을 주지 않습니다.
    둘째, 모델링 방식이 선형 회귀가 아니라면 다중공선성을 고려할 필요가 없습니다. 다중공선성은 선형 회귀 모델의 기본 가정을 위배하기 때문에 생기는 문제입니다. 그러니 랜덤 포레스트 같은 다른 기법을 사용한다면 다중공선성을 따질 필요는 없는 것이죠. (좀 더 엄밀히 말하자면, 트리 모델의 경우 각 노드에 사용될 변수를 선택하는 기준에 영향을 줄 수는 있습니다. 하지만 이것 역시 모델의 해석(변수 중요도)에 영향을 줄 뿐 예측 결과 자체에는 영향을 주지 않습니다. 심지어 랜덤 포레스트는 트리 모델이지만 개별 트리는 피처의 일부만 사용하는 특징이 있기 때문에 이런 문제에 영향을 덜 받습니다.)
    셋째, 다중공선성은 '두' 변수 간의 상관계수만 측정해서는 정확히 파악할 수 없습니다. 다시 말해, 다중공선성을 확인하겠다면서 pairwise scatter plot 만 보거나 상관 계수 매트릭스만 측정해서는 안됩니다. 만약 어떤 독립변수가 여러 독립변수들의 선형 결합 관계인 경우라면 (예를 들어 x3 ~ x1 - x2 인 경우) 변수 쌍의 선형계수는 낮더라도 다중공선성이 생길 수 있습니다. 그러니 다중공선성을 확인하려면 상관계수가 아니라 VIF를 측정해야 합니다.
    만약 모델링의 목적이 회귀 계수 추정인 경우엔 어떨까요? 이런 경우라 하더라도 다중공선성은 반드시 없애야 하는 문제가 아니며, 특히 다중공선성을 이유로 무분별하게 변수를 제거해서는 안됩니다.
    대개 우리는 특정 한 두 개의 요인이 종속변수에 미치는 영향력을 추정하기 위해 회귀 분석을 합니다 (모델에 들어간 모든 변수의 회귀 계수를 정확히 측정하려고는 시도는 비현실적인 목표이죠). 다른 변수들은 실제 관심 있는 변수를 정확히 추정하기 위해 보조하는 통제 변수입니다. 이런 통제 변수의 회귀 계수를 정확히 추정할 필요는 없기 때문에 만약 다중공선성이 이런 통제 변수들 사이에서만 발생한다면 역시 신경 쓸 필요가 없습니다 (관심 변수는 빼고 VIF를 측정해 보면 됩니다).
    설령 통제 변수와 관심 변수 사이에 상관성이 높다 하더라도 해당 통제 변수를 제거해야 할지는 VIF값만 보고 판단할 것이 아니라 도메인 지식을 이용해 변수 간의 관계를 확인해야 합니다. 왜냐하면 해당 통제 변수가 관심변수와 종속변수 양쪽에 인과 관계가 있는 교란 변수일 가능성도 있기 때문입니다. 이 변수가 교란 변수라면 설령 독립변수 간에 상관성이 높다 하더라도 함부로 제거해서는 안되겠죠.
    예를 들어 음주량과 흡연량이 암에 미치는 영향을 정량적으로 추정하기 위해 회귀 분석을 한다고 가정해보죠. 마침 내가 관측한 데이터들에서 음주량과 흡연량 간에 상관성이 매우 높다면 이 두 변수 중 하나를 제거하는 것이 옳은 선택일까요? 아마 그렇지 않을 겁니다. 왜냐하면 실제 음주량과 흡연량은 둘 다 암에 인과적 영향을 줄 가능성이 높기 때문이죠. 즉, 이 둘은 서로간에 교란 요인이 되며 심지어 상호 작용 효과가 있을 가능성도 높습니다. 따라서 이런 경우엔 계수의 신뢰도가 낮아지더라도 둘 중 하나를 제거해서는 안될 겁니다.
    제가 생각하기에 다중공선성을 확인하는 목적과 처리 방법은 크게 아래와 같이 세 가지로 정리할 수 있겠습니다.
    첫째, 내가 미처 고려하지 못한 데이터 간의 숨은 관계가 있는 것은 아닌지 확인하는 용도가 될 수 있습니다. 가령 특정 변수의 VIF가 지나치게 높다면 이게 혹시 내가 미처 생각하지 못한 collidor 나 mediator 일 가능성은 없는지 도메인 전문가나 동료 분석가와 같이 논의해 볼 수 있겠죠 (이에 해당한다고 판단되면 그 때 변수를 제거하면 됩니다). 혹은 상관 관계가 높은 변수들을 조합한 파생 변수를 만든 후 대체하는 방법도 생각할 수 있습니다. 이를테면, 게임 캐릭터의 여러 가지 스탯 정보를 이용한 회귀 모델을 만든다면, 이런 스탯들은 보통 서로 상관관계가 높을 겁니다. 그러면 관련성 높은 스탯 정보들을 합해서 '공격 관련 스탯' 이나 '방어 관련 스탯' 이라는 파생변수를 만든 후 기존변수를 대체할 수도 있을 겁니다.
    둘째, 상관 관계를 완화할 수 있는 추가 데이터 확보가 필요한지 여부를 판단하는 용도가 될 수 있습니다. 가령, 위에 음주량과 흡연량이 암에 미치는 영향을 분석하는 사례를 생각해 보면, 지금 관측데이터에는 음주와 흡연을 같이 하거나 아예 둘 다 안 하는 사람들 데이터만 주로 있어서 생긴 문제일 테니, 술을 좋아하는 비흡연자와 술을 안 좋아하는 골초들의 데이터를 추가 확보하면 둘 간의 상관성을 낮출 수 있을 겁니다. 그리고 사실상 이런 데이터를 확보하는 것이 보다 정확한 분석을 위해선 더 적절하겠죠. 보통 학교에서는 고정된 데이터에 대해서 모델을 잘적합시키기 위해 이런 저런 조작을 가하는 방법만 해법으로 제시하는 경우가 많은데 실전에서는 데이터를 추가 확보하는 방법도 충분히 고려할 수 있는 선택지입니다.
    셋째, 그냥 현재 회귀 모델의 한계를 인정하는 방법도 있습니다. 사실상 대개의 경우 회귀 모델은 불완전합니다. 그러니 다중공선성이 있더라도 그냥 모델을 생성한 후 계수의 표준오차가 크다는 점을 과감 없이 보여주는 것이 인위적인 처리를 통해 통계적 유의성을 확보하려는 것보다 더 옳은 선택일 수 있습니다. 학교에서 이렇게 하면 논문을 못 써서 졸업이 힘들 수 있지만 회사에서는 오히려 한계점을 명확히 제시하고 결과를 보여주는 것이 더 좋은 평가를 받을 수 있습니다 (아닐 수도 있구요).
    최근에 분석 업무를 리뷰하던 중에 든 생각을 정리할 겸 좀 길게 적어봤습니다.
profile
성장하고 싶은 데이터분석가.

0개의 댓글