본문 바로가기

Computer Engineering/Big Data Analytics Using Python

[빅데이터 분석] 5. 데이터 클린징

반응형
  • 데이터 클린징의 이해
    • 표본 편향 오류
    • 품질 좋은 데이터를 확보 [데이터 품질 관리]
  • 데이터 클린징
    • 편향 없이 명확하고 깨끗한 데이터를 확보하는 작업 [데이터 분석 순서 : 백업 -> 보기 -> 결측데이터 처리]
      • 결측 데이터
        1. 결측 데이터 확인
        2. 결측 데이터 대체/제거 [평균 대체법]
        3. 결측 데이터 반영 확인
      • 이상 데이터
        1. 이상 데이터 확인
        2. 이상 데이터 대체/제거
        3. 이상 데이터 처리 확인
      • 중복 데이터
        1. 중복 데이터 확인
        2. 중복 데이터 처리(유일한 1개 키만 남기고 나머지 중복 제거
          • DataFrame.drop_duplicates()
        3. 중복 데이터 처리 확인

  • 결측 데이터
     isnull() : 결측 데이터이면 True 값을 반환, 유효한 데이터면 False를 반환
     notnull() :유효한데이터가존재하면 True를 반환, 누락 데이터이면 False
    • 데이터 누락값을 의미한다
    • 변수가 왜곡될 가능성 제거
    • NaN / None
      1. 제거
      2. 대체
  • 결측 데이터 확인
#결측값 개수
df.isnull().sum()

#행 단위 결측값 개수
df.isnull().sum(1)

#행 단위 실젯값 개수
df.notnull().sum(1)
  • 결측 데이터 개수 확인
import pandas as pd

file_path = 'C:/data/bicycle.csv'
df = pd.read_csv(file_path engine='python')
df

#결측 데이터 확인
df.isnull()

df.notnull()
  • 결측 데이터 제거
    df.dropna(axis=0) : 행 삭제
    df.dropna(axis=1) : 열 삭제
    df.dropna()
#결측 데이터가 있는 전체 행 제거
df_drop_allow = df.dropna(axis=0)
df_drop_allow

#결측 데이터가 있는 전체 열 제거
df_drop_allcolumn = df.dropna(axis=1)
df_drop_allcolumn

#특정 행 또는 열 결측치 제거, 대여소번호 컬럼 제거(비교 확인)
df[대여소번호'].dropna()

#결측값이 들어있는 행 전체 삭제: 하단 df.dropna(axis=0)와 동일
df[['대여소번호', '대여거치대', '이용시간']].dropna()
df[['대여소번호', '대여거치대', '이용시간']].dropna(axis=0)

#결측값이 들어있는 열 전체 삭제
df[['대여소번호', '대여거치대', '이용시간']].dropna(axis=1)

 

  • 결측 데이터 대체
    df.fillna(0) : 특정 값으로 대체
    df.fillna(' ') : 특정 문자열로 대체
    df.fillna(df.mean()) : 변수별 평균으로 대체 [각각 변수의 평균으로 대체, 중위값도 확인]
#결측값을 특정 값(0)으로 대체
df_1= df.fillna(0)
df_1

#특정 컬럼 결측값을 특정 값(0)으로 대체
df_2= df.대여소번호.fillna(0)
df_2

#결측값을 문자열('missing')로 대체
df_3=df.fillna('missing')
df_3

#각 컬럼의 평균을 구해서 대응하는 컬럼의 결측값을 대체하는 방법으로 가장 많이 사용합니다.
df_4=df.fillna(df.mean())
df_4

#특정 항모구 평균 구하기(이용거리 평균)
df_5=df.mean()['이용거리']
df_5

#특정 항목 평균으로 대체
df_6=df.fillna(df.mean()['이용거리'])
df_6

##특정 항목 평균으로 대체
df_7=df.이용거리.fillna(df.mean()['이용거리'])
df_7
  • 결측 데이터 처리 주의
    1. Null의 의미
      • 0 : -1과 1사이의 정수
      • null : 미지의 값, 확정되지않은 결측 값
    2. 자료형
    3. Null은 연산 시 유의 사항
      • sum(), cumsum() 함수 계산시 NaN은 '0'으로 처리
      • 평균 및 표준편차 연산시 NaN은 분석 대상에서 제외
      • 컬럼간 연산시 NaN이 존재하면 NaN으로 반환
    4. 결측치 제거를 위해 행 및 열의 전체삭제는 왜곡의 위험성 존재

  • 이상 데이터
    • 정상에서 벗어난 데이터
  • 이상 데이터 확인 
import pandas as pd

#파일 결로는 찾고 변수 file_path에 저장
file_path = 'C:/data/bicycle_out.csv'

#read_csv() 함수로 데이터프레임 변환
df= pd.read_csv(file_path, engine='python')
df

#이상값이 있는 4번째 행 제거
df1= df.drop(4, 0)
df1
  • 이상 데이터 시각화 [연속형만 확인가능]
    • 박스플롯을 이용해 확인 및 제거
      • 박스플롯의 구성
        • 중앙값
        • 박스
        • 수염
        • 이상치
    • 사분위수를 이용해 제거
#고급 시각화 박스플롯 참조
#이용시간 이상치 시각화

import matplotlib as mpl
import matplotlib.plylab as plt

plt.boxplot(df['나이'])
plt.show()
  • 이상 데이터 처리 방법
    1. 단순 삭제
    2. 다른 값으로 대체
    3. 변수화
    4. 리샘플링
    5. 케이스 분리 분석

  • 중복 데이터
    • duplicated()함수를 이용
    • drop_duplicates()를 이용해 중복 데이터 삭제
  • 중복 데이터 확인
import pandas as pd
file_path= 'C:\data\bicycle_dp.csv'
df= pd.read_csv(file_path)
df

#duplicated() 메소드로 중복 데이터 찾기
#dataFrame.duplicated()는 True, False의 boolean 형태의 series 반환
df.duplicaed(['이용거리'])

df.duplicated(['이용거리', '나이'])
  • 중복 시작과 끝 확인
#중복이 있으면 처음이나 끝에 무엇을 남길지 확인합니다.
#keep='first'가 default이며,
#중복값이 있으면 첫 번째 값을 duplicated 여부를 False로 반환, 나머지 중복 값에 대해서는 True를 반환

#keep='last'는 중복값이 있으면 첫 번째 값을 duplicated 여부를 True로 반환, 나머지 중복값에 대해서는 False를 반환

df.duplicated(['이용거리'], keep='last')

#keep=False는 처음이나 끝 값인지 여부는 고려를 안 하고 중복이면 무조건 True를 반환
df.duplicated(['이용거리'], keep=False)
  • 중복 데이터 제거
#drop_duplicated()는 중복값을 keep='first', 'last', False argument에 따라 유일한 1개의 key 값만 남기고 나머지는 중복 제거
df.drop_duplicates(['이용거리'], keep='first')

df.drop_duplicates(['이용거리'], keep='last')

df.drop_duplicates(['이용거리'], keep=False)

 

 

 

반응형