주제
1. 데이터 분석이란?
2. 데이터 분석 프로세스
3. 정규화와 데이터 스케일링
데이터 분석이란?
- 데이터를 정리, 변환, 조작, 검사하여 인사이트를 만들어내는 작업
- 데이터 분석으로 무엇을 할 수 있는가?
- 의사 결정의 판단 기준이 '주관적인 직감'에서 '객관적인 데이터'로
- 데이터 분석을 꼭 해야할까?
- 주어진 데이터로 문제를 해결할 수 있을지 없을지를 가늠하는 것도 데이터 분석
- 어떻게 문제를 해결할지에 대한 고민이 중요
데이터 분석 프로세스
1. 문제 정의
- 풀고자 하는 문제가 명확하지 않으면 데이터 분석은 무용지물
- 큰 문제(main objective)를 작은 단위의 문제들(sub objectives)로 나눈 후
- 각 작은 문제들에 대해 여러 가설을 세우고
- 데이터 분석을 통해 가설 검증, 결론을 도출하거나 피드백 반영
- 궁극적으로 해결하고자 하는 문제(달성하고자 하는 목표)가 무엇인가요?
- 해당 문제를 일으키는 원인이 무엇인가요?
- 상황 판단하는 지표나 기준이 무엇인가요?
2. 데이터 수집
- 검증해보고자 하는 가설을 해결해줄 데이터를 수집
- 가설 검증에 필요한 데이터가 존재하는가?
- 데이터가 가설 검증에 부적절하거나 없을 수 있다
- 어떤 종류의 데이터가 필요한가?
- 데이터는 많고 산재되어있다. 데이터로부터 얻고자하는 정보가 무엇인지 명확하게 해야 필요한 데이터만 모을 수 있다
- 얻고자 하는 데이터의 지표가 명확한가?
- 적절해보여도 지표가 부적절하면 가설 검증 및 결론 도출 시 오류를 범할 수 있다
- 가설 검증에 필요한 데이터가 존재하는가?
3. 데이터 전처리
- 데이터 추출, 필터링, 그룹핑, 조인 등(SQL 및 DB)
- 데이터 분석을 위한 기본적인 테이블을 만드는 단계
- 테이블과 칼럼의 명칭, 처리 / 집계 기준, 조인 시 데이터 증식 방지
- 이상치 제거, 분포 변환, 표준화, 카테고리화, 차원 축소 등(Python, R)
- 수집한 데이터를 분석에 용이한 형태로 만드는 과정
4. 데이터 분석
- 탐색적 데이터 분석(EDA)
- 그룹별 평균, 합 등 기술적 통계치 확인
- 분포 확인
- 변수 간 관계 및 영향력 파악
- 데이터 시각화
- 모델링(머신러닝, 딥러닝)
- Classification(categorical label)
- Regression(numerical label)
- 클러스터링(비지도학습)
5. 리포팅 / 피드백
- 내용의 초점은 데이터 분석가가 아닌 상대방
- 상대가 이해할 수 있는 언어 사용
- 목적을 수시로 상기하고 재확인
- 적절한 시각화 방법 활용
- 항목간 비교 시 원 그래프는 지양, 막대 그래프 위주
- x, y축 및 단위 주의
- 시계열은 라인이나 실선으로 표현
- 분포는 히스토그램이나 박스플롯
- 변수 간 관계는 산점도
정규화와 데이터 스케일링
- 정규화가 필요한 이유 :
- feature : 데이터에서 하나의 인스턴스(sample)가 가진 여러 속성값들을 이용하여 표현이 가능한 것
- 예. 엑셀 테이블에서는 row가 sample, colums가 sample이 가진 속성값을 의미
- feature 간의 크기 및 단위가 일정하지 않거나 가지는 값의 범위가 크게 다른 경우, 혹은 이상치(outlier) 문제가 심각한 경우 데이터 분석이 어려워지거나 머신러닝, 딥러닝 방법을 적용하기 어려워진다.
- 특히, 머신러닝 모델에서는 데이터를 이상하게 해석할 우려가 있다
- 이를 방지하기 위해 정규화와 스케일링을 진행하여 feature값의 범위를 일정하게 맞춰주는 과정이 필요하다
Normalization(정규화)
- 여러 가지 값(feature)들이 가지는 범위의 차이를 왜곡하지 않으면서 범위를 맞추는 것
- Min-Max normalization
- Z-score normalization(Standardization)
- Log scaling
1. Min-Max normalization
- 모든 feature값이 [0,1] 사이에 위치하도록 스케일링하는 기법
- 분모 : feature가 가질 수 있는 최대값과 최소값의 차이
- 분자 : feature값과 최소값의 차이

- feature 간의 variance 패턴은 그대로 유지한 채 스케일링
- variance 패턴 유지? → 만약 A feature와 B feature 사이의 거리는 20m이고, A와 C 사이 거리는 60m라고 했을 때, 스케일링 후에도 2:6이라는 비율은 변하지 않는 것
- 특정 feature만 variance가 매우 큰 경우, 피쳐 간의 스케일링이 데이터 분석에 적절하지 않을 수도 있다
2. Z-score normalization(standardization, 표준화)
- feature 값들이 µ(평균) = 0, σ(표준편차) = 1 값을 가지는 정규분포를 따르도록 스케일링하는 기법

