본문 바로가기
데이터 청년 캠퍼스/전처리

[전처리] 데이터 통합, 상관 분석, 데이터 축소, 속성부분 집합 선택

by 뚱뚜루뚱 2022. 7. 19.
데이터 통합 Data Integration

 여러 데이터 저장소로부터 온 데이터들의 합병. 데이터 웨어하우스나 데이터 마이닝과 같은 데이터 분석 작업은 다수의 데이터 원천으로부터 수집한 데이터를 하나의 통일된 데이터 저장소로 결합하는 데이터 통합 작업을 필요로 한다. 데이터 원천은 데이터 베이스, 데이터 큐브, 플랫 파일 등 다양한 형태로 존재한다

 

개체 식별 문제 Entity Identification Problem

  • 데이터 통합 시 동일한 의미의 개체들이 서로 다르게 표현되어 있는 문제
  • 메터데이터의 역할이 중요: 일반적으로 속성의 데이터 타입, 도메인, 기본키 여부, 참조무결성(외래키) 관계, 함수적 종속 관계 등을 종합적으로 고려하여 속성의 동일성 여부 판단
  • 메터데이터는 데이터 변환에 도움을 줄 수 있음

 

중복 Redundancy

  • 유도속성 Derived Attribute → 불일치 문제 발생: 무엇이 틀린 것인가? (예: 생년월일과 연령, 월소득과 연간소득)
  • 정규화되지 않은 테이블: 조회 성능 향상을 위해 일부러 정규화하지 않고 중복 허용 → 일관성 저해의 문제 야기 (예: 구매 테이블 {구매자번호, 구매일시, 주소, 전화번호, 구매품목} 동일한 구매자 번호에 대해 다른 주소가 존재할 가능성)
  • 중복 문제의 해결은 데이터 정제의 영역으로, 어떠한 절대적인 해결책이 있다라기보다는 데이터 정제 시 가장 데이터 정확성을 높이는 방향으로 정제 룰 Cleansing Rule을 정의하여 일괄 적용할 수 밖에 없다.

 

 

상관 분석

 속성 간에 엄격한 함수적 종속 관계(x → y, x1=x2이면 y1=y2)가 성립하지는 않지만, 상관분석을 통해서 한 속성이 다른 속성을 얼마나 강하게 암시하는지를 사용 가능한 데이터를 토대로 측정할 수 있다. 두 속성 간에 상관도가 높다면, 두 속성을 중복으로 보고 그 중 하나의 속성을 제거할 수 있다.

 

수치형 데이터: 상관계수

 중복 속성 여부를 판단할 때 절대적인 판단 기준이 존재하지 않으며, 해당 분야 도메인 지식을 충분히 고려해서 최종 판단하는 것이 바람직하다

  • 상관계수 결과 값의 범위는 [-1, 1]이다
  • 0보다 크면 양의 상관관계를 가진다
  • 0보다 작으면 음의 상관관계를 가진다
  • 0이면 둘 사이에 상관관계가 없다
  • 절대값이 0.7보다 크면 강한 상관관계를 의미한다
  • 절대값이 0.3보다 작으면 약한 상관관계를 의미한다

 

 

 

실무예제

 전국 주요 지점별 유동 인구 현황 [남자 20대 vs 여자 20대], [남자 10대 vs 여자50대]의 상관계수를 구하여 비교하고 중복 속성으로 판단할 수 있는지 검토하기

 

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

rawData = pd.read_csv('ch3-1(유동인구수).csv', encoding='CP949', engine='python')
rawData

 

상관계수 분석 (남자20대 vs. 여자20대)

corr = np.corrcoef(rawData['남자20대'], rawData['여자20대'])
print("-- 상관계수(남자20대 vs. 여자20대) --")
print(corr) #0.8472

plt.figure(figsize = (8,6))
plt.scatter(rawData['남자20대'], rawData['여자20대'])
plt.show()

상관계수 분석 (남자10대 vs. 여자50대)

corr = np.corrcoef(rawData['남자10대'], rawData['여자50대'])
print("-- 상관계수(남자10대 vs. 여자50대) --")
print(corr) #0.2632

