카테고리 추천

개인화(personalization)추천은 말그대로 웹사이트의 내용을 사용자마다 다르게 구성하는 것을 말한다. 이번 글에서는 간단한 개인화 추천 방법으로 카테고리 추천에 대해 알아본다.

구매비율

사용자별 추천 카테고리는 해당 사용자의 구매이력을 통해 계산할 수 있다. 예를 들어 좋은서점닷컴에 다음과 같은 구매이력을 가진 사용자가 있다고 생각해 보자. 구매한 서적의 분류기호도 표시하였다.

사용자상품분류기호
사용자1서적1문학
사용자1서적2문학
사용자1서적3문학
사용자1서적4역사
사용자1서적5역사

사용자1의 구매이력에서 분류기호별 구매한 서적수을 전체 구매서적의 비율로 계산해 보면

문학 구매비율=35=0.6역사 구매비율=25=0.4\begin{align*} 문학\ 구매비율 &= \frac{3}{5} = 0.6 \\ 역사\ 구매비율 &= \frac{2}{5} = 0.4 \\ \end{align*}

와 같고, 이를 바탕으로 추천 카테고리를 문학, 역사의 순서로 선정할 수 있다.

구매시각을 고려한 구매비율

이같은 추천 카테고리 선정은 비교적 간단한 계산이다. 좀더 개선할 만한 여지가 있을까? 구매이력 데이터에는 구매시각이 들어 있게 마련이므로 이를 이용해 볼 수 있다. 구매시각이 포함된 구매이력을 다음과 같이 생각해 보자.

사용자상품분류기호구매시각
사용자1서적1문학2019년 1월
사용자1서적2문학2019년 2월
사용자1서적3문학2019년 3월
사용자1서적4역사2022년 6월
사용자1서적5역사2022년 7월

2023년 1월을 기준으로 할 때, 사용자는 3년전에는 문학서적을 구매했지만 최근에는 역사서적을 구매했다는 점을 알 수 있다. 이런 경우 문학보다는 역사를 첫번째 추천카테고리로 선정하는것이 사용자에게 좀더 유용할 수 있다. 구매시점을 반영하기 위해 지수적 감쇠(exponential decay) 와 같은 방법을 사용하여 가중평균 중요도를 계산한다.

f가중평균_중요도(개월수 차이)=exp(C1×개월수 차이)f_{가중평균\_중요도}(개월수\ 차이) = \exp \left( - C_1 \times 개월수\ 차이\right)

여기서 C1C_1 (C1>0C_1 > 0)은 매개변수인데 C1C_1이 클 수록 최근 구매내역의 중요도가 높아지고, C1C_1이 작을수록 최근 구매내역과 오래된 구매내역의 차이가 없어져서 C1C_1=0인 경우 앞서의 단순평균과 같아진다. 2023년 1월을 기준으로 가중평균 중요도를 계산해 보면 아래와 같다.

사용자상품분류기호구매시각개월수 차이가중평균 중요도 (C1C_1=0.1)
사용자1서적1문학2019년 1월48개월전exp(0.1×48)=0.0082\exp( - 0.1 \times 48) = 0.0082
사용자1서적2문학2019년 2월47개월전exp(0.1×47)=0.0091\exp( - 0.1 \times 47) = 0.0091
사용자1서적3문학2019년 3월46개월전exp(0.1×46)=0.01\exp( - 0.1 \times 46) = 0.01
사용자1서적4역사2022년 6월7개월전exp(0.1×7)=0.497\exp( - 0.1 \times 7) = 0.497
사용자1서적5역사2022년 7월6개월전exp(0.1×6)=0.549\exp( - 0.1 \times 6) = 0.549

이제 표에서의 가중평균 중요도를 이용하여 분류기호별 중요도 비율을 계산하면

문학 중요도 비율=0.0082+0.0091+0.010.0082+0.0091+0.01+0.497+0.549=0.025역사 중요도 비율=0.497+0.5490.0082+0.0091+0.01+0.497+0.549=0.975\begin{align*} 문학\ 중요도\ 비율 &= \frac{0.0082 + 0.0091 + 0.01}{0.0082 + 0.0091 + 0.01 + 0.497 + 0.549} \\ &= 0.025 \\ 역사\ 중요도\ 비율 &= \frac{0.497 + 0.549}{0.0082 + 0.0091 + 0.01 + 0.497 + 0.549} \\ &= 0.975 \\ \end{align*}

와 같고, 앞서와 달리 문학보다 역사가 우선적으로 선정되는 것을 알 수 있다.

다양한 정보의 활용

좀더 확장하는 예를 들어보자. 지금까지는 구매정보를 사용했는데 이밖에 추가적인 정보를 이용할 수 있다. 장바구니담기, 좋아요, 클릭등 사이트에 따라서 다양한 추가정보가 있다. 예를 들어 좋은서점닷컴에서 장바구니담기 정보를 이용하는 경우를 생각해 보자. 장바구니 담기와 구매는 서로 다른 의미를 가지므로 그 차이를 가중평균 중요도에 반영한다.

 f가중평균_중요도(이벤트 종류,개월수 차이)=(이벤트 종류가 구매이면 C2,장바구니담기이면 C3)×exp(C1×개월수 차이)\begin{align*} &\ f_{가중평균\_중요도}(이벤트\ 종류, 개월수\ 차이) \\ &= \left( 이벤트\ 종류가\ 구매 이면\ C_2 ,장바구니담기이면\ C_3 \right) \times \exp \left( - C_1 \times 개월수\ 차이 \right) \end{align*}

