[AI] 04. 데이터 전처리
데이터 전처리
수집한 데이터를 데이터 분석/AI 모델링을 위하여 데이터를 정제하고 다듬는 작업
데이터 탐색 방법
- 데이터 확인하기
- 필요한 칼럼만 추출
- 데이터 타입 변경
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
- [[]]로 필요한 칼럼만 작성하여 DataFrame 형태로 추출 및 생성
- rename(columns = {“기존칼럼” : ‘새로운칼럼’}) 형태로 함수 사용하여 복잡한 이름의 칼럼 간단하게 변경
3. 데이터 타입 변경
숫자형 데이터가 object로 있어 사칙연산이 이뤄지지 않는다.
DF = DF.replace("_", numpy.NaN) #1
DF = DF.astype({'column':float}) #2
- replace 함수로 항목값 치환, NaN값으로 변경 가능
- 특정 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만 참고하여 결측치 제거
이상치 처리하기
이상치
특정 추세를 크게 벗어난 데이터
중앙값을 크게 벗어난 데이터 (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
- cut
- 동일 길이로 나누기, 사용자가 구간값을 직접 입력
- bins=[0~q1, q1~q3, q3~DataFrame max값] 나누기
- 라벨은 bins로 나눈 값에 따라 저, 중, 고로 나온다.
- 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파일로 저장