Post

[AI] 04. 데이터 전처리

[AI] 04. 데이터 전처리

데이터 전처리

수집한 데이터를 데이터 분석/AI 모델링을 위하여 데이터를 정제하고 다듬는 작업


데이터 탐색 방법

  1. 데이터 확인하기
  2. 필요한 칼럼만 추출
  3. 데이터 타입 변경

1. 데이터 확인하기

info, head, tail, describe 함수로 데이터 탐색

1. Sample 데이터 확인

  • head(), tail()

2. 통계적 특성 확인

  • descirbe() : 유효데이터수, 값평균, 표준편차, 최소값, 1사분위값~3사분위값, 최대값

Table 정보 확인

  • info() : 인덱스 범위, Column 이름, 데이터 타입, null 값 등 확인 가능

2. 필요한 칼럼만 추출

데이터 확인하기에서 불필요하다고 판단된 칼럼은 해당 방법으로 추출한다.

DF=data[["school_class", "gender_type", "item_count"]] #1
DF=DF.rename(columns = {"school_class" : 'class', "gender_type" : 'gender', "item_count" : 'count'}) #2
  1. [[]]로 필요한 칼럼만 작성하여 DataFrame 형태로 추출 및 생성
  2. rename(columns = {“기존칼럼” : ‘새로운칼럼’}) 형태로 함수 사용하여 복잡한 이름의 칼럼 간단하게 변경

3. 데이터 타입 변경

숫자형 데이터가 object로 있어 사칙연산이 이뤄지지 않는다.

DF = DF.replace("_", numpy.NaN) #1
DF = DF.astype({'column':float}) #2
  1. replace 함수로 항목값 치환, NaN값으로 변경 가능
  2. 특정 column의 type 변경. NaN은 int type을 지원하지 않아 float type으로 변경한다.

결측치 처리하기

결측치는 데이터를 분석하는 데에 있어서 반드시 처리해야 하는 값이다. 참고로 0은 결측치가 아니다. 이때 막대한 데이터가 손실될 수 있거나, 단순대체를 하면 데이터에 편향이 생길 확률이 높아진다.

데이터 결측치 처리시 원본 데이터를 COPY해서 사용한다.
copy하지 않을 경우 기존 데이터 정보도 변경된다.

(datafram명.copy() 함수)


채우기

결측치를 정보 손실없이 빠르게 채울 수 있지만 모든 결측치가 같은 값을 가질 수 있다.

#결측치를 뒤에 있는 data 값을 사용해서 채운다.
DataFrame명.fillna(method='backfill')
DataFrame명.tail()

#결측치를 앞에 있는 data 값을 사용해서 채운다.
DataFrame명.fillna(method='ffill')
DataFrame명.head()

#replace()함수로 결측치를 채운다. 이때 copy 사용
DataFrame명['age'].replace(numpy.nan, DataFrame명['age'].median())

1. 값 대체하기

  • 결측치를 평균화 값으로 대체한다.
  • 주로 평균, 중앙값, 최빈값 사용

2. 예측하기

  • 결측치를 상관관계나 예측모델을 사용하여 채운다.
DataFrame명.interpolate() #결측치를 같은 간격으로 채운다

제거하기

1. Listwise

DataFrame명.dropna()
  • 1개의 값이라도 결측치로 존재하는 전체 행 삭제
  • 결측치가 존재하는 특정 데이터를 삭제하여 결측치 제거
  • 최대치의 정보 손실 발생

2. Pairwise

DataFrame명.dropna(how='all')
  • 결측치로 존재하는 변수만 삭제
  • 모든 변수가 결측치인 경우 해당행을 삭제하고 결측값이 있는 변수는 무시된다.
  • 매번 샘플이 달라 분석을 비교할 수 없다.
DataFrame명.dropna(thresh=10) # NA이 아닌 값이 10개 이상인 경우만 남긴다.
DataFrame명.dropna(subset=['column명']) # 특정 열에 있는 NA만 참고하여 결측치 제거

이상치 처리하기

이상치

  1. 특정 추세를 크게 벗어난 데이터

  2. 중앙값을 크게 벗어난 데이터 (Outlier : 1사분위와 3사분위 거리의 1.5배가 넘어가는 값)

  • DataFrame명[‘column’].value_counts() 함수 범주형 데이터의 값 분포 확인

  • DataFrame[column].quantile(0.25) 0.25는 1사분면, 0.75는 3사분면이 나온다.

삭제

Data = DataFrame명['column'] != '제거할 이상치'
# 제거할 이상치를 제외한 나머지 값이 남는다

위 방법 외에도 이상치를 제거하는 함수를 만들 수 있다. (사분면 개념 이용)

대치

Data = DataFrame.copy()
Data['column'].replace('변경 대상', '변경할 값')

위 방법 외에도 이상치를 대치하는 함수를 만들 수 있다. (사분면 개념 이용)

스케일링

right skewed인 경우 log나 제곱근을 취한다.


Feature Enginerring

데이터를 분석하거나 AI 알고리즘을 적용하기 위해 데이터의 도메인 지식을 활용, 변수를 가공하여 데이터를 비교적 간단명료하게 만드는 것

Data gathering -(Raw Data)→ Feature Engineering -(Training Data)→ Modeling

Binning

연속형 변수를 범주형 변수로 만드는 방법

DataFrame['새로운 column'] = DataFrame['기존 column'] # (새로운 column에 넣기 위한 계산식 등 작성)
q1=DataFrame[column].quantile(0.25)
q3=DataFrame[column].quantile(0.75)
DataFrame['새로운 column'] = pandas.cut(DataFrame["기존 column"], bins=[0,q1,q2,DataFrame["기존 column"].max()], labels=['저', '중','고']) #1
DataFrame['새로운 column'] = pandas.qcut(DataFrame["기존 column"], 3, labels=['저', '중','고']) #2
  1. cut
    • 동일 길이로 나누기, 사용자가 구간값을 직접 입력
    • bins=[0~q1, q1~q3, q3~DataFrame max값] 나누기
    • 라벨은 bins로 나눈 값에 따라 저, 중, 고로 나온다.
  2. qcut
    • 동일 개수로 나누기, 사용자가 구간 개수를 입력

Scaling

숫자 데이터간의 상대적 크기 차이를 제거하는 방법

  • StandardScaler()
    • 각 특성의 평균을 0, 분산을 1로 스케일링해서 정규분포로 만든다.
  • RobustScaler()
    • 평균과 분산 대신 중간값, 사분위값을 이용한다.
    • 이상치에 영향을 받지 않는다.
  • MinMaxScaler()
    • 각 특성이 0과 1 사이에 위치하도록 스케일링한다.
    • 분류보다 회귀에 유용하다.
  • MaxAbsScaler()
    • 각 특성의 절대값이 0과 1 사이가 되도록 스케일링한다. (-1 ~ 1)
    • 데이터가 양수일 경우 MinMaxScaler와 같다.

One Hot Encoding

하나의 데이터만 1, 나머지는 0으로 만들어 준다.

범주형/텍스트형 데이터를 기계가 가장 잘 이해할 수 있도록 한 수치형 데이터 형태

수치형, 범주형, 텍스트형 데이터 중 머신러닝이나 딥러닝 알고리즘은 수치로 된 데이터만 사용 가능

pandas.get_dummies(DataFrame['column']) 
pandas.get_dummies(DataFrame, DataFrame['column']) #기존 값에서 가능

DataFrame.to_csv('dataframe.csv', index=False)

to_csv : 전처리한 데이터 csv파일로 저장

This post is licensed under CC BY 4.0 by the author.