[Python] 기술통계와 모델링

28. 기술통계와 모델링

 

28.1 데이터마이닝(Data Mining)

대용량의 데이터로부터 유용한 정보를 캐내는(mining) 작업

대용량 데이터에 존재하는 데이터 간의 관계, 패턴, 규칙 등을 찾아내고 모형화해서 기업의 경쟁력 확보를 위한 의사결정을 돕는 일련의 과정

 

28.1.1 CRISP-DM(CRoss-Industry Standard Processing for Data Mining)

데이터마이닝을 위한 업계 표준 프로세스

 

28.1.2 인공지능 / 데이터마이닝의 다양한 기법들

 

28.1.2.1 분류 모형(Classification Models)

어떤 기준(정답)에 의해 분석 대상을 2개 혹은 3개 이상의 집단으로 분류하는 예측 모형(부도예측, 기상예측, 채권등급예측 등)

  • 다중판별분석(MDA, Multiple Discriminant Analysis)
  • 로지스틱 회귀분석(LOGIT, Logistic Regression)
  • 인공신경망(ANN, Artificial Neural Networks)
  • 사례기반추론(CBR, Case-Based Reasoning)
  • 의사결정나무(DT, Decision Trees)
  • SVM(Support Vector Machines)

 

28.1.2.2 최적화 기법(Optimization Methods)

주어진 제약조건 하에서 특정 목적함수를 최대, 최소화하는 변수들의 최적값을 도출하는 기법(공장의 생산량 최대화 문제, 비용을 최소화하는 최적 유통경로 등)

  • 선형계획법(LP, Linear Programming)
  • 유전자 알고리즘(GA, Genetic Algorithms)

 

28.1.2.3 가치평가 기법(Valuation Methods)

정성적 측정대상에 대한 가치를 비교, 평가하는 기법(차세대 전투기 선정, 신행정수도 선정 등)

  • 분석적 계층 프로세스(AHP, Analytic Hierarchy Process)
  • 분석적 네트워크 프로세스(ANP, Analytic Network Process)
  • 자료 포락 분석(DEA, Data Envelopment Analysis)

 

28.1.2.4 분류/군집화 기법(Clustering Methods)

사전에 정해진 기준 없이 서로 동질한 데이터들을 같은 그룹으로 묶어주는 기법(고객 세분화 등)

  • K-means 분류기법(K-means clustering)

 

28.1.2.5 전처리 기법(Preprocessing Methods)

예측모형의 성과를 향상하기 위해 입력 데이터에 대해 사전 처리를 수행하는 기법

  • 주성분분석(PCA, Principal Component Analysis)
  • 퍼지이론(Fuzzy theory)

 

 

28.2 데이터 전처리

28.2.1 결측값(Missing Value)의 처리

너무 많은 항목이 비어 있는 변수나 너무 많은 항목이 비어 있는 레코드는 그 자체를 삭제

기타 나머지 항목에 대해서는 일반적으로 다음과 같은 값으로 대체

  • 평균값(Mean) / 중앙값(Median) / 최빈치(Mode)
  • 평균값: (1 + 2 + 3 + 4 + 4 + 5 + 6 + 6 + 6 + 7 + 8) / 11 = 4.727
  • 중앙값: 5
  • 최빈치: 6

 

28.2.2 정성적 변수의 정량화

각 속성은 단일변숫값(atomic value)을 갖도록 수정

정성적 변수의 경우, 0/1의 binary code로 변환해야 추후 해석이 가능

​ 예) 주소의 변환, 성별의 변환 등

 

28.2.3 이상치(Outlier)의 제거

상식적으로 말이 안되거나 잘못 입력된 것으로 추정되는 변숫값을 조정

일괄적으로 상위 10%와 하위 10%에 해당하는 값들을 단일 값으로 부여하는 경우도 있음

​ 예) 체중 80Kg 이상은 무조건 80Kg으로, 체중 45Kg 이하는 무조건 45Kg으로

 

28.2.4 새로운 파생변수 개발

기존의 변수를 조합하여 새로운 변수를 개발

본래는 비율변수인 변수를 의미 있는 정보로 구간화하여, 새로운 명목변수로 만?

 

28.2.5 정규화(Normalization)

모든 입력변수의 값이 최소 0에서 최대 1 사이의 값을 갖도록 조정하거나, 평균을 갖는 표준정규분포를 갖도록 값을 조정하는 것

정규화 공식 (Min-Max Normalization)

​ (x - 최소값) / (최대값 - 최소값)

예를 들어 전체 고객 중 체중이 가장 작은 사람이 40Kg, 가장 큰 사람이 120Kg라고 하면,

