R

[R 프로그램] 신용카드 고객 데이터 군집분석(2)

Yeenn 2022. 1. 21. 00:23
728x90

군집분석이란?

군집 분석은 비지도학습(Unsupervised learning) 분석 기법 중 하나로, 사전 정보 없이 자료를 컴퓨터에게 주고, “유사한 대상끼리 묶어보아라” 고 명령을 내리는 분석 방법이다.

따라서 군집분석에서는 어떤 변수를 컴퓨터에게 입력하느냐(주요 변수 선정과정)가 매우 중요한 고려사항이다.

 

K-Means 군집분석이란?

군집 분석은 유사한 대상끼리 그룹핑 하는 분석이다. 여기서, 대상간의 유사도, 거리를 측정하는 방법에는 여러가지가 존재한다. K-means 군집 분석은 비계층적 군집 분석 방법을 사용하는데, 계산량이 적기 때문에 대용량 데이터도 빠르게 처리할 수 있다는 장점이 존재한다.

 

K-means 군집 분석 알고리즘

  • 분석자가 설정한 K개의 군집 중심점을 랜덤하게 선정
  • 관측치를 가장 가까운 군집 중심에 할당한 후 군집 중심을 새로 계산
  • 기존의 중심과 새로 계산한 군집 중심이 같아질 때까지 반복

 


 

Scaling 후 Cluster수 결정

 

Scaling과정을 거친 후, 최대 클러스터(maxCluster)를 10으로 설정한 뒤, Scree Plot을 그릴 수 있는 코드를 작성하였다.

#Scaling
c_scaled<-scale(bank3)

#군집 수 결정
set.seed(2022)

Plot <- function(c_scaled, maxCluster = 10) {
  SSw <- (nrow(c_scaled) - 1) * sum(apply(c_scaled, 2, var))
  SSw <- vector()
  for (i in 2:maxCluster) {
    SSw[i] <- sum(kmeans(c_scaled, centers = i)$withinss)
  }
  plot(1:maxCluster, SSw, type = "b", xlab = "Number of Clusters", ylab = "Groups sum of squares")
}

Plot(c_scaled)

 

K=4,5가 적절한 군집 수로 판단되었고,

 

K-Means 군집분석

 

K=4로 K-Means 군집분석을 수행하였다.

#K-means 군집분석 수행
set.seed(2022)
kmeans<-kmeans(c_scaled,4)
print(kmeans)
K-means clustering with 4 clusters of sizes 103, 100, 137, 182

Cluster means:
           Age         Sex        Job    Housing Saving.accounts Checking.account Credit.amount   Duration    Purpose
1  0.238391575 -0.25224139  0.7084604  0.0304348     -0.20824307      -0.10456289     1.4995551  1.3870119 -0.3055248
2 -0.466485183  0.46652487 -0.1251868  1.7329501      0.07503008      -0.20008843    -0.2709195 -0.2388217  0.0846180
3  0.171660504 -0.25118058 -0.1917858 -0.5084942      0.28800188       0.10375896    -0.3875189 -0.3958305 -1.0017422
4 -0.007820346  0.07549514 -0.1877917 -0.5866269     -0.14016609       0.09101012    -0.4080887 -0.3557763  0.8804722

