전처리는 왜 중요할까?

hasun·2022년 1월 3일
0

“데이터 분석의 8할은 데이터 전처리이다”라는 말이 있다.

왜 데이터 분석에 있어 전처리는 중요한걸까??

전처리에 따라서 데이터 분석의 질이 달라지기 때문이다. 전처리가 충분히 되어있지 않거나 잘못된 데이터를 사용한 경우 분석 결과의 신뢰도가 떨어지고, 예측 모델의 정확도도 떨어진다. 전처리가 잘되어 있는 경우 데이터 분석의 질이 높아지고 예측 모델의 성능을 높일 수 있다.

결측치( 누락된 값)

중복된 데이터

우선 중복된 데이터를 확인한다. **DataFrame.duplicated()**는 중복된 데이터 여부를 불리언 값으로 반환 해준다.

pandas에서는 **DataFrame.drop_duplicates** 를 통해 중복된 데이터를 손쉽게 삭제할 수 있다.

**DataFrame.drop_duplicates의 subset, keep** 옵션을 통해 손쉽게 중복을 제거할 수 있다.

ex) drop_duplicates(subset=[’id’], keep=’last’)

keep은 행번호 인덱스로 제일 최근껄 남긴다는 뜻이다 고로 제일 후에 나오는거 삭제한다

이상치( 대부분 값의 범위에서 벗어나 극단적으로 크거나 작은값)

이상치를 어떻게 찾아내야 할까?

가장 먼저 생각해 볼 수 있는 간단하고 자주 사용되는 방법은 **평균과 표준편차를 이용하는 zscore 방법**이다.

https://ko.wikihow.com/Z점수-구하는-법#:~:text=이 공식을 이용해 z,있는지 알려주는 값입니다.

이상치를 판단한 뒤에는 어떻게 해야 할까?

  1. 간단한 방법으로는 이상치를 삭제할 수있다. 이상치 원래 데이터삭제하고, 이상치끼리 따로 분석하는 방안
  2. 이상치를 다른 값으로 대체 , 데이터가 적으면 이상치를 삭제하기보다 다른 값으로 대체, 예를 들어 최댓값, 최솟값 설정해 데이터 범위 제한
  3. 결측치와 마찬가지로 다른데이터를 활용해 예측 모델을 만들어 예측값 활용
  4. binning을 통해 수치형 데이터를 범주형으로 바꾼다.
def outlier(df, col, z):
    return df[abs(df[col] - np.mean(df[col]))/np.std(df[col])>z].index

abs(df[col] - np.mean(df[col])) : 데이터에서 평균을 빼준 것에 절대값을 취합니다.

abs(df[col] - np.mean(df[col]))/np.std(df[col]) : 위에 한 작업에 표준편차로 나눠줍니다

df[abs(df[col] - np.mean(df[col]))/np.std(df[col])>z].index: 값이 z보다 큰 데이터의 인덱스를 추출합니다.

IQR method

상위 25%를 자른다.

q3 - q1 = IQR

q1 - 1.5 x IQR

q3 +1.5 x IQR

IQR에 대한 1.5배를 이상치로 본다고 이해 하면된다.

np.percentile 25% 씩 자를껀데.... [75,25] 별표

정규화

예를 들어 0에서 1사이인 컬럼A와 1000에서 10000사이인 컬럼B가 있다고 가정을 하면 데이터 간의 거리를 잴 때, 범위가 큰 컬럼 B의 값에만 영향을 크게 받을 것이다. 그래서 일반적으로 컬럼 간에 범위가 크게 다를 경우 전처리 과정에서 데이터를 정규화 한다.

정규화 하는 방법은 다양하지만, 가장 잘 알려진 표준화(Standardization)와 Min-Max Scaling을 알아보도록 하자

원-핫 인코딩

머신러닝이나 딥러닝 프레임워크에서 범주형을 지원하지 않는 경우 원-핫 인코딩을 해야한다.

원-핫 인코딩이란 카테고리별 이진 특성을 만들어 해당하는 특성만 1, 나머지는 0 으로 만드는 방법이다.

pandas에서 **get_dummies 함수**를 통해 손쉽게 원-핫 인코딩을 할 수 있다.

구간화 (Binning)

데이터를 구간별로 나누고자 할때 구간화(Data binning 혹은 bucketing)이라고 부른다.

hist() 히스토램 같이 연속적인 데이터 구간을 나눠 분석해서 보여주는 함수

데이터를 범주형 데이터로 변형시키는 함수

cut() 데이터와 구간을 입력하면 구간별로 나눠준 값

qcut() 구간을 일정하게 나누는 것이 아니라 데이터의 분포를 비슷한 크기의 그룹을 나눠준 값

value_counts() : 구간별로 값이 몇개 속해 있는지의 값

특정구간을 지정해줘도 되고, 구간의 개수를 지정해 줄수 도있다.

bins=정수 를 입력하면 데이터의 최솟값에서 최댓값을 균등하게 bins의 개수만큼 나눠준다.

구간화 함수 참조 panda.Series.value_counts

https://pandas.pydata.org/docs/reference/api/pandas.Series.value_counts.html

profile
내가 얻는 보상은 내가 제공하는 가치와 비례한다.

0개의 댓글