Visualização de dados com Seaborn (Pt. II/II)

Realizaremos análises exploratórias de dados com informações disponibilizadas pela própria biblioteca Seaborn

Na Visualização de dados com Seaborn Pt. I/II realizamos duas análises:

Primeira Análise: valor da conta → valor da gorjeta?

Verificamos se o valor da conta influencia no valor da caixinha e se este aumento é proporcional, gerando gráficos estatísticos.

Segunda Análise: sobremesa → valor da gorjeta?

Geramos gráficos relativos à sobremesa, verificando as diferenças de gorjeta entre as pessoas que pediram e as que não pediram a sobremesa para criar gráficos distintos, inclusive traçando uma regressão linear.

Agora na Visualização de dados com Seaborn Pt. II/II veremos:

Terceira Análise: dia da semana → valor da gorjeta?

Verficaremos se o dia da semana possui alguma influência sobre o valor da gorjeta, produzindo vários gráficos diferentes com formatações e características visuais diversas.

Quarta Análise: hora do dia → valor da gorjeta?

Por fim, faremos a análise da hora do dia, atestando em qual horário nosso grupo dá mais ou menos caixinha. Com base nesta amostra, geramos gráficos de histograma, boxplot e etc.

Continuando…

Vamos analisar se os dias da semana alteraram o valor da gorjeta, através de uma análise visual gerando diferentes gráficos para cada dia, explorando também de forma descritiva, levantando também uma nova hipótese em relação aos dias mais lucrativos da semana.

Já realizamos uma análise do valor da conta em relação à gorjeta e a que envolve o pedido ou não de sobremesa em relação à gorjeta.

  • valor da conta → valor da gorjeta
  • sobremesa → valor da gorjeta

Nesta etapa, a terceira análise dirá respeito aos dias da semana e suas relações com as gorjetas.

  • dias da semana → valor da gorjeta

Queremos verificar quais são os dias da semana registrados neste campo através de:

Quais dias clientes gastam mais?

Agora, criaremos o primeiro gráfico pegando o valor da conta, para que possamos ver se há algum dia da semana em que as pessoas gastam mais ao final.

Faremos outro plot relacionando o valor da conta com os dias da semana, mas unindo os dados em um único gráfico com relplot():

Poderemos ver as mesmas informações com 'porcentagem':

Para melhor visualização, separaremos cada dia da semana com os dois plots feitos, relacionados com valor da gorjeta, valor da conta e porcentagem.

Chamaremos sns para relplot() que receberá x='valor_da_conta', y='gorjeta', hue='dia_da_semana'. Para termos esta separação, passamos a já conhecida propriedade col='dia_da_semana', finalizando com nosso DataFrame.

Visualmente, poderemos reparar que realmente quinta, sábado e domingo são os dias com mais pessoas no restaurante.

Em seguida, geraremos um novo gráfico com estas mesmas propriedades, substituindo o eixo y por 'porcentagem'.

Em seguida, traçaremos uma linha para cada dia da semana relacionados à porcentagem. Copiaremos e colaremos a última sentença e apenas substituiremos relplot() por lmplot().

Assim, perceberemos melhor as diferenças entre os dias, constatando algumas observações; todas as porcentagens caem conforme o valor da conta sobe, e percebemos maiores distinções entre o domingo e o sábado.

Qual a média de gorjeta por dias da semana?

A seguir, veremos qual a média do valor da gorjeta de todos os dias em relação a cada um dos dias da semana, utilizando outras propriedades interessantes para esta análise.

Agora que já realizamos várias análises visuais gerando alguns gráficos, faremos análises descritivas em relação ao valor da conta, porcentagem, média de gorjetas e etc.

Começaremos exibindo a média geral das gorjetas escrevendo gorjetas.gorjeta.mean(). Para organizar melhor o resultado, atribuiremos este valor à variável media_geral_gorjeta:

Média das gorjetas por dia da semana

Agora, faremos a média geral dos valores para quinta, sexta, sábado e domingo.

Pegaremos primeiro a média de todos os dias com gorjetas.groupby(), recebendo a especificação de 'dia_da_semana' entre colchetes. Em seguida, aplicamos a média mean().

Pelas informações da tabela, poderemos ver que o dia com a maior média de gorjeta é domingo. A média do total_de_pessoas deve ser feita por números inteiros, já que não é possível ter números decimais neste caso. Portanto, removeremos este campo de nossa análise adicionando dois colchetes após mean() para inserir os valores que queremos exibir.

