고객의 목소리를 한 눈에 볼 수 있도록: 무신사의 VoC 대시보드 제작기 Part2 by 검색플랫폼팀

MUSINSA tech
MUSINSA tech
Published in
14 min readJun 19, 2023

--

이 글은 제품분석경험팀의 UX파트와 함께 무신사 VoC (Voice of Customer)의 카테고리 자동 분류기와 이 결과를 ‘VoC 리포팅 페이지’로 풀어낸 경험을 토대로 작성되었습니다.

VoC에 대한 기본적인 정보와 자동 분류의 필요성을 소개하는 Part1과 실제 구축 과정과 협업기인 Part2로 구성되어 있으니 쉬운 이해를 위해 먼저 Part1을 읽고 와주세요.

‘검색’으로 해보는 VoC 카테고리 분류

[그림1] VoC 작업 요청

무신사는 1,000만 명 이상의 사용자가 이용하는 서비스입니다. 사용자의 연령대는 10대가 20%, 20대가 40%로 1020의 사용자가 전체의 약 60%를 차지하고 있습니다.

비교적 어린 나이대의 사용자가 많은 플랫폼인 만큼 VoC(Voice of Customer)는 정말 다양한 형태의 문장으로 수집되고 있는데요. 이렇게 취합된 VoC들은 제품경험분석팀에서 정의한 28개의 카테고리로 분류되고 있습니다.

검색플랫폼팀에서는 카테고리 자동 분류 프로세스 구축을 위해 팀에서 익숙하게 사용하고 있는 ‘검색’이라는 도구를 사용하여 카테고리 분류를 시도해 보았습니다.

편집 없이 그대로 옮겨 온 VoC를 보며 이 VoC는 어떤 카테고리에 속하는 게 맞을지 함께 고민해 볼까요?

“사이트에서 검색어를 치고 검색버튼을 누르면 아무 화면이 안나오네요.

제가 원하는 브랜드나 옷을 검색할수가없어요

위 문장을 가볍게 훑어만 보아도 검색과 관련된 카테고리에 속해 있다는 것을 쉽게 알 수 있습니다.

어떻게 검색과 관련된 카테고리에 속한다고 알 수 있었을까요? 전체 문장을 다 읽지 않아도 ‘검색어’, ‘검색 버튼’, ‘검색할 수가 없어요’ 의 키워드를 통해 검색 카테고리와 관련이 있을 것이라고 판단하는 건 아닐까요?

아래 비슷하지만 조금은 다른 의미의 문장이 있습니다.

“사이트에서 후기스타일 리뷰를 누르면 아무화면이 안나오네요.

제가 원하는 브랜드나 옷 리뷰를 볼 수 없어요”

문장의 구성은 그대로이지만 키워드가 변경된 문장입니다. 변경된 ‘후기’,‘리뷰’,‘스타일리뷰’ 키워드를 보았을 때 이전과 다르게 ‘후기’ 카테고리와 관련된 내용을 담고 있는 VoC라고 판단할 것입니다.

위와 같은 두 가지 케이스를 통해 문장이 뜻하는 카테고리로 분류하기 위해서는 문장 전체의 내용보다는 구성하고 있는 키워드가 중요하다고 생각했습니다.

예시 속 ‘검색어’, ‘검색 버튼’, ‘후기’, ‘리뷰’, ‘스타일 리뷰’와 같이 카테고리의 잘 표현하고 있는 핵심 키워드를 모두 알고 있다면, 새로운 자동화 VoC가 시스템으로 인입되었을 때 문장을 분석하고 어떤 카테고리의 핵심 키워드와 매칭되는지 판단하여 VoC을 카테고리별로 자동 분류하는 것이 가능하기 때문입니다.

검색플랫폼팀이 제일 잘하는 부분이 문장을 분석하여 핵심 키워드로 검색엔진에 질의하고 결과를 도출하는 부분이기에 검색플랫폼팀에서 VoC 카테고리 분류를 잘 자동화 할 수 있을 것이라고 판단했습니다.