Clustering vector:
   2    4    5    8   10   11   12   13   14   15   16   19   22   23   24   26   28   29   30   31   32   33   35   36   38   39   40 
   1    1    1    1    1    2    2    4    3    2    4    1    2    2    3    4    2    4    1    3    4    3    4    4    4    3    4 
  42   43   44   45   48   52   55   59   60   61   63   64   68   73   74   76   77   78   80   84   85   87   88   89   90   92   95 
   4    4    2    1    2    1    3    3    2    3    1    1    3    4    1    3    1    4    4    4    4    4    1    3    4    3    3 
  96   98   99  102  104  106  108  110  111  112  113  115  119  120  121  124  126  127  128  129  130  132  138  140  141  142  143 
   1    3    4    2    2    1    3    3    3    2    2    4    4    3    4    3    3    4    4    3    3    1    4    2    3    1    4 
 144  146  147  149  153  154  155  156  157  158  159  164  167  168  170  171  173  174  175  177  178  180  182  185  187  188  189 
   4    1    3    1    1    2    1    2    4    4    3    1    4    4    3    2    4    4    4    4    4    3    1    3    3    3    4 
 190  192  193  195  196  198  200  202  204  206  208  209  213  214  217  218  219  221  227  228  230  231  234  236  238  240  243 
   4    1    3    2    4    2    4    3    2    1    3    3    3    3    3    4    2    4    1    1    2    4    4    4    3    4    1 
 249  251  252  253  258  261  262  263  266  269  274  275  285  286  287  288  289  290  292  293  294  296  300  302  304  308  309 
   4    3    4    3    4    4    4    1    4    1    1    1    3    1    1    1    4    4    1    1    1    1    3    4    3    4    4 
 310  313  314  316  317  320  321  322  323  324  326  329  330  331  333  335  336  337  339  340  341  342  343  344  345  347  348 
   2    4    3    4    4    4    1    4    1    3    3    4    4    1    1    2    2    4    4    4    2    2    2    3    3    4    2 
 350  352  354  356  360  363  365  368  369  370  375  376  379  382  384  388  389  392  393  394  396  397  398  399  406  408  410 
   3    4    2    3    2    3    4    2    1    2    1    1    1    1    3    1    3    2    1    4    1    4    4    2    4    4    3 
 411  417  423  426  430  432  433  435  439  440  442  443  445  447  448  450  455  457  458  459  461  462  463  466  467  471  472 
   4    3    3    2    4    1    4    4    4    3    4    4    1    3    4    4    3    2    3    4    1    3    2    3    2    2    4 
 473  475  476  478  479  480  481  482  483  486  492  495  497  499  500  501  502  503  504  505  507  508  511  513  514  516  517 
   3    4    2    4    3    4    4    3    2    3    1    2    1    4    3    3    1    4    4    2    3    3    3    2    2    3    3 
 519  522  523  525  526  529  530  531  532  536  538  539  540  541  544  546  549  553  554  555  556  557  559  560  562  563  566 
   3    4    1    4    1    2    3    4    2    2    4    1    4    2    4    3    4    1    3    4    4    3    4    4    2    4    2 
 567  570  571  574  575  577  579  581  582  584  586  587  588  589  590  591  594  596  597  598  601  602  603  605  606  608  611 
   3    1    2    3    4    4    3    3    3    2    2    2    4    3    4    4    2    3    2    3    4    4    2    4    4    4    3 
 612  613  614  618  619  621  624  625  627  628  631  632  635  640  641  642  645  647  649  650  651  652  653  654  656  657  659 
   3    4    2    2    2    3    2    4    4    3    4    4    3    1    4    4    4    4    3    2    1    4    3    1    3    3    3 
 660  661  664  665  667  669  670  678  679  685  688  690  691  692  693  697  700  702  703  704  705  707  708  709  710  712  714 
   4    2    4    4    3    2    4    1    2    1    3    3    4    4    4    4    2    1    4    3    3    1    2    4    4    2    4 
 715  720  721  722  723  724  728  729  730  731  732  733  737  738  740  741  742  744  746  747  748  751  752  753  757  760  762 
   1    3    4    2    3    4    2    1    3    4    2    4    1    3    2    3    4    4    3    2    3    4    3    2    3    3    2 
 763  766  767  769  772  775  778  780  781  783  784  786  789  790  791  794  802  803  806  807  809  810  811  812  813  814  815 
   4    4    4    2    1    3    4    4    1    4    3    3    1    1    3    4    2    4    1    4    1    2    3    4    1    1    1 
 816  819  820  822  823  824  826  827  832  833  835  836  839  841  849  850  851  854  859  863  867  870  872  873  875  876  877 
   1    1    4    4    4    3    3    2    2    1    4    3    3    1    4    4    2    3    3    4    4    2    3    3    4    3    4 
 879  885  886  888  891  893  894  897  900  901  906  912  915  916  918  919  920  923  924  925  926  927  928  930  931  932  935 
   3    4    4    1    3    3    1    2    4    2    2    4    2    1    1    4    2    2    2    1    3    2    1    3    4    4    4 
 936  937  938  939  945  946  947  951  952  953  955  956  958  959  960  962  965  967  970  971  973  974  976  977  980  981  983 
   4    4    2    1    2    1    2    3    3    2    3    2    4    3    4    3    4    4    3    4    2    1    4    4    2    1    3 
 984  986  987  989  990  994  997  999 1000 
   1    2    1    1    4    1    1    1    1 

