BASEMENT
R 프로그래밍 - 7주차 본문
데이터 마이닝
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) 데이터 모델링 단계
-
파일읽기
-
데이터 형태 파악 (summary / str / 기술통계량)
-
데이터 가공 (형변환, 결측치 보정, 이상치 제거/보정)
-
클래스 불균형 보정
-
데이터 분할 (train/test)
-
EDA (그래프, 단변량, 이변량)
-
모델링 -> 변수간 다중공선성 체크 / 상관관계(y) / 파생변수(bining) / 모델링 생성
-
모델링 평가 - 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 |