문제 해결의 핵심은 ‘핵심 키워드’?

먼저 카테고리별로 각각의 카테고리의 핵심 키워드를 추출해 보기로 결정했습니다.

[그림2] 핵심 키워드 이미지 01

카테고리들의 핵심 키워드는 어떻게 정의할 수 있을까요? 담당자(UX 리서처)가 직접 카테고리별로 하나씩 키워드를 지정할 수도 있지만 모든 카테고리의 핵심 키워드를 등록하기는 쉽지 않고, 정의한다 하더라도 담당자의 주관과 판단 시기에 따라 기준이 달라질 수 있기에 부정확합니다.

카테고리별 문장들을 모두 모아서 많이 사용된 단어(기준에 따라 N 개 이상 언급된 키워드를 지정)를 뽑으면 될 것 같지만 단순히 많이 사용된 키워드라고 핵심 키워드로 보기는 어렵습니다.

대부분의 VoC는 무신사 스토어 내에서 발생하는 문제들로 인입되기 때문에 ‘무신사’나 ‘상품’과 같은 단어는 많은 문장에서 빈번하게 사용되는 키워드일 가능성이 높습니다. 이러한 키워드는 모든 카테고리에 고르게 분포되어 있어 개별 카테고리를 대표하는 핵심 키워드로 판단하기보다는 좀 더 통계적인 방법이 필요합니다.

조금 더 보완하여 로직을 고도화해보았습니다.

예를 들어 100건의 VoC 문장 중 ‘리뷰’라는 단어가 70건의 문장으로 후기 카테고리에 속해 있고, 후기가 아닌 다른 카테고리에서10건 만 사용되었다면 상대적으로 ‘리뷰’라는 단어는 후기 카테고리에 더 의미 있는 키워드라고 판단 하는 방법입니다.

이와 같은 방법을 통해 각 카테고리에 대해 통계적인 분석을 수행하여 핵심 키워드를 추출하고 모든 카테고리의 문장에 분포되어 있는 키워드보다는 각 카테고리를 잘 대표하는 핵심 키워드를 찾을 수 있게 됩니다. ‘무신사’와 같이 모든 카테고리의 문장에 분포되어 있는 키워드는 순위가 낮아져 핵심 키워드라고 보지 않게 될 것입니다. Elasticsearch에는 ‘Significant terms aggregation’이라는 기능을 통해 위 방법을 제공하고 있습니다.

Significant terms aggregation을 통해 카테고리별로 더 의미 있게 사용되고 있는 키워드 그룹을 만들 수 있었습니다.

단계별로 고도화해보는 핵심 키워드

막상 키워드를 추출해 보니 카테고리의 핵심 키워드 간의 중복이 있다는 것을 알 수 있었습니다.

[그림3] 핵심 키워드 이미지 02

제품경험분석팀에서 선정한 28개의 카테고리는 서로의 영역이 명확한 것들도 있지만 때로는 쿠폰, 가격/세일과 같이 서로 사용하는 키워드가 비슷한 경우가 존재했습니다. 쿠폰, 가격/세일 카테고리 모두 핵심 키워드로 ‘할인’이라는 키워드를 가지는 상황에서는 단순히 핵심 키워드만을 고려하여 카테고리 분류를 수행하는 것이 어려워집니다.

키워드만을 보고 쿠폰 관련 VoC를 비슷한 가격/세일 카테고리로 잘못 분류하거나, 반대로 가격/세일 카테고리로 VoC를 쿠폰 카테고리로 잘못 분류할 수 있게 되는 경우가 발생할 수 있겠죠.

Significant terms aggregation에서 추출된 핵심 키워드 내 우선순위가 필요했습니다.

키워드간의 우선순위

문제를 해결하기 위해 핵심 키워드처럼 의미 있는 키워드를 세분화하여 중요도를 기준으로 3단계로 키워드를 분리해 보았습니다.

  • 가중치 상 : 가중치 중에 해당하는 키워드 중 임의로 중요도가 가장 높은 키워드들 선별
  • 가중치 중 : 가중치 하에 해당하는 키워드 중 임의로 중요도가 있는 키워드들 선별
  • 가중치 하 : 일반 Significant terms aggregation에서 추출된 키워드
