최근 몇 일간 빅데이터 분석에 관해 공부를 시작했다.
혼자서 이곳저곳 기웃거리면서 여러가지 개념들을 접했다.
방대한 양의 지식들이 있었고, 전문성을 요하는 수준까지의 깊이도 필요했다.
따라서 먼저 크게 흐름을 잡아보는 것을 목표로 공부해보았다.
EDA란 탐색적 정보 분석이다.
주어진 정보에 대한 보편적이고 절대적인 규칙, 성질, 논리 같은 것이 있을 수 없다고 가정한다.
따라서, 말 그대로, 특성이라고 할 만한 것들을 탐색해가는 행위를 말한다.
수학적 전제들과, 기법들이 많지만 이 글에서는 큰 흐름만을 정리해두고,
차후에 조금씩 분석해볼 예정이다.
파이썬에서는 데이터 분석을 위한 여러가지 좋은 패키지를 제공한다.
패키지 정리는 나중에 여건이 되면 하기로..!
- numpy : 행렬 연산을 빠르게 처리하기 위한 패키지
- pandas : 스프레드시트와 같이 데이터를 행과 열로 이루어진 테이블(DataFrame/Series)로 사용할 수 있게 한다.
sql 같은 데이터베이스 문법과 비슷한 느낌이 많다.
- seaborn : 데이터 시각화하는 툴을 제공한다.
- sklearn : 모델링 기법(회귀 / 분류 / 군집화 / 차원축소), 모델링을 위한 데이터 최적화, 모델평가 등의 모듈을 제공한다.


