원시 데이터를 데이터 분석을 위해 분석에 적합한 형태로 가공하는 과정
불필요한 데이터를 제거, 결측치 및 이상치를 처리에 데이터의 질을 향상시킨다.
.isna() or .isnull()
: 결측치가 존재하는 곳에 True, 없는 곳에 False로 bool값을 반환한다.
.sum()
: bool값으로 반환하기 때문에, True = 1, False = 0 으로 모든 값을 더한다.
즉, sum()을 사용하면 특정 행의 결측치 개수를 알 수 있다.
.any(axis=1)
: 행마다 하나라도 결측치가 있으면 True, 없으면 False를 반환하는 역할을 한다.
첫 열에 인덱스, 두 번째 열에 bool값을 출력되는 형태를 가진다.
.dropna()
: non 값이 포함된 행을 삭제한다.
💡 drop 조건
axis=0/1: 행/열을 제거한다.
how='all/any': 모든 값이 결측치일 때 / 어떤 값에도 결측치가 없을 때 삭제한다.
subset='': 특정 열을 기준으로 결측치가 존재하는 행만 삭제한다.
thresh=: 결측치가 n개를 넘어가면 해당 행은 삭제한다.(행 유지 기준)
inplace= True: 수정된 사항을 DataFrame이 포함되어 있던 변수에 저장한다.
✔️ 행, 열값 삭제 후reset_index필수! 그래야만 올바른 순서의 인덱스 사용 가능
fillna()
: 특정 값으로 결측치를 대체한다.
대체로 평균, 중앙값, 최빈값이 자주 사용된다.
# ex) 에어비앤비 평점 결측치를 포함된 모든 평점의 평균으로 대체
# 1. 평점의 평균을 구한다.
rating_mean = aribnb['rating'].mean
# 2. fillna() 사용해 결측치를 평균으로 채운다.
# 이때, 꼭 결측치를 채우고 싶은 열에 저장해 주어야 한다.
airbnb['rating'] = airbnb['rating'].fillna(rating_mean)
.duplicated()
: 중복값이 존재하는 행에 True, 없는 행에 False로 bool값을 반환한다.
모든 열의 값이 중복되어야만이 중복값으로 인식하고 출력한다.
.sum()
: bool값으로 반환하기 때문에, True = 1, False = 0 으로 모든 값을 더한다.
즉, sum()을 사용하면 전체 DataFrame의 중복값 개수를 알 수 있다.
💡 중복값 조건
subset= '': 특정 열이 중복이면 중복값으로 인식하고 출력한다.
keep= 'first/last'/False: [기본값] 첫 번째 행을 제외/마지막 값 제외/중복되는 전체 행을 중복값으로 인식한다.
.drop_duplicates()
: 중복값이 존재하는 행을 삭제한다. 모든 열의 값이 중복되어야 중복값으로 인식하고 삭제된다.
💡 중복값 조건
subset= '': 특정 열이 중복이면 중복값으로 인식하고 삭제한다.
keep= 'first/last'/False: [기본값] 첫 번째 행을 제외/마지막 값 제외/중복되는 전체 행을 중복값으로 인식하고 삭제한다.
꼭inplace=True혹은변수=를 이용해 삭제된 값을 저장해야 한다.
: 전체 데이터 중 25% 에 머무르는 값인 1사분위수(Q1) 와,
전체 데이터 중 75% 에 머무르는 값인 3사분위수(Q3),
이 둘 사이의 거리(Q3 - Q1)를 IQR이라고 부르며,
1사분위수에서 1.5 IQR 한 만큼 떨어진 더 작은 값들과
3사분위수에서 1.5 IQR 한 만큼 떨어진 더 큰 값들을 모두 가리켜 이상치라고 한다.
# 1. IQR 구하기
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
# 2. (1.5 * IQR)만큼 떨어진 이상치 구하기
lower_limit = Q1 - 1.5 * IQR
upper_limit = Q3 + 1.5 * IQR
# 3. 데이터값 이상치인 값 출력하기
lower_outlier = data['check_data'] < lower_limit
upper_outlier = data['check_data'] > upper_limit
이상치 데이터를 건들이지 않는 방법
이상치가 중요한 값인데 해당 값을 변경하거나 삭제하는 등의 처리를 진행하면,
실제 값과 완전히 어긋나는 결과가 출력될 수 있기 때문에,
건들이지 않는 방법을 선택할 수 있다.
이상치 데이터를 기준점 안으로, 정상치 내에 오도록 조정하는 방법
1사분위수보다 작은 데이터를 q1 - 1.5 iqr 값으로 대체하고,
3사분위수보다 큰 데이터를 q3 + 1.5 iqr 값으로 대체한다.
그러면 이상치가 주는 극단적인 영향력을 어느 정도 상쇄할 수 있다.
이상치 데이터를 삭제하는 방법
이상치가 오류 때문에 생긴 것이 확실하거나,
삭제된다고 전체 데이터에 큰 영향을 주지 않는 데이터라면 삭제한다.
# 이상치 데이터 안에 오는 정상치만 출력하면, 이상치 데이터가 삭제된다.
lower_outlier_deleted = data['check_data'] >= lower_data
upper_outlier_deleted = data['check_data'] <= upper_data
data[lower_outlier_deleted & upper_outlier_deleted]
.upper()
: 모든 문자열 데이터를 대문자로 통일한다.
.lower()
: 모든 문자열 데이터를 소문자로 통일한다.
split('split standard')
: 괄호 안의 (특수)문자를 기준으로 텍스트를 나눈다.
여기서, 인덱스와 변수를 적절히 사용하면 나눈 텍스트를 각각 다른 변수에 저장할 수 있다.
data['new'] = data.str.split(',').str[0]
# 데이터의 반점을 기준으로 문자를 나누고, 나누어진 리스트의 첫 번째 인덱스 문자열을 new 열에 추가한다.
.strip()
: 문자열에 들어간 공백을 모두 제거한다.
.drop('drop text', 'filled text')
: 삭제할 문자열 데이터와, 삭제된 곳을 채울 데이터를 적어 준다.
그러면 문자열을 삭제하고, 주어진 데이터로 삭제된 부분을 메운다.
pd.cut(data, bins=,...)
: 특정 범주의 데이터를 묶어 그룹을 만들어 대표되는 라벨을 표기한다.
💡내장 함수
bins=: 어떤 범주로 나눌 것인지 설정
right=True/False: 오른쪽 데이터를 포함할 것인지(이하)/ 하지 않을 것인지(미만)
labels=: 특정 범주에 라벨링