[그림4] 가중치 세분화 작업

“갓신사 쓰는 분덜 다 리뷰 때문 아님? 이번에 배송온것도 빨리 후기 써야지”

분리된 키워드를 기준으로 위 문장에서 ‘리뷰’는 후기 카테고리의 핵심 키워드이고, ‘배송’은 주문/배송 카테고리의 중요 키워드에 속해 있다면 핵심 키워드의 우선순위가 높아 후기 카테고리로 분류 되도록 구성해 보았습니다.

또한, 문장을 구성하는 키워드가 카테고리의 키워드 그룹과 더 많이 일치할수록 해당 카테고리와 연관이 있도록 하였습니다. 아래와 같은 문장을 보고 핵심 키워드들이 더 많이 일치된 검색/필터 카테고리에 속한다고 판단할 수 있습니다.

“후기에 성별 필터가 갑자기 안 걸려요.. 성별+키로 조회하면 검색 가능한데
성별로만 조회하면 무조건 전체 검색결과가 나옵니다. 빠른 조치 부탁드려요..”

  • 후기 : 1
  • 검색/필터: 4

‘검색’을 통해서 맞닥뜨린 문제들

지금까지의 과정을 거치면서 얻은 정확도는 50 ~ 60% 였습니다. 약 40%이상의 문장은 정확하게 분류하지 못했다는 의미인데요. VoC의 카테고리 분류를 자동화하기엔 부족한 수치로 보입니다.

중지를 모은 끝에 3가지 정도의 문제가 있는 것을 확인하였습니다.

  • 부족한 표본 데이터: 구축한 핵심 키워드는 앞서 소개한 것처럼 통계적으로 추출을 하고 있었습니다. 의미 있는 키워드가 추출되려면 데이터의 양도 중요했는데요. 각 카테고리는 다양한 문장으로 구성이 되어 있어 다양한 케이스에 대한 단어를 추출할 수 있어야 합니다.
  • 복합 문장: 하나의 문장에 두 가지의 카테고리가 포함된 경우도 있을 수 있습니다. 사람이 분류한다면 문장에서 조금이라도 더 큰 의미를 내포한 카테고리로 분류를 했을 텐데요. 단순히 키워드의 가중치로 분류하고 있는 프로세스로는 분류가 쉽지 않았습니다.
  • 해석에 따라 달라지는 경우: 중의적인 표현들의 구분이 애매했습니다. 선호한다의 ‘좋아요’라는 표현과 무신사의 ‘좋아요’ 기능을 키워드만으로 분류하기에는 문제가 있습니다.

이 뿐 아니라 검색엔진으로 모든 문맥을 이해하기에는 많은 규칙들이 필요하게 될 것입니다. 때문에 검색이 아닌 머신러닝을 활용하여 카테고리 분류를 진행해보기로 결정했습니다.

AWS Comprehend 활용기

머신러닝을 도입하기 위해서는 환경 셋팅과 알고리즘을 선택하고 모델을 실험하는데 많은 리소스가 필요하게 되는데요. 그러한 과정을 줄이기 위해서 Amazon Comprehend를 사용하기로 하였습니다.

[그림5] Amazon Comprehend 안내

Amazon Comprehend를 사용하면 별도의 NLP 모델을 구축하고 실행하는 데 필요한 기술 구현이나 개발 단계가 필요 없이 손쉽게 애플리케이션에 텍스트 분석을 쉽게 추가 할 수 있습니다.

  1. 별도의 어려운 머신러닝 환경 세팅을 하지 않아도 됩니다.
  2. 머신러닝 모델을 선택하고 해당 모델을 실험하여 최적의 모델을 찾는 것에 많은 시간과 리소스를 사용하지 않아도 됩니다.
  3. AWS Comprehend는 실시간 API방식와 비동기 배치방식으로 제공을하고 있습니다. 비동기 배치 방식을 사용하여 작업을 진행하였습니다.