​ 40Kg -> 0으로 변환

​ 120Kg -> 1로 변환

​ 80Kg -> (80 - 40) / (120 - 40) = 40 / 80 = 0.5로 변환

 

28.2.6 자료의 구분

28.2.6.1 과적합화(Overfitting)의 발생 가능성

다음날의 주가지수를 예측하는 모형 A와 B가 있다.

A는 모형을 구축한 날까지의 주가(과거 주가)는 99.99% 맞춘다. 그런데, 그 다음날부터 주가지수를 예측시켜보니 70%를 맞추었다.

모형 B는 과거 주가는 83% 맞추는데, 미래주가는 78% 맞춘다.

A, B 중 더 잘 구축된 모형은?

 

28.2.6.2 과적합화의 예방법: 모형 구축 시, hold-out data의 개념을 도입

Hold-out data (검증): 모형이 일반성을 갖는지 확인하기 위해 남겨두는 unknown data

통계 모형을 구축할 때, 전체 데이터가 100이라면 학습 : 검증 = 8 : 2 혹은 7 : 3의 비중으로 자료를 미리 나누어 둠

 

28.2.6.3 0/1 예측의 경우 0과 1의 비중이 각 데이터셋마다 1 : 1의 비중이 되도록 섞어야 함

 

28.2.7 모형에 들어갈 후보 입력변수 선정

카이제곱 검정(Chi-square Test)

독립표본 t검정 (t-Test) - 이분류 모형의 경우에 사용

분산분석 (ANOVA) - 다분류 모형의 경우에 사용

 

 

28.3

28.3.2 모집단과 표본

우리나라 국회의원들이 소유하고 있는 모든 주택의 평균 가격은 얼마인가?

 

28.3.2.1 모집단 (population)

  • 관심의 대상이 되는 집단 전체
    (예) 우리나라 국회의원들이 소유하고 있는 모든 주택
  • 모수 (parameter)
    집단이 가지고 있는 특징을 나타내는 수치
    (예) 평균 가격
  • 전수조사 (census)
    모집단의 모든 개체를 전부 조사하는 방법
    모수의 값을 가장 정확하게 알아내는 방법: 시간과 비용 문제

 

28.3.2.2 표본 (Sample)

모수의 값을 알아내기 위해 추출된 모집단의 일부분

일반적인 통계분석에서는 모집단의 일부만 조사하여 모집단의 모수를 추측

100% 정확하지는 않지만, 거의 근접한 값을 제공해 줄 수 있음

대신 시간과 비용을 크게 절약할 수 있는 방법

사용성 평가에 정량 데이터 활용하기 . (2018). Retrieved from https://brunch.co.kr/@jaehyun-design/5.

 

28.3.2.3 표본 추출

표본이 모집단을 대표할 수 있도록 추출하는 것이 중요

표본추출이 잘못되어 발생한 해프닝 사례

미국의 1936년 대선 → 민주당 Franklin Roosevelt vs. 공화당 Alf Landon

전화 조사 결과 공화당 승리 예상, 실제로는 민주당 승리

당시에는 전화의 보급률이 매우 낮았음

 

 

28.5 기술통계량

응답자의 평균 소득은 얼마일까?

응답자 나이의 평균은 몇 살인가?

특정 상품 선호도에 대한 관측치들은 평균을 중심으로 얼마나 퍼져있는가?

분산, 표준편차를 통해 확인 가능

 

왜도(Skewness): 분포의 편중(치우침)을 나타내는 지표

(예) 금액, 거리, 무게, 시간 등

 

28.5.5 카이제곱 검정의 해석

점근 유의확률(p-value라고 함)을 토대로 평가한다.

"95% 신뢰수준 하에서" 로 해석하고 싶으면, 유의확률 < 0.05 인지 확인

"90% 신뢰수준 하에서" 로 해석하고 싶으면, 유의확률 < 0.1 인지 확인

(즉, 유의확률은 작으면 작을수록 좋다.)

 

2) 가설 검정의 기초

가) 과학 분야에서의 증명 : 반증법에 의거해 증명

"모든 사람은 정직하다" 라는 명제가 있을 때 이 명제가 참인지 거짓인지를 확인하는 접근법에는 2가지가 존재

​ (1) 모든 사람을 일일이 조사해서 정직한지 확인하는 방법

​ (2) 정직하지 못한 사람(사례)을 하나 찾아내 명제가 거짓임을 입증하는 방법

위 2가지 방법 중 어느 것이 효율적일까? (현실적으로 가능한 방법일까?)