plt.figure(figsize = (8,6))
plt.scatter(rawData['남자10대'], rawData['여자50대'])
plt.show()

 

 

 

범주형(이산형) 데이터: 카이제곱 검정(Github파일로 실습해보기)

 전라남도 유망중소기업 지정업체 명단. 시군 속성와 지정구분 속성 간의 연관성 여부를 카이제곱 검정 방법에 의해 판단해보시요(유의수준 0.05)

 오라클 SQL을 이용해 데이터의 형태를 표로 바꾸어준다

 

 

 

 

데이터 값 충돌의 탐지와 해결

 서로 다른 데이터 원천으로부터 온 데이터들의 통합 시 동일한 개체에 대해서 속성값이 서로 다를 수 있으므로, 기준을 정해 데이터를 변환하고 통합해야한다.

 원천 시스템의 기능적 종속성과 제약사항들이 통합된 후에도 관련 규칙들이 적용될 수 있도록 목표 통합 시스템의 것과 일치하도록 해야한다.

 

 

 

데이터축소

  방대한 양의 데이터를 대상으로 복잡하게 데이터를 분석하고 마이닝 기법을 적용하면 많은 시간이 소요되어 분석이 비현실적일 수 있다. 데이터 축소의 대전제는 데이터 집합에 대한 데이터 분석 결과가 원본 데이터 집합의 분석 결과와 거의 동일한 결과를 산출해야 한다는 점이다.

 차원적 축소 Dimensionality Reduction는 데이터 인코딩 스키마를 적용하여 압축되거나 축소된 표현을 제공한다. 수치적 축소 Numerosity Reduction는 모수적 모형 Parametric Model이나 비모수적 모형non-parametric model을 사용하여 데이터를 대체한다. 

 

데이터큐브

데이터 웨어하우스(DW)에서 나오는 용어로 다차원의 집계정보를 의미한다. 집단화된 데이터(aggregated data)를 저장하는데, 이때 개별 특성이 뭉개질 가능성이 존재함에 주의한다. 원천 데이터를 여러 관점에서 추상화시켜 데이터 축소를 구현한다. 데이터 큐브는 사전계산되고 요약된 데이터에 신속하게 접근할 수 있다는 장점이 있어 데이터 마이닝과 같은 분석처리가 가능해진다.

  • 기본 큐보이드 base cuboic: 최하위 추상 레벨에서 만들어지는 큐브
  • 정점 큐보이드 apex cuboid: 최상위 추상 레벨에서 만들어지는 큐브

속성 부분집합 선택

연관성이 낮거나 중복되는 데이터 속성을 제거해 데이터 집합의 크기를 줄이는 기법. 데이터 분석에 영향을 미치지 않거나 중복적 성격의 속성을 충분히 제거하지 않을 경우, 분석결과 품질 저하의 우려가 있고 분석 성능에도 영향을 미친다. 목표는 전체 속성에 가장 가까운 데이터 범주의 확률 분포와 최소 속성 집합을 찾는 것이다

 

최소 속성 집합 찾는 법

  • 소모적 탐색법 Exhausted Search: n개의 속성에 대해 2^n개의 가능한 속성조합을 모두 탐색. n이 증가할수록 엄청난 비용이 발생해 비현실적이다
  • 경험적 탐색법 Heuristic Search: 속성 공간을 탐색하는 동안 매 회마다 최선으로 보이는 것을 선택. 지역적으로 최적의 해를 찾는 것으로 탐욕적 Greedy라고도 한다
  • 속성 평가 척도 활용: 분류를 위한 의사결정트리 생성에 사용되는 정보 이득 등

 

경험적 기법

  • 단계적 전진선택법 Stepwise Forward Selection: 속성의 공집합으로 시작해 최적의 속성들을 하나씩 추가
  • 단계적 후진제거법 Stepwise Backward Selection: 속성의 전제 집합으로 시작해 최악의 속성들을 하나씩 제거
  • 전진선택법과 후진제거법의 결합
  • 의사결정트리 귀납법: 비단말노드(속성에 대한 테스트), 가지(속성 테스트 결과에 따른 흐름), 단말 노드(클래스 예측). 데이터를 개별적 클래스로 분할하기 위한 최선의 속성을 각 노드에서 고르는 것. 트리에 나타나지 않은 모든 속성은 부적절한 것으로 판단되고, 트리에 나타나는 속성들의 집합이 축소된 속성집합이다

 

