세줄 코딩(실무용 알고리즘)

유사도 함수 하나로 해결하는 (개인화)추천 알고리즘

정데만 2023. 8. 14. 16:16
728x90

오프라인 추천 방식

매장에 단골고객이 방문하면 영업사원은 고객이 자주 찾는 상품을 안내하거나 취향에 맞는 상품을 추천한다. 그리고는 상품에 대한 반응을 지켜보거나, 정보를 제공하면서 판매를 성사시키는데 고객의 성향에 맞는 상품을 매칭하거나, 선택한 상품에 어울리는 악세사리 등을 고르는데  경험이라는 데이터를 활용한다.

 

 

오프라인 추천방식 → 온라인 전환

단골이 방문하면 그에 맞는 서비스를 제공하는 건 고객에 대한 우대 서비스이자 개인화된 추천을 통한 판매를 목적으로 한다. 오프라인에서 사람이 행했던 영업활동은 온라인 환경에서 프로그램과 데이터로 대체되었으며, 초기 자판기같이 정해진 기능만 수행하던 웹사이트는 데이터를 기반으로 좀 더 친근하고 개인화된 서비스로 개선하였으며, 웹사이트와 배송으로 사업을 키운 넷플릭스와 아마존에서 가장 큰 성과를 이루기 시작하였다.

 

 

 

 


 

추천할 때 데이터를 활용하는 방식

데이터 활용 추천 알고리즘에서 단골고객이 방문했을 때 구매기록을 바탕으로 상품을 권유하는 것을 "사용자 기반 추천", 상품을 고른 고객에게 다른 상품을 덧붙여서 권유하는 것을 "상품 기반 추천"이라고 한다.

 

 

 

 

① 사용자 기반 추천 방식

 

위 데이터는 고객별 편의점 구매 기록을 가정한 것으로 빨간색으로 칠한 부분은 CUST_1의 구매기록에 대해 CUST_2~5번의 구매기록과 유사도를 계산한 내용이다. 

 

계산결과를 보면 CUST_5가 0.82로 가장 높은 유사도를 보였는데, 실제 구매기록을 보면 CUST_1이 라면, 즉석밥을 먹었고 CUST_5가 라면, 즉석밥에 김치를 먹어서 유사성이 높게 나온 것으로 확인된다.

 

오프라인에서도 이러한 현상이 자주 관찰될 경우 CUST_1과 같은 고객에게는 "김치도 드릴까요?"라고 물어보면서 추가구매를 권유하는데, 이러한 추천방식을 사용자 기반 추천이라고 한다.

 

사용자 기반 추천은 넷플릭스의 추천알고리즘 대회에서 유명해졌으며, 첫페이지부터 컨텐츠를 나열해야하는 OTT서비스에서 자주 사용되는 방식으로 매장에 단골고객이 찾아왔을 때 영업사원들이 자주 사용하는 방식이다.

 

실제로 사용자 기반 추천은 구매기록이 많은 단골일 수록 효용성이 높아지는 특징을 가지고 있다.

 

 

② 상품 기반 추천 방식

 

노란색으로 표시된 부분은 상품에 기반한 추천방식으로 김밥을 기준으로 각 상품별로 유사도를 측정해보면 김치를 구매한 고객이 가장 유사도가 높은 것을 볼 수 있다.

 

이는 표만 보더라도 김밥과 김치를 같이 구매한 고객이 많아서 나타나는 현상으로 매장에서 특정 상품을 구매하면 다른 상품을 같이 권유하는데 활용되며, 온라인에서는 상품 페이지에 "이 상품을 구매한 고객이 많이 찾는 상품"으로 노출되거나 컨텐츠를 눌렀을 때 관련 컨텐츠를 표시하는 데 많이 활용되는 알고리즘이다.

 

상품기반 추천 방식은 단골고객이 아니라도  - 데이터가 부족한 고객을 콜드스타트(Cold Start)라고 부른다 - 상품을 즉각적으로 추천할 수 있는 장점을 가지고 있다.

 


 

추천 알고리즘에 쓰이는 유사도 공식

위와 같이 다른 고객의 구매기록을 바탕으로 상품 및 사용자기반으로 추천하는 방식을 협업 필터링(Collaborative filtering)이라고 부르는데, 유사도를 계산하는 수학 공식은 많지만, 협업 필터링에서 코사인 유사도(Cosine similrality)라는 공식을 주로 사용된다.

 

코사인 유사도는 데이터가 양수인 경우라면 크기가 다르거나 개수가 많아져도 숫자의 방향에 따른 유사도를 측정할 수 있다는 장점을 가지고 있으며, 0~1의 값을 가진다.

 

파이썬에서 코사인 유사도를 사용하는 방법은 다음과 같다.

from sklearn.metrics.pairwise import cosine_similarity #코사인 유사도 함수 호출
result = cosine_similarity(X, X)  #Data의 코사인 유사도 계산

 

첫번째줄은 코사인 유사도를 사용하기 위한 함수를 가져오는 부분이며, 두번째줄은 유사도 함수를 이용해 X라는 데이터의 코사인 유사도를 계산하여 result에 저장하는 코드이다.

 

이전 포스팅(바로가기)에서 배웠던 코랩을 이용하여 위의 예시에 사용한 편의점 구매기록을 CSV파일로 업로드하고 코사인 유사도를 계산하면 다음과 같다.

 

 

첫번째 블럭은 CSV파일을 가져오는 코드로 index_col = '고객명'을 추가하여 유사도를 계산할 기준 컬럼을 지정해준다.

두번째 블럭은 코사인유사도를 계산하는 코드이며, 마지막으로 결과값을 확인하면 첫번째 CUST_1부터 ~ CUST_5까지 순서대로 다른 고객과의 유사도가 산출된 것을 볼 수 있다.

 

상품기반 코사인유사도를 계산하고자 한다면, index_col이 상품명이 되도록 아래와 같이 데이터를 바꿔준 후 같은 코드를 사용하면 된다.

 

 


추천 알고리즘 주의사항

코사인 유사도는 사칙 연산으로만 산출가능하기 때문에 연산속도가 빠르고 굳이 파이썬이 아니더라도 엑셀이나 SQL 등을 이용해도 산출가능해서 범용성이 굉장히 높다.

 

상품페이지의 경우 조회 수가 많기 때문에 SQL을 이용해 새벽에 유사도를 계산해둔 후 보여주기도 하며, 사용자기반 필터링의 경우에는 사용자가 행동을 취했을 경우(구매, 시청 등) 유사도를 산출해서 활용하기도 한다.

 

다만, 조건이 간단하다고 해서 아무렇게나 사용하면 오히려 웃지 못할 상황이 발생하니 주의해야 한다.

 

간혹 인터넷에서 협업필터링을 소개 할때 영화 평점을 이용해서 상품 기반 추천을 하는 경우를 볼 수 있는데, 예시라면 다행이지만, 실제로 이렇게 사용해버리면 평점이 비슷한 영화를 추천해버리기 때문에 3점짜리 영화를 봤다고 해서 계속 3점짜리를 영화를 추천하는 난감한 상황이 발생한다.


728x90