본문 바로가기
데이터 분석/데이터 분석

개인화 추천 알고리즘 1 : Apriori 알고리즘

by thomasito 2022. 2. 6.
반응형

우리 안의 수많은 추천 시스템

 추천 시스템은 사용자, 구매자에게 상품을 제안하는 방법론을 말한다. 이것은 쇼핑몰에서 어떤 상품을 추천할 것인지 음악 어플에서 어떤 음악을 추천할 것인지 뉴스피드에서 어떤 뉴스를 추천할 것인지 등 광범위하게 쓰이고 있다. 홈페이지나 어플 이용자들은 어느 상품에서 몇 분동안 머물렀는지, 어떤 상품을 클릭했는지, 실제로 구매로 이어졌는지에 대한 수많은 로그를 남기고 기업들은 이 로그들을 중요한 데이터 자원으로 추천 시스템에 활용한다.

 

 쿠팡에서 내가 특정상품을 보면 그 패턴을 토대로 추천 상품 리스트를 뿌려주는 것을 쉽게 볼 수 있는데 이것이 바로 개인화 추천 알고리즘이다. 최근에 인테리어 때문에 식탁보를 구경한 적 있는데 이 로그 기록을 바탕으로 유사성이 높은 식탁보를 계속 뿌려주고 있는 것 같다.

Apriori 알고리즘

 Apriori 알고리즘 가장 빈번하게 구매하는 구매패턴대로 추천해주는 알고리즘이다. Apriori 는 빈번한 아이템 셋은 하위 아이템셋 또한 빈번할 것이라고 가정하는 것이다. 다르게 말하면 빈번하지 않은 아이템 셋은 하위 아이템 셋도 빈번하지 않을 것이라고 생각하고 분석대상에서 제외하는 것이다. 우선 분석방법을 정리하면 아래와 같다.

  1. k 개의 아이템을 가지고 단일항목집단을 생성
  2. 최소 지지도(support) 이상의 항목만 선택 (지지도 : 총 거래 중 선택되었을 확률)
  3. 선택된 항목을 가지고 2,3, .... k개의 아이템 셋을 생성할 때까지 반복

 이렇게 보면 이해하기가 쉽진 않아서 그냥 사례를 보면 쉽다.

 

Apriori 알고리즘 분석 사례

 mlxtend 모듈을 불러오고 가상의 데이터셋을 생성한다.

import mlxtend
import numpy as np
import pandas as pd

data = np.array([
                 ['휴지','물티슈','샴푸'],
                 ['수세미','물티슈','비누'],
                 ['휴지','수세미','물티슈','비누'],
                 ['수세미','비누']
])

df_data = pd.DataFrame(data)
df_data

 

 이 과정에서 원핫 인코딩이라는 작업을 한다. 예를 들면 거래번호 0번의 구매 패턴이 휴지, 물티슈, 샴푸 이렇게 되어있는데, 구매한 휴지, 물티슈, 샴푸에는 True(1)을 부여하고 구매하지 않은 비누에는 False(2)를 부여하는 것이다. 아래 데이터프레임의 컬럼과 같이 물티슈, 비누, 샴푸, 수세미, 휴지라는 단일항목집단을 생성해준다.

from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_array = te.fit(data).transform(data)

df = pd.DataFrame(te_array, columns=te.columns_)

df

 

 apriori 모듈을 임포트하고 함수에 파라미터들을 넣어주면 바로 결과값을 도출할 수 있다. 파라미터로 데이터프레임, 최소 지지도(min_support), 컬럼명(use_colnames)을 주면 된다. 최소 지지도가 0.5 이상인 조합들만 추출해보도록 하겠다. 컬럼명도 True로 줘서 상품명을 번호대신 이름으로 받도록 하겠다.

from mlxtend.frequent_patterns import apriori
apriori(df, min_support=0.5,use_colnames=True)

 

 가장 지지도가 높은 조합은 (비누, 수세미) 조합이다. 따라서 비누를 구매하는 고객에게는 수세미를 추천해준다. 또한 (물티슈, 수세미, 비누) 조합도 지지도가 높으므로 물티슈, 수세미를 구매한 고객에게는 비누를 추천해준다. 이렇게 최소 지지도를 분석가가 임의로 설정하여 최소 지지도 이상의 조합들에 대해 상품 추천을 제공한다.

 

Apriori 알고리즘의 문제

 Apriori 알고리즘의 문제는 아이템 수가 증가할 수록(상품 수가 늘어날 수록) 연산량이 많아 속도가 저하된다는 점이다. 뿐만 아니라 인과관계가 아니고 연관관계를 분석하기 때문에 잘못된 추천을 제공할 수 있다는 점이다. 예를 들어 (만두, 간장)이 높은 지지도가 나왔다고 해보자. 만두를 구매하는 고객에게 간장을 추천해주는 것은 문제가 없지만, 간장을 구매한 고객은 만두를 사서 찍어먹을지 국을 끓일지 경우의 수가 너무 많기 때문에 만두를 추천해주는 것은 문제가 있다. 

 

 그럼에도 불구하고 단순하고 직관적인 분석 방법론이기 때문에 인터넷을 찾아보면 실무에서 계속 사용하고 있는 방법으로 보인다. 단순하면서 파워풀하면 그것을 이길만한 게 없으니까.

 

유명한 월마트의 기저귀, 맥주의 연관분석을 통해 성과를 낸 기사내용이다.

https://www.edaily.co.kr/news/read?newsId=01410406615800016&mediaCodeNo=257 

 

[똑똑!빅데이터]①맥주는 왜 기저귀 옆에 있을까

사람들은 매일 페이스북에 사진을 올리고 스마트폰으로 기사를 읽고 신용카드로 결제를 합니다. 큰 의미없는 일상생활인 것 같지만 행동 하나하나가 모두 데이터로 쌓이고 있습니다. 이른바 ‘

www.edaily.co.kr

Apriori 모듈 사용에 대해서는 아래 문서를 참조하면 된다.

http://rasbt.github.io/mlxtend/user_guide/frequent_patterns/apriori/

 

Apriori - mlxtend

From here you can search these documents. Enter your search terms below.

rasbt.github.io

반응형

댓글