데이터 분석은 대략적으로 3단계를 거친다.
1. 데이터 프로파일링
2. 특성 엔지니어링
3. 모델링
(캐글의 경우 문제상황과 데이터가 주어지므로 문제정의 단계와 데이터 준비 단계는 생략했다.)
이번 포스트부터 첫번째 단계인 데이터 프로파일링에 대해 살펴보자.
데이터를 프로파일링한다는 것은 데이터를 살펴본다는 뜻이다.
요리를 하기 위한 식재료를 찾는 작업이라고 보면 될 것 같다.
재료만 좋으면 반이라도 간다는 말이 있다.
아무리 요리사가 요리실력이 떨어진다고 한들 그 재료가 좋다면 어떻게든 맛은 어느정도 보장된다는 말이다.
허나 반대로 요리사가 최상급의 요리 실력을 가지고 있다고 한들 물러터진 재료를 사용한다면 그 요리는 실패작이 될 수 밖에 없다.
데이터 분석에서 이를 비유하자면 이와 같다.
요리실력 = 모델(알고리즘)
재료 = 데이터
Xgboost, Random Forest 등등 아무리 좋은 모델을 사용한다고 한들 쓸데없는 데이터로 학습시킨다면
좋은 데이터로 학습시킨 단순한 Decision Tree보다 낮은 성능을 보일 것이다.
따라서 데이터 분석의 가장 기본이자 초석은 좋은 재료를 구매하는 능력 즉 좋은 데이터를 선별해내는 능력이다.
그럼 뭘 보고 좋은 데이터를 선별할 수 있는가?
여기에는 많은 평가 척도가 있으나, 그 평가는 주관적으로 이루어진다.
예를 들어 어떤 분석가는 목표변수(타이나닉 생존자 or 사망자)와의 상관계수 값의 절대값이 0.3이하일 경우 의미가 없는 변수라고 판단할 수 있고, 어떤 사람은 0.6이하일 경우 의미가 없다고 판단할 수 있다.
그렇다면 어떤 임계값(Threshold)을 쓰는 것이 옳은가?
결과값이 좋을때의 임계값이 더 좋은 임계값이다. 즉 까보기 전까지 모른다는 것이다.
그럼 임계값을 어떻게 정하는가?
개인적인 선호도에 따라 갈리는 것 같다.
나는 특성이 내가 전부 확인할 수 없을 만큼 많다면 상관계수로 불필요한 특성이 몇개이고 남겨지는 특성이 몇개인지 확인하며 임계값을 정한다.
그 후 어느정도 전체 확인이 가능할 만큼 특성이 남는다면 그때부터 각각의 특성을 자세히 살펴보기 시작한다. (profiling)
예를 들어 81개의 특성을 하나하나 어떤 값들이 있는지, 분포는 어떤지, 결측치는 몇개인지...등등을 전부 확인하려면 너무 많은 시간이 들고 비효율적이다. (시간이 한정적인 경우가 많기 때문에)
이럴 때 1차원적으로 거르는 방법 중 하나가 상관계수이다.
하지만 이책에서 다루는 titanic문제에서 특성 개수는 총 12개이다.
충분히 하나하나 확인할 수 있는 정도이므로 이번 포스트에서는 모든 특성을 프로파일링하고,
상관계수는 추후에 boston house문제에서 다룰 예정이다.
앞에서 전체 특성을 모두 하나하나 살펴보기로 결정했다.
그럼 어떤 것을 살펴봐야하는가?
1. 특성이 무엇을 의미하는지
2. 특성의 값들은 각각 무엇을 의미하는지
- 값의 유형이 무엇인지 (정수, 문자열... -> "정수값을 지원하는 알고리즘이 많기 때문에 타입변환이 필요할 수 있음")
- 값들 사이에 관계가 있는지 (순서 or 비율 or 카테고리형 -> "추후에 원핫인코딩을 적용할지 말지 판단할 때 필요함")
3. 값의 분포가 어떠한지(정규 분포, 한값에 쏠림.... -> "결측치를 어떻게 처리할지 판단할 때 유용함")
4. 나에게 필요한 특성인지
4번이 사실 메인이고 가장 먼저 하는 것이 좋다..
특성이 뭘 의미하는지. 분포가 어떤지.. 모든 것을 살펴봤다고 한들 나에게 필요없는 특성이라면 그저 헛수고일 뿐이다.
그럼 나에게 필요한 특성인지 아닌지 어떻게 판단하는가?
가장 대표적인 것은 목표변수와의 관계를 파악하는 것이다.
(독립 변수끼리의 관계 및 다중공선성 등도 고려해야하지만 이는 추후에 알아보기로 하자.)
어떤 방법으로 그 관계를 파악할 수 있는가?
상관계수를 계산하는 방법도 있겠지만, 너무 단편적이다.
특성과 특성간의 대략적인 관계의 정도는 알 수 있어도, 특성의 고유값들 간의 관계처럼 깊게는 알 수 없다.
예를 들어 Parch(동승 부모, 아이 인원 수)와 Survived의 상관계수의 절대값이 0.8라 하자.
이 값을 근거로 "Parch가 Survived를 예측하는데 좋은 특성이다" 라고 주장하기에는 근거가 부족하다.
하지만 동승자가 3명 이상일 때부터 사망자가 급격히 늘어난 것을 눈으로 본다면?
그제서야 의미있는 특성이라고 강력하게 주장할 수 있는 것이다.
여기서 키워드는 '눈'이다. 즉 시각화해서 직접 확인한다는 것인데
목표변수와 독립변수간의 관계를 어떻게 시각화할까?
타블로같은 시각화 툴을 사용할 수 있지만
파이썬에서는 seaborn 라이브러리 또는 matploblib 라이브러리가 대표적이다.
.
(다음 포스트부터 matplotlib를 활용한 데이터 시각화부터 seaborn까지 차근차근 알아보자.)