Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

BASEMENT

R 프로그래밍 - 7주차 본문

Programming/R

R 프로그래밍 - 7주차

2_34 2020. 8. 11. 22:33

 

 

데이터 마이닝

 

1. 데이터 마이닝의 이해

 

  • 데이터 마이닝 : 대용량의 데이터에서 유용한 정보와 관계를 탐색하고 모험화하여 지식을 발견하는 과정
  • 대용량의 관측된 자료를 다룸
  • 이론보다는 실무위주의 컴퓨터 중심적인 방법
  • 경험적 방법에 근거
  • 주요 관심은 예측모형의 일반화
  • 기업의 다양한 의사결정에 활용됨
  • 통계학, 전산학, 인공지능, 공학과 같은 분야에서 주로 개발됨

 

2. 데이터 마이닝 프로세스

 

1) 과정

자료선택 및 정제 -> 자료변환 -> 데이터마이닝 -> 해석 및 평가

 

2) CRISP-DM

SPSS, NCR, Daimler-Chrylsler 등 여러 업계의 선도회사가 데이터 마이닝 작업의 표준화를 연구하여 발표한 방법론

비즈니스 이해 -> 데이터 이해 -> 데이터 준비 -> 모델링 -> 평가 -> 전개

 

3) SAS

SAS의 지도예측 문제 해결을 위한 5단계 분석 전략

표본 (Sample) -> 탐색 (Explore) -> 수정 (Modify) -> 모형화 (Model) -> 평가 (Assess)

 

4)  Score 모델 생성

현황파악 -> 현황분석 -> 업무수행 -> 평가수행

방향정의 -> 현황분석/설계 -> 모델생성 -> 모델평가

 

 

3. 데이터 마이닝의 분할

 

데이터 마이닝을 이용하여 모델을 개발할 시, 모델의 개발, 테스트, 검증을 위해 데이터를 분할하여 사용함

 

1) 학습용 데이터 (Training Data)

 

  • 모델을 생성하기 위한 용도로 사용하는 데이터
  • 일반적으로 표본 데이터의 50%를 사용
  • 다수 모델 생성을 위해 동일한 학습용 데이터 사용

2) 평가용 데이터 (Test Data)

 

  • 생성된 모델의 평가 용도로 사용하는 데이터
  • 일반적으로 표본 데이터의 30%를 사용
  • 모델간 성과 비교 및 최적 모형을 선택하기 위한 용도로 활용

3) 검증용 데이터 (Validation Data), 예비용 데이터 (Holdout Data)

 

  • 생성된 모델의 검증(재평가) 용도로 사용하는 데이터
  • 일반적으로 표본 데이터의 20%를 사용
  • 선택 모델이 새로운 데이터에 얼마나 좋은 성과를 보이는지에 대한 불편 추정치를 얻기 위함

 

4. 모델링 기법

 

1) 데이터 유형에 따른 기법 분류

변수구분 연속형 반응변수 범주형 반응변수 반응변수 없는경우
연속형 예측변수 선형 회귀분석
신경망 모형
K-최근접이웃기법
로지스틱 회귀분석
판별분석
K-최근접이웃기법
주성분 분석
군집분석
범주형 예측변수 선형 회귀분석
신경망 모형
회귀나무
신경망 모형
분류나무
로지스틱 회귀분석
단순 베이즈 분류모형
연관성 규칙

 

cf) 로지스틱 회귀분석 : 성능은 낮으나, 설명을 가장 잘 해 주는 기법. 가장 많이 사용함

 

cf) 지도학습, 비지도학습 : y의 유무 차이. 지도학습은 답지가 있으나, 비지도학습은 군집분석 또는 연관성 분석과 같이 정확한 답이 없음

 

 

2) 목적에 따른 기법 분류

 

2-1) 예측

 

  • 분류 규칙(Classification) : 가장 많이 사용되는 작업으로, 과거의 데이터로부터 고객특성을 찾아내어 분류모형을 만들어 이를 토대로 새로운 레코드의 결과값을 예측하는 것. 목표마케팅 및 고객 신용평가 모형에 활용됨             
  • -> 회귀분석, 판별분석, 시계열, 신경망, 의사결정 나무

