[데이터 분석] LDA 토픽 모델링을 통한 고객 후기 분석 : 아마존 에코

2019년 7월 18일 업데이트됨

Original Article by scrapehero.com

Translated by JJ Hwang



image from Amazon.com

온라인 쇼핑몰이 유통의 중심이 되면서 온라인 상의 판매자 수와 고객 후기의 수도 크게 증가하고 있습니다. 따라서 고객 후기를 통해 고객의 제품 구매 경험을 이해하고 분석하는 것이 매우 중요한 일이 되었습니다. 하지만 거의 무한대에 가까울 만큼 방대한 양의 고객 후기를 크롤링하여 분석한다는 것은 간단한 작업이 아닙니다.​고객 후기 분석을 위해, 아마존 에코 (Amazon Echo)를 예시 제품으로 선택하였습니다.​

시작

작업을 시작하기 전에 관련 툴과 라이브러리가 필요합니다. 본 포스팅은 파이썬3를 염두에 둔 글이며, 이 곳의 안내에 따라 파이썬3와 PIP를 먼저 설치합니다. 아래 명령어를 활용하여 필요한 라이브러리를 설치합니다.


pip3 install pandas nltk gensim pyLdavis

라이브러리 로드하기

필요한 몇 개의 라이브러리들을 아래의 명령어를 통해 로드합니다.

import re # We clean text using regex

import csv # To read the csv

from collections import defaultdict # For accumlating values

from nltk.corpus import stopwords # To remove stopwords

from gensim import corpora # To create corpus and dictionary for the LDA model

from gensim.models import LdaModel # To use the LDA model

import pyLDAvis.gensim # To visualise LDA model effectively

import pandas as pd

아마존 에코 고객 후기 데이터 로드하기

웹크롤링으로 수집한 아마존 에코 고객 후기 데이터셋의 샘플은 아래와 같습니다.



fileContents = defaultdict(list)

with open('reviews_sample.csv', 'r') as f:

reader = csv.DictReader(f)

for row in reader: # read a row as {column1: value1, column2: value2,...}

for (k,v) in row.items(): # go over each column name and value

fileContents[k].append(v) # append the value into the appropriate list

리스트에 오직 고객 후기만 추출해 오라는 명령어는 아래와 같습니다.

reviews = fileContents['review_body']

데이터 정제


구두점

구두점은 아래의 명령어를 사용하며 모두 삭제합니다.


reviews = [re.sub(r'[^\w\s]','',str(item)) for item in reviews]


불용어

​고객 후기에는 후기 분석에서 제거되어야 할 불용어(stopwords)들이 많이 포함되어 있습니다. 후기의 텍스트를 토큰으로 변환하는 과정에서 이 불용어들은 제거됩니다.이를 위해 아래의 명령어를 활용하는 NLTK 불용어를 사용합니다.


stopwords = set(stopwords.words('english'))


​고객 후기를 단어들로 분리된 후기 리스트로 변환하는 과정에서 불용어들을 제거합니다. 그 리스트는 리뷰1의 단어1, 리뷰1의 단어2…, 리뷰2의 단어1, 리뷰2의 단어2… 와 같은 방식이 됩니다.​


texts = [[word for word in document.lower().split() if word not in stopwords] for document in reviews]


사용 빈도가 낮은 단어 제거하기

​단어가 문장 내에서 얼마나 중요한지 판단하는 가장 쉬운 방법은 그 단어가 얼마나 많이 사용되었는가 입니다. 만약 어떤 단어가 딱 한 번 사용되었다고 한다면, 토픽 모델링의 맥락에서 관련성이 낮을 것입니다. 아래 명령어로 사용 빈도가 낮은 단어를 제거합니다.​


frequency = defaultdict(int)

for text in texts:

for token in text:

frequency[token] += 1​


texts = [[token for token in text if frequency[token] > 1] for text in texts]

처리 절차 : 텍스트를 일람표로 변환

머신 러닝의 맥락에서 보면 일람표라는 것은 단어와 정수 식별자를 맵핑하는 것입니다. 기계는 단어와 문서를 이해하지 못하기 때문에 우리는 이를 잘게 나누어 벡터화합니다. 이 곳에 잘 설명된 링크를 걸어 두었습니다.​


각 문서는 하나의 벡터로 표현됩니다. 각각의 벡터 요소는 다음과 같은 형식의 질문-답변 쌍을 의미합니다.

“문서에서 그 단어 시스템은 몇 번 등장하는가? – 한 번”

질문을 정수 식별자로만 표현하는 것이 유리합니다. 이렇게 질문과 식별자 사이의 맵핑을 우리는 일람표라고 부릅니다. 이 곳 링크를 참조하면 더 상세한 설명을 만날 수 있습니다.​