EDA의 대략적인 순서는 아래와 같다.
직접 느끼면서 만든 순서라서, 이게 꼭 맞다고 할 수는 없다.
오히려 부족한 부분이 더 많을 듯 하지만 참고만 해보자!
1 | 데이터 가져오기 | 데이터 가공 |
2 | Feature 특성 파악 | |
3 | 이상치 및 결측치 수정 | |
4 | 왜도 및 첨도 수정 | |
5 | Feature Extraction | Feature Engineering |
6 | Feature Selection | |
7 | 모델링 | 모델 만들기 |
8 | 모델 평가 |
1. 데이터 가공
- Data 값 그 자체를 만지는 작업을 포함한다.
- 사전에 생각하고 있던 가정을 검증하는 방향성 안에서 이루어져야한다.
1) 데이터 가져오기
- pandas 패키지를 통해서 로컬 컴퓨터에 있는 파일을 읽어온다.(csv, excel, 등등)
- 또는, 오픈 api의 경우 request 객체로 요청한다.
- pandas 객체에 저장하여 dataFrame의 형태로 관리한다.
- 자료의 개수, feature의 종류, 자료형 등의 개략적인 정보들을 훑어본다.
2) Feature 특성 파악
- 보통 크게 범주형(Category) 데이터와, 연속형(Numeric, Continuous) 데이터, 문자열로 나뉜다.
- 자료의 형식(data type)을 맞게 변경해줘야 한다.(int, float, string, object, category 등)
- 개별 Feature를 시각화 하면서 진행하는 것이 작업에 용이하다.
- 분석하기에 적절하지 않은 형태의 데이터를 파악(이상치, 결측치)
- 데이터의 분포를 파악(왜도 및 첨도)
- 혈압, 키, 몸무게 등과 같은 정보들은 정규분포를 따르기 때문에, 분포를 확인해줘야한다. 눈에 띄게 이상한 분포를 취하고 있다면, ① 손상된 데이터 ② 모집단을 추정하기에 부적합한 데이터 등의 경우를 고려해야한다.
- 목적변수와 독립변수 간 1:1 관계를 주로 분석한다.
3) 이상치 및 결측치 수정
- 이상치는 해당 feature의 분포를 따르지 않는 개별 데이터를 의미한다. 예를 들어 정규분포를 따르는 feature 의 한 데이터가 정규분포곡선 근처가 아닌, 터무니 없이 이상한 곳에 위치하고 있으면 이상치라고 한다. (정규분포 말고도 많다.)
- 다르게 표현하자면, 대부분의 값들을 공통의 특성을 갖고 하나의 feature를 형성한다. 하지만 공통의 특성이 아닌 다른 특성을 갖기 때문에 다른 독특한 값을 갖게되는 경우가 섞여 있을 수 있다.
- 예를 들어보자. 날씨에 따른 물품의 판매량을 알고싶다. 어느날 판매량이 4배 이상 늘었던 날이 있었다고 해보자. 이 때 판매량을 폭발적으로 증가시킨 원인이 날씨가 아니라, 지역마을 축제와 같은 이유라면, '4배'라는 값은 다른 특성값을 갖는 이상치라고 볼 수 있다.
- 이상치를 다루는 방법은 크게 3가지를 봤다. ① 개수가 많지 않으면 해당 레코드를 삭제 ② 4분위수를 이용하여 이상치 제거 ③ 정규분포를 따른다고 할 때, 표준편차의 3배를 넘어가는 범위에 있는 값들을 삭제.
- 하지만 이상치의 값이 너무 많은 경우에는 무턱대고 다 삭제할 수는 없다. 표본의 양이 많아야 모집단을 추정하는데 수월하기 때문이다. 이런 경우에는 이상치 중 일부만 제거하는 등의 조치를 취한다.
- 결측치는 해당 값이 존재하지 않는 경우를 말한다. 0 이나 NaN 으로 채워져있다.
- 평균, 중앙값, 최빈값 등으로 채워 넣는다. 해당 feature의 통계적 특성을 잘 알고 있어야한다.
- 경우에 따라서는 Regression 으로 결측치를 추정하여 채워넣기도 한다.
4) 왜도 및 첨도 수정
- 왜도는 분포가 좌우 대칭인지, 좌로 쏠렸는지, 우로 쏠렸는지에 대한 쏠림의 정도를 값으로 나타낸 것이다.
- log를 씌워주면 정규분포의 형태를 취하게 된다.
- 첨도는 분포가 얼마나 뾰족한지에 대한 정도를 값으로 나타낸 것이다.
- 첨도는 그렇게 중요하게 보는 것 같지는 않았다. 일반적으로 왜도에 대한 수정을 해주었을때는 첨도를 고려하지 않았다. modal 이라는 단어도 알아보면 좋다.
- 무조건적으로 정규분포의 형태로 수정해주는 사람들이 있는데, 그러면 안된다. 해당 feature의 모집단의 분포가 추정가능해야하며, 모집단이 따르는 분포의 형태를 고려해야한다. 분포의 종류는 많다. 정규분포는 기본적으로 random한 현상에 들어맞는다.
이 외에도 스케일링과 같은 기법들을 적용하기도 한다.
(참고로 스케일링은 feature간의 비중을 같게하기 위한 작업을 말한다.)
2. Feature Engineering
- 이 부분을 잘하는 게 핵심인 듯하다.
- 위 과정을 통해 기존의 있던 raw 데이터를 정리하고 잘 정리된 깨끗한 형태의 데이터를 얻었다.
- one-hot-encoding 등의 작업을 통해 feature 변환하기
- 기존의 feature들을 서로 비교하여 상관관계 파악하기
- feature들을 조합하여 새로운 feature를 만들어내기
- 결과에 영향을 주지 않는 feature들을 지우기
등등의 일들을 통해 예측 성능을 향상시키려는 노력을 한다.
3. 모델 만들기
- 지도학습 : 연속된 값을 추정하려면 regression, 참거짓의 문제를 판별하려면 classificasion
- 비지도학습 : clustering 과 같은 기법들.
- 상황에 맞는 모델을 선택하고, 학습을 진행.
- 가장 예측에 잘 맞는 하이퍼파라미터를 찾는다.
- 데이터를 train / validation / test 으로 구분하여 진행
- 모델을 통해 예측한 결과과 적합한지 판별하는 방법들도 있는데, 이는 아직 공부하지 않아서 모르겠다.
크게 대충 이렇게 되는 것 같다.
이 흐름 잡는게,, 생각보다 오래걸렸다.
keggle 의 competition 분석글들을 읽으면서 나타난 공통된 특징이었다.
데이터 분석 재밌다.
흐름을 잡았으니
이제 머신러닝 기법에 대해 슬슬 공부하면서
백엔드 공부 병행해야겠다.
재밌는 아이디어가 있어서 얼른 구현해보고 싶다! 크크