2-2) 설명 

 

  • 연관 규칙(Association) : 데이터 안에 존재하는 항목간의 종속관계를 찾아내는 작업. 제품이나 서비스의 교차판매, 매장진열, 첨부우편, 사기적발 등의 다양한 분야에 활용됨                                                                 
  • ->동시발생 매트릭스
  • 연속 규칙(Sequence) : 연관 규칙에 시간관련 정보가 포함된 형태. 고객의 구매이력 속성이 반드시 필요하며, 목표 마케팅이나 일대일 마케팅에 활용됨                                                                                                   
  • -> 동시발생 매트릭스
  • 데이터 군집화(Clustering) : 고객 레코드들을 유사한 특성을 지닌 몇 개의 소그룹으로 분할하는 작업. 작업의 특성이 분류규칙과 유사하나 분석대상 데이터에 결과값이 없으며, 판촉활동이나 이벤트 대상을 선정하는데 활용됨     
  • -> K-Means Clustering

 

의사결정나무

 

1. 의사결정나무

 

1) 의사결정나무란?

발견된 변수의 규칙 혹은 조건문을 토대로 나무 구조로 도표화하여 분류예측을 수행하는 방법

 

Tree 형상 알고리즘 

  • CHAID
  • CART : 분류 + 회귀 알고리즘. 분류 중 이진분류
  • QUEST
  • C 5.0

2) 의사결정나무의 개념

 

  • 목적과 자료구조에 따라 적절한 분리 기준과 정지 규칙을 지정하여 의사결정나무를 얻음
  • 분리기준 : 어떤 입력 변수를 이용하여 어떻게 분리하는 것이 목표 변수의 분포를 가장 잘 구별해 주는지에 대한 기준
  • 순수도 or 불순도 : 목표 변수의 분포를 구별하는 정도
  • 순수도 : 목표 변수의 특정 범주에 개체들이 포함되어 있는 정도
  • 부모 마디의 순수도에 비해 자식마디들의 순수도가 증가하도록 자식 마디를 형성함
  • 가지치기 : 분류 오류를 크게 할 위험이 높거나 부적절한 가지를 제거함

3) 의사결정나무의 장단점

 

  • 해석이 용이하며, 어떤 입력변수가 중요한지 파악이 쉬움
  • 두 개 이상의 변수가 결합하여 목표변수에 어떠한 영향을 주는지 알기 쉬움
  • 계산 속도가 빠르고 대형자료 처리에 용이
  • 이상치에 민감하지 않음
  • 이산형 변수에 대하여 수준이 많은 경우 결과가 정확하지 않을 수 있음
  • 연속형 변수를 비연속적인 값으로 취급하여 예측 오류가 큼

 

2. 의사결정나무의 구성요소

 

1) 뿌리마디, 중간마디, 끝마디

 

  • 뿌리마디 (root node) : 나무구조가 시작되는 마디
  • 중간마디 (internal node) : 중간에 있는 끝 마디가 아닌 마디
  • 끝 마디 (terminal node, leaf) : 각 나무줄기의 끝에 위치하는 마디

2) 부모마디, 자식마디

 

  • 부모마디 (parent node) : 자식마디의 상위마디
  • 자식마디 (child node) : 하나의 마디로부터 분리되어 나간 마디

3) 가지, 깊이

 

  • 가지 (branch) : 하나의 마디로부터 끝마디까지 연결된 마디들. 옵션값으로 사용됨
  • 깊이(depth) : 가지를 이루고 있는 마디의 개수

4) 분리기준

 

  • 분리기준 : 어떤 입력변수를 이용하여 어떻게 분리하는 것이 타겟 변수를 잘 구별해 주는지 비교
  • 부모마디의 순수도에 비해 자식마디의 순수도가 증가하도록 자식 마디를 형성함

5) 정지규칙, 가지치기

 

  • 정지규칙 (stoping rule) : 더 이상 분리가 일어나지 않고, 현재의 마디가 끝마디가 되도록 하는 규칙
  • 가지치기 (pruning) : 적절하지 않은 마디를 제거하여 적당한 크기의 부나무(subtree) 구조를 가지도록 하는 규칙

 

3 . CART (Classification and Regression Tree)

 

  • 가장 널리 사용되는 의사결정나무 알고리즘
  • 분류와 회귀에 모두 적용
  • 이산형(범주형) 타겟 변수의 경우, 타겟 변수의 각 범주에 속하는 빈도에 기초하여 분리가 일어남
  • 지니 지수 (Gini index) 사용
  • 연속형(구간형) 타겟 변수의 경우, 타겟 변수의 평균과 표준편차에 기초하여 분리가 일어남
  • 분산의 감소량 (Variance reduction)
  • 분리 방법은 이지 분리 (binary split) - 이지분리 : 가지의 분리를 2단계 까지 함

