모델에 데이터를 넣기 전까지 과정
손실 데이터
# 전체 데이터 수
len(파일명)
# 컬럼별 결측치 개수
len(파일명) - 파일명.count()
# 결측치가 있는 컬럼 삭제하기
trade = 파일명.drop('결측치가 있는 컬럼명', axis=1)
DataFrame.isnull()
: 데이터마다 결측치 여부를 True, False로 반환
DataFrame.any(axis=1)
: 행마다 하나라도 True가 있으면 True, 그렇지 않으면 False를 반환
dropna
: 결측치를 삭제해주는 메서드
# 데이터별 결측치 여부 확인
파일명.isnull()
# 행별 True 데이터 추출
파일명.isnull().any(axis=1)
# 각 칼럼의 값이 모두 결측치인 행 삭제하기
# subset: 특정 칼럼 선택
# how = 'all': 선택한 컬럼 전부가 결측치인 행을 삭제하겠다는 의미 ('any': 하나라도 결측치인 경우)
파일명.dropna(how='all', subset=['컬럼1', '컬럼2', '컬럼3', '컬럼4', '컬럼4'], inplace=True)
같은 값을 가진 데이터 없이 행별로 값이 유일해야 한다면 중복된 데이터를 제거해야한다.
DataFrame.dulicated()
: 중복된 데이터 여부를 불리언 값으로 반환
대부분의 값의 범위에서 벗어나 극단적으로 크거나 작은 값을 의미
일부 이상치 때문에 대부분의 값의 차이의 의미가 없어지게 된다.
극단적인 값이 생기는 경우를 제외하고 데이터를 고려하고 싶은 경우 이상치를 제거하고 분석
평균을 빼주고 표준편차로 나눠 계산.
z score가 특정 기준을 넘어서는 데이터에 대해 이상치라고 판단.
기준을 작게하면 이상치라고 판단하는 데이터가 많아지고, 기준을 크게 하면 이상치 데이터가 적어짐.
# 이상치 데이터의 인덱스를 리턴하는 함수 생성
# df: 데이터 프레임, col: 컬럼, z: 기준
def outlier(df, col, z):
return df[abs(df[col] - np.mean(df[col]))/np.std(df[col])>z].index
# 이상치 확인
파일명.loc[outlier(df, col, z)]
# 이상치가 아닌 데이터를 추출하는 함수
def not_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보다 큰 데이터의 인덱스를 추출
출처 : https://en.wikipedia.org/wiki/Interquartile_range
# 제1사분위수와 제 3사분위수 구하기
Q3, Q1 = np.percentile(data, [75 ,25])
IQR = Q3 - Q1
# 이상치 확인하기
data[(Q1-1.5*IQR > data)|(Q3+1.5*IQR < data)]
일반적으로 컬럼간에 범위가 크게 다를 경우 전처리 과정에서 데이터를 정규화.
대표적인 정규화 방법: 표준화(Standardization), Min-Max Scaling
데이터의 평균은 0, 분산은 1로 변환
# 정규분포를 따라 랜덤하게 데이터 x를 생성.
np.random.seed(2020)
x = pd.DataFrame({'A': np.random.randn(100)*4+4,
'B': np.random.randn(100)-1})
# 데이터 x를 Standardization 기법으로 정규화
x_standardization = (x - x.mean())/x.std()
데이터의 최솟값은 0, 최댓값은 1로 변환
# 데이터 x를 min-max scaling 기법으로 정규화.
x_min_max = (x-x.min())/(x.max()-x.min())
카테고리별 이진 특성을 만들어 해당하는 특성만 1, 나머지는 0으로 만드는 방법.
머신러닝이나 딥러닝 프레임워크에서 범주형을 지원하지 않는 경우 원-핫 인코딩.
pandas
의 get_dummies
함수 활용
# get_dummies를 통해 컬럼1 원-핫 인코딩
변수명 = pd.get_dummies(파일명['컬럼1'])
변수명.head()
히스토그램과 같이 연속적인 데이터를 구간을 나눠 분석할 때 사용하는 방법
수치형 데이터를 범주형 데이터로 변환
cut
과 qcut
을 이용cut
: 데이터와 구간을 입력하면 데이터를 구간별로 나눠줌
value_counts()
: 구간별로 값이 몇 개 속해 있는지 확인
bin
옵션에 정수를 입력하면 데이터의 최솟값에서 최댓값을 균등하게 bin
의 개수만큼 나눠줌.
qcut
: 데이터의 분포를 비슷한 크기의 그룹으로 나눠줌