다중공선성 Multicolinearity 분석

 독립변수들 간의 상관정도가 높은 상태로, 다중공선성이 있으면 회귀분석 시 각 독립변수의 회귀계수가 종속변수에 미치는 영향을 제대로 설명하지 못하고 분류 시 종속변수에 중요한 영향을 미치는 독립변수가 결정트리 분류 조건에서 누락될 가능성이 발생한다

  상관성 다중공선성
특징 두 변수(속성) 간 상관정도 측정
독립변수와 종속변수 구별X
두 개 이상의 변수들 간의 상관정도 측정
독립변수들 간의 상관정도 측정
측정방법 Pearson Correlation 분산팽창계수 VIF
공차한계 Toelerance
상태지수 CN

 

다중공선성 존재 판단 기준(일반적)

  • 분산팽창계수 VIF <= 0.1
  • 공차한계 Toelerance >= 10
  • 상태지수 CN >= 10
  • 고유값 Eigen Value <= 0.01

 

속성 부분집합 선택

  • 최소제곱법 OLS: 오차의 제곱 합을 최소화하는 기법
  • Adj R-squared: 다중 회귀모형의 설명력. 0.4 이상 권장
  • 회귀계수 coef: 종속변수에 대한 영향력
  • 유의확률 P>|t|: 0.05미만 권장
  • Durbin-Watson: 독립변수들의 독립성. 1.5 ~ 2.5 권장

전진선택법 + 후진 제거법: 전진선택법에 의해 독립변수를 추가한 뒤, 다중공선성을 측정하여 변수 제거

 

 

의사결정트리 귀납법의 대안

  • 랜덤포레스트 기법: 속성 중요도를 측정하여 중도요 수치가 높은 n개의 속성 선택(전진선택법)
  • XGBoost: 속성 중요도를 측정하여 중도요 수치가 높은 n개의 속성 선택(전진선택법)
  • RFE: 모든 특성으로 시작하여 모델을 만들고, 속성 중요도가 가장 낮은 특성을 제거(후진제거법)

 

속성 부분집합 선택 실습

붓꽃 데이터: 품종 판별에 중요한 영향을 미치는 속성의 부분집합을 의사결정트리 귀납법을 적용하여 선택하시오

 

1. 필요한 패키지, 라이브러리, 데이터 불러오기

import pandas as pd
import numpy as np

from sklearn import tree  # 의사결정트리 기법에 관련된 모듈
from sklearn.model_selection import train_test_split  # 분석모형 선택에 관련된 모듈
from sklearn.preprocessing import StandardScaler  # 데이터전처리에 관련된 모듈
from sklearn.metrics import accuracy_score # 분류 정확도(classification accuracy)를 계산하는 모듈

rawData = pd.read_csv('ch4-2(붓꽃데이터).csv', encoding='CP949', engine='python')

 

2. 데이터 분할하기

X = rawData.loc[:, 'sepal_length':'petal_width']
y = rawData.loc[:, 'class']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

 

3. 모델 만들고 학습, 예측, 평가하기

iris_tree= tree.DecisionTreeClassifier(criterion='entropy', max_depth=4, random_state=0)
iris_tree.fit(X_train, y_train)

y_pred_tr = iris_tree.predict(X_test)
print('Accuracy: %.2f' %accuracy_score(y_test, y_pred_tr))

 

4. 의사결정 트리 시각화

from sklearn.tree import export_graphviz
import pydotplus  # graphviz의 dot language 와의 인터페이스를 제공하는 패키지 임포트
from IPython.display import Image  # IPython의 display와 관련된 Public API

x_list = list(X.columns)
y_list = list(y.drop_duplicates(inplace=False))

dot_data = export_graphviz(iris_tree, out_file=None, feature_names=x_list,
                          class_names=y_list, filled=True, rounded=True, special_characters=True)

graph = pydotplus.graph_from_dot_data(dot_data)  
Image(graph.create_png())

 

 

Github

결정트리 실습

RFE 실습

다중공선성 실습