cf) Gini 지수 : 불순도 계산

  CART C 5.0 CHAID QUEST
목표변수 범주형
연속형
범주형 범주형
연속형
범주형
예측변수 범주형
연속형
범주형
연속형
범주형 범주형
연속형
분리기준 지니지수
분산의 감소량
엔트로피 지수 카이제곱 통계량
F-검정
카이제곱 통계량
F-검정
분리개수 이지분리 다지분리 다지분리 이지분리

 

 

 

로지스틱 회귀

 

1. 로지스틱 회귀모형의 개념

 

  • 목표변수가 이항형일 때, 선형 회귀모형의 단점을 극복하기 위해 확률에 대한 로짓변환을 고려하여 모형화
  • Odds : P(A)를 특정사건 A가 일어날 확률이라고 하면 A가 일어나지 않을 확률은 정의상 1- P(A)가 됨
  • Odds가 1보다 작다는 것은 입력변수가 감소방향으로 영향을 미침을 뜻하고, 반대로 1보다 크다는 것은 증가방향으로 영향을 미침을 의미함
  • Odds는 0에서 무한대의 수로 표현
  • Logit 무한대에서 무한대로 표현

 

2. 최대 우도 추정법

 

  • 우도(Likelihood) : 주어진 정보를 바탕으로 모집단의 모수에 관해 어떤 추정량이 적합한가?
  • 모수로부터 특정현상이 관찰되는 것을 확률의 문제라고 한다면, 우도는 주어진 현상을 가지고 이 현상이 추출될 가능성을 추적하는 방법
  • 이를 가장 높게 하는 모수를 거꾸로 추적하는 방법이 최대우도추정법 (maximum likelihood method)
  • 다중회귀분석에서는 최소제곱법, 로지스틱 회귀분석에서는 최대우도추정법을 사용함 


3. Odds Ratio

 

  • 오즈(odds) : 상대젹 확률의 표현 방법 중 하나. A를 했을때 B라는 결과가 나올 확률을 π 라고 할때 B의 오즈는 π/(1-π) 가 됨
  • 오즈비(odds ratio) : A의 유무가 B의 유무에 얼마나 강한 영향을 끼치는지를 수치화하기 위한 방법. 오즈비가 1에서 멀어질 수록 A와 B 사이의 연관성이 큼
  • Bassassinator의 오즈 = 50/50 = 1
  • No bait의 오즈 = 2/98 = 0.02
  • Bassassinator vs No bait의 오즈비 = 1/0.02 = 50
  • Bassassinator를 사용한 경우 No bait를 사용한 경우보다 물고기를 잡을 확률이 50배 높음

 

4. Logit

 

  • 로짓변환 : 두 개의 범주를 갖는 반응변수를 범주형의 설명변수로 설명. 두 범주를 취할 확률의 비가 설명번수의 수준에 따라 어떻게 달라지는지를 선형모형으로 표현한 모형
  • 범위는 무한대

 

 

실습

 

의사결정나무 rpart 예제

install.packages("ROCR")
install.packages("MASS")
install.packages("rpart")
install.packages("rpart.plot")

library(ROCR)
library(MASS)
library(rpart)
library(rpart.plot)

data(iris)
t.idx <- sample(1:150, 100)
iris.tr <- iris[t.idx,]
iris.te <- iris[-t.idx,]

dt <- rpart(Species~., data=iris, method="class")
dt
rpart.plot(dt, type=4, extra=101)

 

 

의사결정나무 rpart 실습1 - 척추수술 데이터

# << 의사결정나무 rpart >> 실습1 - 척추수술 데이터

data(kyphosis)
str(kyphosis)
summary(kyphosis)

table(kyphosis$Kyphosis)

dt <- rpart(Kyphosis~., data=kyphosis, method="class")
dt
rpart.plot(dt, type=1, extra=101)

## rpart.plot말고 그래프 그리기 - 분리기준 Gini지수
tree.1 <- rpart(kyphosis ~ Age + Number + Start, data= kyphosis)
tree.1
par(mar=c(1,1,1,1), xpd = TRUE); plot(tree.1)
text(tree.1, use.n = TRUE)

