Concept of Data Mining

Picture

Data Mining

  • 대량의 데이터로부터 새롭고 의미 있는 정보를 추출하여 의사결정에 활용하는 작업
    • 지식발견
    • 정보발견, 정보수학
    • 정보고고학, 자료패턴처리

데이터마이닝의 다양한 정의

  • 데이터베이스에서 지기발견은 데이터에 있는 유효하고, 잠재적으로 이용가능하며 궁극적으로 이해할 수 있는 패턴을 식별하는 중요한 프로세스 (Fayyad et al., “Advance in Knowledge Discovery and Data Mining,”1996)
  • 데이터 마이닝은 비즈니스 문제를 해결하기 위해 현재 조치를 취할 수 있고,명시적이며 새로운 정보를 추출하기 위해 세부적인 데이터를 분석하는 프로세스이다.(NCR)
  • 데이터 마이닝은 큰 데이터베이스로부터 이전에 알려지지 않고, 궁극적으로이해가능한 정보를 추출 및 중요한 비즈니스 의사결정을 하는 프로세스이다.(IBM)
  • 데이터 마이닝은 비즈니스 우위를 위해 이전에 알려지지 않은 패턴을 발견하기 위해 많은 양의 데이터를 선택하고, 탐색 및 모델링하는 프로세스이다.(SAS Institute)
  • 데이터 마이닝은 기업의 경영 활동에서 발생하는 대용량 데이터에서 데이터간의 관계·패턴·규칙 등을 찾아내고 모형화해 유용한 경영 정보로 변환시키는 일련의 과정이다.

Statistics Vs DM

  • 전통적 통계분석
    • 대상집단이 있으며, 모집단의 분포 혹은 모형 등 여러 가지 가정을 전제로 하게 되며 이 전제 조건하에서 분석을 실시
    • =>표본의 관찰을 통해 모수 전체를 추론하는 과정
  • 데이터마이닝
    • 표본조사/실험에서 필연적으로 수반되는 분포라든가 모형에 대한 전제조건이 필요하지않음
    • =>모집단의 전체자료를 이용한 정보화하는 과정

SQL / OLAP / DataMining

SQl/OLAP/DataMining

What Problems can DM Solve ?

  • 대부분의 문제에 대해서 결과를 예측한다. 또는 확률, 의사결정, 수치를 에측한다.

Data Mining Process

DMProcess DMProcess

Predictive Modeling Process

DMProcess

데이터마이닝 기법의 종류

Supervised Modeling (지도 학습, Predictive Analytics)

  • Estimation / Prediction (추정/예측 : 연속형)
    • Linear Regression, Neural Network
  • Classification / Prediction (분류/예측 : 이산형)

    • Decision Tree(C5.0), Neural Network, SVM


    <font size=3 color='green'>용어의 유례 : 어리아이가 말을 배우는 과정 ( 엄마가 Supervisor ) </font>

unsupervised Modeling ( 비지도 학습 , descriptive Analytics)

  • Clustering(군집화)
    • K-Means, SOM
  • Association rule Mining ( 연관규칙 탐사 )
  • Sequential rule Mining ( 연속규칙 탐사 )

1. 연관 규칙 탐사 (Association Rule Mining)

  • 정의
    • 데이터 안에 존재하는 항목간의 종속 관계를 찾아내는 작업
  • 장바구니 분석(Market Basket Analysis)
    • 고객의 장바구니에 들어있는 품목 간의 관계를 발견
  • 규칙의 표현
    • 항목 A와 품목 B를 구매한 고객은 품목 C를 구매한다.
    • (품목A) & (품목B) => (품목C)
  • 연관규칙의 활용
    • 제품이나 서비스의 교차 판매
    • 매장진열, 첨부우편
    • 사기적발

DMProcess

2. 연속규칙탐사 ( Sequential Rule Mining )

  • 정의
    • 연관 규칙에 시간 관련 정보가 포함된 형태
  • 규칙의 표현
    • 새 냉장고를 구입한 고객 중 한달 이내에 새 오븐을 구입하는 경향이 많다.
  • 연속 규칙의 활용
    • 타겟 마케팅
    • 일대일 마케팅
  • 전제조건
    • 고객의 구매내역(History) 정보가 반드시 필요함.

DMProcess