C2C_2 는 구매한 서적의 가중평균 중요도, C3C_3는 장바구니에 담은 서적의 중요도를 나타낸다. C2C_2 =5 와 C3C_3=1을 선택하면 다음과 같이 계산할 수 있다.

사용자이벤트 종류상품분류기호구매시각개월수 차이가중평균 중요도 (C1=0.1C_1=0.1, C2=5C_2=5, C3=1C_3=1)
사용자1장바구니담기서적1문학2019년 1월48개월전exp(0.1×48)×1=0.0082\exp( - 0.1 \times 48) \times 1 = 0.0082
사용자1구매서적1문학2019년 1월48개월전exp(0.1×48)×5=0.041\exp( - 0.1 \times 48) \times 5 = 0.041
사용자1장바구니담기서적2문학2019년 2월47개월전exp(0.1×47)×1=0.009\exp( - 0.1 \times 47) \times 1 = 0.009
사용자1장바구니담기서적3문학2019년 2월47개월전exp(0.1×47)×1=0.009\exp( - 0.1 \times 47) \times 1 = 0.009
사용자1구매서적2문학2019년 2월47개월전exp(0.1×47)×5=0.045\exp( - 0.1 \times 47) \times 5 = 0.045
사용자1구매서적3문학2019년 3월46개월전exp(0.1×46)×5=0.050\exp( - 0.1 \times 46) \times 5 = 0.050
사용자1장바구니담기서적4역사2022년 5월8개월전exp(0.1×8)×1=0.449\exp( - 0.1 \times 8) \times 1 = 0.449
사용자1장바구니담기서적5역사2022년 5월8개월전exp(0.1×8)×1=0.449\exp( - 0.1 \times 8) \times 1 = 0.449
사용자1구매서적4역사2022년 6월7개월전exp(0.1×7)×5=2.48\exp( - 0.1 \times 7) \times 5 = 2.48
사용자1구매서적5역사2022년 7월6개월전exp(0.1×6)×5=2.74\exp( - 0.1 \times 6) \times 5 = 2.74
사용자1장바구니담기서적6자연과학2022년 10월3개월전exp(0.1×3)×1=0.741\exp( - 0.1 \times 3) \times 1 = 0.741
사용자1장바구니담기서적7자연과학2022년 10월3개월전exp(0.1×3)×1=0.741\exp( - 0.1 \times 3) \times 1 = 0.741

이제 표에서의 가중평균 중요도를 이용하여 분류기호별 중요도 비율을 계산해 보면

문학 중요도 비율=0.0082+0.041+0.009+0.009+0.045+0.0500.0082+0.041+0.009+0.009+0.045+0.050+0.449+0.449+2.48+2.74+0.741+0.741=0.0208역사 중요도 비율=0.449+0.449+2.48+2.740.0082+0.041+0.009+0.009+0.045+0.050+0.449+0.449+2.48+2.74+0.741+0.741=0.788자연과학 중요도 비율=0.741+0.7410.0082+0.041+0.009+0.009+0.045+0.050+0.449+0.449+2.48+2.74+0.741+0.741=0.1909\begin{align*} 문학\ 중요도\ 비율 &= \frac{0.0082 + 0.041 + 0.009 + 0.009 + 0.045 + 0.050}{0.0082 + 0.041 + 0.009 + 0.009 + 0.045 + 0.050 + 0.449 + 0.449 + 2.48 + 2.74 + 0.741 + 0.741} \\ &= 0.0208 \\ 역사\ 중요도\ 비율 &= \frac{0.449 + 0.449 + 2.48 + 2.74}{0.0082 + 0.041 + 0.009 + 0.009 + 0.045 + 0.050 + 0.449 + 0.449 + 2.48 + 2.74 + 0.741 + 0.741} \\ &= 0.788 \\ 자연과학\ 중요도\ 비율 &= \frac{0.741 + 0.741}{0.0082 + 0.041 + 0.009 + 0.009 + 0.045 + 0.050 + 0.449 + 0.449 + 2.48 + 2.74 + 0.741 + 0.741} \\ &= 0.1909 \\ \end{align*}

와 같고, 역사, 자연과학, 문학의 순서로 추천 카테고리가 선정되는 것을 알 수 있다. 구매기록만 사용한 결과와는 달리 자연과학도 추천 카테고리에 선정되었는데, 사용자가 자연과학 서적을 장바구니에 담은 정보를 활용한 결과이다.

선정된 추천 카테고리를 다양한 방법으로 활용할 수 있다. 예를 들어, 좋은서점닷컴의 로그인 화면에 "고객님을 위한 추천 카테고리"와 같은 항목을 추가해서 클릭하면 해당 분류기호의 페이지로 안내하도록 할 수 있다. 추천 카테고리와 인기상품 추천을 통합하는 것도 가능하다. 먼저 카테고리별 인기상품을 앞서의 글에서 처럼 데이터 수집 기간과 갱신 기간을 고려하며 선정한다. 그리고 가령 개인화 추천 카테고리가 역사, 자연과학, 문학의 순서인 사용자에게는 "역사 분야 인기서적", "자연과학 분야 인기서적", "문학 분야 인기서적" 의 순서로 보여주면 해당 사용자의 로그인 화면을 좀더 유용하게 만들 수 있다.