# 장바구니 분석(연관 규칙)
- 특정 구매 패턴을 보이는 고객에게 추천/제안을 통해 매출을 증대시키는 기법이다.
- 장바구니 분석의 기본은 바로 아이템 단위입니다. 아이템 집합을 수많은 거래 데이터 속에서 일정한 규칙을 찾아 아이템 집합 사이의 관계에 존재하는 패턴을 명시하는 방법이다.
- 수 많은 데이터 속에서 유의미한 연관 규칙을 학습하고 도출하기 위해 주로 'Apriori'알고리즘을 사용합니다.
Apriori 알고리즘의 장/단점
- 장점
- 대규모 거래 데이터에 대해 작업할 수 있다.
- 이해하기 쉬운 규칙을 생성한다.
- 데이터 마이닝과 데이터베이스에서 예상치 못한 지식을 발굴하는데 용이하다. - 단점
- 작은 데이터셋에는 그다지 유용하지 않다.
- 진정한 통찰과 상식을 분라하기 위한 노력이 필요하다.
- 랜점 패턴에서 비논리적인 결론을 도출하기 쉽다.
str(g_df)
head(g_df)
summary(groceries)
- 총 9,835건의 거래 건수와 169개의 아이템 개수를 나타내며 밀도 0.02609146는 행렬에서 0이 아닌 셀의 비율을 나타낸다. 여기서 0은 아이템이 해당 거래에서 구매되지 않은 것을 말하며, 1은 구매된 것을 나타낸다.
- 이 때, 행렬에서 9,835 x 169 = 1,662,115가 되며, 밀도값 0.02609146을 곱하면 해당 데이터셋은 43,367개의 아이템이 구매된다고 계산할 수 있습니다. 추가로 평균 거래의 경우 43,367개를 전체 거래건수인 9,385로 나누게 되면 평균적으로 거래에 약 4.4개의 아이템이 포함된다고 볼 수 있다.
- 출력된 요약 정보에서 most frequent items를 확인할 수 있는데, Whole milk의 거래는 2,513건으로 전체 총거래의 25,6%에서 나타났다는 것을 알 수 있다.
- 다음으로 거래의 크기에 대한 정보를 볼 수 있는데, 한 가지 아이템만이 거래된 건수는 총 2,159건이며 2개 아이템은 1,643건 그리고 32개의 아이템이 거래된 건도 1건이 있는 것을 알 수 있다.
- 마지막으로 거래에 대한 통계치는 제공한다. 1 사분위와 중윗값이 각 2개, 3개로 거래의 25%가 두 개 이하의 아이템을 포함하는 것을 알 수 있다. 평균값은 4.409인 것 도 확인이 가능하다.
inspect(groceries[1:5])
- 데이터 관찰을 위해 inspect() 함수와 itemFrequency() 함수를 사용하면, 각 거래의 구성과 각 아이템별 거래의 비율을 볼 수 있다.
- [1] 거래를 살펴보니 시트러스 과일, 마가린, 수프 제품, 반제품으로 된 빵 조합을 볼 수 있다. [2] 거래는 총 3개의 아이템이 [3] 거래는 whole milk 한 가지 아이템만 거래된 것을 알 수 있다.
# 아이템 지지도 시각화 : 아이템 빈도 그래프
itemFrequency(groceries[,1:6])
itemFrequencyPlot(groceries, support = 0.1) # 지지도 10% 이상
itemFrequencyPlot(groceries, topN = 20) # 탑 20
# 거래 데이터 시각화 : 희소 행렬 도표화
- image() 함수를 이용하면 행렬의 셀은 item을 구매한 거래에 대해서는 검은색으로 채워진다.
image(groceries[1:5]) # 1~5행만 관찰한 희소 행렬
- 1행, 4행, 5행은 각 4개 아이템을 구매한 거래임을 알 수 있고, 3행과 5행은 각 공통의 아이템을 구매했다는 것을 알 수 있다.
image(sample(groceries, 100)) # 100개 샘플
- 만약 거래의 건수가 많다면 특정 데이터를 샘플링해서 데이터를 볼 수 있다. 앞서 image함수에 sample함수를 중첩적으로 사용할 수 있다.
- 일부 칼럼에서 점이 밀접해 있는 모습을 보이는데, 이는 인기 있는 아이템을 나타낸다.
# 데이터에 대한 모델 훈련
groceriesrule <- apriori(data = groceries, parameter = list(support = 0.006, confidence = 0.25, minlen = 2))
- 흥미로운 패턴을 위해 최소 거래 건수에 대해 미리 생각해야 한다. 여기에서는 하루에 두 번 구매된다고 했을 때 한 달 기준으로 60회이고 전체 6,835건 중 60건이므로 0.006의 지지도를 설정하였다. 신뢰도 역시 너무 낮게 설정하면 엄청난 수가 나오게 되고, 너무 높게 설정하면 결과가 너무나도 명백하거나 반드시 예상할 수 있는 규칙으로만 제한된 결괏값이 나타날 수 있다.
- 지지도 0.006, 신뢰도 0.25, 최소 아이템 규칙은 2개 이상으로 설정하였다.
- minlen = 2로 설정한 이유는 {whole milk}의 경우 아이템이 자주 구매되기 때문에 흥미롭지 않은 규칙이 생성될 수 있기 때문이다.
summary(groceriesrule)
- 총 463개의 룰이 만들어졌으면, 2개 조합의 룰은 150개, 3개는 297개 4개는 15개의 룰을 발견하였습니다.
- 예를 들어 향상도가 1보다 크면 조합된 아이템의 구매의 빈도가 높으며 하나의 아이템을 일반적으로 구매하는 확률보다 해당 아이템 조합의 구매 확률이 높다. 즉, 큰 향상도 값은 규칙이 중요하며, 아이템 간에 실제 연관성을 반영하는 강한 지표이다.
inspect(groceriesrule[1:3])
- [1] 조합은 지지도와 신뢰도, 향상도 등이 모두 높지만 유용한 규칙으로 이해하기 어렵다. 하지만 데이터는 괜찮은 아이템 조합이라고 이야기합니다. 이를 이해하기 위해서는 연관 규칙을 아래의 세 가지 범주로 규칙을 나눠볼 수 있다.
1. 실행 가능한
2. 사소한
3. 설명하기 어려운
- 명확하고 유용한 인사이트를 제공하는 실행 가능한 규칙을 찾는 것이다.
# 모델 성능 개선
View(groceriesrule)
inspect(sort(groceriesrule, by = "lift")[1:5])
- sort() 함수를 이용해 가장 유용한 규칙을 정렬하여 관찰할 수 있다. 예를 들어 가장 높은 향상도를 피라미터 값으로 5개의 규칙을 살펴보면 아래와 같다.
- [1] 규칙을 보면 허브 구매고객이 뿌리채소를 구매할 확률이 일반적으로 뿌리채소를 산 고객보다 약 4배 가까이 높다는 것을 의미한다. 아마도 어떤 종류의 스튜를 만들기 위해 이 두 아이템을 같이 살 가능성이 높다고 판단할 수 있다. [2] 조합도 흥미로운데, 휘핑/샤워크림이 베리와 함께 구매할 가능성이 높은데, 이는 디저트류를 만드는데 2개의 아이템이 구매되는 것을 시사할 수 있다.
- 위의 결과를 토대로 말을 하자면 베리가 포함된 아이템 조합을 함께 고객에게 제안하거나 노출하는 방법이나 프로모션을 진행하는 것이 효과적일 것이다. 그러기 위해 베리가 포함된 규칙을 모두 찾아보자.
- subset() 함수를 이용해 거래, 아이템, 규칙의 부분집합을 찾을 수 있다. 베리가 포함된 규칙을 찾아 베리룰로 규칙을 객체로 저장하고 저장된 규칙을 앞에서 설명한 것과 같이 각 규칙을 검사할 수 있다.
berryrules <- subset(groceriesrule, items %in% "berries")
inspect(berryrules)
- 베리가 포함된 규칙은 총 4개가 있다. 가 규칙을 살펴보니 actionable 한 규칙으로 보인다. 앞서 본 {베리 -> 휘핑/샤워크림} 외에도 요거트와도 자주 구매되는 것을 알 수 있다.
- 이밖에도 좌측, 우측 아이템과 매칭 하여 부분집합을 찾을 수 있으며, 연산자 %in%에는 하나의 아이템뿐만 아니라 여러 아이템을 조건 값으로 하여 찾을 수 있다. 이밖에도 부분집합은 lift 외 support, confidence로 제약할 수 있으며, 논리 연사자인 and, or, not과 결합하여 사용할 수 있다.
# 연관 규칙을 파일이나 데이터 프레임에 저장
write(groceriesrule, file = "groceriesrules.csv", sep = ",", quote = TRUE, row.names = FALSE)
- 연관 규칙을 통한 장바구니 분석은 커머스 업종에서 유용한 인사이트를 제공하는 머신러닝 기법이다.
- 도메인 지식을 바탕으로 actionable 한 규칙을 판단할 수 있어야 하며, 모델의 흥미도의 최소 임계치를 적절하게 설정하는 것이 모델의 유용성을 높일 수 있다.
'데이터 분석 > 데이터분석 예제(github참고)' 카테고리의 다른 글
Network_Graph (0) | 2021.01.31 |
---|---|
RFM 고객가치 분석 (0) | 2021.01.31 |
다중선형회귀분석 - 의료비 예측 (0) | 2021.01.19 |
단순선형회귀분석 - Diamonds (2) | 2021.01.17 |
Logistic Regression - 고객 이탈 예측 (0) | 2021.01.16 |
댓글