Within cluster sum of squares by cluster:
[1]  799.0813  627.4943  864.5229 1009.8816
 (between_SS / total_SS =  29.6 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"    "size"         "iter"        
[9] "ifault"

 

군집화된 네 군집의 size를 확인해보았다.

#군집크기 비교
kmeans$size
[1] 103 100 137 182


군집의 중심을 확인해보았다.

#군집 중심 확인
kmeans$centers
           Age         Sex        Job    Housing Saving.accounts Checking.account Credit.amount   Duration    Purpose
1  0.238391575 -0.25224139  0.7084604  0.0304348     -0.20824307      -0.10456289     1.4995551  1.3870119 -0.3055248
2 -0.466485183  0.46652487 -0.1251868  1.7329501      0.07503008      -0.20008843    -0.2709195 -0.2388217  0.0846180
3  0.171660504 -0.25118058 -0.1917858 -0.5084942      0.28800188       0.10375896    -0.3875189 -0.3958305 -1.0017422
4 -0.007820346  0.07549514 -0.1877917 -0.5866269     -0.14016609       0.09101012    -0.4080887 -0.3557763  0.8804722

 

 

기존 데이터셋과 군집화 데이터셋 합치기


군집화 결과와 기존 bank 데이터를 cbind()를 이용해 합친 후, head()를 통해 bind가 잘 이루어졌는지 확인하였다.

 #군집화 결과-기존 데이터 합치기
> bb<-cbind(bank2, cluster=kmeans$cluster)
> head(bb)
   Age    Sex Job Housing Saving.accounts Checking.account Credit.amount Duration             Purpose cluster
2   22 female   2     own          little         moderate          5951       48            radio/TV       1
4   45   male   2    free          little           little          7882       42 furniture/equipment       1
5   53   male   2    free          little           little          4870       24                 car       1
8   35   male   3    rent          little         moderate          6948       36                 car       1
10  28   male   3     own          little         moderate          5234       30                 car       1
11  25 female   2    rent          little         moderate          1295       12                 car       2



군집분석 결과

 

각 군집의 특성을 파악하기 위해, 군집별로 주요변수의 min. max. mean 값을 정리해보았다.

#군집분석 결과 해석
bb_groups<-bb %>% 
  select(Age, Credit.amount, Duration, Credit.amount, cluster) %>% 
  group_by(cluster) %>% 
  ungroup()

bb_g_means<-bb_groups %>% 
  group_by(cluster) %>% 
  summarize(min.Age=round(min(Age)),
            mean.Age=round(mean(Age)),
            max.Age=round(max(Age)),
            min.Credit.amount=round(min(Credit.amount)),
            mean.Credit.amount=round(mean(Credit.amount)),
            max.Credit.amount=round(max(Credit.amount)),
            min.Duration=round(min(Duration)),
            mean.Duration=round(mean(Duration)),
            max.Duration=round(max(Duration)),
            min.Credit.amounts=round(min(Credit.amount)),
            mean.Credit.amounts=round(mean(Credit.amount)),
            max.Credit.amounts=round(max(Credit.amount)))

head(bb_g_means)
# A tibble: 4 x 13
  cluster min.Age mean.Age max.Age min.Credit.amount mean.Credit.amount max.Credit.amount min.Duration mean.Duration max.Duration
    <int>   <dbl>    <dbl>   <dbl>             <dbl>              <dbl>             <dbl>        <dbl>         <dbl>        <dbl>
1       1      22       38      75              1845               7671             18424            6            39           72
2       2      19       29      64               276               2485              7758            6            18           48
3       3      21       37      74               571               2144              6850            6            16           36
4       4      20       35      67               338               2083              6403            6            17           45
# ... with 3 more variables: min.Credit.amounts <dbl>, mean.Credit.amounts <dbl>, max.Credit.amounts <dbl>

DT<-as.data.table(bb)
DT[ , .N, by=.(Sex, Housing, Saving.accounts, Checking.account, Purpose, cluster)][
  order(cluster),
  .SD[ N == max(N)]
  ,by=cluster]]
     cluster    Sex Housing Saving.accounts Checking.account             Purpose  N
1:       1   male    free          little           little                 car 13
2:       2 female    rent          little           little furniture/equipment 14
3:       3   male     own          little           little                 car 27
4:       4   male     own          little         moderate            radio/TV 26


군집결과는 아래와 같이 정리할 수 있다.
성별, 주거상태, Saving/Checking account, Credit purpose별로 각 군집의 특성이 다르게 나타난 것을 확인할 수 있으며, 다음의 군집결과는 신용카드 상품 기획과 관련하여 고객 Segmentation에 활용될 수 있을 것이다.

Cluster Sex Housing Saving.accounts Checking.account Purpose N
1 male own little moderate radio/TV 26
2 male own little little furniture/equipment 28
3 female rent little little furniture/equipment 14
4 male free little little car 12
728x90