1000명이 정직함을 확인했을 때, 1001명째 사람이 정직하다고 확언할 수 있을까?

나) 귀무가설(H0)과 대립가설(Ha)

우리가 알고 싶은 명제(주로 A와 B는 다르다, A와 B는 차이가 있다 등)는 대립가설로 두고, 그 반대인 귀무가설(주로 A와 B는 같다, A와 B는 차이가 없다 등)이 기각됨을 보임으로서 내가 입증해 보이고 싶은 명제를 증명

 

3) 독립표본 t-검정

서로 독립된 두 집단간의 평균의 차이가 통계적으로 유의미한지 비교하고자 할 때 사용

예) 전체 응답자 중 남자와 여자 사이의 연령은 차이가 있는가?

 

4) 대응표본 t-검정(Paired-samples t-test)

서로 동일한 모집단에서 추출된 두 표본에 대해 특정 연속형 변수 평균값이 서로 차이가 있는지, 없는지를 통계적으로 검정할 때 사용되는 기법

​ 예) 한 회사에서 자사가 개발한 한 달간의 식이요법 프로그램이 효과가 있는지 여부를 분석하고자 함

 

5) 일원배치 분산분석(One-way ANOVA)

세 개 이상의 집단간의 평균의 차이가 통계적으로 유의미한지 비교하고자 할 때 사용

​ 예) 학력수준에 따라 직무만족도의 수준은 차이가 있는가?

 

28.6 Examples

28.6.4 대응표본 t검정

# 다이어트 약을 복용한 사람들 중 20명을 선택하여 복용 전후의 체중 차이가 유의미한지 알고 싶다.
# 귀무 가설: 복용 전후의 체중 차이가 없다.
# 대립 가설: 복용 전후의 체중 차이가 있다.
import numpy as np
from scipy import stats

# 랜덤 시드 설정(같은 결과가 나옴)
np.random.seed(1)

# 복용전: 평균 60, 표준편차 5
before = [60 + np.random.normal(0, 5) for _ in range(20)]
print(before)

# 복용후: 평균 : 복용전체중 x 0.99, 표준편차 0.02
after = [w * np.random.normal(0.99, 0.02) for w in before]
print(after)

# 대응표본 t검정
result = stats.ttest_rel(before, after)
print("검정통계량: %.3f, p-value: %.3f" % result)

# p-value가 0.05보다 작으므로 95% 신뢰수준 하에서
# 다이어트약 복용전후의 체중은 통계적으로 유의하게 차이가 난다고 할 수 있음
# 따라서 귀무가설을 기각하고 대립가설을 채택한다.
# 즉, 다이어트약 복용전후의 체중 차이가 있다.

 

28.6.5 아노바 분석

# 김부장은 4개의 각기 다른 신입사원 교육훈련 기법의 효과성을 평가하고자 한다.
# 새로 입사한 32명의 신입사원에게 4가지 기법을 임의로 적용시켜 교육을 시켰다.
# 한 달간의 훈련기간이 끝난 후 표준 시험을 쳤는데 그 점수는 아래와 같다.
# 4개의 교육훈련 기법간 차이가 있는가? 만약 있다면 어떻게 다른가?
# 3개 이상의 대응표본을 비교해야 하므로 일원배치 분산분석(아노바 분석) 기법을 사용해야 한다.
# 귀무가설 : 4개의 교육훈련 기법간의 차이가 없다.
# 대립가설 : 4개의 교육훈련 기법간의 차이가 있다.
import scipy.stats as stats
import urllib
import matplotlib.pyplot as plt
%matplotlib inline
a = [ 66, 74, 82, 75, 73, 97, 87, 78 ]
b = [ 72, 51, 59, 62, 74, 64, 78, 63 ]
c = [ 61, 60, 57, 60, 81, 55, 70, 71 ]
d = [ 63, 61, 76, 84, 58, 65, 69, 80 ]

print("a 평균: ", np.mean(a))
print("b 평균: ", np.mean(b))
print("c 평균: ", np.mean(c))
print("d 평균: ", np.mean(d))

# matplotlib plotting
plot_data = [a, b, c, d]

'programming > python' 카테고리의 다른 글

[Python] 인공신경망  (0) 2019.06.25
[Python] 회귀분석  (0) 2019.06.24
[Python] 기술통계와 모델링  (0) 2019.05.09
[Python] 웹 스크레이핑  (0) 2019.04.23
[Python] Matplotlib  (0) 2019.04.21
[Python] Pandas  (0) 2019.04.15

댓글(0)

Designed by JB FACTORY