1. 데이터 전처리

  • 특정 분석에 적합하게 데이터를 가공하는 작업

  • 완결성 필수로 기입되어 있어야 하는 데이터는 모두 입력되어야 한다.
  • 유일성 동일한 데이터가 불필요하게 중복되어 있으면 안된다.
  • 통일성 데이터가 모두 동일한 형식으로 입력되어야 한다.


2. 주의해야 하는 점

  • 잡음 Noise 측정 과정에서 무작위로 발생하여 측정값의 에러를 발생시키는 것. 이상치와 달리 예측하기 어려움
  • 아티펙트 Digital Artifact 어떤 기술적인 요인으로 인해 반복적으로 발생하는 왜곡이나 에러
  • 정밀도 Precision 동일한 대상을 반복적으로 측정했을 때, 각 결과의 친밀성을 나타내는 것. 측정 결과의 표준편차로 표현 가능
  • 편향 bias 측정 장비에 포함된 시스템적인 변동 (ex. 영점 조절이 되지 않은 체중계)
  • 정확도 Accuracy 평향에 영향 받음. 유효 숫자의 사용에 있어서 중요함
  • 이상치 Outlier 대부분의 데이터와 다른 특성을 보이너가, 특정 속성의 값이 다른 개체들과 달리 유별난 값을 가지는 데이터. 잡음과 다름
  • 결측치 Missing Value 값이 표기되지 않은 값
  • 모순, 불일치 Inconsistent Value 동일한 개체에 대한 측정 데이터가 다르게 나타나는 경우
  • 중복 Duplicated data 중복된 데이터 사이에 속성의 차이나, 값의 불일치가 발생하면 문제가 됨


3. 전처리 순서

1) 데이터 수집 : 분석이나 학습에 필요한 데이터를 수집하는 작업
- 데이터 분석 및 모델 생성의 첫 과정
- 목적에 맞는 정보 수집을 위해 문제 정의 필요

2) 데이터 정제 : 비어있는 데이터나 잡음, 모순된 데이터를 정합성이 맞도록 교정하는 작업
- 데이터를 활용할 수 있도록 만드는 과정
- 컴퓨터가 읽을 수 없는 요소의 제거 및 숫자나 날짜 등의 형식에 대해 일관성 유지
- 누락값, 불일치 값, 오류 값 수정

3) 데이터 통합 : 여러 개의 데이터 베이스, 데이터 집합 또는 파일을 통합하는 작업
- 서로 다른 데이터 세트가 호환이 가능하도록 통합
- 같은 객체, 같은 단위나 좌표로 통합

4) 데이터 축소 : 샘플링, 차원 축소, 특징 선택 및 추출을 통해 데이터 크기를 줄이는 작업
- 대용량 데이터에 대한 복잡한 데이터 분석은 실행하기 어렵거나 불가능한 경우가 많음

5) 데이터 변환 : 데이터를 정규화, 이산화 또는 집계를 통해 변환하는 작업


4. 데이터 전처리 기법

  • 집계 Aggregation
  • 샘플링 Sampling
  • 차원 축소 Dimensionality Reduction
  • 특징 선택 Feature Subset Selection
  • 특징 생성 Feature Creation
  • 이산화와 이진화 Discretization and Binarization
  • 속성 변화 Attribute Transformation


5. 전처리 전 데이터 확인

  • shape 데이터 크기 출력
  • head() 데이터 상위 5개 행 출력
  • tail() 데이터 하위 5개 행 출력
  • info() 데이터 전반적인 정보 제공 (행/열 크기, 컬럼명, 컬럼을 구성하는 값의 자료형 등)
  • describe() 데이터 컬럼별 요약 통계량 제공


6. 결측치 처리

  • NA 값이 표기되지 않은 값. 결측치
    -> 제거, 대치, 예측모델로 처리

1) 전체 결측치 확인

df.isnull()
pd.isnull(df)
  • 결측치일 때 true 반환
  • isnull -> notnull : 결측치일 때 false 반환


2) 인덱싱 후 결측치 개수 확인하기

df['col'].isnull()


3) 결측치 만들기

df.ix[[row1, row2], ['col']] = None


4) 전체 결측치 개수 확인

df.isnull().sum()
df.isnull().value_counts()
df.isnull().sum(1)


5-1) 결측치 제거

  • dropna() 판다스에서 누락 데이터를 제거하는 함수
  • 목록삭제 : 결측치가 있는 행/열은 전부 삭제
df = df.dropna()             # default, 행 제거
df = df.dropna(axis = 1)     # 열 제거
  • 단일값 삭제 : 행/열 자체가 결측치일 때, 혹은 조건부 삭제
df = df.dropna(how = 'all')   
df = df.dropna(thresh = 1)     

df = df.dropna(subset=['col1', 'col2', 'col3'], how = 'all')  # 모두 결측치일 때 해당 행 삭제
df = df.dropna(subset=['col1', 'col2', 'col3'], thresh = 2)   # 특정 열에 2개 초과의 결측치가 있을 때 해당 행 삭제


5-2) 대치

  • 단순 대치: 중앙값, 최빈값, 0, 분위수, 주변값, 예측값 등으로 결측치 대치
  • 다중 대치: 단순 대치법을 여러번! (대치 - 분석 - 결합)

  • 판다스에서 결측치 대치하는 함수들
fillna()

# 전체 결측치를 특정 단일값으로 대치
df.fillna(0)  