Com isso, não teremos mais os dados de total_de_pessoas, pois não são relevantes para esta nossa análise.

A média de porcentagem possui o menor valor no sábado, em comparação com os demais dias.

Clientes por dia

Estamos olhando somente a média dos valores, sem levar em consideração o número de clientes em cada dia. Para saber a frequência desses dias, inserimos gorjetas.dia_da_semana com value_counts().

Assim poderemos visualizar a quantidade de pessoas que foram ao restaurante nos quatro dias:

  • sábado é o dia mais frequentado
  • sexta-feira é a mais frequentada

Compararemos com a tabela de médias e veremos que a gorjeta é maior para o domingo, o segundo dia mais frequentado. Enquanto o sábado que é o dia mais cheio não possui a maior média de gorjeta.

A seguir, veremos se os dois grupos são de fato diferentes.

Anteriormente, vimos que a média do valor da gorjeta no domingo é maior do que a do sábado. Porém, também observamos que a quantidade de pessoas no restaurante é maior no sábado do que no domingo. A questão é se os valores das contas nos dois dias são diferentes também.

Gerando outro Teste de Hipóteses

  • Hipótese nula H0: o valor médio das contas no sábado e no domingo são iguais.
  • Hipóteses Alternativa H1: o valor médio das contas no sábado e domingo são diferentes

Agora, montaremos a query() que trará o valor da conta de cada um dos dias em questão, como realizamos em nossos testes relacionados a gorjeta.

Em seguida, copiaremos a sentença e colaremos em uma nova célula de edição, apenas substituindo por 'Sábado' para a nova variável valor_conta_sabado.

ranksums() para comparar semelhança entre grupos

Assim, obteremos os valores das contas nos dois dias. Agora, rodaremos o ranksums() para ver se os dois grupos são iguais ou diferentes.

Para isso, escreveremos ranksums() recebendo as duas variáveis:

Isso significa que a distribuição do valor da conta no sábado e no domingo são iguais

O resultado de p-value será 0.35, ou seja, apenas aceitaremos a hipótese alternativa se este número for menor do que 0.05; como é maior, apenas nossa hipótese nula é válida.

Portanto, mesmo que o sábado seja mais frequentado e o domingo possua a maior média de gorjetas, não são diferentes no que diz respeito ao valor da conta.

Ao plotar a imagem do valor da conta e a porcentagem da gorjeta de cada dia, algo chamou a atenção de uma pessoa que estava analisando:

A pessoa percebeu, que visualmente existe uma diferença entre esses dois dias. Então, ao estabelecer duas hipóteses, realizou o seguinte teste:

Sabendo que o valor do p-value = 0.046688533353323416, com o nível de significância de 5%, podemos afirmar que.

Rejeitamos a Hipótese Nula H0

A distribuição do valor da conta não é igual na quinta e no sábado, aceitando a hipótese alternativa. Os valores das contas são diferentes.

Até aqui vimos…

  • Analisamos o valor da conta e da gorjeta de cada dia da semana
  • Em nossa análise descritiva, conferimos também a frequência de cada dia
  • Geramos também diferentes tipos de gráficos para uma análise exploratória visual

Quarta e útima análise

Falta analisar a hora do dia em relação ao valor da conta e percentual de gorjeta. Temos dois períodos diferentes a serem analisados: Almoço e Jantar, visíveis por gorjetas.hora_do_dia.unique():

Aplicaremos tanto análises visuais quanto utilizando ranksums() para os dois grupos em questão.

sns.catplot()

Nosso primeiro gráfico estatístico será categórico cruzando ahora do dia com o valor da conta:

Aparentemente, o jantar é o momento do dia com os maiores valores de conta. Perceberemos que existem alguns pontos com quantias muito parecidas, e poderemos aplicar um parâmetro que nos permitirá visualizar melhor todos os pontos separadamente.

swar plot

Copiaremos a última sentença de código e colaremos na célula seguinte, passando um quarto parâmetro kind sendo igual a 'swarm'.

Desta forma, conseguiremos visualizar melhor cada um dos pontos do gráfico.

sns.violinplot()

Geraremos um outro gráfico interessante por meio de violinplot():