dictionary = corpora.Dictionary(texts)


일람표를 출력해 보면 같은 개별 토큰들의 개수를 알 수 있습니다.​


print(dictionary)​


Dictionary(13320 unique tokens: ['warmth', 'exclusively', 'orchestral', 'techy', 'formal']...)


이는 각 문서가 28054-D 벡터에 의해 표현된다는 것을 의미합니다. 토큰화된 문서를 벡터로 변환하려면 아래 명령어를 활용합니다.​


corpus = [dictionary.doc2bow(text) for text in texts]


doc2bow가 각 고유 단어의 사용 횟수를 세고, 단어를 정수 식별자로 변환하여, 밀도가 낮은 벡터로서 그 결과를 돌려 보냅니다. 이렇게 되면 튜플의 리스트가 생성됩니다.​


코퍼스가 [(0,1),(1,4)] 를 판독한다면, 이는 그 문서에서 0이라는 식별자의 단어가 한 번 사용되었음을, 1이라는 식별자의 단어가 4번 사용되었음을 의미합니다. 이제 고객 후기 텍스트가 컴퓨터가 이해할 수 있는 신호로 변환되었기 때문에, 후기에서 주제를 추려내는 작업을 시작합니다.​


LDA 모델이란 무엇인가?


​토픽 모델링이란 다양한 문서에서 추상적인 “주제(topic)”를 발견해내는 통계학적 모델링 기법의 하나입니다. Latent Dirichlet Allocation (잠재 디리클레 할당)의 준말인 LDA는 특정 주제에 맞게 텍스트를 분류하는 데 쓰이는 하나의 모델이며, 문서 모델 당 하나의 주제를, 주제 모델 당 단어들을 생성합니다.​


9개의 주제로 시작해 봅니다. 모델은 문서가 여러 개의 주제를 함유하고 있다는 가정에서 시작합니다. 몇 개의 주제가 적합한 지를 판단하기 위해서는 일치 모델 (coherence model)를 참조해 볼 수도 있겠습니다. 아래 명령어를 통해 드디어 모델을 생성할 수 있습니다!​


NUM_TOPICS = 9 # This is an assumption.

ldamodel = LdaModel(corpus, num_topics = NUM_TOPICS, id2word=dictionary, passes=15)#This might take some time.


분석 결과


모델에서 주제를 도출해 내기

먼저 주제들을 살펴봅니다. 다만 LDA 토픽 모델링이 만능의 해답이 아니라 최적화와 관련된 부분적인 솔루션을 찾는 방법임을 감안해야 합니다.​


topics = ldamodel.show_topics()

for topic in topics:

print(topic)​


(0, '0.229*"love" + 0.049*"alexa" + 0.040*"gift" + 0.027*"loves" + 0.026*"christmas" + 0.023*"family" + 0.023*"bought" + 0.023*"awesome" + 0.017*"best" + 0.016*"absolutely"')

(1, '0.017*"amazon" + 0.017*"app" + 0.012*"device" + 0.010*"alexa" + 0.010*"work" + 0.010*"wifi" + 0.009*"phone" + 0.008*"time" + 0.008*"set" + 0.008*"get"')

(2, '0.037*"home" + 0.034*"smart" + 0.029*"lights" + 0.028*"music" + 0.025*"turn" + 0.021*"control" + 0.021*"amazon" + 0.020*"alexa" + 0.016*"devices" + 0.014*"use"')

(3, '0.042*"music" + 0.033*"alexa" + 0.022*"weather" + 0.020*"play" + 0.020*"questions" + 0.020*"use" + 0.018*"ask" + 0.015*"things" + 0.012*"list" + 0.012*"news"')

(4, '0.035*"like" + 0.031*"alexa" + 0.029*"dont" + 0.022*"doesnt" + 0.020*"would" + 0.019*"know" + 0.017*"say" + 0.015*"get" + 0.015*"cant" + 0.014*"really"')

(5, '0.091*"one" + 0.020*"bought" + 0.017*"got" + 0.016*"im" + 0.015*"another" + 0.014*"buy" + 0.013*"get" + 0.013*"day" + 0.012*"first" + 0.012*"would"')

(6, '0.155*"echo" + 0.145*"dot" + 0.039*"love" + 0.024*"room" + 0.019*"bedroom" + 0.018*"dots" + 0.016*"house" + 0.015*"use" + 0.013*"music" + 0.012*"great"')

(7, '0.061*"speaker" + 0.039*"sound" + 0.031*"good" + 0.027*"bluetooth" + 0.021*"better" + 0.020*"speakers" + 0.020*"quality" + 0.018*"echo" + 0.016*"great" + 0.015*"small"')