3. 분류 ( Classification )

  • 분류 프로세스
    • 과거의 데이터를 부류로 구분
    • 부류별 특성을 발견
    • 분류 모형 생성
    • 모형을 토대로 새로운 레코드의 분류 값 예측
  • 분류의 활용
    • 고객의 신용등급 분류
    • 기업의 도산 예측
    • 프로모션 대상고객 선정
  • 분류 기법
    • 의사결정나무 (Decision Tree)
    • 인공신경망 (Neural Network)
    • SVM(Support Vector Machine)

Classification

4. 군집화(Clustering)

  • 정의
    • 레코드들을 유사한 특성을 지닌 몇 개의 소그룹으로 분할하는 작업
  • 군집화의 활용
    • 다른 데이터 마이닝 기법의 선행 작업으로써 많이 이용
  • 분류 vs 군집화
    • 분류 값의 유무
  • 군집화 기법
    • 계층적 군집분석
    • 비계층적 군집분석: K-means, EM Algorithm, SOM(Self-Organizing Map)

Classification

데이터 분할(Data Partitioning)

Partitioning

5 Folder Cross Validation

1 2 3 4 5
A B C D E
                            - ABCD : 학습 , E : 검증
                            - BCDE : 학습 , A : 검증
                              와 같은 방법으로 5가지의 경우의 수를 모두 입력 

Data Mining Demo

1. Business Understanding

한 은행이 새로운 개인연금상품(PEP)을 신설하여 기존 고객들을 대상으로 가능한 많은 계좌를 유치하고자 한다.

고객의금융상품(PEP: Personal Equity Plan, 연금보험) 구매여부 예측에 의한 신규고객 창출

  • 고객 프로파일 개발
  • 다이렉트 메일 광고 효율성 제고
  • 타겟 메일링에 의한 응답률 제고

분석 절차

  • 1) 기존 고객 DB로부터 시험 메일 발송을 위한 표본 고객 목록을 추출
  • 2) 새로운금융상품(PEP)의 제안 메일을 발송
  • 3) 고객의 반응을 기록
  • 4) R을 이용하여 캠페인 결과를 분석

2. Data Understanding

학습용 데이터 300건 (pepTrainSet.csv)

검증용 데이터 200건 (pepTestSet.csv)

신규 고객 데이터 200건 (pepNewCustomers.csv)

3. Data Preparation

In [1]:
train <- read.csv("pepTrainSet.csv", stringsAsFactors=F)
train <- subset(train, select=-c(id))
test <- read.csv("pepTestSet.csv", stringsAsFactors=F)
newd <- read.csv("pepNewCustomers.csv", stringsAsFactors=F)

train$pep <- factor(train$pep)
test$pep <- factor(test$pep)

str(train)
'data.frame':	300 obs. of  11 variables:
 $ age        : int  48 40 51 23 57 57 22 58 37 54 ...
 $ sex        : chr  "FEMALE" "MALE" "FEMALE" "FEMALE" ...
 $ region     : chr  "INNER_CITY" "TOWN" "INNER_CITY" "TOWN" ...
 $ income     : num  17546 30085 16575 20375 50576 ...
 $ married    : chr  "NO" "YES" "YES" "YES" ...
 $ children   : int  1 3 0 3 0 2 0 0 2 2 ...
 $ car        : chr  "NO" "YES" "YES" "NO" ...
 $ save_act   : chr  "NO" "NO" "YES" "NO" ...
 $ current_act: chr  "NO" "YES" "YES" "YES" ...
 $ mortgage   : chr  "NO" "YES" "NO" "NO" ...
 $ pep        : Factor w/ 2 levels "NO","YES": 2 1 1 1 1 2 2 1 1 1 ...

4. Modeling(Cont.)

In [5]:
install.packages("caret",repos = "http://cran.us.r-project.org") #데이너 전처리 / 모델
install.packages("ROCR",repos = "http://cran.us.r-project.org") # 모형의 그래프 생성과 평가
install.packages("C50",repos = "http://cran.us.r-project.org") # 분류 분석, 의사결정나무 (Decision Tree)
Installing package into 'C:/Users/byung/Documents/R/win-library/3.3'
(as 'lib' is unspecified)
package 'caret' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\byung\AppData\Local\Temp\Rtmp2HZLjX\downloaded_packages
Installing package into 'C:/Users/byung/Documents/R/win-library/3.3'
(as 'lib' is unspecified)
also installing the dependencies 'bitops', 'gtools', 'gdata', 'caTools', 'gplots'