- z(z-score) : feature 값을 평균값으로 뺀 후 표준편차값으로 나눈 값
- z-score가 ±1.5σ, ± 2σ를 벗어나는 경우 해당 데이터를 이상치로 간주하고 제거할 수 있다
- outlier 문제에 상대적으로 robust한 스케일링 방법
- robust : 문제가 발생해도 영향을 적게 받는다는 뜻
- 단점 : min-max처럼 feature 값이 가지는 최소값-최대값 범위가 정해지지 않는다
- 대부분의 머신러닝 기법을 활용하는 경우, input에 표준화를 적용해야 하는 경우가 많다
3. Log 스케일링
- feature 값들이 exponential한 분포(positive skewed)를 가지는 경우 feature 값들에 log 연산을 취하여 스케일링하는 기법
- exponential : 수치가 빠르게 증가하는 것(지수)

- 비슷하게 square root 연산을 취하거나, 반대의 분포를 가지는 경우 power / exponential 연산을 통해 스케일링한다
- 다양한 스케일링을 통해 정규분포에 가까워지도록 하고, outlier 문제에도 더 적극적으로 대응이 가능하다
- positive skewed?
- skewness : 왜도를 뜻하며, 데이터의 분포가 한쪽으로 쏠린 것을 의미
- positive skew : 왼쪽에 데이터가 많은 형태(그림의 맨 왼쪽)
- negative skew : 오른쪽에 데이터가 많은 형태(그림의 맨 오른쪽)
- 일반적으로 skewness(왜도)값이 -2 ~ +2는 치우침이 없능 데이터라고 함

실습
- 타이타닉 데이터셋을 이용하여 다양한 정규화 기법 실습
- 데이터중 age와 fare만을 사용
import numpy as np
import pandas as pd
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
# scaling에 필요한 모듈 임포트
from sklearn.preprocessing import MinMaxScaler, StandardScaler
# titanic 데이터셋 로드
df = sns.load_dataset('titanic')
df = df.loc[df['age'].isna()==False].reset_index(drop=True)
- 우선 age의 히스토그램
df['age'].hist(bins=30)

- fare의 히스토그램
df['fare'].hist(bins=30)

1. Min-Max normalization을 한 모습
scaler = MinMaxScaler()
df['fare_minmax'] = scaler.fit_transform(df['fare'].values.reshape(-1, 1))
df['age_minmax'] = scaler.fit_transform(df['age'].values.reshape(-1, 1))
df['fare_minmax'].hist(bins=30)
df['age_minmax'].hist(bins=30)


- 스케일링 전 히스토그램과 비교해보면 variance가 동일한 것을 볼 수 있다.
2. Standardization
- z-score 스케일링 실시
scaler = StandardScaler()
df['fare_standard'] = scaler.fit_transform(df['fare'].values.reshape(-1, 1))
df['age_standard'] = scaler.fit_transform(df['age'].values.reshape(-1, 1))
df['fare_standard'].hist(bins=30)
df['age_standard'].hist(bins=30)


- fare에서 z-score가 2를 크게 벗어난 값이 있음을 확인할 수 있다.
3. Log / power scale
- numpy를 이용하여 난수 생성 후 실행
# np random 함수를 통해 난수 생성
exp_scale_data = np.random.exponential(1,300)
df_exp = pd.DataFrame(columns=['x'])
df_exp['x'] = exp_scale_data
df_exp['x'].hist(bins=30)

- 이를 로그함수를 통해 스케일링
# Log scaling
df_exp['log_x'] = np.log(df_exp['x'])
df_exp['log_x'].hist(bins=30)

- fare 항목에 추가적인 스케일링 진행
# 0이 있는지 확인(True)
0 in df['fare'].values
# 0이 존재하기 때문에 log 대신 square root로 스케일링
df['fare_sqrt'] = np.sqrt(df['fare'])
df['fare_sqrt'].hist(bins=30)

느낀점
이번주부터는 통계학을 배우는 데, 처음 접하는 것이다 보니 많이 생소하고 어려웠다. 수학을 베이스로 두고 있어서 용어들도 생소한데 강사님이 jargon을 많이 사용하시는 타입이셔서 따로 찾아보는데 시간을 쓰게되는게 조금 아쉬웠다. 이론 부분은 따로 찾아보면서 더 공부를 해야할 것 같다.
'Data Science > TIL (Today I Learned)' 카테고리의 다른 글
| 프로그래머스 데이터분석 데브코스 1기 - 33일차 (0) | 2024.01.10 |
|---|---|
| 프로그래머스 데이터분석 데브코스 1기 - 32일차 (1) | 2024.01.09 |
| 프로그래머스 데이터분석 데브코스 1기 - 30일차 (1) | 2024.01.05 |
| 프로그래머스 데이터분석 데브코스 1기 - 29일차 (1) | 2024.01.04 |
| 프로그래머스 데이터분석 데브코스 1기 - 28일차 (0) | 2024.01.03 |