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