package 'bitops' successfully unpacked and MD5 sums checked
package 'gtools' successfully unpacked and MD5 sums checked
package 'gdata' successfully unpacked and MD5 sums checked
package 'caTools' successfully unpacked and MD5 sums checked
package 'gplots' successfully unpacked and MD5 sums checked
package 'ROCR' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\byung\AppData\Local\Temp\Rtmp2HZLjX\downloaded_packages
Installing package into 'C:/Users/byung/Documents/R/win-library/3.3'
(as 'lib' is unspecified)
also installing the dependencies 'Formula', 'partykit'

package 'Formula' successfully unpacked and MD5 sums checked
package 'partykit' successfully unpacked and MD5 sums checked
package 'C50' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\byung\AppData\Local\Temp\Rtmp2HZLjX\downloaded_packages
In [2]:
library(caret)
library(ROCR)
library(C50)
Loading required package: lattice
Loading required package: ggplot2
Loading required package: gplots

Attaching package: 'gplots'

The following object is masked from 'package:stats':

    lowess

In [8]:
?C5.0Control

first candidate model : Decision Tree(C5.0)

In [3]:
c5_options <- C5.0Control(winnow = FALSE, noGlobalPruning = FALSE)
c5_model <- C5.0(pep ~ ., data=train, control=c5_options, rules=FALSE)
summary(c5_model)
Call:
C5.0.formula(formula = pep ~ ., data = train, control = c5_options, rules
 = FALSE)


C5.0 [Release 2.07 GPL Edition]  	Sat Sep 10 23:23:12 2016
-------------------------------