[그림6] AWS Comprehend 다이어그램

Column 1에 분류가 되어야 할 카테고리 정보를 Column 2에 VoC문장을 넣어 간단하게 모델을 생성할 수 있었습니다.

원활한 모델 생성을 위해 데이터를 정제함으로써 모델이 더욱 효과적으로 훈련되도록 개선하였는데요.

정제는 아래 두가지 작업으로 진행했습니다.

  1. 의미 없이 고정적으로 들어가 있는 텍스트, 날짜 제거: VoC로서의 날짜는 매우 중요하지만, 데이터 관점에서 날짜는 그리 중요하지 않았습니다. VoC의 입력을 위해 미리 입력된 정보성 Form 도 입력되어 있었는데요. 이러한 데이터들은 모델 생성 과정에서는 고려할 필요 없는 데이터입니다.

2. 맞춤법 교정: 한글은 띄어쓰기가 매우 중요하지만 작성할때는 그렇게 신경쓰지 않습니다. 어떻게 띄어쓰냐에 따라 다른 전혀 다른 뜻이 되곤 합니다.

a. 아버지가 방에 들어가신다.

b. 아버지 가방에 들어가신다.

더군다나 무신사 고객의 대상이 10대~30대인 경우가 많고 주로 휴대폰을 사용해 텍스트를 작성하기에 오탈자 교정이 필요했습니다.

이렇게 AWS Comprehend의 도입으로 정확한 카테고리 분류를 더욱 쉽게 수행할 수 있게 되었습니다. 앞서 낮은 정확도의 한계점으로 지적했던 작은 데이터라는 조건에 변화가 없었음에도, 92%라는 향상된 정답률을 얻을 수 있었습니다.

카테고리 자동 분류 파이프라인

만족스러운 정답률이 나올 수 있도록 파이프라인을 구축하고 난 뒤, 남은 과제는 제품경험분석팀에서 실무에 바로 활용할 수 있도록 가이드하는 일이었습니다.

분석 전 데이터를 어딘가에 업로드하고, 분석한 결과를 다시 내려받는 일련의 작업이 필요했고 아래 방법들로 풀어보고자 했습니다. 검색플랫폼팀의 개입 없이 제품경험분석팀에서 자체적으로 관리할 수 있어야 하는 것이 가장 중요한 포인트였죠.

1. API 활용

처음 검색플랫폼팀의 계획은 API를 제공하고 API 통해 정답셋 추가, VoC 문장의 카테고리분류를 진행하는 것이었습니다. 그렇기에 Swagger를 제공하여 API를 사용해서 언제든지 VoC를 분류를 진행할 수 있도록 하였습니다.

[그림7] API 다이어그램

가장 간단한 방법이라고 생각했으나 제품경험분석팀에는 이 작업을 담당할 개발자가 없었고 이는 오히려 낯설고 비효율적인 어려운 방법으로 보여졌습니다.

2. S3 활용

제품경험분석팀에서 카테고리를 직접 분류할때는 엑셀을 활용해서 직접 분류를 하고 있었는데요.

두번째 방법으로 S3(Amazon Simple Storage Service)를 활용하여 엑셀 파일을 직접 업로드 하면 일괄적으로 분류 작업을 진행하도록 하였습니다.

  1. 제품경품분석팀이 파일을 업로드한다.
  2. Batch를 통해 VoC를 분류하여 새로운 파일을 생성한다.
  3. 생성된 파일을 제품경험분석팀이 다운로드하여 검수 및 정답셋을 만든다.
  4. 정답셋을 다시 S3 업로드한다.
  5. 업로드된 정답셋을 검색엔진에 반영한다.
[그림8] S3 다이어그램