Conseguimos visualizar ver que há um grupo que gasta com maior frequência valores próximos de $20 na horajantar, e outro maior ainda por volta dos $15 na hora do almoço.

sns.boxplot()

Em seguida, visualizaremos os dois grupos lado a lado, analisando a média dos valores para cada horário do dia.

Este novo gráfico utilizará o comando boxplot() recebendo os mesmos valores nos eixos anteriores:

Desta forma, poderemos ver mais claramente que a média dos valores da conta no horário do jantar é diferente da média do almoço.

Outro gráfico bastante conhecido e tradicional que utilizaremos em nossa análise é o histograma por meio de distplot(). Para que funcione, precisaremos pegar os valores da conta de todas as pessoas que almoçaram no restaurante através de uma query().

Passaremos como parâmetro hora_do_dia sendo == a 'Almoço' entre aspas. Por fim, aplicaremos valor_da_conta e armazenaremos em uma nova variável almoco.

Com esta variável, chamaremos a biblioteca Seaborn com distplot() passando almoco>

Poderemos passar um parâmetro kde igual a False para visualizarmos um gráfico atrás deste último, facilitando nossa leitura.

Neste gráfico, vemos uma grande faixa entre os valores $10 e $15. Faremos o mesmo processo para o jantar:

Em seguida, geraremos o gráfico com distplot() para jantar.

Faremos a mesma alteração na visualização que aplicamos para o almoço, usando um gráfico que facilite a leitura.

Com esses gráficos gerados, poderemos ver que suas distribuições são bastante diferentes.

A seguir, verificaremos com testes de hipóteses se o valor das contas de sábado é, de fato, diferente dos valores de domingo.

Teste de Hipótese: Hora do dia → Valor da Conta

Já geramos alguns gráficos, mas queremos uma descrição estatística com números do que estamos visualizando. Nossa análise será para saber se a hora do dia tem influência sobre o valor da conta.

Poderemos tirar uma média desses valores utilizando o groupby:

Novamente, não será necessário o uso dos números decimais para o campo total_de_pessoas:

Com isso, poderemos ver que a média do valor da conta e da gorjeta no almoço são menores em relação ao jantar. A mesma coisa acontece com a porcentagem.

Aplicaremos ranksums() para teste de hipóteses, descobrindo se, de fato, a distribuição do valor da conta é diferente entre os dois grupos em questão.

  • Hipótese nula: a distribuição é igual no almoço e no jantar
  • Hipótese alternativa: a distribuição é diferente no almoço e no jantar

Portanto, chamaremos ranksums() e passaremos o valor do jantar e do almoco. Armazenaremos esta informação em uma variável r2.

O sistema retorna um pvalue menor do que 0.05, o que significará que a distribuição é diferente nos dois períodos do dia e que a hipótese alternativa poderá ser aceita, ou seja, a distribuição dos valores entre jantar e almoço são siferentes.

Adicionaremos a observação textual com a hipótese alternativa aceita para deixar nossa conclusão de que a distribuição de valores da conta não é igual no almoço e no jantar.

Faremos um teste com p-value relacionado à porcentagem que possui uma média bastante parecida para as duas horas do dia, verificando se são grupos diferentes de fato ou não.

Após executar e receber os valores, armazenaremos em uma variável porcentagem_almoco:

Para verificarmos se são iguais ou não, chamaremos o ranksums() passando as duas variáveis.

O valor do p-value é superior a 0.05, o que significa que temos grupos parecidos. Ou seja, a distribuição da taxa da gorjeta é igual de fato no almoço e no jantar.

Em seguida, adicionaremos a descrição textual após o teste de hipótese nula aceito, retirando a alternativa. Atribuiremos este valor para uma variável r3, criando um print() para exibir o resultado de forma mais organizada.

Finalizando…

  • Analisamos de forma visual e descritiva as diferenças entre os valores das contas do almoço e do jantar
  • Aprendemos a gerar diferentes gráficos estatísticos, como um histograma, gráfico de violino e um boxplot com Seaborn
  • Utilizamos um cálculo em testes de hipóteses para analisarmos se a população se comporta da mesma forma ou não utilizando ranksums().
  • Vimos a frequência de pessoas em cada dia da semana, e fizemos testes de hipóteses para saber se as distribuições dos valores das contas eram iguais em dias difentes

Obrigado.

Composing a repository of books (i bought), authors (i follow) & blogs (direct ones) for my own understanding.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store