Class specified by attribute `outcome'

Read 300 cases (11 attributes) from undefined.data

Decision tree:

children > 2:
:...income <= 43228.2: NO (30/2)
:   income > 43228.2: YES (5)
children <= 2:
:...children <= 0:
    :...married = NO:
    :   :...mortgage = NO: YES (29/2)
    :   :   mortgage = YES:
    :   :   :...save_act = NO: YES (3)
    :   :       save_act = YES: NO (12)
    :   married = YES:
    :   :...mortgage = NO: NO (59/6)
    :       mortgage = YES:
    :       :...save_act = NO: YES (9/1)
    :           save_act = YES: NO (16/2)
    children > 0:
    :...income > 29622: YES (48/2)
        income <= 29622:
        :...children > 1: NO (47/3)
            children <= 1:
            :...income <= 12640.3: NO (5)
                income > 12640.3:
                :...current_act = YES: YES (28/1)
                    current_act = NO:
                    :...income <= 17390.1: NO (3)
                        income > 17390.1: YES (6)


Evaluation on training data (300 cases):

	    Decision Tree
	  ----------------
	  Size      Errors

	    14   19( 6.3%)   <<


	   (a)   (b)    <-classified as
	  ----  ----
	   159     6    (a): class NO
	    13   122    (b): class YES


	Attribute usage:

	100.00%	children
	 57.33%	income
	 42.67%	married
	 42.67%	mortgage
	 13.33%	save_act
	 12.33%	current_act


Time: 0.0 secs
In [5]:
## plot(c5_model, cex=1.0)
# 결과가 그림으로 찌그러져 나온다.

plot

In [7]:
plot(c5_model, cex=1.0)
Warning message:
In partysplit(varid = as.integer(i), breaks = as.numeric(j[1]), : 강제형변환에 의해 생성된 NA 입니다Warning message:
In partysplit(varid = as.integer(i), breaks = as.numeric(j[1]), : 강제형변환에 의해 생성된 NA 입니다Warning message:
In partysplit(varid = as.integer(i), breaks = as.numeric(j[1]), : 강제형변환에 의해 생성된 NA 입니다Warning message:
In partysplit(varid = as.integer(i), breaks = as.numeric(j[1]), : 강제형변환에 의해 생성된 NA 입니다Warning message:
In partysplit(varid = as.integer(i), breaks = as.numeric(j[1]), : 강제형변환에 의해 생성된 NA 입니다Warning message:
In partysplit(varid = as.integer(i), breaks = as.numeric(j[1]), : 강제형변환에 의해 생성된 NA 입니다Warning message:
In cut.default(as.numeric(x), breaks = c(-Inf, breaks_split(split), : 강제형변환에 의해 생성된 NA 입니다Warning message:
In cut.default(as.numeric(x), breaks = c(-Inf, breaks_split(split), : 강제형변환에 의해 생성된 NA 입니다Warning message:
In cut.default(as.numeric(x), breaks = c(-Inf, breaks_split(split), : 강제형변환에 의해 생성된 NA 입니다Warning message:
In cut.default(as.numeric(x), breaks = c(-Inf, breaks_split(split), : 강제형변환에 의해 생성된 NA 입니다Warning message:
In cut.default(as.numeric(x), breaks = c(-Inf, breaks_split(split), : 강제형변환에 의해 생성된 NA 입니다Warning message:
In cut.default(as.numeric(x), breaks = c(-Inf, breaks_split(split), : 강제형변환에 의해 생성된 NA 입니다

Second candidate model : Logistic Regression

In [10]:
lm_model <- glm(pep~.,data=train,family=binomial)
summary(lm_model)
Call:
glm(formula = pep ~ ., family = binomial, data = train)

Deviance Residuals:
    Min       1Q   Median       3Q      Max
-2.1618  -0.9717  -0.6610   1.0941   2.0354

Coefficients:
                 Estimate Std. Error z value Pr(>|z|)
(Intercept)    -1.568e+00  5.666e-01  -2.767  0.00565 **
age             1.593e-02  1.299e-02   1.227  0.21998
sexMALE         6.887e-01  2.583e-01   2.666  0.00768 **
regionRURAL     2.696e-01  3.702e-01   0.728  0.46641
regionSUBURBAN -4.920e-02  4.905e-01  -0.100  0.92011
regionTOWN     -1.790e-01  2.960e-01  -0.605  0.54541
income          3.863e-05  1.518e-05   2.545  0.01093 *
marriedYES     -6.382e-01  2.679e-01  -2.382  0.01720 *
children       -1.800e-01  1.195e-01  -1.506  0.13200
carYES         -2.357e-01  2.535e-01  -0.930  0.35241
save_actYES    -3.225e-01  2.786e-01  -1.158  0.24696
current_actYES  3.680e-01  3.159e-01   1.165  0.24401
mortgageYES    -1.942e-01  2.696e-01  -0.720  0.47128
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 412.88  on 299  degrees of freedom
Residual deviance: 370.64  on 287  degrees of freedom
AIC: 396.64

Number of Fisher Scoring iterations: 4

Model evaluation by Confusion Matrix

In [11]:
install.packages("e1071",repos = "http://cran.us.r-project.org")
Installing package into 'C:/Users/byung/Documents/R/win-library/3.3'
(as 'lib' is unspecified)
package 'e1071' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\byung\AppData\Local\Temp\RtmpcFu14J\downloaded_packages
In [12]:
library(e1071)
In [14]:
test$c5_pred <- predict(c5_model, test, type="class")
test$c5_pred_prob <- predict(c5_model, test, type="prob")
head(test)
str(test)
idagesexregionincomemarriedchildrencarsave_actcurrent_actmortgagepepc5_predc5_pred_prob
1ID12401 19 FEMALE INNER_CITY 8162.42 YES 1 YES YES YES YES NO NO 0.925000001986822 0.0749999980131785
2ID12402 37 FEMALE TOWN 15349.6 YES 0 NO YES NO NO NO NO 0.8925000005252660.107499999474734
3ID12403 45 FEMALE TOWN 29231.4 YES 0 NO YES NO NO NO NO 0.8925000005252660.107499999474734
4ID12404 49 MALE RURAL 41462.3 YES 3 NO YES YES YES NO NO 0.920967739525093 0.0790322604749069
5ID12405 67 FEMALE RURAL 57398.1 NO 3 NO YES YES NO YES YES 0.09166666865348820.908333331346512
6ID12406 35 FEMALE RURAL 11520.8 YES 0 NO NO YES NO NO NO 0.8925000005252660.107499999474734
'data.frame':	300 obs. of  14 variables:
 $ id          : chr  "ID12401" "ID12402" "ID12403" "ID12404" ...
 $ age         : int  19 37 45 49 67 35 63 38 48 28 ...
 $ sex         : chr  "FEMALE" "FEMALE" "FEMALE" "MALE" ...
 $ region      : chr  "INNER_CITY" "TOWN" "TOWN" "RURAL" ...
 $ income      : num  8162 15350 29231 41462 57398 ...
 $ married     : chr  "YES" "YES" "YES" "YES" ...
 $ children    : int  1 0 0 3 3 0 2 0 2 1 ...
 $ car         : chr  "YES" "NO" "NO" "NO" ...
 $ save_act    : chr  "YES" "YES" "YES" "YES" ...
 $ current_act : chr  "YES" "NO" "NO" "YES" ...
 $ mortgage    : chr  "YES" "NO" "NO" "YES" ...
 $ pep         : Factor w/ 2 levels "NO","YES": 1 1 1 1 2 1 2 2 1 1 ...
 $ c5_pred     : Factor w/ 2 levels "NO","YES": 1 1 1 1 2 1 2 2 1 1 ...
 $ c5_pred_prob: num [1:300, 1:2] 0.925 0.8925 0.8925 0.921 0.0917 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr  "1" "2" "3" "4" ...
  .. ..$ : chr  "NO" "YES"
In [17]:
confusionMatrix(test$c5_pred, test$pep) # .No, .Yes생성하는
#pred.prob.No -> NO 의 확률 
#pred.prob.Yes -> Yes의 확률
Confusion Matrix and Statistics

          Reference
Prediction  NO YES
       NO  146  18
       YES  15 121

               Accuracy : 0.89
                 95% CI : (0.849, 0.9231)
    No Information Rate : 0.5367
    P-Value [Acc > NIR] : <2e-16

                  Kappa : 0.7785
 Mcnemar's Test P-Value : 0.7277

            Sensitivity : 0.9068
            Specificity : 0.8705
         Pos Pred Value : 0.8902
         Neg Pred Value : 0.8897
             Prevalence : 0.5367
         Detection Rate : 0.4867
   Detection Prevalence : 0.5467
      Balanced Accuracy : 0.8887

       'Positive' Class : NO
                                         
In [19]:
test$lm_pred <- ifelse(predict(lm_model, test, type="response") > 0.5, "YES", "NO")
test$lm_pred_prob <- predict(lm_model, test, type="response")
confusionMatrix(test$lm_pred, test$pep)
Confusion Matrix and Statistics

          Reference
Prediction  NO YES
       NO  108  71
       YES  53  68

               Accuracy : 0.5867
                 95% CI : (0.5286, 0.643)
    No Information Rate : 0.5367
    P-Value [Acc > NIR] : 0.04626

                  Kappa : 0.1614
 Mcnemar's Test P-Value : 0.12685

            Sensitivity : 0.6708
            Specificity : 0.4892
         Pos Pred Value : 0.6034
         Neg Pred Value : 0.5620
             Prevalence : 0.5367
         Detection Rate : 0.3600
   Detection Prevalence : 0.5967
      Balanced Accuracy : 0.5800

       'Positive' Class : NO
                                         
In [22]:
options(repr.plot.width = 5, repr.plot.height=5)

c5_pred <- prediction(test$c5_pred_prob[, "YES"], test$pep)
c5_model.perf <- performance(c5_pred, "tpr", "fpr")

lm_pred <- prediction(test$lm_pred_prob, test$pep)
lm_model.perf <- performance(lm_pred, "tpr", "fpr")

plot(c5_model.perf, col="red")
plot(lm_model.perf, col="blue", add=T)
legend(0.7, 0.7, c("C5","LM"), cex=0.9, col=c("red", "blue"), lty=1)
  • 그래프가 경사가 더 크고 급격하게 상승 후 마지막 정확도가 동일 한 경우
    • 동일 한 정확도를 가지고 있더라도 선택하는 Subset 즉, Choosing을 하게 될 사람 수가 적게 된다면
      위의 빨깐 선보다 경사가 높은 경우를 선택하는 것이 좋다.

Deployment

In [27]:
newd$c5_pred <- predict(c5_model, newd, type="class")
newd$c5_pred_prob <- predict(c5_model, newd, type="prob")
target <- subset(newd, c5_pred=="YES" & c5_pred_prob[ ,"YES"] > 0.8)
head(target[order(target$c5_pred_prob[,"YES"], decreasing=T),])
# write.csv(target[order(target$c5_pred_prob[,"YES"], decreasing=T), ], "dm_target.csv", row.names=FALSE)
idagesexregionincomemarriedchildrencarsave_actcurrent_actmortgagec5_predc5_pred_prob
4ID12704 50 MALE TOWN 46794.4 YES 2 NO YES NO YES YES 0.05204081873578960.94795918126421
16ID12716 44 MALE TOWN 34961.7 YES 1 NO NO NO YES YES 0.05204081873578960.94795918126421
21ID12721 40 MALE TOWN 37227.8 NO 1 YES YES YES NO YES 0.05204081873578960.94795918126421
23ID12723 54 MALE RURAL 49986.7 YES 1 YES YES YES NO YES 0.05204081873578960.94795918126421
29ID12729 58 MALE RURAL 41114.2 YES 2 YES YES YES YES YES 0.05204081873578960.94795918126421
43ID12743 66 MALE INNER_CITY 43720.4 NO 1 NO YES NO YES YES 0.05204081873578960.94795918126421