Gráficos de pirulito e o pacote Janitor

Navegando na plataforma data.world encontrei um conjunto de dados sobre smartphones na Índia. Nesse data set é possível encontrar diversos modelos, seus preços e o número de avaliações que cada um recebeu. Nesse post, uso as ferramentas que desenvolvemos até o momento para explorar e análisar esses dados.

Guilherme Bastos Gomes https://gbastosg.github.io/guilhermesportfolio/
2022-06-05

Olá!

Navegando pela internet encontrei 2 data sets contendo informações sobre smartphones vendidos na Índia.

Vou usar todo o conteúdo desenvolvido até agora para compreender esses dados e obter ideias sobre eles.

Bibliotecas

Carregando o tidyverse:

library(tidyverse)
#Também usaremos outras bibliotecas em seu tempo elas serão carregadas

Lendo os dados:

# Dados da apple na Índia
apple_sold_in_india <- read_csv("apple_products.csv")

# Dados sobre smartphones no mundo
smartphones_sold <- read_csv("smartphone_category (1).csv")

Pacote Janitor para limpar os dados

Preparando os dados para a análise de forma simples: o pacote janitor

install.packages("janitor")

library(janitor)

#Observe as colunas do data set antes e depois de usar a função clean_names()

Nomes das colunas do data set antes da função clean_names():

 [1] "Product Name"        "Product URL"         "Brand"              
 [4] "Sale Price"          "Mrp"                 "Discount Percentage"
 [7] "Number Of Ratings"   "Number Of Reviews"   "Upc"                
[10] "Star Rating"         "Ram"                
clean_apple_sold_in_india <- apple_sold_in_india %>%
  clean_names()
 [1] "product_name"        "product_url"         "brand"              
 [4] "sale_price"          "mrp"                 "discount_percentage"
 [7] "number_of_ratings"   "number_of_reviews"   "upc"                
[10] "star_rating"         "ram"                 "american_dolar"     
[13] "australian_dolar"   

Agora seguindo um padrão de palavras em caixa baixa e separadas por um “_” sublinhado.

Ótimo!

Compreendendo os dados

Primeiro, podemos conhecer a variação dos preços entre os iPhones:

  ggplot(clean_apple_sold_in_india) +
    geom_histogram(aes(x = sale_price))

Os valores estão em Rupias, então vamos transformar nossos dados para construir uma nova coluna com os valores em dólar americano e dólar australiano:

  clean_apple_sold_in_india <- clean_apple_sold_in_india %>%
  mutate(american_dolar = sale_price * 0.013, australian_dolar = sale_price * 0.018)

Parece que está tudo ótimo para começar, mas não! Esse dado possui redundância, notável por um agrupamento das avaliações de cada marca:

clean_apple_sold_in_india %>%
group_by(number_of_ratings) %>%
count() %>% arrange(desc(n)) -> redundancia_ratings

Ou seja, o número de avaliações (number_of_ratings) é repetido em diferentes modelos do mesmo produto.

Primeiro temos que trabalhar nesse data set de modo a retirar essa redundância dos dados, assim receberemos respostas menos enviesadas, que não poderiam nos levar a caminhos muito complicados.

Removendo a redundância

Nosso dado possui redundância, principalmente por causa dos diferentes modelos de iPhones.

Podemos agrupar os dados pelos preços de vendas (que não se repetem) e escolher apenas o primeiro do nosso data set com a função slice():

  clean_apple_sold_in_india %>%
  group_by(sale_price) %>%
  slice(1) -> sale_price_first

Agora podemos plotar os valores dos iPhones para entender sua variação, vamos ver quais são os mais caros:

  sale_price_first %>%
  mutate(iphone = fct_reorder(product_name, australian_dolar)) %>%
  ggplot(aes(x = iphone, y = australian_dolar)) +
  geom_bar(stat = "identity", fill="#f68060", alpha=.6, width=.4) +
  coord_flip() +
  labs(
    #title = "",
    #subtitle = "por: Guilherme Bastos Gomes",
    caption = "Source: data.world",
    x = "",
    y = "Preços em dólar australiano") +
  theme_bw()

