잘 팔릴 아이템을 어떻게 예측할까

https://www.123rf.com/photo_98594568_stock-vector-cute-cartoon-robot-drawing-line-chart-stock-market-trading-or-business-analytics-presentation-.html

우리는 패션 도매 쇼핑몰이다. 도매상들이 물건을 올리고, 소매상들이 물건을 사고, 그걸 우리가 중개해준다. 그래서 아이템 목록을 보여주는데, 단순히 최신 순으로 보여주니까 문제가 있었다. 일단 최신이라고 꼭 좋은 아이템은 아니었고, 어떤 업체는 상위에 자주 뜨려고 같은 상품을 이름만 바꿔서 등록했다. 더 나아가 회사를 여러 개 만들어서 같은 상품을 등록하기도 했다. 회사 주소를 보면 같은 건물, 같은 층에 인접한 사무실들이었다. 대표자 이름도 부부거나 자녀 관계였다.

이런 어뷰징(abusing)도 문제지만, 잘 팔릴만한 아이템이 상위에 뜨지 않는게 문제였다. 관리자들이 큐레이팅한 목록은 괜찮았지만, 사람 손으로 일일이 고르는 거라 한계가 있었다. 그래서 최신순 대신 판매 금액순으로 보여줬는데, 그러니까 뻔한 아이템들만 보여서 좀 지루했다. 나쁘지는 않지만 조금 뒤쳐지는 느낌이었다. 그래서 과거에 잘 팔린 것 대신에, 미래에 잘 팔릴 것 같은 걸 예측해서 보여주기로 했다.

그럼 그 미래를 어떻게 맞출 것인가? 아이템 별로 판매금액, 판매량, 별점 수, 바이어 수, 리텐션 비율, 카테고리 등 여러가지의 최근 6주 데이터를 뽑아서 GBM(Gradient Boosting Machine)을 돌렸다. GBM은 아마존이 쓴다길래 따라한건데, DNN과 결과가 비슷하면서 훨씬 빨랐다. 두 시간 걸리던게 15분 정도로 줄었다. 출처: Amazon Search: The Joy of Ranking Products (2016)

근데 이러니까 너무 큰 업체들만 많이 노출됐다. 상위 10개 업체가 전체 매출의 40%를 점유했고, 특히 첫 20개 아이템은 네다섯 업체밖에 나오지 않았다. 그래서 각 업체별로 점수를 매겨서 한 페이지에 나오는 횟수를 3개에서 5개로 제한했고, 저작권 침해 등의 문제가 있으면 즉시 랭킹에서 제외하도록 했다. 이렇게 전처리(pre-processing), 후처리(post-processing)하는데 생각보다 사람 손을 많이 타야 했다. 이건 어쩔 수 없었다.

이렇게 랭킹을 다시 매기는데는 총 1시간이 걸리고 200GB 정도를 읽기 때문에, 별도의 서버에 구성해서 다른 데 영향이 가지 않도록 했다. 그리고 아이템이 100만여건이기 때문에, 기존의 랭킹을 UPDATE 하면 너무 오래 걸리니까, 별도의 랭킹 테이블을 만들고, 임시 테이블에 BULK INSERT 하고, 임시 테이블을 기존 테이블로 SWITCH 해서 0.1초 안에 끝나도록 했다. 그리고 랭킹은 필요할때마다 JOIN 해서 사용했다.

그래서 적용 후 매출이 17% 늘었다. 근데 적중률은 30% 밖에 되지 않았다. 이게 우리가 잘 팔릴 아이템을 잘 맞춰서 잘 팔린 것 같지가 않았다. 그래도 기존에 단순히 최신순이나 매출액순으로 보여줄때보다 지금이 좀 더 정돈되어 보였다. 나름의 인공지능 큐레이션 같았다.

비록 사용자들이 우리가 예쁘게 큐레이션한대로 아이템을 사는 건 아니었지만, 적어도 그 페이지에 좀 더 오래 머물고, 이것 저것 클릭해보면서 뭔가 더 샀다. 일단은 매출이 늘어서 다행이었지만, 내가 지금 여기에서 어떤 정확한 단어나 수치로 표현하지 못하는 무언가가 더 있는 것 같았다. 그걸 더 발견하고 설명하고 적용하는 것이 나에게 남겨진 숙제가 될 것이다.

Loading

Published
Categorized as xacdo

By xacdo

Kyungwoo Hyun

2 comments

  1. 이 글의 제대로된 제목:
    How to train AI for politically correct affirmative marketing action
    이런 진성 좌빨같으니 ㅋ

Leave a comment

Your email address will not be published. Required fields are marked *