장바구니분석을 통한 쇼핑 트렌드 예측 — 1 in R

미완성의 신
11 min readMar 28, 2019

--

장바구니 분석

장바구니 분석은 보통 몇 가지 모델링 기법으로 이루어진다. 판매자들과 전자상거래 사이트에서 일반적으로 사용하는 장바구니 분석과 거래 분석을 통해 소비자들이 가장 많이 사는 제품에 대한 정보와 특정 제품이 가장 많이 팔리는 시기에 대한 정보를 알아내려고 한다. 이 장에서는 구매 패턴에 기초해 사람들이 어떤 제품을 구매할 지 알아내고 예측해볼 것이다. 먼저 기본적인 장바구니 분석에 대한 정의를 살펴보고 관련 있는 중요한 개념, 지표, 기법을 알아보도록 하자. 최종적으로 어떻게 실제적으로 이 결과들을 이용해서 데이터 기반의 결정을 이끌어내는지 알아볼 것이다. 장바구니 분석에 대해 더 자세히 알기 위해서는 지난번의 블로그를 참고하도록 한다. 참고: [R 머신러닝] — 연관규칙분석(Apriori 알고리즘)

데이터 기반 의사결정 만들기

장바구니 분석의 결과는 자주 같이 구매되는 아이템 혹은 물건들의 집합이다. 이제 연관도를 향상시키는 강한 지지도, 신뢰도, 향상도로 인해 이런 일들이 가능하고, 소비자들은 그것들을 구매하려 할것이며, 또한 판매자들은 가게나 그들의 웹사이트에 관련 있는 제품들을 같이 진열해 놓을 것이다. 하지만 강한 연관성은 항상 일어나는 것이 아니라 확률을 높이는 것이며, 그렇기 때문에 판매자들은 판매를 증대시키기 위해 이전에 소개한 기법들을 이용해 항상 알아내려고 해야 한다.

다음에 나오는 몇 가지 중요한 데이터 기반 의사 결정들은 판매자들이 주로 장바구니 분석을 통해 얻고자 하는 결과를 기반으로 하는 경향이 있다.

  • 맥주와 기저귀 같은 상품 조합을 포함하는 빈발 아이템 세트들은 보통 매장에서 바로 옆에 배치하려는 경향이 있다. 이를 통해 소비자가 추가로 구매 할 수 있는 제품에 쉽게 접근할 수 있게 한다.
  • 아이템 혹은 상품의 개수가 많은 빈발 아이템 세트는 특정 카테고리 혹은 테마를 가진 곳에 배치해야 한다. 특별한 식료품 혹은 유아 상품들처럼 말이다. 아이템 세트 전체에 대해 가격 할인을 한다면 소비자들에게 더 매력적으로 다가갈 것이다.
  • 빈발 아이템 세트나 분할 행렬로부터 얻어진 아이템 세트에 있는 아이템 또는 상품들이 긴 목록을 가지고 있다면, 고객이 웹 브라우저로 쇼핑할 때 연관된 상품 페이지를 이용해 상품 제안과 추천을 보여줄 수 있다. 이전에 다뤘든이 향상도는 적어도 1 이상이 되도록 연관 규칙이 다뤄져야 한다.
  • 추천 시스템, 타깃 광고, 마케팅은 모두 장바구니 분석을 통해 얻어진 결과로 만들어질 수 있다.

이 의사결정들이 정확한 위치에서 정확한 시점에 이뤄진다면 판매자들에게 판매 증가와 더불어 더 많은 이익을 가져다줄 것이다.

이제 간단한 알고리즘을 만들어보자. 슈퍼마켓에서 가장 많이 팔리는 제품들을 기반으로 한 상ㅍ무 분할 행렬을 사용해 상품 추천을 만들어보고, 강력한 머신 러닝을 지원하는 R언어를 이용해 세련된 분석기와 추천기를 만들어보자.

상품의 분할 행렬 평가

두가지를 해볼 것이다. 첫 번째로는 슈퍼마켓에 있는 간단한 데이터 세트를 분석할 것이다. 같이 구매된 상품들을 분할 행렬을 이용해 분석할 것이다. 그리고 나서 구해진 분할 행렬을 지지도, 향샹도와 같은 다른 지표에 기반해 분석할 것이다.

첫 번째 행렬의 데이터는 슈퍼마켓에서 팔린 제품 중에 가장 인기 있는 여섯 개의 제품으로 구성돼 있으며, 각 제품 자체의 판매량과 다른 상품의 조합으로 팔린 횟수가 포함돼 있다. 이 정보들에 대해 .csv 파일로 저장된 표를 가지고 있으며 이 표는 다음 그림에 나타나 있다.

