사용 도서: Python과 SQL을 활용한 실전 데이터 처리(이현호 저)
데이터 전처리
데이터 분석 작업을 하기 전 데이터를 분석하기 좋은 형태로 만드는 과정. 데이터 전처리는 중요한 과정이나 과정 자체를 정형화하기는 복잡하고 힘들다. 고품질 데이터도 실무에서 존재하는 데이터의 구조적 형태(format)이 분석 목적이나 분석 기법에 적합한 경우가 드물기 때문에 전처리가 필요하다
- 데이터 정제: Missing Values 채우고, Noisy Data 제거, Inconsistent Data는 정합성이 맞는 데이터초 교정
- 데이터 자체/구조(format)의 변환: 데이터 정규화 또는 집단화. 스케일이 안 맞는 경우 결과에 왜곡이 발생할 수 있다. 따라서 데이터 정규화를 통해 변수 간 스케일을 맞추어야 한다.
- 데이터 차원/볼륨 축소: 샘플링을 통해 데이터의 볼륨을 줄이거나 분석대상 속성(차원)을 줄이는 작업. 속성 Attribute, 필드 Field, 차원 Dimension, 변수 Variable, 특성 Feature - 사실은 모두 같은 의미! 최대한 Original Dataset과 유사해야함이 원칙.
- 데이터의 통합: 여러 개의 데이터베이스, 데이터큐브, 또는 파일 통합.
- 데이터 이산화: 데이터 축소의 일종으로 연속적인 수치 데이터를 구간화하는 작업
데이터 전처리가 필요한 이유
- 실무 데이터는 분석 기법을 바로 적용하기 힘든 형태
- Missing Value, Noise, 적합하지 않은 구조
- 낮은 품질의 데이터로는 좋은 분석결과를 얻기 힘듬 Garbage in Garbage out
데이터 품질 저하의 원인
- Incomplete: 데이터가 비어있는 경우 (예: DB 테이블 속성값이 NULL)
- Noisy: 데이터에 오류가 포함된 경우 (예: 나이 = -20)
- Inconsistent: 데이터 간의 정합성(일관성)이 없는 경우 (예: 성별은 남자인데, 주민번호 뒷자리가 2)
데이터 마이닝의 이론적 사례
분석환경 및 주제
웹로그: Apach Accessing Log
사이트: 사진을 서비스하고 앨범을 만들어주는 사이트
분석주제: 사진 조회 빈도 및 사진 간 연관조회 현황 분석
1. 웹로그와 사진정보 DB 간의 매개 현황 파악
2. 로그 필터링을 통해 사진 조회와 직접적인 관련이 없는 로그 제거 후 분석대상만 추출
3. 로그 파싱을 통한 패러미터 값 추출
4. 추출한 패러미터 값을 조건으로 사진정보 DB를 조회 후, 조회된 사진의 키 값으로 조회사진 항목집합 구성
5. 트랜잭션 설계
사진의 조회 연관성 분석을 위해 트랜잭션 설계가 필수적이다. 트랜젝션 내 조회사진 itemset에 대한 빈발항목을 구한다. 이때 시간 차에는 정답이 없으며 프로그래머가 임의로 지정한다.
사용자가 동시에 조회하는 사진 itemset + 트랜젝션의 개념이 없는 개별적인 웹서버 사용 기록(웹로그)
= 로그 간 시간차 분석을 바탕으로 가상의 트랜젝션 도출
학습의 방향
데이터 전처리 유형
- 실무에 있는 데이터는 매우 다양한 형태로 이를 특정 분석 목적에 맞게 가공하는 일은 사안마다 다름
- 데이터 전처리를 개념적인 몇 가지 분류 내로 국한해서 분석 대상 데이터를 만들어내기 힘듦
- 데이터 전처리는 개념적 이론적으로 제시되는 범위보다 훨씬 넓고 포괄적
학습 방향
- 모든 데이터 전처리 유형을 다루기는 불가능하므로, 이론적으로 제시되어 있고 실무에 자주 등장하는 유형 중심 학습
- 이론적 이해 + 실무 사용을 통해 활용 능력 배양
활용 도구
- Python: 플랫폼 독립적이며 인터프리터식, 객체지향적, 동적타이핑 대화형 언어로, 데이터 프레임, 기계학습 등 데이터 분석을 위한 다양한 함수를 제공해 데이터 전처리에 적함
- Oracle: Python의 SQL은 오라클의 SQL에서 제공하는 윈도우 함수와 같은 데이터의 집합적 처리를 위한 강력한 기능은 제공되지 않는 부분이 있어, 일부 사례에서는 오라클 SQL을 통해 해답 제시 ← 데이터 전처리에서는 SQL이 우선!
결측값 Missing Value
존재하지 않고 비어있는 상태로 DB에서 Null값
결측값을 해결하는 방법
- 해당 튜플을 무시한다 row-wise deletion
- 결측값을 수동으로 채워넣는다
- 전역상수 Global Constant를 사용하여 채워넣는다
- 속성의 평균값을 사용하여 채워넣는다
- 주어진 튜플과 같은 클래스(분류)에 속하는 튜플들의 속성 평균값을 사용한다
- 가장 가능성이 높은 값(예측)으로 결측값을 채워넣는다 (회귀분석, 베이지안기법, 의사결정트리기법 등)
실무예제: 결측값 해결
0. 필요한 데이터 불러오기
import pandas as pd
rawData = pd.read_csv('ch2-1(약수터수질현황).csv', encoding='CP949', engine='python')
rawData
1. 해당 튜플 무시하기 Row Wise Deletion - 결측값을 포함하고 있는 튜플 제거
rawData_missing_exclusion = rawData.dropna()
rawData_missing_exclusion
2. 전역상수 Global Constant(0)를 사용하여 결측값 채워 넣기
rawData_missing_fill_constant = rawData.fillna(0)
rawData_missing_fill_constant.query('연번 in (4, 17, 20)')
3. 속성의 평균값을 사용하여 결측값 채워 넣기
rawData_missing_fill_mean = rawData.fillna(rawData.mean())
rawData_missing_fill_mean.query('연번 in (4, 17, 20)')
4. 주어진 튜플과 같은 클래스(분류)에 속하는 튜플들의 속성 평균값을 채워 넣기
rawData_missing_fill_mean_groupby = rawData.fillna(rawData.groupby('적합').transform('mean'))
rawData_missing_fill_mean_groupby.query('연번 in (4, 17, 20)')
5. 가장 가능성 높은 값으로 결측값 채워 넣기 - 회귀분석
rawData_missing_fill_regression = pd.DataFrame(rawData, copy=True)
mask = ~np.isnan(rawData_missing_fill_regression['일반세균']) & ~np.isnan(rawData_missing_fill_regression['질산성질소'])
# y(질산성질소) = ax(일반세균) + b a:slope, b:intercept
slope, intercept, r_value, p_value, std_err = stats.linregress(rawData_missing_fill_regression['일반세균'][mask],
rawData_missing_fill_regression['질산성질소'][mask])
rawData_missing_fill_regression['질산성질소'].fillna(rawData_missing_fill_regression['일반세균']*slope + intercept, inplace=True)
# y(일반세균) = ax(질산성질소) + b a:slope, b:intercept
slope, intercept, r_value, p_value, std_err = stats.linregress(rawData_missing_fill_regression['질산성질소'][mask],
rawData_missing_fill_regression['일반세균'][mask])
rawData_missing_fill_regression['일반세균'].fillna(rawData_missing_fill_regression['질산성질소']*slope + intercept, inplace=True)
# 채우지 못한 17번 제거
rawData_missing_fill_regression.dropna(inplace=True)
rawData_missing_fill_regression
'데이터 청년 캠퍼스 > 전처리' 카테고리의 다른 글
[전처리] 고급 SQL 이해와 활용(1) (0) | 2022.07.21 |
---|---|
[전처리] 주성분분석 (0) | 2022.07.21 |
[전처리] 라벨 인코딩, 원 핫 인코딩, 오버샘플링 SMOTE (0) | 2022.07.20 |
[전처리] 데이터 통합, 상관 분석, 데이터 축소, 속성부분 집합 선택 (0) | 2022.07.19 |