본문 바로가기

카테고리 없음

데이터 전처리 -1

데이터를 분석에 사용할때 성능이? 더 좋게 나오도록 데이터를 수정하거나 형태를 변경하는 작업

 

data preprocessing

 

데이터전처리의 종류

- 데이터 클리닝 -> 결측치 처리, 틀린값 처리

- 스케일링 - > 여러변수값의 범위를 동등하나 조건으로 맞추는것 : 표준스케일링 , min -max 스케일링

- 이상치 처리 - > 이상치 탐지 및 제거

- 데이터 변환 - 로그 변환, 카테고리 인코딩 등

 

데이터 클리닝

 

결측치 처리

값이 비어있는 것을 처리하는 것 ( 파이썬에서는 빈 값이 nan으로 표시 된다 : not a number)

결측치를 철리하는 방법은 크게 세가지가 있다.

 

-> 결측치가 표함된 샘플(행)을 버린다.

-> 결측치를 적절한 값으로 대체 한다.
-> 결측치 처리를 다음 분석 단계로 넘긴다. 즉, 결측치를 그대로 둔다.

 

틀린값 처리

틀린값을 처리하는 방법도  결측치를 처리하는 방법과 같이 세가지이다.

- 틀린값이 포함된 샘플(행)을 버린다.

틀린값을 적정한 값으로 대체한다.

틀린값 처리를 다음 분석 단계로 넘긴다. 즉. 틀린값을 그대로 둔다.

 

import numpy as np  #넘파이.,

import pandas as pd   #판다스

import matplotlib.pyplot as plt  #그림그리기

%matplotlib inline   # 그림을 현재 화면에 보여주는것 

%config InlineBackend.figure_format = 'retina'  #맥일경우 고생상도로 화면 표시 

 

# matplotlib를 이용하여 다양한 시각화 함수를 제공하는 라이브러리 seaborn

import seaborn as sns   #시각화 라이브러리 

 

n_samples = 1000    #그냥 샘플 1000개 하겠다는 말

height = 4*np.random.randn(n_samples).round(2) + 170   #넘파이 안에 랜덤 함수. randn(n_samples) = 정규분포를 따르는 n_samples 만큼의 랜덤 변수를 생성

      # round(2) 소수점 2자리까지.  정규분포의 표준편차는 1이고 , 여기서 *4를 하는것은  표준편차를 4로 만듬, 

weight = 5*np.random.randn(n_samples).round(2) + 65

df_raw = pd.DataFrame({"height": height, "weight": weight})  # 딕셔너리 형태로 만듬. 

df_raw[:5] #df_raw 의 데이터 표시 0부터 4까지 

 

# 사본 사용 (원본 백업)

df = df_raw.copy()  #데이터 복사

 

# 샘플의 확률 분포 근사 그래프 보기

sns.distplot(df.height.values)   #seaborn 라이브러리에서 데이터표현 

 

# 임의의 값 하나를 결측치로 변경

df['weight'][2] = np.nan #nan 값을 대입
df[:5] # 샘플 5개만  보여주기

 

df.isnull()  # df라는 딕셔너리에서 Null, Nan 값이 있는지 검색
df.isnull().sum()  #False는 1, True는 0으로환산되어 null 값이 몇개 있는지 확인할수 있음=

 

 

# 결측치가 있는 행(샘플) 삭제하기

df2  = df.dropna() #결측치 Null 삭제하기 
print(df2.shape)  # df2모양 출력
df2[:5]

 

# 결측치를 다른 값으로 대체하기 (아래는 몸무게 컬럼의 평균치로 대체한 예)

df3 = df.fillna(df['weight'].mean()) #fillna  결측치를 채움. weight 의 평균값으로 
print(df3.shape) #df3의 모양
print(df['weight'].mean()) #df3d의 weight 의 평균
df3[:5] 

 

# 결측치를 0으로 대체하는 경우

df.fillna(0)   # 0으로 채우기

 

# 결측치를 바로 이전 값으로 대체하는 경우 (forward fill)

df.fillna(method="ffill")[:5]  #결측치를 바로 이전 값으로 대체하는 겨웅 forward fill 
#바로 다음값으로 대입하는 경우 bfill