# -*- coding: utf-8 -*-
"""
Created on Sat Feb  2 22:58:07 2019

@author: User
"""

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data_path = r'D:\graduated_school\Study\Data_Mining\data\Titanic/'

train_data = pd.read_csv(data_path+'train.csv')

# 3.1 데이터 전처리 : 개요

"""
3.1.1 데이터 품질
- 크게 정확성, 완결성, 일치성으로 나뉨
 ○ 정확성 : 정확성이 결여되면 오류값이 포함되며 기대값에서 벗어난 값이 포함됨
 ○ 완결성 : 정확성이 결여되면 속성값 부족 및 통합 데이터만 존재
 ○ 일치성 : 일치성이 결여되면 분류된 항목의 부서코드가 일치하지 않는 등 속성과 일치하지 않는 데이터 발생.
 
3.1.2 데이터 전처리 주요 작업
- 정제, 해석, 축소, 변환의 단계로 나뉨
- 정제 : 결측치를 채우고 노이즈 데이터를 조정하며 이상치 식별 및 제거하며 일관성 없는 문제점 해결하는 과정.
 ○ 모델링되는 함수에 데이터가 과적합되지 않도록 해야 함.
 ○ 데이터 정제, 통합과정에서 중복 피하는 작업을 해야 함.
- 축소 : 데이터 양을 상대적으로 작게 만드나 분석 결과는 동일하게 만드는 것.
 ○ 차원축소, 작은 형태로 표현(Log-linear모형의 모수만 저장하는 방법 등)이 있음
- 그 외
 ○ 클러스터링 할 때 속성값을 정규화하면 더 좋은 결과를 얻을 수 있음.
 ○ 이산화, 컨셉 계층 생성
 ○ 데이터를 범위, 상위 개념 수준으로 대체 가능(예를 들면 나이는 청년, 성인, 노인 등)
 
"""

# 3.2 데이터 정제
"""
3.2.1 결측치
- 방법
 ○ 행(튜플) 무시 : 분류 분석 가정 시, 클래스 라벨이 없는 경우 사용하는 방법
  ● 튜플이 결측값 갖는 속성 포함 시 별로 효과적이지 않음.
  ● 속성별로 결측값의 비율이 다를 때 별로 효과적이지 않음.
 ○ 글로벌 상수값을 이용하여 결측치 채우기
  ● 모든 결측치 속성 값을 'Unknown' 등으로 채움.
 ○ 해당 속성의 결측치에 중심 경향 측정값 사용(평균, 중위수 등)
  ● 편향된 데이트 분포의 경우 중위수 사용
 ○ 주어진 튜플과 동일한 클래스에 속하는 모든 샘플의 속성평균, 중위수 이용하기
  ● Titanic 데이터를 예로 들면 고객을 Pclass에 따라 분류 시, 결측치를 동일 
    Pclass 카테고리에 속하는 고객에 대한 Age의 평균값, 중위수 등으로 처리
 ○ 가장 가능성이 높은 값으로 채우기
  ● 회귀분석, 베이지안 공식, 의사결정나무 도입을 이용한 추론 기반 도구로 결측치 대체 값 결정.
  ● 예 : 데이터 집합에서 다른 고객의 속성값을 사용 시, 의사결정나무를 사용해 Age에 대한 결측값 예측 가능.

- 행(튜플) 무시를 제외한 방법은 데이터를 왜곡시키므로 대체값이 정확하지 않을 수 있으나 많이 사용하는 방법.
- 특정 속성의 값을 추정 할 때 다른 속성값을 고려하면 다른 속성값 간의 관계 보존 가능성 커짐
 => 하지만 그 데이터에만 과적합 가능성도 있음.
- 결측값은 오류가 아닐 수도 있음을 인지해야 함.

3.2.2 노이즈 데이터
- 노이즈 : 측정 변수의 랜덤 오류, 분산을말함.
- 처리 방법
 ○ 비닝
  ● 근접한 다른 값을 참고하여 정렬한 데이터 값을 평활화 함.
  ●  예를 들면 9개 데이터가 있다고 할 때 앞의 3개 평균, 중간 3개 평균, 끝의 3개 평균 값으로 각 데이터 나타냄
   (3,3,3,6,6,6,9,9,9)
  ● 빈 경계로 평활화 하는 방법도 있음.(가장 근접한 경계값으로)
 ○ 회귀분석
  ●2개 속성에 대해 최적합하는 라인을 알아내서 한 속성을 사용하여 다른 속성의 값을 알아냄
 ○ 이상치 분석 : 군집의 외부에 존재하는 값을 말함.
- 많은 데이터 평활화 방법은 데이터 구분(데이터 변환 형태)와 데이터 축소에 사용.
 ○ ex) 비닝 : 속성별 개별 값의 개수 축소.
 => 의사결정 나무 같은 로직 기반 데이터 마이닝 방법에 사용하기 위해 데이터 축소과정에서 사용.

3.2.3 프로세스로서 데이터 정제
- 단계로 나누면
1. 불일치감지 : 데이터에서 일관성이 없는 경우 불일치라고 함.
 ○ 데이터 특성에 대한 기존 지식 활용함
  ● 각 속성에 대한 데이터 유형, 용인 가능한 값의 범위(이상치 제거) 파악 등.
  ● 데이터가 대칭적으로 분포하는지 여부, 값의 분포 파악
  ● 모든 값이 예측 범위 내에 위치하는지 파악
  ● 이 속성의 표준편차 값 파악 -> 평균에서 표준편차 2개가 떨어지면 이상치로 표시하기도 함.
  ● 속성간 상호 종속관계가 있는지 여부 파악.
2. 차이 감지
 ○ 모순 감지
  ● 도메인 지식을 이용하여 데이터 오류 체크
 ○ 이상치 감지를 위한 클러스터링, 상관관계 발견을 위한 통계분석도 가능.
"""