# 특정 열에 결측치가 있을 경우 다른 값으로 대치
df['col'] = df['col'].fillna(0)
df['col'] = df['col'].fillna(df['col'].mean())

# 결측치 바로 이후 행 값으로 채우기
df.fillna(method='bfill')

# 결측치 바로 이전 행 값으로 채우기
df.fillna(method='pad')
replace()

# 결측치 값 0으로 채우기
df.replace(to_replace = np.nan, value = 0)
interpolate()

# 인덱스를 무시하고, 값을 선형적으로 같은 간격으로 처리
df.interpolate(method = 'linear', limit_direction = 'forward')


5-3) 예측 모델

  • 결측값을 제외한 데이터로부터 모델을 훈련하고 추정값을 계산하고 결측치 대체
  • K-NN, 가중 K-NN, 로지스틱 회귀, SVM, 랜덤 포레스트 방식 등


7. 중복 데이터 처리

  • 중복은 언제든지 발생할 수 있지만, 중복 데이터 사이에 속성의 차이나 값의 불일치가 발생한 경우 처리해야 함
  • 두 개체를 합치거나 응용에 적합한 속성을 가진 데이터를 선택하는 등
# 중복 데이터 확인
df.duplicated(['col'])

# 중복 데이터 삭제
drop_duplicates()

# 해당 열의 첫 행을 기준으로 중복 여부 판단 후, 중복되는 나머지 행 삭제
drop_duplicated(['col'])

df.drop_duplicates(keep = )
    subset = None           # default, 특정 열 지정 X, 모든 열에 대해 작업 수행
    keep = 'first'          # 가장 처음에 나온 데이터만 남김
    keep = 'last'           # 가장 마지막에 나온 데이터만 남김
    keep = False            # 중복된 어떤 데이터도 남기지 않음


8. 불균형 데이터 처리

  • 분류를 목적으로 하는 데이터 셋에 클래스 라벨의 비율이 불균형한 경우
  • 각 클래스에 속한 데이터 개수 차이가 큰 데이터
  • 정상 범주의 관측치 수와 이상 범주의 관측치 수가 현저히 차이나는 데이터
  • 이상 데이터를 정확히 찾아내지 못할 수 있음

8-1) Under Sampling

  • 다수 범주의 데이터를 소수 범주의 데이터 수에 맞게 줄이는 샘플링 방식
  • Random Undersampling, Tomek’s Link, CNN

8-2) Over Sampling

  • 소수 범주의 데이터를 다수 범주의 데이터 수에 맞게 늘리는 샘플링 방식
  • Random Oversampling
  • ADASYN, SMOTE


9. 이상치 탐지 기법

1) z-score

  • z = (x - μ) / σ
  • 변수가 정규분포 따른다고 가정, 각 특성값이 평균에서 표준편차의 몇 배만큼 떨어져 있는지 나타냄
  • z-score가 임계치보다 크거나 작은 관측치를 이상치라고 규정
  • 임계치 조정함으로써 기준 조정
def z_score_outlier(df, col, thres = 3):
    z_score = (df[col] - df[col].mean()) / df[col].std()
    return df[(z_score > thres) | (z_score < -thres)]


2) IQR

  • IQR = Q3 - Q1

iqr

  • Q3 + 1.5IQR 이상** 이거나, **Q1 - 1.5IQR 이하 인 경우 이상치라고 규정
  • 1.5 대신 다른 값 이용해 기준 조정 가능
def IQR_outlier(df, col, scale = 1.5):
    Q1 = df[col].quantile(0.25)
    Q3 = df[col].quantile(0.75)
    IQR = Q3 - Q1
    lower_limit = Q1 - scale * IQR
    upper_limit = Q3 + scale * IQR
    
    return df[(df[col] > upper_limit) | df[col] < lower_limit)]


3) DBSCAN

  • 밀도 기반 군집화 알고리즘
  • 하이퍼 파라미터: eps(반경, default=0.5), min_samples(core point가 되기 위한 최소한의 이웃 수, default=5)


DBSCAN


# 이상치 탐지
from sklearn.cluster import DBSCAN

model = DBSCAN(eps = .3, min_samples = 10)
pred = model.fit_predict(abalone)

# 이상치 개수
(pred == -1).sum()


10. 레이블 인코딩

  • 문자열 카테고리 피처를 코드형 숫자 값 으로 변환하는 것
# pandas
df.factorize()

# scikit-learn
LabelEncoder()
encoder.fit_transform() # 학습, 변환 한번에


11. 원핫 인코딩

  • 피처값의 유형에 따라 새로운 피처를 생성해 고유값에 해당하는 컬럼에만 1 표시, 나머지 컬럼에는 0 을 표시하는 방식
  • 숫자의 크기 차이를 만드는 레이블 인코딩의 단점 보완


12. Feature Scaling

  • 서로 다른 변수 값의 범위를 일정한 수준으로 맞추는 작업
  • 변수 값의 범위 또는 단위가 달라서 발생 가능한 문제 예방
  • 머신러닝 모델이 특정 데이터의 bias 갖는 것 방지

1) 표준화 Standardization

  • 서로 다른 범위의 변수들을 평균이 0이고 분산이 1인 가우시안 정규분포를 가진 값으로 변환
  • ScandardScaler()

2) 정규화 Normalization

  • 변수값들을 모두 0과 1 사이의 값으로 변환하는 방식
  • MinMaxScaler()