Gráfico de pirulito

Podemos também analisar com um gráfico de pirulito (Lollipop chart):

  sale_price_first %>%
  mutate(iphone = fct_reorder(product_name, australian_dolar)) %>%
  ggplot(aes(x = iphone, y = australian_dolar)) +
  geom_segment( aes(xend=iphone, yend=0)) +
  geom_point( size=4, color="0088cc") +
  coord_flip() +
  theme_bw() +
  labs(
    #title = "",
    #subtitle = "por: Guilherme Bastos Gomes",
    caption = "Source: data.world",
    x = "",
    y = "Preços em dólar australiano")

O que aprendemos com esse plot?

Será que existe uma relação entre o preço e número de avaliações entre os iPhones?

  sale_price_first %>%
  ggplot(aes(x = australian_dolar, y = number_of_ratings)) +
  geom_point( size = 3, color = "Firebrick") +
  geom_smooth(method = "lm") +
  theme_classic()

Interessante, parece que quanto menor o valor do produto, maior o número de avaliações (imagino que porque mais pessoas tem acesso), porém nosso gráfico ainda não parece mostrar uma correlação forte entre nossas variáveis.

Transformando os dados para observar a relação entre as variáveis

sale_price_first %>%
  ggplot(aes(x = australian_dolar, y = number_of_ratings)) +
  geom_point( size = 3) +
  scale_y_log10() +
  geom_smooth(method = "lm") +
  theme_classic()

Sem usar um modelo linear na função geom_smooth:

sale_price_first %>%
  ggplot(aes(x = australian_dolar, y = number_of_ratings)) +
  geom_point( size = 3) +
  scale_y_log10() +
  geom_smooth(aes(x = australian_dolar, y = number_of_ratings)) +
  theme_classic()

Veja que interessante se torna nosso gráfico quando trocamos a escala do eixo y para incluir o logaritmo na base 10 dos números que analisamos.

Distribuição da variável sem e com transformaçao logaritmica:

library(patchwork)

h1 <- ggplot(sale_price_first) +
  geom_histogram(aes(x = number_of_ratings))
  
h2 <- ggplot(sale_price_first) +
  geom_histogram(aes(log10(sale_price_first$number_of_ratings)))

h1 + h2

Perceba como mais caixas são preenchidas após a transformação logaritmica na base 10, o que aumenta nossa compreensão dos dados no plot.

O que estamos tentando dizer aqui é que quanto maior o valor do iPhone, menos avaliações o produto recebe do publico geral. Não é uma hipótese brilhante, mas vai garantir que comecemos a analisar os dados de uma forma mais profunda.

Antes de prosseguir, você deve estar se perguntando se o mesmo é verdade para outras marcas também, vamos checar!

smartphones_sold %>%
  clean_names() -> clean_smartphones_sold

Perceba como da mesma forma que podemos usar <- para definir um objeto, o mesmo é verdade quando usamos -> porém pelo sentido contrário!

Muito útil quando estamos usando pipes ou %>%

Removendo a redundância:

clean_smartphones_sold %>%
  group_by(sale_price) %>%
  slice(1) -> red_out_clean_smartphones_sold

Vamos analisar os preços em dólar australiano, então para isso precisamos construir uma coluna com os valores desejados:

  red_out_clean_smartphones_sold <-  red_out_clean_smartphones_sold %>%
  mutate(american_dolar = sale_price * 0.013, australian_dolar = sale_price * 0.018)