이 데이터를 분석하기 위해 먼저 이표를 이해해보자. 기본적으로 각각의 셀 값은 해당하는 제품의 좋바이 판매된 횟수를 나타낸다. 따라서 셀 조합 (2,B)의 경우 (milk, milk) 상품의 조합을 의미할 수 있으며, 우유의 판매 횟수를 나타낸다. 다른 예로 셀 조합 (4,C)의 경우 셀 조합 (3,D)와 같으며 빵과 버터가 같이 판매된 횟수를 나타낸다. 이것은 분할 행렬로 알려져 있으며, 이 경우 상품 정보를 다뤗기 때문에 상품 분할 행렬이라고 한다. 이제 기본적인 머신 러닝의 순차 과정인 데이터 수집, 데이터 분석, 알고리즘 적용, 의도된 결과를 얻어보자.

데이터 수집

먼저 다음의 간단한 코드를 이용해 디스크로부터 데이터 세트를 읽어서 메모리로 옮겨보자.

참고: 데이터는 이곳에서 Email을 통해 받아야 한다. 받은 후에 압축을 풀고 Chapter 3 code file을 클릭하면 된다. https://www.packtpub.com/books/content/support/24316

이곳에서 top_supermarket_transactions.csv파일이 있는데 이 데이터를 불러 오도록 한다.

# 데이터 세트 읽기
data <- read.csv("top_supermarket_transactions.csv")
# 행의 이름을 열의 이름과 같게 할당하기
# 분할 행렬을 만들기 위해
row.names(data) <- data[[1]]
data <- subset(data, select = c(-1))
## 분할 행렬 보기
cat("Products Transactions Contigency Matrix")

데이터 분석과 시각화

이제 데이터 세트의 몇 가지 탐색적 분석을 통해 데이터가 우리에게 어떤 종류의 이야기를 들려주는지 살펴볼 것이다. 그러기 위해 먼저 다음 코드와 같이 우유와 빵의 구매에 관련된 거래를 살펴보자.

## 데이터 분석 시각화
# 우유 구매 횟수
data['milk', ]
# 우유 구매 횟수를 순서대로 정렬
sort(data['milk', ], decreasing = TRUE)
# 빵 구매 횟수
data['bread', ]
# 빵 구매 횟수를 순서대로 정렬
sort(data['bread', ], decreasing = TRUE)

이제 데이터 열을 정렬해 빵 혹은 우유와 같이 구매한 상ㅍ무 중에 가장 높은 순위를 확인할 수 있다. 행렬로부터 가장 많이 구매한 상품을 추천할 때, 이미 장바구니에 있는 제품이라면 제외할 수 있다. 빵을 구매한다면 다시 빵을 추천할 필요는 없기 때문이다. 이제 이 데이터 세트를 모자이크 그래프(mosaic plot)를 이용해 시각화해보자. 자주 구매한 상품 조합은 높은 빈도수 값을 가지며 모자이크 그래프에서 큰 영역으로 나타날 것이다.

mosaicplot(as.matrix(data), color = TRUE, 
title(main="Prodects Contigency Mosaic Plot"), las = 2)

앞의 그림에서 어떤 상품이 다른 상품들과 같이 팔렸는지 시각적으로 볼 수 있다. 같은 열과 행에 있는 제품은 무시한다. 우리는 쉽게 맥주와 기저귀가 자주 같이 판매된 것을 유추할 수 있다.

배경지식

맥주와 기저귀의 조합에 대해 이야기해본다. 월마트는 고객의 구매 데이터 분석을 통해 금요일에 미국의 젊은 아버지들이 맥주와 기저귀를 같이 사려는 경향을 발견했따. 그들은 친구들과 주말을 기념하려고 하지만, 아버지가 됐기 때문에 자신들의 자녀들을 돌봐야 하는 최소한의 책임 또한 이행하려고 한다는 것이다. 월마트는 맥주와 기저귀를 매장에 나란히 진열했고 매출은 증가했다. 이 사례는 몰랐거나 예측하지 못했던 패턴을 찾아주는 분석과 머신러닝의 힘을 보여준다.

포괄 추천

고객의 장바구니에 놓인 제품을 기반으로 상품을 추천해보자. 포괄 추천이라고 표현한 것은 연관 규칙이나 빈발 아이템 세트를 이용한 추천이 아니기 때문이다. 이들에 대해서는 이후에 다룰 것이다. 포괄적 추천은 상품 분할 행렬에 있는 상품들의 조합에만 근거했다. 다음 코드는 분할 행렬로부터 두 개의 상품 조합을 추천 할 것이다.