몇 번의 프로세스를 진행해 보면서 업로드를 확인하고 다운로드하는 작업 API를 대신해 사용할 수 있었지만, 절차가 너무 복잡합니다. 파일을 업로드 해놓고 다시 분류작업이 완료되면 공유해야 하는 커뮤니케이션 비용이 발생하였습니다.

3. 구글 시트 활용

마지막으로 엑셀 파일 대신 구글 시트를 활용해 보기로 하였습니다. 구글시트에 업데이트 후 분류 작업을 진행하면 구글시트에 분류된 카테고리를 업데이트해 주는 것이죠. 작업자도 구글시트에 바로 업데이트가 되니 작업 내용을 확인할 수 있어 불필요한 커뮤니케이션을 하지 않아도 되기에 현재까지 이 방법을 활용하고 있습니다.

[그림9] 구글 시트 다이어그램

VoC를 더 적극 활용할 수 있는 방법에 대해

자동 분류 파이프라인 구축 완료 이후 회고하며 이 작업물을 계속 적재해서 보여줄 수 있는 페이지가 있었으면 좋겠다는 제품경험분석팀의 초반 요구사항까지 모두 이루어드리고 싶다는 생각을 했습니다.

계획해 둔 완료 일정까지 얼마 남지 않았지만 기획 이후 개발에 착수하는 것이 아니라 기획 요건이 나올 때마다 API를 개발하고, Elasticsearch의 시각화 및 분석 도구인 Kibana를 활용한다면 짧은 시간 안에 효율적으로 구현할 수 있겠다고 판단했습니다.

  1. 데이터 적재 및 표시 : VoC 분류를 위해 data들을 모두 Elasticsearch에 보관하고 있었기에 Elasticsearch API를 활용
  2. 대시보드 시각화 자료 : ES에 적재된 데이터를 Kibana 대비보드의 공유 기능을 활용해 iframe으로 그래프와 표 형태로 구현
  3. VoC 검색 기능 : API 개발을 통해 적재된 데이터를 활용한 검색 기능 개발
  4. UI 개발 : 프론트엔드 개발팀의 지원으로 API 연동 및 인터페이스 개발

정보보안 검토와 함께 기능 테스트인 QA 작업을 마무리로 무신사 임직원이라면 누구나 편하게 접근할 수 있는 공간인 ‘VoC 리포팅 페이지’를 만들 수 있게 되었고, 더 나은 접근성을 위해 내부 어드민에도 ‘VoC 리포팅’ 메뉴를 추가했습니다.

[그림10] VoC 대시보드 페이지 화면
[그림11] 검색 페이지 화면

마치며

작은 수정사항과 보완 작업을 완료하고 마침내 2023년 04월 28일 대시보드와 VoC 검색으로 구성된 VoC 리포팅 페이지가 전사에 공개되었습니다.

[그림12] VoC 대시보드 론칭 슬랙 공지

누구나 무신사를 이용하는 고객이 어떤 생각을 가지고 있는지, 어떤 불편함이 있는지 확인할 수 있으며 이를 기획의 근거로 활용할 수 있길 바라는 마음에서 시작된 작업이 정보보안팀과의 보안성검토 작업, SRE(Site Reliability Engineering)팀과의 방화벽 작업 등 공개를 위한 사전 작업들과 프론트 개발자의 많은 노력 덕에 빠른 시간 안에 기획에 부합하는 결과물로 나올 수 있었습니다.

필요한 작업이 있을때 바로 개발을 시작해서 모델을 만드는 것 또한 중요하지만 이미 마련되어 있는 도구와 라이브러리를 활용할 수 있도록 아이디어를 얻을 수 있는 다양한 커뮤니티 활동과 검색 활동도 못지않게 중요합니다.

검색플랫폼팀은 앞으로 편리한 검색 기능을 위해 검색어 서비스(연관검색어,자동완성,동의어,금칙어 등)를 고도화하고 유의미한 지표 다양화 작업을 통해 지속해서 개선해 나갈 예정입니다.

무신사가 고객의 목소리를 통하여 점점 발전하는 모습을 함께 지켜봐 주시길 바랍니다.

--

--