카테고리를 하나 추가했다. 이유는 최근에 데이터 분석 개인 프로젝트를 진행하면서 크나큰 문제점이 발생함을 느꼈기 때문이다. 그 위험성은 데이터를 분석하면서 방향성에 대한 문제와 관련된 것이었다. 필자는 어떤 일을 수행할 때마다 그에 정해진 하나의 절차 즉, 프로세스를 찾게 된다. 그것을 기준으로 앞으로 어떤 방향으로 나가야할지 방향성을 설정하기 때문이다. 그렇게 암묵적으로 방향을 설정하지 않고 무작정 키보드를 눌러가면서 코딩을 하다가 문득 막다른 길에 다다랐다. 이제 내가 나아가야 할 방향을 설정하고 분석을 진행하기 위해 뛰어난 Kaggle 고수들의 가르침을 받고 기록해보려 한다.
분석하려는 모든 문제의 종류가 동일한 프로세스를 갖진 않을 것이다. 그래서 하나씩 문제 종류에 맞게 포스팅을 해보려 한다. 가장 먼저 소개할 문제의 종류는 Multivariate Regression 즉, 다변량 회귀분석이다.
참고로 이 카테고리에서는 소위 말하는 데이터를 통해 '인사이트'를 도출하는 결과를 관찰하는 것이 아닌 주어진 데이터를 어떻게 탐색하는 공통적인 방법론에 대해 소개한다. 이에 대한 방법론은 Kaggle의 Data exploration notebook을 필자가 직접 우리말로 번역하여 정리한 것임을 미리 알린다.
다변량 분석은 다음과 같은 5가지 절차를 거치면서 진행하게 된다. 하나씩 살펴보면서 구체적으로 어떤 작업을 해보는지 알아가보자.
1. 변수에 대한 이해
2. Univariate인 종속변수에 대한 이해
3. Multivariate인 독립변수들과 종속변수간의 관계 파악
4. 기본적인 데이터 Cleansing
5. 다변량 회귀분석의 가정사항 충족여부 체크
1. 변수에 대한 이해
데이터가 주어지고 가장 우선적으로 해야 할 작업은 "내가 무슨 데이터를 분석할까?" 에 대한 이해이다. '지피지기면 백전불태' 라고, 상대를 알고 나를 알면 백번 싸워도 위험하지 않다. 이것은 데이터를 파악할 때도 똑같이 적용된다. 분석할 데이터가 어떤 변수들로 구성되어 있고 구성된 변수들이 무슨 의미인지 인지하고 있어야 한다.
해당 notebook을 작성한 Kaggler분은 분석하려는 데이터에 대한 명세서로 Spreadsheet 형태로 직접 작성해보는 방법도 추천하고 있으니 자세한 표기방식은 해당 링크를 참고하자.
2. Univariate인 종속변수에 대한 이해
변수들에 대한 이해가 충분히 이루어졌다면 그 중 가장 중요하다고 볼 수 있는 종속변수(Target variable)에 대한 이해가 필요하다. 우선 종속변수의 분포도를 살펴본다. 정규분포가 가장 이상적이며 정규분포 범위에서 벗어난다면 첨도가 어떤지, 왜도가 어느쪽으로 심한지를 관찰하고 추후에 종속변수의 분포를 변형하여 정규분포화를 해주어야겠다는 생각도 마음속으로 미리 해보기도 하자.
다음은 종속변수와 Numeric(수치형) 독립변수간의 Scatter plot(산점도)를 살펴보자. 그리고 종속변수와 Categorical(범주형) 독립변수간의 관계를 파악하기 위해 Box plot을 살펴보기도 하자. 이 때 살펴볼 변수 선정은 1번의 변수에 대한 이해를 기반으로 '주관적인' 해석을 통해 어떤 변수들이 종속변수에 큰 영향을 끼칠 것 같은지 주관적으로 변수를 선정해 그 변수들과의 관계를 살펴보자.
참고로 회귀분석 문제에서 종속변수가 상수값 즉, int형 type이라면 예를 들어, 물가상승률 같은 연속적인 변화량을 일으키는 요인의 영향을 간과할 수도 있다. 하지만 float(실수형)이라면 상관없다.
이렇게 모든 변수들마다 서로의 관계를 그래프로 살펴보는 것은 중요한(right) feature를 선별하는 과정이 될 수 있다. 하지만 주관적인 feature 선정이 개입되었기 때문에 객관적인 분석이라고 할 수 없다. 그렇다면 이제 다변량 변수들간의 객관적인 분석을 수행해보자.
3. Multivariate인 독립변수들과 종속변수간의 관계 파악
여러개로 이루어진 독립변수들과 종속변수간의 관계를 파악하기 위해 변수들간의 상관계수 행렬을 이용한다. 이는 다중 공선성을 발견하기 용이하다. 다중 공선성이란, 쉽게 말해서 변수들간의 상관관계가 존재하는 문제를 말하는데, 이를 제거하지 않고 회귀분석을 수행할 시, 정보 손실이 발생하게 된다.
위와 같이 변수들간의 상관계수를 살펴보고 상관관계가 있는 변수들끼리 다시 Scatter plot을 그려보면서 자세히 관찰해본다. 이 때 기억해야 할 한 가지가 있다. 변수가 여러개가 존재하면 그 중에서 몇 개의 변수들은 서로 비슷한 의미를 부여하는 변수들일 수 있다. 예를 들어, '차고(garage)의 넓이'를 나타내는 변수와 '차고가 수용할 수 있는 차 대수' 변수가 의미하는 바는 비슷함을 알 수 있다. 따라서 앞서 들은 예시처럼 비슷한 의미를 부여하고 있는 변수들이 존재할 시 그 중 종속변수와 가장 상관관계가 높은 변수를 제외한 나머지 변수는 삭제하는 것이 좋다.
참고로 만약 여러가지 변수를 관찰하던 중 시간과 관련된 변수가 등장한다면 한편으로 '시계열 분석' 가능성도 염두에 둔다. 또한 여러 변수가 존재할 때 일일이 하나의 Scatter plot을 그리기 귀찮을 것이다. 이 때는 Seaborn의 pairplot을 이용해 마치 상관관계 행렬처럼 만들어서 쉽게 시각화가 가능하다. 이와 같은 분석을 하면서 이상치를 관찰해볼 수도 있다.
4. 기본적인 데이터 Cleansing
기본적인 클렌징은 2가지로 결측치(missing value) 처리와 이상치(outlier) 처리이다. 먼저 결측치 처리에 대해 알아보자.
4-1. 결측치 처리
결측치를 맞닥뜨렸을 때 가장 처음엔 다음과 같은 2가지 사항을 확인해보자.
- 첫 번째, 결측치가 널리 만연하게 퍼져있는가?
- 두 번째, 결측치가 무작위로 분포되어 있는가 아니면 일정한 패턴을 갖는가?
그리고 결측치 존재 원인을 알아내기 이전에는 결측치는 편향된 값이 아니며 무엇인가 내재된 진실을 숨기고 있다고 생각하는 것이 좋다. 그래야 무턱대고 결측치를 삭제해 불상사를 일으키는 문제를 예방할 수 있다.
그리고 만약 결측치가 총 데이터 개수의 15% 비율을 넘는 수치이며 결측치를 갖고 있는 변수가 종속변수에 큰 영향을 미치지 않는 변수라면 과감히 삭제하자. 이 때 종속변수에 큰 영향을 미치지 않는 변수라는 판단은 1,2,3번 단계를 거치면서 이미 판단이 내려져 있을 것이다.
이것은 결과론적인 이야기지만, 결측치는 보통 종속변수에 큰 영향을 미치지 않기 때문에 결측치가 발생한다는 육감(?)도 도출해볼 수 있다..
또한 동일한 결측치 개수를 갖고 있는 여러 변수들이 존재하고 이 변수들이 비슷한 의미를 갖고 있는 변수들이라면 이 때도 그 변수들 중 종속변수에 가장 큰 영향을 미치는 변수만을 남기고 나머지는 과감히 삭제한다. 마지막으로 결측치가 존재하는 독립변수들 중 어떠한 다른 변독립변수와 큰 상관관계를 갖고 있을 때도 삭제를 고려해보아야 한다. 왜냐하면 다중공산성 문제를 일으킬 가능성이 농후하기 때문이다.
4-2. 이상치 처리
Scatter plot이나 Box plot을 그려 이상치 존재를 확인한다면 이상치 데이터를 삭제해버리고 싶은 본능적인 욕구(?)를 느껴본 적이 많을 것이다. 하지만 이상치를 무조건적으로 부정적으로만 바라보지 말자. 비록 이상치 데이터가 추후 예측 모델 성능에 영향을 미치더라도 귀중한 정보를 담고 있는 데이터들일 수 있기 때문이다.
이상치를 확인하는 방법 중에 Scatter plot이나 Box plot을 그려 시각적으로 확인하는 방법도 있지만 이상치가 위와 같이 두드러지게 나타나는 경우가 아닐 때도 있다. 이럴 때는 평균이 0 표준편차가 1인 분포로 Standardization(표준화) Scaling을 적용해 값들의 분포를 관찰해보자. Scaling을 적용한 후 값들의 범위를 살펴보고 표준편차 바깥의 범위에 존재하는 값들을 이상치로 간주해보고 자세히 살펴보자.
5. 다변량 회귀분석의 가정사항 충족여부 체크
(다변량)회귀분석이 가정하고 있는 사항을 충족하는지 체크하는 것은 추후 선형성에 기반하여 만들어진 예측 알고리즘을 적용시에 매우 중요한 포인트로 작용한다. 가정사항에는 어떤 것들이 있고 어떻게 체크하는지 하나씩 살펴보자.
5-1. Normality(정규성)
데이터의 정규성을 확인한다. 물론 일변량 변수가 정규성을 띈다고해서 다변량 모두가 정규성을 보장하진 않는다. 단, 데이터 개수가 200개가 넘어갈 때 데이터의 정규성이 위배되는 것은 크나큰 문제가 되진 않는다. 참고로 오른쪽으로 꼬리가 긴 Positive skewness 분포일 때 log변환으로 쉽게 정규분포화시켜줄 수 있다.
5-2. Homoskedasticity(등분산성)
종속변수가 동일한 분산을 띄는지 살펴본다. 이 종속변수의 등분산성은 잔차항(error term)이 독립변수 값들에 상관없이 일정하도록 해주는 데 필수적인 요소이다. 그럼 이분산성은 어떤 모양일까? 영어로는 conic shape라고도 부르는데, 만약 두 개의 numeric 변수로 이루어진 독립변수, 종속변수간의 Scatter plot을 그려보았을 때 한쪽은 작은 분산, 반대쪽은 큰 분산인 형태를 띈다. 하지만 이분산성은 보통 정규화로 극복이 가능하다.
5-3. Linearity(선형성)
선형성 여부는 파악하기가 상대적으로 쉽다. 바로 두 변수간의 Scatter plot을 그려보면 된다. 만약 선형성이 없다면 변수값들에 변형시도를 해본다.
5-4. Absence of correlated errors(잔차의 상관성)
그야말로 잔차(error)끼리 서로 상관관계가 있는 것을 의미한다.(귀무가설은 잔차의 상관성이 없음을 가정한다.) 잔차 상관성이 위배되는 일은 보통 시계열(Time-series) 데이터에서 자주 발생한다. 아래 그림은 선형성이 존재할 때 잔차의 분포도 이다. 하단의 오른쪽 그림과 같이 잔차가 Random하게 분포되어 있으면 잔차들이 서로 상관관계가 없는 즉, 잔차의 독립성을 만족한다.
지금까지 다변량 회귀분석 문제를 다룰 때 수행해야 할 기본적인 분석 프로세스에 대해 알아보았다. 주어진 데이터에서 어떠한 인사이트를 도출하던 간에 오늘 배워보았던 기본적인 프로세스가 선행되어야 함을 절대 잊지말자.
# Reference : Comprehensive data exploration with Python, Kaggle Notebook, Kaggle
'Data Science > Machine Learning' 카테고리의 다른 글
[ML] Class imbalance 해결을 위한 다양한 Sampling 기법 (0) | 2020.09.20 |
---|---|
[ML] How to correlate one or two categorical variables? (0) | 2020.09.15 |
[ML] Mean Shift, DBSCAN, and Silhouette metric (0) | 2020.08.14 |
[ML] How to encode categorical variables (3) | 2020.07.19 |
[ML] Spectral Clustering(스펙트럴 클러스터링) (4) | 2020.07.10 |