### 포괄 추천
cat("Recommendations based on global products contigency matrix")
items <- names(data)
for (item in items) {
cat(paste("Top 2 recommended items to buy with", item, "are: "))
item.data <- subset(data[item,], select=names(data)[!names(data) %in% item])
cat(names(item.data[order(item.data, decreasing = TRUE)][c(1,2)]))
cat("\n")
}

출력은 다음과 같다.

Top 2 recommended items to buy with milk are: bread butter
Top 2 recommended items to buy with bread are: butter milk
Top 2 recommended items to buy with butter are: bread milk
Top 2 recommended items to buy with beer are: wine diapers
Top 2 recommended items to buy with wine are: beer butter
Top 2 recommended items to buy with diapers are: beer milk

분할 행렬로부터 선정된 상품의 조합을 살펴보면, 가장 많이 같이 팔리는 두 개의 상품을 얻을 수 있다. 위의 그림을 통해 확인해 해보면 된다. 이제 다른 지표를 이용해 좀 더 발전도니 분할 행렬을 생성하는 방법을 살표보자.

발전된 분할 행렬

직금까지 구매 빈도수만을 이용한 상품 분할 행렬을 이용했다. 이전에 언급했듯이, 이제 지지도와 향상도 같은 지표를 이용한 분할 행렬을 만들어보자. 이를 이용하면 상ㅍ무에 대해 다른 상ㅍ무도 같이 사게 될 확률까지 구할 수 있다. CRAN 저장소에 있는 arules 패키지를 이용하자. 먼저 필요한 패키지와 데이터를 작업창으로 로드 하고 다음과 같이 구매 데이터를 살펴보도록 하자.

# arules 패키지 설치
# install.packages("arules") # 설치 되지 않았으면 설치
library(arules)
### 발전된 분할 행렬
#데이터 얻기와 로드
data(Groceries)
# 앞의 세 개 구매에 대해 확인하기
inspect(Groceries[1:3])

위에 있는 각각의 거래는 구매한 물품들의 집합이다. 이제 몇 개의 다른 지표를 가지고 분할 행렬을 만들어 보고, 소비자가 같이 구매한 상위 다섯 개의 물품 조합을 살펴보자. 다음 코드는 횟수 기반의 상품 분할 행렬을 보여준다.

# 횟수 기반 상품 분할 행렬
ct <- crossTable(Groceries, measure="count", sort=TRUE)
ct[1:5,1:5]
# 지지도 기반 상품 분할 행렬
ct <- crossTable(Groceries, measure="support", sort=TRUE)
ct[1:5,1:5]

이제 향상도 기반 상품 분할 행렬을 살펴보자. 향상도 값이 1보다 크다면 고객으로부터 같이 구매될 확률이 높음을 의미한다.

# 향상도 기반 상품 분할 행렬
ct <- crossTable(Groceries, measure="lift", sort=TRUE)
ct[1:5,1:5]

앞의 행렬로부터, 사람들이 요거트와 우유를 같이 구매하려는 경향이 있다는 통찰을 얻을 수 있다. 또는 탄산수와 우유는 향상도가 1보다 작기 때문에 같이 구매하지 않으려는 경향이 있다는 것을 알 수 있다. 이런 종류의 통찰은 매출 향상이나 추천을 목적으로 매장 혹은 웹사이트에서 상품 배치를 계획할 때 도움을 준다.

하지만 이 모델에 대한 몇가지 중요한 주제들이 다음에 나타나 있다.

  • 상품의 종류가 많아지면 행렬은 엄청나게 커질 것이며 이를 처리하려면 많은 시간과 연산을 위한 충분한 공간이 필요하다.
  • 빈발 아이템 세트에서 품목들의 조합을 탐색하는 것은 추천만을 위한 것이다. 이 모델에서 두 개 이상의 아이템으로 구성된 조합을 찾아낼 수 있다. 하지만 이를 위해서는 이론과 연관된 추가적인 로직이 필요하다.
  • 일반적으로 알려진 추천 엔진에서는 백지 상태 시작(Cold start) 문제에 직면하게 된다. 새로운 제품이 출시됐을 때는 추천을 예측할 수 없거나 과거에 기록된 데이터가 이 제품과 관련된 정보를 가지지 않으므로 매장에서는 어떻게 팔아야 하는지 알 수 없다.

이번 블로그에서는 장바구니 분석에 대한 간단한 개념을 제시하고 이를 통해 지지도, 향상도데 따른 행렬을 만들어 보았다. 다음 블로그에서는 빈발 아이템 세트를 생성하여 패턴을 통해 자주 구매하는 상품을 찾아내는 알고리즘을 알아보도록 하자.

--

--

미완성의 신

우리 인간은 미완성의 신들이다. 뛰어난 데이터 과학자를 꿈꾸는. 책을 좋아하는. 그런 사람입니다.