## parms = list(split = "information") 분리기준을 정보지수(entropy)로 한다
tree.2 <- rpart(Kyphosis ~ Age + Number + Start, data= kyphosis, parms = list(split = "information"))
par(mar=c(1,1,1,1), xpd = TRUE); plot(tree.2)
text(tree.2, use.n = TRUE)

 

 

의사결정나무 rpart 실습2 - 209개의 컴퓨터 cpu 성능평가

# << 의사결정나무 rpart >> 실습2 - 209개의 컴퓨터 cpu 성능평가

data(cpus, package="MASS")
str(cpus)

cpus.tree.1 <- rpart(perf ~ syct+mmin+mmax+cach+chmin+chmax, data=cpus)
cpus.tree.1

windows(height=8, width=8)
par(mar=c(1,1,1,1), xpd=TRUE)
plot(cpus.tree.1, uniform=F)
text(cpus.tree.1, use.n=T, cex=0.8)

rpart.plot(cpus.tree.1, type=4, extra=101)

## control = rpart.control(cp=0.02) 불순도의 상대적 감소가 5% 미만이면 노드 분리를 종결한다. 디폴트 1
cpus.tree.1 <- rpart(perf ~ syct+mmin+mmax+cach+chmin+chmax, data=cpus.train, control = rpart.control(cp=0.02))

subsample <- sample(1:209, replace = T)
cpus.train <- cpus[subsample,]
cpus.test <- cpus[-subsample,]

cpus.tree.1 <- rpart(perf ~ syct+mmin+mmax+cach+chmin+chmax, data=cpus.train, control=rpart.control(cp=0.02))

# msa 오차제곱의 평균
pred.err <- cpus.test$perf - predict(cpus.tree.1, newdata=cpus.test)
pred.err
mean(pred.err*pred.err)

 

 

randomForest 실습

# << randomForest >>

install.packages("randomForest")
library(randomForest)

rf <- randomForest(Species~., data=iris, importance=TRUE) #importance=True : 정확도
importance(rf)
varImpPlot(rf)  # 그래프

c <- randomForest(perf ~ syct+mmin+mmax+cach+chmin+chmax, data=cpus, importance=TRUE)
varImpPlot(c)

data("kyphosis")
k <- randomForest(Kyphosis ~., data=kyphosis, importance=TRUE)
varImpPlot(k)

 

 

클래스 불균형 실습

# << 클래스 불균형 >>

install.packages("mlbench")
install.packages("caret")
library(mlbench)
library(caret)

data("BreastCancer")

table(BreastCancer$Class)

## 1. upsample
x <- upSample(subset(BreastCancer, select=-Class), BreastCancer$Class)
table(BreastCancer$Class)
table(x$Class)

## 2. downsample
x <- downSample(subset(BreastCancer, select=-Class), BreastCancer$Class)
table(BreastCancer$Class)
table(x$Class)

## 3. SMOTE
install.packages("DMwR")
library(DMwR)

data(iris)
data <- iris[,c(1,2,5)]
data$Species <- factor(ifelse(data$Species == "setosa", "rare", "common"))
table(data$Species)

newData <- SMOTE(Species~., data, perc.over = 600, perc.under = 100)
table(newData$Species)

 

 

로지스틱 회귀 모델 예제

# << 로지스틱 회귀 모델 >>

# 모델링의 정확도를 ROC 커브로 그림. auc : 정확도. 1에 가까울수록 좋음
d <- subset(iris, Species == "virginica" | Species == "versicolor")
d$Species <- factor(d$Species)
str(d)
t.idx <- sample(1:100, 70)
d.tr <- d[t.idx,]
d.te <- d[-t.idx,]

## glm : 일반화 선형모델 생성
m <- glm(Species~., data=d.tr, family="binomial")
summary(m)
fitted(m)
## ROC 커브
predicted <- predict(m, newdata = d.te, type="response")
predicted
pr <- prediction(predicted, d.te$Species)
prf <- performance(pr, measure="tpr", x.measure="fpr")
plot(prf)
# auc : 모델 정확도
auc <- performance(pr, measure="auc")
summary(auc)
auc <- auc@y.values[[1]]
auc

 

 

로지스틱 회귀모형 실습1 - car 데이터

## 로지스틱 회귀 실습1 - car