# 3.3 데이터 통합

"""
3.3.1 엔티티 확인 문제
- 데이터 분석 작업은 다양한 원천에서의 데이터 통합도 포함함.
 => 데이터 원천 : 다양한 데이터베이스, 데이터 큐브, 파일 등
- 엔티티 식별문제 : 엔티티들을 매칭하는 방법.
 ○ ex) 데이터베이스의 customer_id, 타 데이터베이스의 cust_number은 동일한 속성을 같는가?
- 통합시에는 데이터 구조에 대해 특히 주의해야 함.

3.3.2 중복과 상관관계 분석
- ex) 연간 수익과 같은 속성이 다른 속성으로 계산 되면 중복임.
- 2개의 속성 데이터 기준으로 하면
 ○ 명목형 데이터 : 카이-스퀘어 검정을 이용함(카이-스퀘어 상관검증)
  ● sex와 survive의 상관관계 분석시
   ex)
             남    여     총합
   survived
   died
  -> 이러한 형태로 정리하여 카이제곱값을 계산하여 상관관계가 있는지 평가함
  (귀무가설 : 상관관계 없다고 가정함.)
  
 ○ 수치형 속성 : 상관계수, 공분산 사용 가능.
  ● 상관계수 : 피어슨의 상관계수로 계산함.
   -> 상관관계가 클수록 각 속성은 다른 속성으로 대체 가능.
  ● 공분산 : 두 변수가 얼마나 같은 방향으로 변동하는지 정량적으로 평가한 지표.

3.3.3 튜플 복사 : 튜플 수준에서도 중복 감지 가능함.
 -> 예를 들어 키 값을 중복 가능한 데이터로 할 경우.

3.3.4 데이터 값 충돌 감지 및 해결
- 데이터 통합은 이 값의 충돌 감지 및 해결하는 작업.
- 예를 들면 어떤 데이터베이스에서 거리 단위를 km, 다른 데이터베이스는 meter를 사용하는 경우



"""