(8, '0.145*"great" + 0.068*"works" + 0.062*"product" + 0.054*"easy" + 0.052*"fun" + 0.041*"use" + 0.026*"set" + 0.023*"device" + 0.022*"little" + 0.020*"well"')


위 코드가 너무 복잡하니 pandas data frame을 활용하면 아래와 같은 더 나은 결과를 얻을 수 있습니다.​


word_dict = {};

for i in range(NUM_TOPICS):

words = ldamodel.show_topic(i, topn = 20)

word_dict['Topic # ' + '{:02d}'.format(i+1)] = [i[0] for i in words]

pd.DataFrame(word_dict)



아래와 같은 기초적인 9개의 주제들을 형성했습니다.


주제 1 – Alexa는 가족들의 크리스마스 선물로 매우 좋다. 아이들과 어른들이 모두 좋아한다.​


주제 2 – 와이파이 연결 시 약간의 잡음이 있다. 본 주제에 대해 ‘문제’라고 표현되었다.​


주제 3 – 고객들이 ‘스마트 홈’이라는 주제로 아마존 에코와 음악, 라디오, 조명 등의 연결 방식에 대해 많은 언급을 하고 있다.​


주제 4 – 아마존 에코가 음악, 날씨, 뉴스 같은 일상사와 많이 연관되어 언급되고 있다. 블루투스 연결이라는 기술적인 방식도 많이 언급되고 있다.​


주제 5 – 아마존 에코가 구글 홈과 비교되었을 때는 그렇게 큰 차별점을 보여주지 못하고 있다.​


주제 6 – 아마존 에코를 추천하는 사람이 많다. 긍정적인 후기라고 할 수 있다.​


주제 7 – 고객들이 침실과 거실에서 아마존 에코를 사용한 경험에 대해 많이 이야기하고 있다. 긍정적인 후기라고 할 수 있다.​


주제 8 – 스피커의 음질과 블루투스 연결에 대한 이야기가 많다.​


주제 9 – 고가임에도 불구하고 아마존 에코가 추천을 많이 받고 있다. 긍정적인 후기라고 할 수 있다.


PyLDAvis를 활용한 시각화

PyLDAvis는 시각화라는 방식을 통해 토픽 모델에서 몇 가지 주제들을 더 쉽게 해석하도록 도와줍니다. 아래의 그림과 같으며, 여러 개의 주제를 반응형으로 살펴보려면 이 곳을 방문하여 원하는 주제별로 클릭 할 수 있습니다.​


결론


​​분석 결과 몇 가지 결론을 요약해 보면 다음과 같습니다.​


1. 주제 4와 주제 5에 대한 후기가 두드러집니다. 일상적인 사용이라는 측면에서 아마존 에코와 구글 홈의 비교가 많이 언급되고 있습니다.


2. 주제 2와 주제 5의 연관이 아마존 에코와 구글 홈의 와이파이 연결 관련 비교와도 연결됩니다.


3. 주제 2와 주제 3의 연관은, 고객들의 주된 불만 요소와 타 제품과의 비교 요소가 와이파이 연결임을 보여줍니다.


4. 주제 8에서 세번째로 큰 요소가 “Good” 이라는 단어입니다. 즉 음질이 좋다는 것이 큰 장점입니다.


5. 주제 1은 아마존 에코가 크리스마스 선물로 매우 좋다는 것을 보여줍니다. 따라서 크리스마스 시즌에 맞춘 광고 집행 의사결정에 도움이 될 수 있습니다.


고객 후기를 체계적으로 수집하여 분석하는 것이 마케팅의 핵심 전략이 되고 있습니다. 고객 후기의 수집과 분석, 지금 바로 스파이더킴과 상의해 주세요!​


=========================

스파이더킴 (www.spiderkim.com)

웹크롤링, 웹스크래핑, 웹데이터 수집, 빅데이터에서 최고의 서비스를 제공합니다.

지금 바로 홈페이지를 방문하셔서, 문의 요청해 주십시오!


조회 278회

​고객센터

Tel: 02-596-8900  Fax : 02-6930-5709

10시 - 오후 7시(토, 일요일 및 공휴일은 휴무)

개인정보관리책임자 : 황재준   상호 : 유펜솔루션   대표자 : 김재훈   사업자등록번호 : 426-86-00939
주소 : (본사)대전광역시 유성구 엑스포로446번길 38, 3층 302호 / (지사 및 연구소)서울시 성동구 연무장 15길 11, B동 2층
​ⓒ 2019 UpennSolution Co., Ltd. All rights reserved.