## y변수 clm, 나머지 x변수, 로지스틱 회귀, stepwise적용
c <- read.csv("car.csv")
str(c)
c$agecat <- factor(c$agecat)
c$valcat <- factor(c$valcat)

c.idx <- sample(1:67856, 70)
c.tr <- c[c.idx,]
c.te <- c[-c.idx,]

c1 <- glm(clm~., data=c.tr, family="binomial")
summary(c1)
c2 <- step(c1, direction="both")
formula(c2)
c3 <- glm(clm ~ claimcst0, data=c.tr, family="binomial")

predicted <- predict(c3, newdata = c.te , type="response") 
predicted
pr <- prediction(predicted, c.te$clm)
prf <- performance(pr, measure="tpr", x.measure="fpr")
plot(prf)

auc <- performance(pr, measure="auc")
summary(auc)
auc <- auc@y.values[[1]]
auc

 

 

로지스틱 회귀모형 실습2 - Sonar 데이터

# 실습2 - Sonar 데이터
data(Sonar)
str(Sonar)

s.idx <- sample(1:208, 70)
s.tr <- Sonar[s.idx,]
s.te <- Sonar[-s.idx,]

s1 <-glm(Class~., data=s.tr, family="binomial")
summary(s1)
s2 <- step(s1, direction="both")
formula(s2)
s3 <- glm(Class ~ V6 + V8 + V9 + V12 + V17 + V18 + V31 + V32 + V35 + V39 + 
            V40 + V46 + V50 + V59, data=s.tr, family="binomial")

predicted <- predict(s3, newdata=s.te, type="response")
predicted
pr <- prediction(predicted, s.te$Class)
prf <- performance(pr, measure="tpr", x.measure="fpr")
plot(prf)

auc <- performance(pr, measure="auc")
auc <- auc@y.values[[1]]
auc

 

 

smbinning (파생변수 생성) 예제

# smbinning
library(smbinning)
data(smbsimdf1)

test <- data(smbsimdf1)

testiv = smbinning.sumiv(test, y="fgood")
testiv
smbinning.sumiv.plot(testiv)

result <- smbinning(df=smbsimdf1, y="fgood", x="cbsl")
result$ivtable
result$iv

 

 

cf) 데이터 모델링시 효율성 높이는 방법

 

1. Bining - 파생변수 설정

 

  • 연속형 변수를 구간화 하고 범주형 변수를 그룹핑 하여 파생변수를 만드는 작업
  • 파생변수를 만들어서 모델링에 변수로 활용
  • 연속형 변수 ex) age (10-100세) 에서 y값에 영향도가 높은 40-60세를 구간화
  • 범주형 변수 ex) 직업군 A,B,C,D,E, ..Z에서 y값에 근접한 C,D,E 그룹화

⇒ Bining한 데이터에서 파생변수로 사용

 

 

2. 분리기준

 

  • 지니, 정보, chiq

⇒ 모델링 방향에 따라 옵션을 잘 사용해야 함

 

parms = list(split = "information") 분리기준을 정보지수(entropy)로 한다.

control = rpart.control(cp=0.02) 불순도의 상대적 감소가 5% 미만이면 노드 분리를 종결한다. 디폴트 1

 


3. 샘플링 방법

 

  • 층화랜덤샘플링 -> 모델링 성능을 높이고 테스트 검증 시 모델의 안정성 확보 가능
  • 랜덤샘플링 -> 가장 안좋은 방법

 

 

cf) 데이터 모델링 단계

 

  1. 파일읽기

  2. 데이터 형태 파악 (summary / str / 기술통계량)

  3. 데이터 가공 (형변환, 결측치 보정, 이상치 제거/보정)

  4. 클래스 불균형 보정

  5. 데이터 분할 (train/test)

  6. EDA (그래프, 단변량, 이변량)

  7. 모델링 -> 변수간 다중공선성 체크 / 상관관계(y) / 파생변수(bining) / 모델링 생성

  8. 모델링 평가 - ROC / confusion matrix / PSI(모델 안정성평가) / K-S(모델링검증)

'Programming > R' 카테고리의 다른 글

R 프로그래밍 - 8주차  (0) 2020.08.11
R 프로그래밍 6주차  (0) 2020.07.20
R 프로그래밍 5주차  (0) 2020.07.18
R프로그래밍 4주차  (0) 2020.07.06
R프로그래밍 3주차  (0) 2020.07.05
Comments