Você está na página 1de 59

Team19_Week5

April 4, 2020

1 EDA - Team 19

Team 19 * Luis Henrique M O Imagiire * Reinaldo Augusto D Sima * Makoto Ikegame * Natalia
Sales Mesquita
EDA of the followin stores on ReclameAqui (27-03-2020 first 5 pages): * tokestok-loja-online *
tokestok * madeiramadeira * mobly * etna-home-store-loja-online * etna-home-store * casas-bahia-
loja-online * casas-bahia-lojas-fisicas
Second EDA batch of ReclameAqui (04-04-2020): - [x] Lojas Cem - [x] TUTTI MÓVEIS - [x]
Móveis Rainha - [x] Magazine Luiza - [x] Casas bahia - [x] Madeira Madeira - [x] Lojas Guido -
[x] Fabrispuma - [x] Viggore Móveis - [x] Lider Interiores - [x] Lojas Lebes - [x] Openbox2 - [x]
Marabraz - [x] Sylvia Design - [x] Mobly - [x] Inovar Móveis e Colchões - [x] KingStar Loja - [x]
Etna - [x] Tok&Stok - [x] Esplanada Móveis

1.1 What questions will I be able to answer with this data?

Our MVP’s target: - Focus on answering customers’ most frequent questions/problems - Stores
ranking - Segmented analysis both online vs. bricks and mortar retailers - Deliver a general snapshot
of the vertical

1.2 Reclame Aqui (RA) dataset sample

[1]: from util import agg_jsonls # helper function


from pprint import pprint

# Unique reviews
unique_ids = set()
reviewsRA = []
for complaint in agg_jsonls("listing"):
if "review_ID" in complaint and complaint["review_ID"] not in unique_ids:
unique_ids.add(complaint["review_ID"])
reviewsRA.append(complaint)

print(f"We have a total of {len(reviewsRA)} reviews!")

We have a total of 9600 reviews!

1
[2]: # Get an example of responses > 0
for review in reviewsRA:
if "responses" in review and len(review["responses"]["business"]) > 0:
pprint(review)
break

{'business_name': 'Marabraz - Loja Online',


'city': 'Salvador',
'datetime': '2020-02-10T17:04:00Z',
'description': 'Fiz uma compra na empresa Marabraz online,no dia 02/01,com o '
'número de pedido:501031622,com previsão de entrega para o dia '
'06/02.A entrega era pra ser feita pela transportadora '
'LeiteExpress,eles realizaram 04 tentativas, realizei o '
'rastreamento da entrega,no dia 28/01 e 31/01 alegaram que não '
'houve tempo hábil;no dia 03/02 não tinha ninguém na casa pra '
'receber no final da tarde;e no dia 07/02 mais uma vez '
'alegaram que não teve tempo hábil.Já passou o tempo de '
'entrega mando e-mail e falo pelo chat com a Marabraz,e eles '
'falaram vão entrar em contato com a empresa até o dia 19/02. '
'Tenho que ficar a disposição da transportadora,ligo pra eles '
'confirmaram que vão fazer a entrega no dia acordado e não o '
'fazem.Venho solicitar a Marabraz que resolva está '
'situação,não ficar dando prazos pra entrar em contato com a '
'transportadora.Ou então façam o extorno da compra.',
'responses': {'business': [{'content': 'Olá Fernanda bom dia tudo '
'bem?Primeiramente peço desculpas pelo '
'transtorno com sua compra em nosso '
'site.Mas conforme contato telefônico, '
'agendei ontem com a transportadora a '
'entrega para hoje, e já foi entregue, '
'irei adicionar seu WhatsApp para caso '
'precise de alguma outra ajuda. Fico a '
'disposição e agradeço a '
'compreensão.Peço por favor que não '
'deixe de avaliar o meu atendimento no '
'site, sua avaliação positiva é '
'extremamente importante para mim.Por '
'conta do transtorno decidi enviar um '
'presentinho em seu e-mail, pode '
'verificar?Atenciosamente;LucasCentral '
'de Relacionamento Marabraz.com',
'datetime': '2020-02-11T17:02:00Z'}],
'customer': [],
'final': {'reply': [{'content': 'Conforme a resposta da empresa '
'Marabraz a entrega foi '
'realizada hoje,com atraso.Fui '
'bem atendida pelo chat e '

2
'também por contato telefônico '
'com o Lucas.',
'datetime': '2020-02-11T18:57:00Z'}],
'result': 'positive',
'seals': [{'seal': 'Nota do atendimento',
'value': '8'}]}},
'review_ID': '100355327',
'tags': ['Móveis em Geral'],
'timeCaptured': '2020-04-03T03:36:27Z',
'title': 'Não entregaram o produto',
'uf': 'BA'}

1.2.1 Count of complaints with response

[4]: reviews_with_response = [review for review in reviewsRA if "responses" in ␣


,→review and len(review["responses"]["business"]) > 0]

reviews_with_no_response = [review for review in reviewsRA if "responses" in ␣


,→review and len(review["responses"]["business"]) == 0]