Selecionando algumas marcas mais relevantes em números no data set:

  red_out_clean_smartphones_sold %>%
  group_by(brand) %>%
  summarise(media_relevantes = mean(number_of_ratings)) %>%
  arrange(desc(media_relevantes)) %>%
  mutate(brand = fct_reorder(brand, media_relevantes)) %>%
  ggplot(aes(x = brand, y = media_relevantes)) +
  geom_segment( aes(xend=brand, yend=0)) +
  geom_point( size=4, color="0088cc") +
  coord_flip() +
  theme_bw() +
  labs(
    #title = "",
    #subtitle = "por: Guilherme Bastos Gomes",
    caption = "Source: data.world",
    x = "",
    y = "")

Esse gráfico é interessante para observar a distribuição das médias (valor médio de avaliações por marca), mas agora vamos analisar as distribuições dos números de avaliações totais de cada marca:

  red_out_clean_smartphones_sold %>%
  ggplot(aes(x = reorder(brand, number_of_ratings, na.rm = TRUE), y = number_of_ratings, fill = brand)) +
  geom_boxplot() +
  labs(
    #title = "",
    subtitle = "por: Guilherme Bastos Gomes",
    caption = "Source: data.world",
    x = "",
    y = ""
  ) +
  coord_flip()

Deixei o eixo X, Y e o título do gráfico para que você possa usar os exemplos

Vamos selecionar algumas marcas relevantes para procurar se o mesmo fenômeno se aplica a elas, ou seja, esperamos que quanto maior o valor do produto, menos avaliações ele recebeu do público:

  red_out_clean_smartphones_sold %>%
  filter(brand == "SAMSUNG" | brand == "Apple" | brand == "Lenovo" | brand == "Redmi" |brand == "Motorola" | brand == "ASUS") %>%
  ggplot(aes(x = australian_dolar, y = number_of_ratings, color = brand)) +
  geom_jitter(size = 2) +
  scale_y_log10() +
  #geom_smooth(method = "lm") +
  theme_classic() +
  facet_wrap(~brand)

Em primeiro momento parece que o mesmo fenomeno acontece com a SAMSUNG e também com a Motorola, interessante não?

Enquanto isso parece que a Redmi, a Lenovo e a ASUS, mantém preços parecidos e altas avaliações, mas isso não significa que também não podem revelar algum tipo de correlação.

Vamos usar a função geom_smooth para aplicar um modelo de regressão linear simples em nosso gráfico, se o modelo formar uma linha apontando para baixo, então significa que existe correlação entre as variáveis, e que essa correlação é negativa.

red_out_clean_smartphones_sold %>%
  filter(brand == "SAMSUNG" | brand == "Apple" | brand == "Lenovo" | brand == "Redmi" |brand == "Motorola" | brand == "ASUS") %>%
  ggplot(aes(x = australian_dolar, y = number_of_ratings, color = brand)) +
  geom_jitter(size = 2) +
  scale_y_log10() +
  geom_smooth(method = "lm") +
  facet_wrap(~brand) +
  theme_fivethirtyeight()

Vamos checar o quão forte está nossa correlação:

Parece que o mesmo é real até para as outras marcas de dispositivos.

Como será que o preço de um produto afeta suas avaliações? E qual preço seria ótimo para obter um valor ótimo de avaliações?

No próximo post, vou escrever sobre como avaliar e usar os modelos a nosso favor.

Correlação entre valor do produto e número de avaliações

Vamos voltar ao nosso dataset com os apples:

cor(clean_apple_sold_in_india$australian_dolar, clean_apple_sold_in_india$number_of_ratings, method = c("pearson"))

cor(clean_apple_sold_in_india$australian_dolar, clean_apple_sold_in_india$number_of_ratings, method = c("spearman"))

cor(clean_apple_sold_in_india$australian_dolar, clean_apple_sold_in_india$number_of_ratings, method = c("kendal"))
[1] -0.7015259
[1] -0.8029363
[1] -0.6314646

Observamos então que existe correlação negativa forte (-0.7 no coeficiente de correlação de Pearson) entre ambas as variáveis.

Até a próxima!