print(f"Total of reviews with response {len(reviews_with_response)}␣


,→[{round((len(reviews_with_response)/len(reviewsRA))*100, 2)}%]")

print(f"Total of reviews with NO response {len(reviews_with_no_response)}␣


,→[{100- round((len(reviews_with_response)/len(reviewsRA))*100, 2)}%]")

print(f"We have a total of {len(reviewsRA)} reviews!")

Total of reviews with response 7836 [81.62%]


Total of reviews with NO response 1764 [18.379999999999995%]
We have a total of 9600 reviews!

[5]: from datetime import datetime


import numpy as np
import pandas as pd

def extract_days_to_resolution(review):
if "datetime" in review and "reply" in review["responses"]["final"]:
init_dt = datetime.strptime(review["datetime"], '%Y-%m-%dT%H:%M:%SZ')
final_ans_dt = datetime.
,→strptime(review["responses"]["final"]["reply"][0]["datetime"], '%Y-%m-%dT%H:

,→%M:%SZ')

days_diff = (final_ans_dt - init_dt).days


if days_diff < 0:
return 0
return days_diff
return np.nan

3
def extract_days_to_first_contact(review):
if "datetime" in review and "business" in review["responses"] and␣
,→len(review["responses"]["business"]) > 0:

init_dt = datetime.strptime(review["datetime"], '%Y-%m-%dT%H:%M:%SZ')


final_ans_dt = datetime.
,→strptime(review["responses"]["business"][0]["datetime"], '%Y-%m-%dT%H:%M:

,→%SZ')

days_diff = (final_ans_dt - init_dt).days


if days_diff < 0:
return 0
return days_diff
return np.nan

def format_RA_to_df(review):
cols_for_df = ['title', 'description', 'business_name', 'uf', 'city',␣
,→'review_ID', 'datetime', 'timeCaptured']

r_cp = {col: review[col] for col in cols_for_df if col in review}


r_cp["days_to_resolution"] = extract_days_to_resolution(review)
r_cp["days_to_first_contact"] = extract_days_to_first_contact(review)
r_cp["resolution_outcome"] = review["responses"]["final"]["result"] if␣
,→"responses" in review and "final" in review["responses"] and "result" in␣

,→review["responses"]["final"] else np.nan

return r_cp

dff = pd.DataFrame([format_RA_to_df(row) for row in reviewsRA])


dff.head()

[5]: title \
0 Não entregaram o produto
1 Descumprimento do prazo e da tratativa
2 Descaso
3 Quero meu dinheiro!!
4 DEVOLUÇÃO.

description business_name \
0 Fiz uma compra na empresa Marabraz online,no d… Marabraz - Loja Online
1 Após atraso na entrega, abri reclamação e minh… Marabraz - Loja Online
2 No dia 06/01/2020 realizei a compra de um armá… Marabraz - Loja Online
3 Comprei um armario na loja online marabraz, na… Marabraz - Loja Online
4 COMPREI CHEGO COM 2 MÊS ATRASADOS. TODO QUEBR… Marabraz - Loja Online

uf city review_ID datetime timeCaptured \


0 BA Salvador 100355327 2020-02-10T17:04:00Z 2020-04-03T03:36:27Z
1 MG Belo Horizonte 100342419 2020-02-10T13:26:00Z 2020-04-03T03:36:31Z

4
2 SP São Paulo 100343397 2020-02-10T13:44:00Z 2020-04-03T03:36:31Z
3 SP São Paulo 100346141 2020-02-10T14:31:00Z 2020-04-03T03:36:31Z
4 PR Cafeara 100346415 2020-02-10T14:36:00Z 2020-04-03T03:36:31Z

days_to_resolution days_to_first_contact resolution_outcome


0 1.0 0.0 positive
1 NaN 49.0 NaN
2 NaN 10.0 NaN
3 NaN 9.0 NaN
4 NaN NaN NaN

1.2.2 Word cloud from complaints’ description

[6]: import matplotlib.pyplot as plt


from wordcloud import WordCloud
import wordcloud
import pandas as pd
import nltk
from nltk.corpus import stopwords

word_cloud_text = ' '.join(dff['description'])


stop_words = set(stopwords.words("portuguese"))
without_stop_words = []
sentence = word_cloud_text
words = nltk.word_tokenize(sentence)
for word in words:
if word not in stop_words:
without_stop_words.append(word.lower())

word_cloud_text_SW = ' '.join(without_stop_words)

wordcloud = WordCloud(max_font_size=100, max_words=100,␣


,→background_color="white",\

scale = 10,width=800, height=400).


,→generate(word_cloud_text_SW)

<Figure size 640x480 with 1 Axes>

[8]: plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

5
Correlation between average response time and whether or not a response was posi-
tive/negative.
We see that complaints that have a positive resolution are solved on average 3 times faster than
the ones with a negative conclusion. Also, the time to first response is half in comparisson with the
negative conclusion. We need to dig deeper to understand the properties of negative and positive
outcomes.
[60]: dff.resolution_outcome = pd.Categorical(dff.resolution_outcome)
dff.groupby("resolution_outcome").mean()

[60]: days_to_resolution days_to_first_contact


resolution_outcome
negative 126.746207 34.064706
positive 49.650868 15.038265

Average time to company response and evaluating experience.


On average, companies take 15 days to give the first reply - but there are weird values for the
maximum for both “days_to_resolution” and “days_to_first_contact” that do not make sense.
We proceed investigating these values.
Also, when aggregating by days before contact, we have a hint that positive responses appear more
frequently when the contact is made ealier on.
[46]: dff.describe()

[46]: days_to_resolution days_to_first_contact


count 3489.000000 7836.000000
mean 65.670966 16.201761
std 178.113495 55.441741
min 0.000000 0.000000
25% 2.000000 0.000000

6
50% 10.000000 2.000000
75% 38.000000 12.000000
max 1884.000000 833.000000

Investigating high values for “days until resolution”


[9]: dff.loc[dff.days_to_resolution > 1500].head()

[9]: title \
459 DEFEITO DE FABRICAÇÃO
466 Indignação
3224 garantia nao atendida.

description business_name uf \
459 FIZ UMA COMPRA EM 21.01.2014 E CONCORDEI EM A… Sylvia Design SP
466 Minha reclamação hoje é referente a indignação… Sylvia Design SP
3224 comprei um sofá na unidade de sao miguel, que … Móveis Rainha SP

city review_ID datetime timeCaptured \


459 São Paulo 9662698 2014-08-06T13:56:00Z 2020-04-01T20:54:11Z
466 São Paulo 10178100 2014-09-23T19:42:00Z 2020-04-01T20:54:11Z
3224 Guarulhos 8673765 2014-04-29T09:50:00Z 2020-03-31T23:03:54Z

days_to_resolution days_to_first_contact resolution_outcome


459 1884.0 1.0 positive
466 1827.0 7.0 negative
3224 1667.0 0.0 positive

[12]: def get_complaint_conversation(idx, complaints):


comps = [i for i in complaints if "review_ID" in i and i["review_ID"] ==␣
,→str(idx)]

if len(comps)>0:
return comps[0]["responses"]
else:
return None

pprint(get_complaint_conversation(9662698, reviewsRA))
print("============================================================")
pprint(get_complaint_conversation(10178100, reviewsRA))
print("============================================================")
pprint(get_complaint_conversation(8673765, reviewsRA))

{'business': [{'content': 'Boa tarde, Isabel ! A Sylvia Design agradece seu '
'contato e desculpa-se pelo transtorno.Estamos '
'tomando todas as providencias necessárias para a '
'resolução do ocorrido. O departamento responsável '
'entrará em contato posteriormente.Atenciosamente '

7
'Relacionamento com ClienteSylvia Design (11) '
'3033-9505.',
'datetime': '2014-08-07T14:05:00Z'}],
'customer': [{'content': 'VCS NÃO SÓ NAO RESOLVERAM O PROBLEMA, COMO CONTINUO '
'COM O SOFÁ EM CASA SEM ENCOSTO, E NAO QUERO '
'AGUARDAR MAIS 60 DIAS PARA TER OUTRO SOFÁ COM SEI '
'LÁ QUANTOS OUTROS PROBLEMAS. QUERO MEU DINHEIRO DE '
'VOLTA, E AINDA ESTA SEMANA ESTAREI INDO A LOJA '
'REITERAR MEU DESACORDO.ESTOU AGUARDANDO ATE HJ A '
'TAL DA CAROLINE LIGAR !',
'datetime': '2014-08-18T21:45:00Z'}],
'final': {'reply': [{'content': 'Resposta: só resolvi por conta do advogado.',
'datetime': '2019-10-03T14:43:00Z'}],
'result': 'positive',
'seals': [{'seal': 'Voltaria a fazer negócio?', 'value': 'Não'}]}}
============================================================
{'business': [{'content': 'Boa tarde Tais.A empresa Sylvia Design agradece o '
'seu contato.Informações serão encaminhadas ao setor '
'responsável, referente a negociações somente na '
'loja.AtenciosamenteRelacionamento com o '
'clienteSylvia Design',
'datetime': '2014-10-01T13:37:00Z'}],
'customer': [],
'final': {'reply': [{'content': 'Péssimo atendimento',
'datetime': '2019-09-25T15:00:00Z'}],
'result': 'negative',
'seals': [{'seal': 'Voltaria a fazer negócio?', 'value': 'Não'}]}}
============================================================
{'business': [{'content': 'Prezado Sr. Luis, Não estamos conseguindo entrar em '
'contato , o técnico pode ir hoje no local ? No '
'aguardo Atenciosamente,Móveis Rainha',
'datetime': '2014-04-29T17:45:00Z'},
{'content': 'Prezado Sr. Luis, Conforme o técnico nos passou o '
'Sr. viajou, estaremos no aguardo para solucionar o '
'problema no dia 05 ou 06/05. Atenciosamente,Móveis '
'Rainha',
'datetime': '2014-04-30T10:36:00Z'}],
'customer': [{'content': 'Vcs tem meu telefone, tanto que o técnico me ligou '
'ontem msm, antes de vcs postarem essa resposta! '
'porém não foi agendado a visita, pois no horário em '
'que ele queria fazer a visita eu já não tinha '
'disponibilidade.',
'datetime': '2014-04-30T10:23:00Z'}],
'final': {'reply': [{'content': 'são bastante enrolados.',
'datetime': '2018-11-21T12:01:00Z'}],
'result': 'positive',
'seals': []}}

8
Investigating high values for “days until first response”
[10]: dff.loc[dff.days_to_first_contact > 600].head(2)

[10]: title \
6269 Descaso com o consumidor, produto com defeito …
6276 Móvel danificado em 2 entregas!!!

description \
6269 Sou de Resende-RJ, no mês de abril fui até a l…
6276 Na data de 21/01/2014 efetuei a compra de uma …

business_name uf city review_ID \


6269 Inovar Móveis e Colchões RJ Resende 10044510
6276 Inovar Móveis e Colchões SP São José dos Campos 8617940

datetime timeCaptured days_to_resolution \


6269 2014-09-10T21:48:00Z 2020-04-02T18:52:51Z NaN
6276 2014-04-23T10:59:00Z 2020-04-02T19:19:25Z NaN

days_to_first_contact resolution_outcome
6269 657.0 NaN
6276 659.0 NaN

[13]: for i in dff.loc[dff.days_to_first_contact > 600].review_ID:


print("================================================================")
pprint(get_complaint_conversation(i, reviewsRA))

================================================================
{'business': [{'content': 'enviado atraves do e-mail.',
'datetime': '2016-06-29T12:47:00Z'}],
'customer': [{'content': 'Depois de mais de 2 anos da compra do sofá '
'(24/04/2014), meu caso ainda não foi resolvido, não '
'me mandaram os pés do sofá que eles mesmos '
'danificaram com a entrega, não atendem os '
'telefones, não respondem os emails e ainda vem aqui '
'no reclame aqui e mente que me enviaram um email. '
'MENTIRA! Eles são totalmente omissos com o '
'consumidor e não estão interessados em reparar e '
'resolver nenhum problema que eles causaram. Por '
'isso volto a repetir não comprem NADA, '
'absolutamente NADA nessa loja, pois são enganadores '
'e [Editado pelo Reclame Aqui].',
'datetime': '2016-06-29T13:17:00Z'}],
'final': {}}
================================================================
{'business': [{'content': 'Boa Tarde pedimos a gentileza de finalizar a '
'reclamação. Att',

9
'datetime': '2016-02-11T15:36:00Z'}],
'customer': [],
'final': {}}
================================================================
{'business': [{'content': 'Boa Tarde, pedimos a gentileza de finalizar a '
'reclamação !',
'datetime': '2016-02-11T15:40:00Z'}],
'customer': [],
'final': {'reply': [{'content': 'Muito demorado',
'datetime': '2016-02-11T23:50:00Z'}],
'result': 'positive',
'seals': [{'seal': 'Voltaria a fazer negócio?', 'value': 'Não'},
{'seal': 'Nota do atendimento', 'value': '4'}]}}
================================================================
{'business': [{'content': 'Estofado entregue pedimos a gentileza de finalizar '
'a reclamação . Att',
'datetime': '2016-02-11T15:43:00Z'}],
'customer': [],
'final': {}}
================================================================
{'business': [{'content': 'Pedimos a gentileza de finalizar a reclamação !',
'datetime': '2016-02-11T15:34:00Z'}],
'customer': [],
'final': {}}
================================================================
{'business': [{'content': 'Bom dia Sr. AkropoleReferente ao ocorrido , '
'pedimos nossas sinceras desculpas em nome da Open '
'Box2.Estamos a sua disposição para qualquer duvida '
'ou esclarecimento no e-mail sac2@openbox2.com.br '
'.Nosso objetivo é, atender com satisfação e '
'presteza nossos consumidores . Favor não finalizar '
'a reclamação caso o problema não tenha sido '
'resolvido , postar uma replica que entraremos em '
'contato com a finalidade de sanar o problema '
'causado .Se a mesma já foi solucionada , favor '
'avaliar o nosso atendimento .Att',
'datetime': '2019-05-21T11:02:00Z'}],
'customer': [],
'final': {}}
================================================================
{'business': [{'content': 'Boa tardeSra. Ana Paula Pedimos nossas sinceras '
'desculpas em nome da OpenBox2.O nosso objetivo é '
'atender os nossos consumidores com presteza '
'.Estamos a sua disposição Att',
'datetime': '2019-05-22T17:41:00Z'}],
'customer': [],
'final': {'reply': [{'content': 'Gerente Renan extremamente atencioso, '
'preocupado com o cliente, coerente. '

10
'Certamente ganharam uma cliente pela '
'preocupação com o pos venda.',
'datetime': '2018-01-31T10:20:00Z'}],
'result': 'positive',
'seals': []}}
================================================================
{'business': [{'content': 'Boa tarde, Gabriel.A empresa Sylvia Design '
'agradece, e desculpa-se novamente pelo transtorno. '
'Caso tenha alguma duvida por favor entre em contato '
'pelo SAC.Atenciosamente Relacionamento com o '
'Cliente Sylvia Design',
'datetime': '2015-08-12T17:17:00Z'}],
'customer': [],
'final': {'reply': [{'content': 'Problema resolvido',
'datetime': '2014-02-13T09:13:00Z'}],
'result': 'positive',
'seals': [{'seal': 'Nota do atendimento', 'value': '8'}]}}
================================================================
{'business': [{'content': 'Agradecemos seu contato e estamos a disposição para '
'maiores esclarecimentos.',
'datetime': '2015-09-16T11:16:00Z'}],
'customer': [],
'final': {'reply': [{'content': 'Eu precisei ir até a loja e cancelar '
'diretamente com o gerente, o SAC não '
'consegue resolver nada.',
'datetime': '2014-02-24T08:27:00Z'}],
'result': 'positive',
'seals': [{'seal': 'Voltaria a fazer negócio?', 'value': 'Não'}]}}
================================================================
{'business': [{'content': 'Agradecemos seu contato e estamos a disposição para '
'maiores esclarecimentos.',
'datetime': '2015-09-16T11:15:00Z'}],
'customer': [{'content': 'Não foi Resolvido me enviaram uma nota fiscal '
'falsa tudo em árabe e nem registraram no '
'sistema da nota fiscal paulista, vou ter '
'que processar vocês?solucionem isso ae',
'datetime': '2014-02-10T20:05:00Z'}],
'final': {'reply': [{'content': 'OK', 'datetime': '2014-04-24T10:16:00Z'}],
'result': 'positive',
'seals': [{'seal': 'Voltaria a fazer negócio?', 'value': 'Não'}]}}
================================================================
{'business': [{'content': 'Agradecemos seu contato e estamos a disposição para '
'maiores esclarecimentos.',
'datetime': '2015-09-16T11:19:00Z'}],
'customer': [{'content': 'Sem nenhum contato para informar sobre a entrega do '
'meu sofá e da troca do bau da cama',
'datetime': '2013-11-29T09:00:00Z'},
{'content': 'A cama box foi entregue no sábado dia '

11
'07/12/2013.mas meu SOFÁ não veio. lembrando qeu o '
'prazo de vocês era de 7 a 30 dias.hoje completa-se '
'30 dias e NÃO ESTOU COM MEU SOFÁ. POSSO ENTÃO NÃO '
'QUERER PAGAR UMA PARCELA, VISTO QUE ESTOU A 30 '
'DIAS COM MEU BEM ADQUIRIDO SEM TÊ-LO.',
'datetime': '2013-12-09T20:20:00Z'},
{'content': 'Impressionante como até hoje 18/12/2013 não tive a '
'entrega do meu SOFÁ com PROMETIDO PELA CAROLINA '
'(SAC - ATENDIMENTO CLIENTE).Estamos desde o dia '
'09/11/2013 quando depois de 2 semanas consegui que '
'retirassem meu SOFÁ que estava com barulho desde '
'sua montagemPrazo 7 a 30 dias para entrega de '
'acordo com o setor de manutenção porque disseram '
'que não poderia ser feita a troca do móvel.Bom dia '
'09/12 liguei e tive a informação que não tinha '
'chego o movel da fábrica.Liguei dia 10/12 e a mesma '
'história e que a entrega seria feia dia 14/12Dia 13 '
'fui informada que o movel já tinha saido da fabrica '
'e seria entregue dia 18.Bom liguei hoje pela manhã '
'e como esperava a CAROLINA disse que não seria '
'entregue. Que teria que aguardar.Palhaçada..Até '
'quando?O NOME DE VOCÊS NÃO DEVEM ESTAR PREOCUPADOS, '
'VISTO QUE SEQUER RESPONDEM OS EMAILS QUE ENVIO '
'SOLICITANDO UM POSICIONAMENTO.FALE CONOSCO, EMAIL '
'PROPRIO E OUTRA RECLAMAÇÃO NO RECLAME AQUI.Pedido '
'01A-1-6338',
'datetime': '2013-12-18T11:50:00Z'}],
'final': {'reply': [{'content': 'Desrespeitto',
'datetime': '2014-09-27T20:42:00Z'}],
'result': 'positive',
'seals': [{'seal': 'Voltaria a fazer negócio?', 'value': 'Não'}]}}
================================================================
{'business': [{'content': 'Agradecemos seu contato e estamos a disposição para '
'maiores esclarecimentos.',
'datetime': '2015-09-16T11:18:00Z'}],
'customer': [{'content': 'Nem se quer tentaram entrar em contato. Nem se qr '
'querem resolver. Incompetentes.',
'datetime': '2013-12-12T14:52:00Z'}],
'final': {'reply': [{'content': 'não gostei. péssimo produto. e não me '
'contataram.',
'datetime': '2015-03-18T13:26:00Z'}],
'result': 'negative',
'seals': [{'seal': 'Voltaria a fazer negócio?', 'value': 'Não'}]}}
================================================================
{'business': [{'content': 'Agradecemos seu contato e estamos a disposição para '
'maiores esclarecimentos.',
'datetime': '2015-09-16T11:18:00Z'}],
'customer': [],

12
'final': {'reply': [{'content': 'O espelho do rack foi trocado e me conformei '
'com os amassados da mesa e os rasgos no '
'sofá. Registro aqui que, nunca mais compro '
'produtos da Sylvia Design.',
'datetime': '2014-02-04T11:12:00Z'}],
'result': 'positive',
'seals': [{'seal': 'Voltaria a fazer negócio?', 'value': 'Não'}]}}
================================================================
{'business': [{'content': 'Agradecemos seu contato e estamos a disposição para '
'maiores esclarecimentos.',
'datetime': '2015-09-16T11:17:00Z'}],
'customer': [],
'final': {'reply': [{'content': 'Muito tempo para resolver!',
'datetime': '2014-02-06T12:21:00Z'}],
'result': 'positive',
'seals': [{'seal': 'Voltaria a fazer negócio?', 'value': 'Não'}]}}

1.2.3 Investigation of higher values: conclusion

We discovered two new dynamics from this investigation. First, high values from “days until
resolution” are due to users forgetting to close the complaint ticket and only doing it years later
(when they probably logged backed to the website for another complaint). Second, the unsual high
values for “days to first reply” are due to company revisiting older complaints and asking the user
to close the ticket (probably to increase their response rate that is shown at their profile screen).
We will take this in consideration when modeling and further analysis.
[101]: fig,ax = plt.subplots(figsize=(10, 5))
sns.barplot(x="days_to_first_contact",
y="days_to_resolution",
hue="resolution_outcome",
data=dff.groupby(["days_to_first_contact", "resolution_outcome"]).
,→count().head(20).reset_index(),ax=ax)

[101]: <matplotlib.axes._subplots.AxesSubplot at 0x7f1165a148d0>

13
[15]: answered_perc = round(dff.days_to_first_contact.count()/dff.shape[0] * 100, 2)
print(f"Total of answered complaints : {answered_perc}%")

Total of answered complaints : 81.62%


Percentage of answered complaints by store
[19]: aa = dff.groupby("business_name").count()
aa = round(aa.days_to_first_contact/aa.review_ID * 100, 2)
pprint(aa.sort_values())

business_name
Magazine Luiza - Loja Online 0.00
Casas Bahia - Loja Online 1.74
Tok&Stok - Loja Online 6.38
Casas Bahia - Lojas Físicas 8.24
MadeiraMadeira 11.73
Casas Bahia - Marketplace 12.04
Etna Home Store - Loja Online 13.04
Etna Home Store 22.22
Magazine Luiza - Loja Física 26.14
Tok&Stok - Loja Física 34.29
Mobly 41.38
Lojas Cem 55.38
Lojas Guido 61.11
TUTTI MÓVEIS 65.70
Marabraz - Loja Online 88.00
93.64
Marabraz - Lojas Físicas 94.93

14
Openbox2 97.30
Inovar Móveis e Colchões 98.32
Sylvia Design 99.91
Móveis Rainha 100.00
Fabrispuma 100.00
Viggore Móveis 100.00
dtype: float64

[87]: view = dff.groupby('business_name').agg({'days_to_resolution': 'mean'}).


,→reset_index().dropna()

height = view["days_to_resolution"].sort_values()
bars = view["business_name"]
y_pos = np.arange(len(bars))

fig, ax = plt.subplots(figsize=(6,6))
plt.barh(y_pos, height)
plt.yticks(y_pos, bars)
plt.title('Day to resolution per company')
plt.show()

15
[88]: view = dff.groupby('business_name').agg({'days_to_first_contact': 'mean'}).
,→reset_index().dropna()

height = view["days_to_first_contact"].sort_values()
bars = view["business_name"]
y_pos = np.arange(len(bars))

fig, ax = plt.subplots(figsize=(6,6))
plt.barh(y_pos, height)
plt.yticks(y_pos, bars)
plt.title('Days to first contact per company')
plt.show()

Investigation of ’ ’ stores
We see that it must been some sort of bug while scraping data from RA. We have descriptions
pointing towards different stores, so it is not a single store problem.
[20]: dff.loc[dff["business_name"]=='']

[20]: title \
73 Atraso na entrega

16
74 Absurdo
89 COMPREI, PAGUEI e NÃO RECEBI O PRUDUTO.
132 Recebi um armário com 2 peças faltando.
488 Empresa horrivel
… …
9484 Mau atendimento montagem
9519 ENTREGA FORA DE PRAZO
9572 Falta de Respeito com consumidor
9583 Indignada
9588 Devolução do dinheiro

description business_name uf \
73 Comprei os moveis pedido 501056490, compra apr… SP
74 Fiz uma compra no dia 21/11/2019 de um guarda … SP
89 COMPREI UM GUARDA ROUPA NO DIA 29/01/2020 (PED… SP
132 Recebi um armário com 2peças faltando e entrar… RJ
488 Comprei um produtos pela Marabraz que era pra … SP
… … … ..
9484 Boa noite!Fizemos uma grande compra na loja da… SP
9519 Fui na loja da R Catumbi na ultima segunda fei… SP
9572 No dia 3/5/2017 fui na loja com meu marido com… SP
9583 No dia 18/04/2017 fui até a loja 128 marabraz … SP
9588 Eu comprei um sofá na loja da Vila Maria pague… SP

city review_ID datetime \


73 São Bernardo do Campo 100263403 2020-02-07T14:02:00Z
74 São Paulo 100264023 2020-02-07T14:16:00Z
89 São Paulo 100254139 2020-02-07T10:59:00Z
132 Nova Iguaçu 100203653 2020-02-06T08:52:00Z
488 Ilhabela 99784485 2020-01-26T09:46:00Z
… … … …
9484 São Paulo 97388795 2019-11-25T19:16:00Z
9519 São Paulo 95086435 2019-09-11T16:56:00Z
9572 Sorocaba 26698415 2017-06-06T21:41:00Z
9583 São Paulo 26502497 2017-05-29T12:15:00Z
9588 Santo André 26517822 2017-05-29T20:24:00Z

timeCaptured days_to_resolution days_to_first_contact \


73 2020-04-03T03:40:23Z NaN 0.0
74 2020-04-03T03:40:23Z 12.0 0.0
89 2020-04-03T03:40:52Z NaN 13.0
132 2020-04-03T03:44:37Z NaN 0.0
488 2020-04-03T12:57:51Z NaN 1.0
… … … …
9484 2020-04-01T12:11:47Z NaN 0.0
9519 2020-04-01T12:14:31Z 0.0 0.0
9572 2020-04-03T18:16:41Z 1.0 1.0

17
9583 2020-04-03T18:18:13Z 0.0 0.0
9588 2020-04-03T18:18:13Z 0.0 0.0

resolution_outcome
73 NaN
74 negative
89 NaN
132 NaN
488 NaN
… …
9484 NaN
9519 positive
9572 positive
9583 positive
9588 positive

[220 rows x 11 columns]

Tag analysis
[21]: unique_tags = set()
for review in reviewsRA:
if "tags" in review:
for tag in review["tags"]:
unique_tags.add(tag)

print(f"We have {len(unique_tags)} unique tags!")


pprint(unique_tags)

We have 264 unique tags!


{'Acessórios de Vestuário',
'Acessórios para Bebê',
'Acessórios para Carros',
'Agendamento',
'Alto falantes',
'Amassado',
'Aparadores',
'Aparelho de jantar',
'Aparelhos de musculação',
'Aparelhos de som',
'Aplicativos',
'Ar condicionado',
'Armários de cozinha',
'Aromatizantes e Difusores',
'Artigos Religiosos',
'Artigos para bebê',
'Aspiradores e vassouras',
'Assistência técnica',

18
'Assistência técnica e Garantia',
'Assistência técnica indisponível',
'Atendimento na Loja',
'Atraso na entrega',
'Atraso na entrega do produto',
'Atraso no reembolso por cancelamento',
'Balanças',
'Bancos e banquetas',
'Berço desmontável',
'Bikes',
'Bolsas',
'Bolsas e Malas',
'Bonecos e Bonecas',
'Braço quebrado',
'Braço solto',
'Brinquedos e jogos',
'Brinquedos eletrônicos',
'Brinquedos para bebês',
'Cabeceira',
'Cadeira bamba',
'Cadeiras',
'Cafeteiras e Chaleiras',
'Caixas de som e fone de ouvido',
'Cama, Mesa e Banho',
'Camas e camas-box',
'Canais de Atendimento',
'Cartão de crédito',
'Cartões de Crédito',
'Celular',
'Celulares e Smartphones',
'Chapinhas (Pranchas)',
'Churrasqueira',
'Chuveiro elétrico',
'Chuveiros e Aquecedores',
'Climatizador de ar',
'Clubes de Compras e Vantagens',
'Coifa e depurador',
'Colchão irregular',
'Colchões',
'Colchões e acessórios',
'Componentes, peças e acessórios',
'Comportamento do profissional',
'Computadores all in one',
'Console (Videogame)',
'Controle remoto',
'Controles e Joysticks',
'Conversor digital',
'Cooktop',

19
'Cortina',
'Cristaleiras',
'Câmera',
'Danos ao imóvel',
'Decoração',
'Deformado',
'Demora no atendimento',
'Demora no reparo',
'Desacordo Comercial',
'Desconfortável',
'Descosturado',
'Desgaste prematuro',
'Desligando sozinha',
'Desligando sozinho',
'Dificuldade para abrir-fechar a porta',
'Divergência de valores',
'Eletrodomésticos',
'Eletroeletrônicos',
'Eletroportáteis',
'Encosto com problema',
'Encosto quebrado',
'Entrega',
'Equipamentos de Beleza e Estética',
'Equipamentos de academia',
'Equipamentos de rede-Wireless',
'Equipe de Atendimento',
'Escovas - Modeladores - Babyliss',
'Esquentando',
'Estado de conservação da loja',
'Estofamento manchado',
'Estofamento rasgado',
'Estorno do valor pago',
'Estrado quebrado',
'Falta de peças',
'Falta de peças para reparo',
'Farmácias',
'Fazendo muito barulho',
'Ferro de passar',
'Fila',
'Fios e cabos',
'Fogão-Forno',
'Fone de ouvido',
'Forma de pagamento indisponível',
'Frigobar',
'Fritadeira elétrica',
'Funcionários despreparados',
'Fôrmas e assadeiras',
'Games e Jogos',

20
'Gavetas não abrem-fecham',
'Gel',
'Geladeira-Refrigerador',
'Guarda-Roupas',
'Higiene e Limpeza Pessoal',
'Iluminação e Elétrica',
'Impressoras',
'Incompatibilidade',
'Inferior ao vendido',
'Informática',
'Instalação-Reparo não concluídos',
'Jogo de cama',
'Jogos',
'Lava louças',
'Lavadora de roupas e Tanquinho',
'Leitores de Ebooks',
'Lento',
'Lençol',
'Liga e desliga sozinho',
'Liquidificadores',
'Livros',
'Lixeiras',
'Louças',
'Louças e Metais',
'MP3 Player',
'Maquiagem de preço',
'Marketplace',
'Mau Atendimento',
'Mau atendimento no SAC',
'Mesa bamba',
'Mesa de jantar',
'Mesa quebrada',
'Mesa riscada',
'Mesas e Cadeiras',
'Micro-ondas',
'Milhas',
'Mixers e Processadores de alimentos',
'Mochilas',
'Molas quebradas',
'Monitores',
'Montagem',
'Má qualidade do produto',
'Máquinas de cortar o cabelo',
'Móveis',
'Móveis Infantis',
'Móveis Modulados',
'Móveis Planejados',
'Móveis em Geral',

21
'Móveis para Escritório',
'Móveis para Jardim e Piscina',
'Notebooks',
'Não acende',
'Não aguenta peso',
'Não atende',
'Não carrega',
'Não conecta à intenet',
'Não consigo agendar',
'Não consigo fazer operação por telefone',
'Não encontrei meu problema',
'Não gela',
'Não liga',
'Não recebi',
'Organizadores de cozinha',
'Outro Tipo de produto/Serviço',
'Outro problema',
'Outros',
'Painéis para TV',
'Panela',
'Panela elétrica',
'Perdendo fio',
'Perfumarias',
'Perfume',
'Pernas quebradas',
'Peças erradas',
'Peças faltando',
'Peças quebradas',
'Pisos e Revestimentos Vinílicos',
'Plafon',
'Players de DVD-Blue Ray',
'Poltronas',
'Pontos',
'Porta Livros',
'Portas',
'Portas e Janelas',
'Potes',
'Prateleiras e cantoneiras',
'Problema com garantia estendida',
'Problema nas bocas do fogão',
'Problemas com a tela',
'Problemas com as ligações',
'Problemas com lojas de móveis',
'Problemas com o Atendimento',
'Problemas com o Site',
'Problemas de coluna causados pelo colchão',
'Problemas de sinal',
'Problemas na Loja',

22
'Problemas na finalização da compra',
'Problemas para utilizar aplicativos',
'Produto com defeito',
'Produto com peças faltando',
'Produto danificado',
'Produto errado',
'Produto indisponível',
'Produto não parece original',
'Produto não recebido',
'Produto não reparado',
'Produto quebrou com pouco tempo de uso',
'Produto rasgado',
'Produto usado',
'Produtos divergentes',
'Projeto divergente',
'Promoção',
'Propaganda Enganosa',
'Propaganda enganosa',
'Pré venda e Projeto',
'Pé quebrado',
'Qualidade do Produto',
'Qualidade do produto',
'Qualidade do serviço prestado',
'Rack e bancadas',
'Relógios',
'Sabonete líquido',
'Secador de cabelo',
'Secadora de roupa e centrífuga',
'Serviço não incluso na garantia',
'Site fora do ar-Lento',
'Sites e portais',
'Smartphone',
'Sofás e Estofados',
'TV',
'Tablets',
'Talheres',
'Tampa trincada-quebrada',
'Tapetes',
'Tapetes e Carpetes',
'Tecido de baixa qualidade',
'Teclados',
'Tela manchada',
'Tela quebrada',
'Telefones fixos (aparelhos)',
'Toalhas',
'Travesseiros',
'Troca-Devolução de produto',
'Utilidades domésticas',

23
'Valor de frete',
'Vazando água',
'Ventiladores e Circuladores de ar',
'Vidro quebrado',
'Vidros',
'Vidros e Espelhos'}

1.2.4 Aggregating tags into macro categories

We found that we can aggregate tags into macro categories, removing redundant tags. We look
forward to developing more structure in the future.
[22]: tag_map = {
"others": {'Lento',
'Não encontrei meu problema',
'Outro Tipo de produto/Serviço',
'Outro problema',
'Outros'},
'products': {'Acessórios de Vestuário',
'Acessórios para Bebê',
'Acessórios para Carros',
'Alto falantes',
'Aparadores',
'Aparelho de jantar',
'Aparelhos de musculação',
'Aparelhos de som',
'Ar condicionado',
'Armários de cozinha',
'Aromatizantes e Difusores',
'Artigos Religiosos',
'Artigos para bebê',
'Aspiradores e vassouras',
'Balanças',
'Bancos e banquetas',
'Berço desmontável',
'Bikes',
'Bolsas',
'Bolsas e Malas',
'Bonecos e Bonecas',
'Brinquedos e jogos',
'Brinquedos eletrônicos',
'Brinquedos para bebês',
'Cabeceira',
'Cadeiras',
'Cafeteiras e Chaleiras',
'Caixas de som e fone de ouvido',
'Cama, Mesa e Banho',

24
'Camas e camas-box',
'Celular',
'Celulares e Smartphones',
'Chapinhas (Pranchas)',
'Churrasqueira',
'Chuveiro elétrico',
'Chuveiros e Aquecedores',
'Climatizador de ar',
'Clubes de Compras e Vantagens',
'Coifa e depurador',
'Colchões',
'Colchões e acessórios',
'Componentes, peças e acessórios',
'Computadores all in one',
'Console (Videogame)',
'Controle remoto',
'Controles e Joysticks',
'Conversor digital',
'Cooktop',
'Cortina',
'Cristaleiras',
'Câmera',
'Decoração',
'Eletrodomésticos',
'Eletroeletrônicos',
'Eletroportáteis',
'Equipamentos de Beleza e Estética',
'Equipamentos de academia',
'Equipamentos de rede-Wireless',
'Escovas - Modeladores - Babyliss',
'Farmácias',
'Ferro de passar',
'Fios e cabos',
'Fogão-Forno',
'Fone de ouvido',
'Frigobar',
'Fritadeira elétrica',
'Fôrmas e assadeiras',
'Games e Jogos',
'Gel',
'Geladeira-Refrigerador',
'Guarda-Roupas',
'Higiene e Limpeza Pessoal',
'Iluminação e Elétrica',
'Impressoras',
'Informática',
'Jogo de cama',

25
'Jogos',
'Lava louças',
'Lavadora de roupas e Tanquinho',
'Leitores de Ebooks',
'Lençol',
'Liquidificadores',
'Livros',
'Lixeiras',
'Louças',
'Louças e Metais',
'MP3 Player',
'Mesa de jantar',
'Mesas e Cadeiras',
'Micro-ondas',
'Milhas',
'Mixers e Processadores de alimentos',
'Mochilas',
'Monitores',
'Máquinas de cortar o cabelo',
'Móveis',
'Móveis Infantis',
'Móveis Modulados',
'Móveis Planejados',
'Móveis em Geral',
'Móveis para Escritório',
'Móveis para Jardim e Piscina',
'Notebooks',
'Organizadores de cozinha',
'Painéis para TV',
'Panela',
'Panela elétrica',
'Perfumarias',
'Perfume',
'Pisos e Revestimentos Vinílicos',
'Plafon',
'Players de DVD-Blue Ray',
'Poltronas',
'Pontos',
'Porta Livros',
'Portas',
'Portas e Janelas',
'Potes',
'Prateleiras e cantoneiras',
'Rack e bancadas',
'Relógios',
'Sabonete líquido',
'Secador de cabelo',

26
'Secadora de roupa e centrífuga',
'Smartphone',
'Sofás e Estofados',
'TV',
'Tablets',
'Talheres',
'Tapetes',
'Tapetes e Carpetes',
'Teclados',
'Telefones fixos (aparelhos)',
'Toalhas',
'Travesseiros',
'Utilidades domésticas',
'Ventiladores e Circuladores de ar',
'Vidros',
'Vidros e Espelhos'},
"product_issues": {
'Amassado',
'Braço quebrado',
'Braço solto',
'Cadeira bamba',
'Atraso na entrega',
'Atraso na entrega do produto',
'Colchão irregular',
'Danos ao imóvel',
'Deformado',
'Desconfortável',
'Descosturado',
'Desgaste prematuro',
'Desligando sozinha',
'Desligando sozinho',
'Dificuldade para abrir-fechar a porta',
'Encosto com problema',
'Encosto quebrado',
'Entrega',
'Esquentando',
'Estofamento manchado',
'Estofamento rasgado',
'Estrado quebrado',
'Falta de peças',
'Falta de peças para reparo',
'Fazendo muito barulho',
'Gavetas não abrem-fecham',
'Incompatibilidade',
'Inferior ao vendido',
'Instalação-Reparo não concluídos',
'Liga e desliga sozinho',

27
'Mesa bamba',
'Mesa quebrada',
'Mesa riscada',
'Molas quebradas',
'Montagem',
'Má qualidade do produto',
'Não acende',
'Não aguenta peso',
'Não atende',
'Não carrega',
'Não conecta à intenet',
'Não gela',
'Não liga',
'Não recebi',
'Perdendo fio',
'Pernas quebradas',
'Peças erradas',
'Peças faltando',
'Peças quebradas',
'Problema nas bocas do fogão',
'Problemas com a tela',
'Problemas de coluna causados pelo colchão',
'Problemas de sinal',
'Produto com defeito',
'Produto com peças faltando',
'Produto danificado',
'Produto errado',
'Produto indisponível',
'Produto não parece original',
'Produto não recebido',
'Produto não reparado',
'Produto quebrou com pouco tempo de uso',
'Produto rasgado',
'Produto usado',
'Produtos divergentes',
'Projeto divergente',
'Pé quebrado',
'Qualidade do Produto',
'Qualidade do produto',
'Tampa trincada-quebrada',
'Tecido de baixa qualidade',
'Tela manchada',
'Tela quebrada',
'Vazando água',
'Vidro quebrado',
},
"business_issues": {

28
'Aplicativos',
'Atendimento na Loja',
'Atraso no reembolso por cancelamento',
'Cartão de crédito',
'Cartões de Crédito',
'Canais de Atendimento',
'Comportamento do profissional',
'Demora no atendimento',
'Demora no reparo',
'Desacordo Comercial',
'Divergência de valores',
'Equipe de Atendimento',
'Estado de conservação da loja',
'Estorno do valor pago',
'Fila',
'Forma de pagamento indisponível',
'Funcionários despreparados',
'Maquiagem de preço',
'Marketplace',
'Mau Atendimento',
'Mau atendimento no SAC',
'Não consigo agendar',
'Não consigo fazer operação por telefone',
'Problema com garantia estendida',
'Problemas com as ligações',
'Problemas com lojas de móveis',
'Problemas com o Atendimento',
'Problemas com o Site',
'Problemas na Loja',
'Problemas na finalização da compra',
'Problemas para utilizar aplicativos',
'Troca-Devolução de produto',
'Promoção',
'Propaganda Enganosa',
'Propaganda enganosa',
'Pré venda e Projeto',
'Qualidade do serviço prestado',
'Serviço não incluso na garantia',
'Site fora do ar-Lento',
'Sites e portais',
'Valor de frete',
'Assistência técnica e Garantia',
'Assistência técnica', 'Assistência técnica indisponível',
}
}

29
[28]: # Adding Macro categories
for review in reviewsRA:
if "tags" in review:
macro_tags = []
for tag in review["tags"]:
for macro, vals in tag_map.items():
if tag in vals:
macro_tags.append(macro)
review["macro_tags"] = macro_tags

[29]: def format_tags_to_df(tag_field, reviews):


unique_tags = set()
unique_businesses = set()

# Getting unique tags and company names


for review in reviews:
unique_businesses.add(review['business_name'])
if tag_field in review:
for tag in review[tag_field]:
unique_tags.add(tag)

tags_per_businesses = pd.DataFrame(0, columns = unique_businesses, index =␣


unique_tags)
,→

for review in reviews:


if tag_field in review:
for tag in review[tag_field]:
tags_per_businesses[review['business_name']][tag] += 1
return tags_per_businesses

macro_tag_df = format_tags_to_df("macro_tags", reviewsRA)


macro_tag_df

[29]: Magazine Luiza - Loja Online Marabraz - Lojas Físicas \


business_issues 5 27 799
others 9 108 269
products 15 192 2565
product_issues 3 53 1258

Marabraz - Loja Online Magazine Luiza - Loja Física \


business_issues 393 24
others 1264 93
products 4305 190
product_issues 1721 62

Openbox2 Casas Bahia - Marketplace \


business_issues 7 23
others 3 15

30
products 60 124
product_issues 20 29

Casas Bahia - Lojas Físicas MadeiraMadeira Lojas Cem … \


business_issues 12 38 26 …
others 183 108 130 …
products 91 189 184 …
product_issues 38 77 46 …

Lojas Guido Etna Home Store - Loja Online \


business_issues 5 5
others 2 26
products 23 26
product_issues 10 12

Inovar Móveis e Colchões Móveis Rainha Sylvia Design \


business_issues 305 88 342
others 74 7 31
products 986 167 1168
product_issues 443 126 573

Casas Bahia - Loja Online Tok&Stok - Loja Online \


business_issues 36 45
others 101 45
products 197 27
product_issues 54 12

Fabrispuma TUTTI MÓVEIS Etna Home Store


business_issues 26 10 1
others 13 5 39
products 124 43 32
product_issues 37 19 24

[4 rows x 23 columns]

[107]: import seaborn as sns


perc_macro_tags_df = round(macro_tag_df.transpose().divide(macro_tag_df.
,→transpose().sum(axis=1), axis=0)*100, 2)

fig,ax = plt.subplots(figsize=(30, 20))

sns.barplot(x="value",y="index",
hue="issue_type",
data=perc_macro_tags_df[["business_issues", "product_issues",␣
,→"others"]].reset_index().melt(id_vars=["index"], var_name="issue_type"),␣

,→ax=ax)

31
[107]: <matplotlib.axes._subplots.AxesSubplot at 0x7f11619082d0>

[73]: unique_tags = set()


unique_businesses = set()

# Getting unique tags and company names


for review in reviewsRA:
unique_businesses.add(review['business_name'])
if "tags" in review:
for tag in review["tags"]:
unique_tags.add(tag)

tags_per_businesses = pd.DataFrame(0, columns = unique_businesses, index =␣


,→unique_tags)

[74]: for review in reviewsRA:


if "tags" in review:
for tag in review['tags']:
tags_per_businesses[review['business_name']][tag] += 1

tags_per_businesses

[74]: Magazine Luiza - Loja Online \


Falta de peças para reparo 0 0
Encosto com problema 0 0

32
Louças 0 0
Produto quebrou com pouco tempo de uso 0 0
Clubes de Compras e Vantagens 0 0
… .. …
Milhas 0 0
Outro problema 4 41
Portas e Janelas 0 0
Colchões e acessórios 0 0
Perdendo fio 0 0

Marabraz - Lojas Físicas \


Falta de peças para reparo 22
Encosto com problema 5
Louças 0
Produto quebrou com pouco tempo de uso 0
Clubes de Compras e Vantagens 0
… …
Milhas 0
Outro problema 121
Portas e Janelas 0
Colchões e acessórios 19
Perdendo fio 0

Marabraz - Loja Online \


Falta de peças para reparo 0
Encosto com problema 0
Louças 0
Produto quebrou com pouco tempo de uso 0
Clubes de Compras e Vantagens 0
… …
Milhas 0
Outro problema 512
Portas e Janelas 0
Colchões e acessórios 45
Perdendo fio 0

Magazine Luiza - Loja Física \


Falta de peças para reparo 1
Encosto com problema 0
Louças 0
Produto quebrou com pouco tempo de uso 2
Clubes de Compras e Vantagens 0
… …
Milhas 0
Outro problema 38
Portas e Janelas 0
Colchões e acessórios 1

33
Perdendo fio 0

Openbox2 Casas Bahia - Marketplace \


Falta de peças para reparo 0 0
Encosto com problema 0 0
Louças 0 0
Produto quebrou com pouco tempo de uso 0 0
Clubes de Compras e Vantagens 0 0
… … …
Milhas 0 0
Outro problema 1 4
Portas e Janelas 0 0
Colchões e acessórios 0 1
Perdendo fio 0 0

Casas Bahia - Lojas Físicas \


Falta de peças para reparo 0
Encosto com problema 0
Louças 0
Produto quebrou com pouco tempo de uso 0
Clubes de Compras e Vantagens 1
… …
Milhas 0
Outro problema 68
Portas e Janelas 0
Colchões e acessórios 2
Perdendo fio 0

MadeiraMadeira Lojas Cem … \


Falta de peças para reparo 0 2 …
Encosto com problema 1 0 …
Louças 1 0 …
Produto quebrou com pouco tempo de uso 0 0 …
Clubes de Compras e Vantagens 0 0 …
… … … …
Milhas 0 0 …
Outro problema 44 46 …
Portas e Janelas 1 0 …
Colchões e acessórios 0 0 …
Perdendo fio 0 0 …

Lojas Guido \
Falta de peças para reparo 0
Encosto com problema 0
Louças 0
Produto quebrou com pouco tempo de uso 0
Clubes de Compras e Vantagens 0

34
… …
Milhas 0
Outro problema 1
Portas e Janelas 0
Colchões e acessórios 0
Perdendo fio 0

Etna Home Store - Loja Online \


Falta de peças para reparo 0
Encosto com problema 0
Louças 0
Produto quebrou com pouco tempo de uso 0
Clubes de Compras e Vantagens 0
… …
Milhas 0
Outro problema 10
Portas e Janelas 0
Colchões e acessórios 0
Perdendo fio 0

Inovar Móveis e Colchões \


Falta de peças para reparo 1
Encosto com problema 3
Louças 0
Produto quebrou com pouco tempo de uso 0
Clubes de Compras e Vantagens 0
… …
Milhas 0
Outro problema 30
Portas e Janelas 0
Colchões e acessórios 15
Perdendo fio 0

Móveis Rainha Sylvia Design \


Falta de peças para reparo 1 1
Encosto com problema 1 5
Louças 0 0
Produto quebrou com pouco tempo de uso 0 0
Clubes de Compras e Vantagens 0 0
… … …
Milhas 0 0
Outro problema 3 13
Portas e Janelas 0 0
Colchões e acessórios 0 0
Perdendo fio 0 0

Casas Bahia - Loja Online \

35
Falta de peças para reparo 0
Encosto com problema 0
Louças 0
Produto quebrou com pouco tempo de uso 0
Clubes de Compras e Vantagens 1
… …
Milhas 1
Outro problema 37
Portas e Janelas 0
Colchões e acessórios 0
Perdendo fio 0

Tok&Stok - Loja Online Fabrispuma \


Falta de peças para reparo 0 0
Encosto com problema 0 0
Louças 0 0
Produto quebrou com pouco tempo de uso 0 0
Clubes de Compras e Vantagens 0 0
… … …
Milhas 0 0
Outro problema 18 5
Portas e Janelas 0 0
Colchões e acessórios 0 19
Perdendo fio 0 0

TUTTI MÓVEIS Etna Home Store


Falta de peças para reparo 0 0
Encosto com problema 0 0
Louças 0 0
Produto quebrou com pouco tempo de uso 0 0
Clubes de Compras e Vantagens 0 0
… … …
Milhas 0 0
Outro problema 2 14
Portas e Janelas 0 0
Colchões e acessórios 0 0
Perdendo fio 0 1

[264 rows x 23 columns]

1.2.5 Filtering for customer support tags

[75]: problem_categories=['Assistência técnica e Garantia',


'Atraso na entrega',
'Canais de Atendimento',
'Demora no reparo',

36
'Desgaste prematuro',
'Divergência de valores',
'Entrega',
'Equipe de Atendimento',
'Estorno do valor pago',
'Falta de peças',
'Maquiagem de preço',
'Mau Atendimento',
'Mau atendimento no SAC',
'Montagem',
'Má qualidade do produto',
'Não atende',
'Não consigo agendar',
'Não encontrei meu problema',
'Outro problema',
'Pernas quebradas',
'Peças erradas',
'Peças quebradas',
'Problema com garantia estendida',
'Problemas com o Atendimento',
'Problemas com o Site',
'Problemas na finalização da compra',
'Produto com defeito',
'Produto com peças faltando',
'Produto errado',
'Produto indisponível',
'Produto não recebido',
'Propaganda Enganosa',
'Pé quebrado',
'Qualidade do Produto',
'Site fora do ar-Lento',
'Troca-Devolução de produto',
'Valor de frete']

tags_per_businesses.loc[problem_categories]

[75]: Magazine Luiza - Loja Online \


Assistência técnica e Garantia 0 0
Atraso na entrega 2 22
Canais de Atendimento 0 0
Demora no reparo 0 0
Desgaste prematuro 0 0
Divergência de valores 0 0
Entrega 0 0
Equipe de Atendimento 1 0
Estorno do valor pago 0 7
Falta de peças 0 0

37
Maquiagem de preço 0 0
Mau Atendimento 1 0
Mau atendimento no SAC 0 2
Montagem 0 0
Má qualidade do produto 0 1
Não atende 0 0
Não consigo agendar 0 0
Não encontrei meu problema 2 23
Outro problema 4 41
Pernas quebradas 0 0
Peças erradas 0 0
Peças quebradas 0 0
Problema com garantia estendida 0 0
Problemas com o Atendimento 1 0
Problemas com o Site 0 0
Problemas na finalização da compra 0 4
Produto com defeito 1 4
Produto com peças faltando 0 2
Produto errado 0 2
Produto indisponível 0 2
Produto não recebido 0 12
Propaganda Enganosa 0 0
Pé quebrado 0 0
Qualidade do Produto 0 1
Site fora do ar-Lento 0 0
Troca-Devolução de produto 0 8
Valor de frete 0 2

Marabraz - Lojas Físicas \


Assistência técnica e Garantia 78
Atraso na entrega 417
Canais de Atendimento 14
Demora no reparo 62
Desgaste prematuro 5
Divergência de valores 21
Entrega 114
Equipe de Atendimento 81
Estorno do valor pago 60
Falta de peças 5
Maquiagem de preço 0
Mau Atendimento 70
Mau atendimento no SAC 1
Montagem 17
Má qualidade do produto 123
Não atende 0
Não consigo agendar 1
Não encontrei meu problema 28

38
Outro problema 121
Pernas quebradas 1
Peças erradas 20
Peças quebradas 58
Problema com garantia estendida 1
Problemas com o Atendimento 138
Problemas com o Site 0
Problemas na finalização da compra 0
Produto com defeito 151
Produto com peças faltando 36
Produto errado 80
Produto indisponível 35
Produto não recebido 0
Propaganda Enganosa 18
Pé quebrado 5
Qualidade do Produto 26
Site fora do ar-Lento 0
Troca-Devolução de produto 0
Valor de frete 1

Marabraz - Loja Online \


Assistência técnica e Garantia 45
Atraso na entrega 1001
Canais de Atendimento 0
Demora no reparo 0
Desgaste prematuro 0
Divergência de valores 4
Entrega 173
Equipe de Atendimento 0
Estorno do valor pago 228
Falta de peças 5
Maquiagem de preço 0
Mau Atendimento 1
Mau atendimento no SAC 26
Montagem 1
Má qualidade do produto 15
Não atende 0
Não consigo agendar 0
Não encontrei meu problema 248
Outro problema 512
Pernas quebradas 2
Peças erradas 22
Peças quebradas 59
Problema com garantia estendida 0
Problemas com o Atendimento 0
Problemas com o Site 0
Problemas na finalização da compra 6

39
Produto com defeito 58
Produto com peças faltando 32
Produto errado 51
Produto indisponível 11
Produto não recebido 237
Propaganda Enganosa 0
Pé quebrado 0
Qualidade do Produto 7
Site fora do ar-Lento 0
Troca-Devolução de produto 62
Valor de frete 1

Magazine Luiza - Loja Física Openbox2 \


Assistência técnica e Garantia 1 2
Atraso na entrega 21 7
Canais de Atendimento 0 0
Demora no reparo 1 0
Desgaste prematuro 0 0
Divergência de valores 1 2
Entrega 0 0
Equipe de Atendimento 0 0
Estorno do valor pago 5 0
Falta de peças 0 0
Maquiagem de preço 0 0
Mau Atendimento 3 3
Mau atendimento no SAC 0 0
Montagem 2 0
Má qualidade do produto 3 2
Não atende 0 0
Não consigo agendar 2 0
Não encontrei meu problema 18 1
Outro problema 38 1
Pernas quebradas 0 0
Peças erradas 1 0
Peças quebradas 2 0
Problema com garantia estendida 1 0
Problemas com o Atendimento 0 0
Problemas com o Site 0 0
Problemas na finalização da compra 0 0
Produto com defeito 7 6
Produto com peças faltando 0 0
Produto errado 4 2
Produto indisponível 1 1
Produto não recebido 2 0
Propaganda Enganosa 0 0
Pé quebrado 0 0
Qualidade do Produto 0 0

40
Site fora do ar-Lento 0 0
Troca-Devolução de produto 1 0
Valor de frete 0 0

Casas Bahia - Marketplace \


Assistência técnica e Garantia 0
Atraso na entrega 14
Canais de Atendimento 0
Demora no reparo 0
Desgaste prematuro 0
Divergência de valores 1
Entrega 0
Equipe de Atendimento 0
Estorno do valor pago 12
Falta de peças 0
Maquiagem de preço 0
Mau Atendimento 0
Mau atendimento no SAC 0
Montagem 0
Má qualidade do produto 0
Não atende 0
Não consigo agendar 0
Não encontrei meu problema 6
Outro problema 4
Pernas quebradas 0
Peças erradas 0
Peças quebradas 0
Problema com garantia estendida 0
Problemas com o Atendimento 0
Problemas com o Site 0
Problemas na finalização da compra 2
Produto com defeito 3
Produto com peças faltando 0
Produto errado 2
Produto indisponível 0
Produto não recebido 9
Propaganda Enganosa 0
Pé quebrado 0
Qualidade do Produto 0
Site fora do ar-Lento 0
Troca-Devolução de produto 5
Valor de frete 0

Casas Bahia - Lojas Físicas \


Assistência técnica e Garantia 0
Atraso na entrega 11
Canais de Atendimento 0

41
Demora no reparo 1
Desgaste prematuro 0
Divergência de valores 0
Entrega 0
Equipe de Atendimento 0
Estorno do valor pago 0
Falta de peças 0
Maquiagem de preço 0
Mau Atendimento 1
Mau atendimento no SAC 0
Montagem 0
Má qualidade do produto 2
Não atende 0
Não consigo agendar 0
Não encontrei meu problema 57
Outro problema 68
Pernas quebradas 0
Peças erradas 0
Peças quebradas 0
Problema com garantia estendida 3
Problemas com o Atendimento 0
Problemas com o Site 0
Problemas na finalização da compra 1
Produto com defeito 8
Produto com peças faltando 0
Produto errado 4
Produto indisponível 0
Produto não recebido 1
Propaganda Enganosa 0
Pé quebrado 0
Qualidade do Produto 0
Site fora do ar-Lento 0
Troca-Devolução de produto 0
Valor de frete 0

MadeiraMadeira Lojas Cem … \


Assistência técnica e Garantia 6 1 …
Atraso na entrega 27 6 …
Canais de Atendimento 0 0 …
Demora no reparo 0 2 …
Desgaste prematuro 0 0 …
Divergência de valores 2 2 …
Entrega 0 0 …
Equipe de Atendimento 0 0 …
Estorno do valor pago 9 2 …
Falta de peças 1 0 …
Maquiagem de preço 0 0 …

42
Mau Atendimento 0 7 …
Mau atendimento no SAC 10 0 …
Montagem 0 0 …
Má qualidade do produto 8 3 …
Não atende 0 0 …
Não consigo agendar 0 1 …
Não encontrei meu problema 31 40 …
Outro problema 44 46 …
Pernas quebradas 0 2 …
Peças erradas 2 0 …
Peças quebradas 4 0 …
Problema com garantia estendida 0 0 …
Problemas com o Atendimento 0 0 …
Problemas com o Site 0 0 …
Problemas na finalização da compra 1 0 …
Produto com defeito 11 11 …
Produto com peças faltando 4 1 …
Produto errado 5 1 …
Produto indisponível 0 0 …
Produto não recebido 11 0 …
Propaganda Enganosa 0 0 …
Pé quebrado 0 0 …
Qualidade do Produto 0 0 …
Site fora do ar-Lento 0 0 …
Troca-Devolução de produto 6 0 …
Valor de frete 1 0 …

Lojas Guido \
Assistência técnica e Garantia 1
Atraso na entrega 3
Canais de Atendimento 0
Demora no reparo 2
Desgaste prematuro 0
Divergência de valores 0
Entrega 1
Equipe de Atendimento 0
Estorno do valor pago 0
Falta de peças 0
Maquiagem de preço 0
Mau Atendimento 0
Mau atendimento no SAC 0
Montagem 1
Má qualidade do produto 1
Não atende 0
Não consigo agendar 0
Não encontrei meu problema 0
Outro problema 1

43
Pernas quebradas 0
Peças erradas 0
Peças quebradas 0
Problema com garantia estendida 0
Problemas com o Atendimento 0
Problemas com o Site 0
Problemas na finalização da compra 0
Produto com defeito 2
Produto com peças faltando 0
Produto errado 0
Produto indisponível 0
Produto não recebido 0
Propaganda Enganosa 0
Pé quebrado 0
Qualidade do Produto 0
Site fora do ar-Lento 0
Troca-Devolução de produto 0
Valor de frete 0

Etna Home Store - Loja Online \


Assistência técnica e Garantia 2
Atraso na entrega 3
Canais de Atendimento 0
Demora no reparo 0
Desgaste prematuro 0
Divergência de valores 2
Entrega 2
Equipe de Atendimento 0
Estorno do valor pago 0
Falta de peças 0
Maquiagem de preço 0
Mau Atendimento 0
Mau atendimento no SAC 0
Montagem 0
Má qualidade do produto 0
Não atende 0
Não consigo agendar 0
Não encontrei meu problema 6
Outro problema 10
Pernas quebradas 0
Peças erradas 0
Peças quebradas 0
Problema com garantia estendida 0
Problemas com o Atendimento 0
Problemas com o Site 0
Problemas na finalização da compra 0
Produto com defeito 2

44
Produto com peças faltando 0
Produto errado 2
Produto indisponível 0
Produto não recebido 3
Propaganda Enganosa 0
Pé quebrado 0
Qualidade do Produto 0
Site fora do ar-Lento 0
Troca-Devolução de produto 0
Valor de frete 1

Inovar Móveis e Colchões Móveis Rainha \


Assistência técnica e Garantia 25 17
Atraso na entrega 152 18
Canais de Atendimento 3 1
Demora no reparo 34 17
Desgaste prematuro 1 5
Divergência de valores 1 3
Entrega 25 16
Equipe de Atendimento 37 3
Estorno do valor pago 23 1
Falta de peças 1 3
Maquiagem de preço 0 0
Mau Atendimento 36 6
Mau atendimento no SAC 0 0
Montagem 9 25
Má qualidade do produto 46 3
Não atende 0 0
Não consigo agendar 1 3
Não encontrei meu problema 14 1
Outro problema 30 3
Pernas quebradas 0 0
Peças erradas 4 0
Peças quebradas 7 1
Problema com garantia estendida 1 0
Problemas com o Atendimento 49 7
Problemas com o Site 0 0
Problemas na finalização da compra 0 0
Produto com defeito 54 10
Produto com peças faltando 3 1
Produto errado 54 9
Produto indisponível 2 1
Produto não recebido 0 0
Propaganda Enganosa 7 1
Pé quebrado 3 0
Qualidade do Produto 3 16
Site fora do ar-Lento 0 0

45
Troca-Devolução de produto 0 0
Valor de frete 0 0

Sylvia Design Casas Bahia - Loja Online \


Assistência técnica e Garantia 47 0
Atraso na entrega 165 31
Canais de Atendimento 19 0
Demora no reparo 35 0
Desgaste prematuro 4 0
Divergência de valores 8 1
Entrega 29 0
Equipe de Atendimento 29 0
Estorno do valor pago 14 14
Falta de peças 0 0
Maquiagem de preço 1 0
Mau Atendimento 31 0
Mau atendimento no SAC 0 2
Montagem 2 0
Má qualidade do produto 103 0
Não atende 1 0
Não consigo agendar 4 0
Não encontrei meu problema 6 24
Outro problema 13 37
Pernas quebradas 0 0
Peças erradas 3 0
Peças quebradas 7 0
Problema com garantia estendida 3 0
Problemas com o Atendimento 60 0
Problemas com o Site 0 0
Problemas na finalização da compra 0 5
Produto com defeito 82 6
Produto com peças faltando 3 0
Produto errado 56 2
Produto indisponível 6 0
Produto não recebido 0 10
Propaganda Enganosa 5 0
Pé quebrado 5 0
Qualidade do Produto 9 0
Site fora do ar-Lento 0 0
Troca-Devolução de produto 0 6
Valor de frete 0 1

Tok&Stok - Loja Online Fabrispuma \


Assistência técnica e Garantia 0 4
Atraso na entrega 4 7
Canais de Atendimento 8 0
Demora no reparo 0 2

46
Desgaste prematuro 0 0
Divergência de valores 1 1
Entrega 0 0
Equipe de Atendimento 3 0
Estorno do valor pago 5 6
Falta de peças 0 0
Maquiagem de preço 0 0
Mau Atendimento 0 3
Mau atendimento no SAC 2 0
Montagem 0 0
Má qualidade do produto 1 5
Não atende 1 0
Não consigo agendar 0 6
Não encontrei meu problema 9 3
Outro problema 18 5
Pernas quebradas 1 0
Peças erradas 0 1
Peças quebradas 0 0
Problema com garantia estendida 0 0
Problemas com o Atendimento 16 0
Problemas com o Site 4 0
Problemas na finalização da compra 1 0
Produto com defeito 2 4
Produto com peças faltando 0 0
Produto errado 1 3
Produto indisponível 0 0
Produto não recebido 2 0
Propaganda Enganosa 3 0
Pé quebrado 0 2
Qualidade do Produto 0 0
Site fora do ar-Lento 0 0
Troca-Devolução de produto 1 0
Valor de frete 0 0

TUTTI MÓVEIS Etna Home Store


Assistência técnica e Garantia 2 0
Atraso na entrega 3 6
Canais de Atendimento 0 0
Demora no reparo 1 1
Desgaste prematuro 0 1
Divergência de valores 0 0
Entrega 0 4
Equipe de Atendimento 0 0
Estorno do valor pago 0 0
Falta de peças 0 1
Maquiagem de preço 0 0
Mau Atendimento 1 0

47
Mau atendimento no SAC 0 0
Montagem 0 1
Má qualidade do produto 7 0
Não atende 0 0
Não consigo agendar 1 0
Não encontrei meu problema 1 11
Outro problema 2 14
Pernas quebradas 0 0
Peças erradas 0 0
Peças quebradas 0 0
Problema com garantia estendida 0 0
Problemas com o Atendimento 0 0
Problemas com o Site 0 0
Problemas na finalização da compra 0 0
Produto com defeito 1 3
Produto com peças faltando 0 0
Produto errado 1 1
Produto indisponível 0 3
Produto não recebido 0 0
Propaganda Enganosa 0 0
Pé quebrado 0 0
Qualidade do Produto 0 2
Site fora do ar-Lento 0 0
Troca-Devolução de produto 0 0
Valor de frete 0 0

[37 rows x 23 columns]

1.3 NLP Analysis

[19]: import matplotlib.pyplot as plt


from wordcloud import WordCloud
import pandas as pd
import nltk
from nltk.corpus import stopwords
#nltk.download('punkt')
#nltk.download('stopwords')
import numpy as np
import string
#from nltk.stem import PorterStemmer
import unicodedata

[20]: word_cloud_text = ' '.join(dff['description'])

stop_words = set(stopwords.words("portuguese"))
without_stop_words = []

48
sentence = word_cloud_text
words = nltk.word_tokenize(sentence)
for word in words:
if word not in stop_words:
without_stop_words.append(word)

[21]: stop_words = set(stopwords.words("portuguese"))


without_stop_words = []
stopword = []
sentence = word_cloud_text
words = nltk.word_tokenize(sentence)
for word in words:
if word in stop_words:
stopword.append(word)
else:
without_stop_words.append(word)

[22]: def clean_reviews(review):


without_stop_words = []
words = nltk.word_tokenize(review.lower())
for word in words:
if not word in stop_words:
without_stop_words.append(word)

return ' '.join(without_stop_words)

[23]: def strip_punctuation(text):


"""
>>> strip_punctuation(u'something')
u'something'

>>> strip_punctuation(u'something.,:else really')


u'somethingelse really'
"""
punctutation_cats = set(['Pc', 'Pd', 'Ps', 'Pe', 'Pi', 'Pf', 'Po'])
return ''.join(x for x in text
if unicodedata.category(x) not in punctutation_cats)

[24]: dff['cleaned_review'] = dff.description.apply(lambda x:␣


,→strip_punctuation(clean_reviews(x)))

dff.head()

[24]: title \
0 Estorno de entrega
1 Nao entregaram no prazo e descaso não retornam…
2 Insatisfação com o produto

49
3 Produto entregue errado e quebrado
4 Produto entregue com defeito, aguardando a tro…

description \
0 Eu comprei uma mesa no dia 29.01.2019 a vista …
1 Comprei em 26.01 moveis para quarto e mesa sa…
2 No dia 05/01/2018 fiz uma compra a vista na lo…
3 Boa tarde! Adquiri uma cama box marron com tec…
4 Em novembro comprei um sofá na loja inovar de …

business_name uf city review_ID \


0 Inovar Móveis e Colchões SP São José dos Campos 90143053
1 Inovar Móveis e Colchões SP São Paulo 90109323
2 Inovar Móveis e Colchões SP Jacareí 43153321
3 Inovar Móveis e Colchões SP São José dos Campos 43172911
4 Inovar Móveis e Colchões SP São Sebastião 43196029

datetime timeCaptured days_to_resolution \


0 2019-03-28T19:32:00Z 2020-04-02T14:37:21Z NaN
1 2019-03-27T20:09:00Z 2020-04-02T14:37:24Z 35.0
2 2019-02-25T10:59:00Z 2020-04-02T14:37:46Z NaN
3 2019-02-25T18:24:00Z 2020-04-02T14:37:46Z NaN
4 2019-02-26T12:37:00Z 2020-04-02T14:37:46Z NaN

days_to_first_contact resolution_outcome \
0 0.0 NaN
1 0.0 positive
2 0.0 NaN
3 0.0 NaN
4 0.0 NaN

cleaned_review
0 comprei mesa dia 29012019 vista prazo entrega …
1 comprei 2601 moveis quarto mesa sala jantar se…
2 dia 05012018 fiz compra vista loja inovar jaca…
3 boa tarde adquiri cama box marron tecido sued…
4 novembro comprei sofá loja inovar sao sebastiã…

[25]: from collections import Counter

AllReviews = dff['cleaned_review']

all_reviews_text = ' '.join(AllReviews)


tokenized_words = nltk.word_tokenize(all_reviews_text)
word_freq = Counter(tokenized_words)

word_freq.most_common(20)

50
[25]: [('dia', 14417),
('loja', 13062),
('entrega', 9157),
('dias', 8173),
('compra', 7572),
('produto', 6937),
('contato', 6152),
('sofá', 5871),
('pois', 5201),
('prazo', 4967),
('comprei', 4958),
('pedido', 4336),
('nada', 3839),
('empresa', 3423),
('marabraz', 3297),
('pra', 3149),
('problema', 3057),
('gerente', 2938),
('hoje', 2796),
('agora', 2785)]

[26]: selected_reviews = [each for each in AllReviews if 'entrega' in each]

for review in selected_reviews[:30]:


index = review.find('entrega')
print(review[index-10:index+20].replace("\n", ""))

sta prazo entrega dia 1503 ent


pergunte entrega informaram e
duto casa entregadores rasgara
s mostrei entregador afirmou p
es agora entregaram justifica
arcar dia entrega cabeccabecei
mprometeu entregarem todos jun
realizar entrega moveis 10 di
r produto entregaram deram ne
té prazo entrega 0711 portan
atibaia entrega deu último d
dia 0508 entrega combinada 30
ro braço entregar msm detecto
m n feita entrega alegando def
harem bom entrega entrei cont
visão pra entrega quero fazer
agendei entrega ser prédio
disse ia entregar mesa semana
ts porque entregaram porta cor
r disse q entregaria 7 dias an

51
s vieram entregar móveis entr
strativas entrega creio fuja
edor iria entregar antes natal
ter prazo entrega escolhi agor
o agendou entrega 17h30 chega
ealizaram entrega dia 2201 ag
problemas entrega devidamente
rico duas entregas ploblemas
ra antes entregar pra gerar m
p agendar entrega pois produto

[27]: from sklearn.feature_extraction.text import CountVectorizer

def get_top_n_words(corpus, n=1,k=1):


vec = CountVectorizer(ngram_range=(k,k),stop_words = 'portuguese').
,→fit(corpus)

bag_of_words = vec.transform(corpus)
sum_words = bag_of_words.sum(axis=0)
words_freq = [(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.
,→items()]

words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)


return words_freq[:n]

[28]: from nltk.util import ngrams

def top_k_ngrams(word_tokens,n,k):

n_gram_list = list(ngrams(word_tokens, n))

n_gram_strings = [' '.join(each) for each in n_gram_list]

n_gram_counter = Counter(n_gram_strings)
most_common_k = n_gram_counter.most_common(k)
pprint(most_common_k)

[29]: port_stopwords = stopwords.words('portuguese')

#n-grams
word_tokens = nltk.word_tokenize(all_reviews_text)
top_k_ngrams(word_tokens, 3, 10)

[('editado reclame aqui', 680),


('valor r $', 304),
('5 dias úteis', 298),
('comprei guarda roupa', 279),
('entrei contato sac', 250),
('entrei contato loja', 246),
('fiz compra dia', 214),

52
('10 dias úteis', 205),
('4 dias úteis', 203),
('loja sylvia design', 201)]

[30]: top_k_ngrams(word_tokens, 2, 10)

[('entrei contato', 1871),


('dias úteis', 1749),
('fiz compra', 1413),
('guarda roupa', 1317),
('prazo entrega', 1280),
('30 dias', 1125),
('r $', 1107),
('reclame aqui', 981),
('entrega dia', 801),
('entrar contato', 784)]

[31]: def get_top_n_words(corpus, n=1,k=1):


vec = CountVectorizer(ngram_range=(k,k),stop_words = 'english').fit(corpus)
bag_of_words = vec.transform(corpus)
sum_words = bag_of_words.sum(axis=0)
words_freq = [(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.
,→items()]

words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)


return words_freq[:n]

[32]: common_words = get_top_n_words(AllReviews, 20, 2)

for word, freq in common_words:


print(word, freq)

df = pd.DataFrame(common_words, columns = ['ReviewText' , 'count'])

entrei contato 1872


dias úteis 1749
fiz compra 1414
guarda roupa 1319
prazo entrega 1280
30 dias 1125
reclame aqui 981
entrega dia 803
entrar contato 784
nota fiscal 720
sylvia design 703
editado reclame 680
10 dias 655
realizei compra 651
falta respeito 643

53
loja marabraz 632
comprei sofá 627
hoje dia 616
efetuei compra 604
dias uteis 568

[33]: #Inovar vs. Sylvia Design

inovar_reviews = [each for each in dff[dff.business_name == 'Inovar Móveis e␣


,→Colchões'].cleaned_review]

sylvia_reviews = [each for each in dff[dff.business_name == 'Sylvia Design'].


,→cleaned_review]

[34]: inovar_reviews_text = ' '.join(inovar_reviews)


tokenized_words = nltk.word_tokenize(inovar_reviews_text)
inovar_word_freq = Counter(tokenized_words)

inovar_word_freq.most_common(20)

[34]: [('loja', 2050),


('sofá', 1431),
('dia', 1394),
('entrega', 957),
('gerente', 878),
('dias', 762),
('inovar', 672),
('compra', 661),
('contato', 637),
('produto', 562),
('pois', 551),
('comprei', 470),
('nada', 449),
('prazo', 417),
('problema', 412),
('disse', 411),
('vendedor', 393),
('troca', 365),
('mesa', 333),
('empresa', 323)]

[35]: sylvia_reviews_text = ' '.join(sylvia_reviews)


tokenized_words = nltk.word_tokenize(sylvia_reviews_text)
sylvia_word_freq = Counter(tokenized_words)

sylvia_word_freq.most_common(20)

54
[35]: [('sofá', 2382),
('loja', 2356),
('dia', 1871),
('entrega', 1256),
('dias', 1157),
('pois', 1007),
('compra', 959),
('sylvia', 893),
('mesa', 889),
('contato', 879),
('produto', 862),
('design', 759),
('prazo', 712),
('comprei', 702),
('vendedor', 701),
('empresa', 662),
('sac', 621),
('cadeiras', 565),
('problema', 565),
('disse', 552)]

[36]: inovar_word_tokens = nltk.word_tokenize(inovar_reviews_text)


top_k_ngrams(inovar_word_tokens, 4, 10)

[('comprei sofá loja inovar', 15),


('center vale josé campos', 13),
('inovar shopping center vale', 11),
('prazo entrega 30 dias', 11),
('loja inovar móveis colchões', 11),
('shopping center vale josé', 10),
('entrega 30 dias úteis', 9),
('compra sofá loja inovar', 9),
('loja inovar shopping center', 8),
('entrei contato gerente loja', 8)]

[37]: sylvia_word_tokens = nltk.word_tokenize(sylvia_reviews_text)


top_k_ngrams(sylvia_word_tokens, 4, 10)

[('sofá loja sylvia design', 29),


('entrega 45 60 dias', 18),
('loja sylvia design av', 17),
('sylvia design raposo tavares', 16),
('prazo entrega 45 60', 15),
('prazo 45 60 dias', 14),
('sylvia design comprei sofá', 14),
('comprei sofá sylvia design', 14),
('av zaki narchi 42', 14),
('loja sylvia design raposo', 14)]

55
1.4 Google Business Store Dataset

[19]: reviewsGB = agg_jsonls("gbusiness")


print(f"We have a total of {len(reviewsGB)} reviews!")
pprint(reviewsGB[0])

We have a total of 40 reviews!


{'caption': '',
'id_review':
'ChZDSUhNMG9nS0VJQ0FnSUNjemJPSkR3EAEaFkNra0VkOHhNczE2WmVhRXRtWWZoanc',
'n_photo_user': 0,
'n_review_user': 0,
'rating': 4.0,
'relative_date': 'um dia atrás',
'retrieval_date': '2020-03-21T15:38:25Z',
'url_user': 'https://www.google.com/maps/contrib/112092464143644397071?hl=pt-
BR',
'username': 'Maria Gorete Veras Martins de Carvalho'}

[22]: caption_reviews = [i for i in reviewsGB if len(i["caption"]) > 0]

print(f"Reviews with caption: {round((len(caption_reviews) /␣


,→len(reviewsGB))*100,2)}%")

Reviews with caption: 25.0%

[24]: pprint(caption_reviews[0:3])

[{'caption': '(Tradução do Google) Está bem (Original) Ok',


'id_review':
'ChdDSUhNMG9nS0VJQ0FnSUNjMWVLaS1RRRABGhZkOTdseko4VG4yVzZyYUVPWkQ0TTln',
'n_photo_user': 0,
'n_review_user': 0,
'rating': 5.0,
'relative_date': '3 dias atrás',
'retrieval_date': '2020-03-21T15:38:25Z',
'url_user': 'https://www.google.com/maps/contrib/108919364759095568849?hl=pt-
BR',
'username': 'roberto boni'},
{'caption': 'Sempre sou bem atendida.',
'id_review':
'ChdDSUhNMG9nS0VJQ0FnSUNjNVpuMW5RRRABGhZzcjhXRmlIYi1zaXAzLURfSDJuVHVn',
'n_photo_user': 0,
'n_review_user': 1,
'rating': 5.0,
'relative_date': '3 dias atrás',
'retrieval_date': '2020-03-21T15:38:25Z',
'url_user': 'https://www.google.com/maps/contrib/102183203056207578960?hl=pt-

56
BR',
'username': 'Rauana Cristina Salas Calvo'},
{'caption': 'gostp somente dos eletrodomésticos',
'id_review':
'ChdDSUhNMG9nS0VJQ0FnSUNjcVlDem1RRRABGhZscGN4amx3NnJsSy1jdS1DbWxMbG9n',
'n_photo_user': 0,
'n_review_user': 20,
'rating': 4.0,
'relative_date': '6 dias atrás',
'retrieval_date': '2020-03-21T15:38:25Z',
'url_user': 'https://www.google.com/maps/contrib/113547853182606933472?hl=pt-
BR',
'username': 'Thayane Vitoria'}]

[28]: # Average rates


print(f"Average grade {np.average([i['rating'] for i in reviewsGB])}")

Average grade 4.25

1.4.1 General impressions - Google Business

Here we have less data to work with and most of them does not include a caption/description, so
we might need a larger number of points to make a deep analysis. However, since this is not a
complaint focused platform, we expect to have more positive responses from the users (and that
can be seen by the 4.25 average rating of our sample data) - allowing us to draw a better overall
picture of the store.

2 First EDA conclusions

2.0.1 EDA Statistics

We conclude that the majority (~86%) of the companies do not respond, but we also noticed that
when spitted by company, there are differences between them (there are companies that do not
respond at all). Regarding the most common problems, we see that the main problems are regarding
customer support and delivery. From our word cloud and the n-grams analysis, we found that the
most common words are those related to the problems (“atendimento” -> support, “entrega” ->
delivery …), reinforcing our previous findings.

2.0.2 EDA data next steps

We found that we will need more data points in our final dataset, given that we want to do a
deep analysis on every store. We want to have better estimates on response time and get data on
negative conclusion (we only got positive conclusions in this sample). Thus, we will be scraping
data every day from today onward. The data features are good, specially for ReclameAQUI data,
we will have a broad feature space to build from the complaints description that will help to guide

57
our ratings. For the Google Business data, we will adapt the scraper to store the geolocation of
location. Additionally, as we are drawing from multiple sources (namely ReclameAQUI, Google
Business and Facebook Reviews) that classify businesses differently, we will also have to look into
how to aggregate data at different levels in order to achieve fruitful results.

3 Second EDA Conclusions (04/04/2020)

In this new analysis, we have almost 10k of data points and develop a more general understanding
of our data. Found specific dynamics underlying weird values and had ideas on how to better
aggregate our data sources.

3.0.1 Nonsense max values for “days until resolution” and “days to first reply”

With the new batch of data, we found very weird max values for “days until resolution” (1800+
days) and “days to first reply” (500+ days). Investigating further, we uncovered two dynamics
from this investigation.
First, high values from “days until resolution” are due to users forgetting to close the complaint
ticket and only doing it years later (when they probably logged backed to the website for another
complaint). Second, the unsual high values for “days to first reply” are due to company revisiting
older complaints and asking the user to close the ticket (probably to increase their response rate
that is shown at their profile screen). We will take this in consideration when modeling and doing
further analysis.

3.0.2 Better category/tag organization

We found that we can aggregate complaints’ tags into macro categories to create better overall
understanding of the problem. We also found that there are many problems tagged as “others”,
we plan to dig deeper and see if we can develop nlp models to “re-tag” them based on similar
complaints. Also, we want to break these tags into more specific category groups that might be of
users’ interests in the future.

3.0.3 New Response rate insight

Previously, we saw that the majority of the complaints were not answered, but now we have the
inverse conclusion. What we found is that newly complaints (as the ones that we scrape from the
firsts pages) take a while to receive a response, so our previous batch was highly biased.
Also, we found out that there are only a few companies that have very low response rates. This is
strange because nowadays the companies are looking forward to having good relations with their
clients. And it is also curious that the companies that are in this situation are the larger ones.
One way we try to explain that is that these stores have a lot of comments per day and the
companies just haven’t had the time to answer the complaints yet. Thus, we will intensify the
scrapping effort on these companies pages and get as many historical data as possible.

58
3.0.4 NLP analysis

In general, an NLP analysis of the dataset shows that most complaints made against furniture
retailers revolve around words related to the order (order, shop, buy, store) or to the actual delivery
of the product (day, delivery, days, arrival). A k-gram investigation of the issue confirms our
findings and word sets such as “5 working days” and “delivery date” are on top of the list. We
then proceeded to a side-by-side comparison between 2 similar sized businesses: Sylvia Design and
Inovar. A word frequency analysis shows us that both experience most customer inquires regarding
couches, however, their approaches to delivering their mecharndise differ somewhat. Sylvia Design
delivers in 45 to 60 days while Inovar’s delivery is 15 days shorter.

59

Você também pode gostar