Analisando dados da GooglePlayStore

Renan Tomazini

22 setembro de 2022

O projeto

Para esse projeto estarei analisando o conjunto de dados de Downloads e avaliações de aplicativos da GooglePlayStore obtidos em Julho de 2022.

drawing

Introdução

O conjunto de dados analisados trata-se de um compilado dos aplicativos mais populares da GooglePlayStore, com detalhes sobe sua categoria, preço, número de Downloads, avaliações, número de Reviews, tamanho, gênero e público alvo. O objetivo é verificar os aplicativos mais populares de cada categoria, se existe alguma relação entre suas avaliações, seu preço e público alvo. Com esses dados podemos verificar quais aplicativos tem têndencia de serem mais populares e quais despertam maior interesse no público e assim ter uma segurança maior ao desenvolver aplicativos para plataforma, verificando quais são os concorrentes, suas avaliações e quais os serviços mais populares.

Pacotes Requeridos

Os pacotes a serem usados são:

plotly

Para criação de gráficos.

stringr

Para trabalhar com as strings presentes no dataset.

tidyr

Para auxiliar na limpeza e organização das tabelas de dados.

prettydoc

Personalização do tema para melhor visualização do documento.

plyr

Para controle do HTML da página

#pacotes a serem importados

library(prettydoc)
library(plotly)
library(stringr)
library(tidyr)
library(plyr)

Preparação dos dados

Fonte dos dados

Os dados foram retirados do agregador kaggle. A principio eles são apenas um conjunto de dados de dominio público retirados da GooglePlay Store via mineração de texto, com alguns dados corrompidos, não normalizados ou faltando. O conjunto de dados de Downloads e avaliações de aplicativos da GooglePlayStore foram obtidos em Julho de 2022.

dados <- read.csv("googleplaystore.csv")

#head(dados)

Limpeza de dados

Aqui farei a limpeza dos dados faltando, não normalizados ou corrompidos.

Irei ignorar os casos não completos primeiramente

df <- dados[complete.cases(dados), ]

print(paste0("Número de dados completos: ",nrow(df)))
## [1] "Número de dados completos: 9367"

Irei retirar dados percebidos como fora do padrão em rating e uma linha problematica com erro:

df[df$Rating > 5,] <- 5
df[df$Rating < 0,] <- 0
df <- subset(df, App != "5")

substituir os dados de número de instalações de string para números, eles são arredondados e aproximados pelo próprio Google

#Verifiquei abaixo as possibilidades antes de substituir
#unique(df$Installs)
options(scipen=999) # para os numeros não ficarem em notação
df$Installs[df$Installs == "10,000+"] <- 10000
df$Installs[df$Installs == "500,000+"] <- 500000
df$Installs[df$Installs == "5,000,000+"] <- 500000
df$Installs[df$Installs == "50,000,000+"] <- 5000000
df$Installs[df$Installs == "100,000+"] <- 100000
df$Installs[df$Installs == "50,000+"] <- 50000
df$Installs[df$Installs == "1,000,000+"] <- 1000000
df$Installs[df$Installs == "10,000,000+"] <- 10000000
df$Installs[df$Installs == "5,000+"] <- 5000
df$Installs[df$Installs == "100,000,000+"] <- 100000000
df$Installs[df$Installs == "1,000,000,000+"] <- 1000000000
df$Installs[df$Installs == "1,000+"] <- 1000
df$Installs[df$Installs == "500,000,000+"] <- 500000000
df$Installs[df$Installs == "100+"] <- 100
df$Installs[df$Installs == "500+"] <- 500
df$Installs[df$Installs == "10+"] <- 10
df$Installs[df$Installs == "5+"] <- 5
df$Installs[df$Installs == "50+"] <- 50
df$Installs[df$Installs == "1+"] <- 1
df$Installs[df$Installs == "5"] <- 5
df$Installs <- as.numeric(as.character(df$Installs))



df$Reviews <- as.integer(as.character(df$Reviews)) #convertendo o numero de reviews para int afim de usar os dados

Como está o conjunto limpo

Os dados limpos e normalizados estão aqui, aqui são uma amostra com o top25 dos melhores avaliados com maior número de reviews.

dfOrdenado <-df[order(-df$Rating, -df$Reviews),]
dfOrdenado <- dfOrdenado[dfOrdenado$Installs> 1000,]  #Tem que ser mais de 1000 downloads para ser considerado


top25 <- dfOrdenado[1:25,]

tab <- plot_ly( type='table',
        #collumnwidth= c(50,50),
        #collumnorder= c(0,1),
        header = list(
          values =c("App", "Rating"),
          align= c("center","center"),
          fill = list(color = c("#9ddcff", "#317ccf")),
          line= list(width= 1.5, color = 'black'),font= list(family= "Helvetica", size= 12, color = c("black"))
        ),
        cells =list(
          values = rbind(top25$App, top25$Rating),
          align= c("center","center"),
          line= list(width= 1.5, color = 'black'),font= list(family= "Helvetica", size= 12, color = c("black"))
        )
        )%>% layout(title = "25 Aplicativos melhores avaliados com maior numero de review")
tab
dfOrdenadoPopularidade <-df[order(-df$Installs, -df$Rating),]
dfOrdenadoPopularidade <- dfOrdenadoPopularidade[dfOrdenadoPopularidade$Installs> 1000,]  #Tem que ser mais de 1000 downloads para ser considerado


top500pop <- dfOrdenadoPopularidade[1:500,]


fig2 <- plot_ly(

  type='histogram',

    x=~ top500pop$Rating , marker = list(color='orange') )  %>% layout(title = "Distribuição das notas dos 500 apps mais populares") 

fig2

Análise exploratória dos dados

Exploro os dados a partir daqui

Grátis ou pago

As porcentagens de grátis ou pago aparentemente mantém uma proporção muito próximas entre os 100 e os 1000 primeiros, além de no geral.

#head(df)
dfOrdenado <-df[order(-df$Rating, -df$Reviews),]

top1000 <- dfOrdenado[1:1000,]
top100 <- top1000[1:100,]

ContagemTypeGeral <- count(dfOrdenado,'Type')
ContagemTypeGeral$perc <- c(ContagemTypeGeral[,2] / length(dfOrdenado$App))*100
colnames(ContagemTypeGeral)<- c("Type","freq","perc")


#dfOrdenado$Type
top1000ContagemType <- count(top1000,'Type')
top1000ContagemType$perc <- c(top1000ContagemType[,2] / length(top1000$App))*100
colnames(top1000ContagemType)<- c("Type1000","freq1000","perc1000")

top100ContagemType <- count(top100,'Type')
top100ContagemType$perc <- c(top100ContagemType[,2] / length(top100$App))*100
colnames(top100ContagemType)<- c("Type100","freq100","perc100")





fig <- plot_ly(ContagemTypeGeral, x = ~Type, y = ~perc, type = 'bar', name = 'Porcentagem geral', color = I("rgba(132, 182, 244, 1)"))



fig <- fig %>%  add_trace(top1000ContagemType, x = ~top1000ContagemType$Type1000, y = ~top1000ContagemType$perc1000, type = 'bar', name = 'Porcentagem 1000 primeiros', color = I("rgba(255, 105, 97, 1)"))


fig <- fig %>% add_trace(top100ContagemType,
                         x =top100ContagemType$Type100,
        y = ~top100ContagemType$perc100,
        type = 'bar',
        name = "Porcentagem 100 primeiros",
        color = I("rgba(119, 221, 119, 1)"))

fig <- fig %>% layout(yaxis = list(title = 'Count'), barmode='group')        
  
fig <- fig %>% layout(title = 'Porcentagem de Pagos e gratuitos entre os mais populates')


fig

Categorias mais bem avaliadas

Aqui serão analisadas as categorias com melhor rating dos usuários e as mais populares

dfRating <- aggregate(df$Rating, by=list(Category=df$Category), FUN=mean)
colnames(dfRating) <-  c("Category", "Rating")
dfRating$Rating <- format(round(dfRating$Rating, 2), nsmall = 2)

colors = c('#1B998B', '#ED217C','#2D3047', '#FFFD82' ,'#FF9B71','#53DD6C','#63A088','#56638A','#483A58','#56203D','#FB5012','#01FDF6','#CBBAED','#E9DF00','#03FCBA','#4464AD','#A4B0F5','#F58F29','#7D4600','#466995','#FFA69E','#B8F2E6','#FAF3DD','#AED9E0','#5E6472','#255F85','#C5283D','#FFC857','#E9724C','#D84A05','#E89005','#212738','#57C4E5')

fig <- plot_ly(dfRating, x = ~Category, y = ~Rating, type = 'bar', name = 'Categorias Mais populares',marker = list(color = colors)) %>% 
layout(xaxis = list(categoryorder = "total descending"))

tab <- plot_ly(

  type = 'table',
  columnwidth = c(100, 100),

  columnorder = c(0, 1),

  header = list(

    values = c("Categoria","Instalações"),

    align = c("center", "center"),

    line = list(width = 1, color = 'black'),

    fill = list(color = c("rgba(255, 105, 97, 1)", "rgba(119, 221, 119, 1)")),

    font = list(family = "Arial", size = 14, color = "white")

  ),

  cells = list(
    
    values = rbind(dfRating$Category, dfRating$Rating),

    align = c("center", "center"),

    line = list(color = "black", width = 1),

    font = list(family = "Arial", size = 12, color = c("black"))

  ))






fig
tab

A categoria de eventos é a mais bem avaliada, a pior avaliada é a Dating, aplicativos de relacionamento.

Categorias mais populares

O gráfico a seguir mostra quais são as categorias mais baixadas

dfIntalacoes <- aggregate(df$Installs, by=list(Category=df$Category), FUN=sum)
colnames(dfIntalacoes) <- c("Category", "Installs")

fig <- plot_ly(dfIntalacoes, x = ~Category, y = ~Installs, type = 'bar', name = 'Categorias Mais populares',marker = list(color = colors)) %>% 
layout(xaxis = list(categoryorder = "total descending"))

tab <- plot_ly(

  type = 'table',
  columnwidth = c(100, 100),

  columnorder = c(0, 1),

  header = list(

    values = c("Categoria","Instalações"),

    align = c("center", "center"),

    line = list(width = 1, color = 'black'),

    fill = list(color = c("rgba(255, 105, 97, 1)", "rgba(119, 221, 119, 1)")),

    font = list(family = "Arial", size = 14, color = "white")

  ),

  cells = list(
    
    values = rbind(dfIntalacoes$Category, dfIntalacoes$Installs),

    align = c("center", "center"),

    line = list(color = "black", width = 1),

    font = list(family = "Arial", size = 12, color = c("black"))

  ))




fig
tab

Comunicação e games são os com maior número de Downloads, enquanto o Eventos e Beleza são os com menores.

Numero de Downloads por púbico alvo

dfIntalacoes <- aggregate(df$Installs, by=list(Publico=df$Content.Rating), FUN=sum)
colnames(dfIntalacoes) <- c("Publico", "Installs")

fig <- plot_ly(dfIntalacoes, x = ~Publico, y = ~Installs, type = 'bar', name = 'Categorias Mais populares',marker = list(color = c('red','lightgreen', 'blue','brown','green','pink'))) %>% 
layout(xaxis = list(categoryorder = "total descending"))

tab <- plot_ly(

  type = 'table',
  columnwidth = c(100, 100),

  columnorder = c(0, 1),

  header = list(

    values = c("Categoria","Instalações"),

    align = c("center", "center"),

    line = list(width = 1, color = 'black'),

    fill = list(color = c("rgba(255, 105, 97, 1)", "rgba(119, 221, 119, 1)")),

    font = list(family = "Arial", size = 14, color = "white")

  ),

  cells = list(
    
    values = rbind(dfIntalacoes$Publico, dfIntalacoes$Installs),

    align = c("center", "center"),

    line = list(color = "black", width = 1),

    font = list(family = "Arial", size = 12, color = c("black"))

  ))




fig
tab

Os que tem publico alvo para todos são os com maior número de downloads.

Mais bem avaliados por público alvo

Qual a média de avaliação dos aplicativos por público alvo (idade).

dfPublico <- aggregate(df$Rating, by=list(Publico=df$Content.Rating), FUN=mean)
colnames(dfPublico) <- c("Publico", "Rating")



fig1 <- plot_ly(dfPublico, x = ~Publico, y = ~Rating, type = 'bar', name = ' Mais populares por Publico',marker = list(color = c('red','lightgreen', 'blue','brown','green','pink'))) %>%   layout(xaxis = list(categoryorder = "total descending")) 


tab <- plot_ly(

  type = 'table',
  columnwidth = c(100, 100),

  columnorder = c(0, 1),

  header = list(

    values = c("Publico","Rating"),

    align = c("center", "center"),

    line = list(width = 1, color = 'black'),
    

    fill = list(color = c("rgba(255, 105, 97, 1)", "rgba(119, 221, 119, 1)")),

    font = list(family = "Arial", size = 14, color = "white")

  ),

  cells = list(
    
    values = rbind(dfPublico$Publico, dfPublico$Rating),

    align = c("center", "center"),

    line = list(color = "black", width = 1),

    font = list(family = "Arial", size = 12, color = c("black"))

  ))




fig1
tab

Jogos para +18 são os com melhores avaliações.

Comparações aplicativos

Agora, a partir dos dados da GooglePlayStore atuais, de 30/09/2022, irei comparar público e rating de aplicativos semelhantes. As cores dos grágicos são de acordo com as cores das marcas,

Comparando mensageiros instantâneos

Nessa etapa estarei comparando os mensageiros Whatsapp, Telegram, Signal e Menssager

aplicativos <- read.csv("aplicativos.csv")
mensageiros <- aplicativos[1:4,]

fig1 <- plot_ly(mensageiros, x = ~Rating, y = ~Aplicativo, type = 'bar', name = 'Mensageiros populares com maior avaliação',marker = list(color = c('#25D366','#FF00BF', '#E1306C', '#006AFF'))) %>%   layout(yaxis = list(categoryorder = "total descending")) %>% layout(title = "Mensageiros populares com maior avaliação")

                                                                                                                                                                             

fig1
aplicativos <- read.csv("aplicativos.csv")
mensageiros <- aplicativos[1:4,]

fig1 <- plot_ly(mensageiros, x = ~Instalacoes, y = ~Aplicativo, type = 'bar', name = 'Mensageiros populares com maior número de Downloads',marker = list(color = c('#25D366','#FF00BF', '#E1306C', '#006AFF'))) %>%   layout(yaxis = list(categoryorder = "total descending")) %>% layout(title = "Mensageiros populares com maior número de Downloads")
                                                                                                                                                                             

fig1

Apesar de menos popular, o Signal é o que apresenta a melhor avaliação, seguida do Telegram. WhatsApp e Messenger, ambos da Meta. são os mais populares, com 5x o número do Telegram, porém tem as piores avaliações. Em Categorias mais bem avaliadas descobrimos que a média para aplicativos de comunicação é 4.16, nesse caso apenas o Menssenger ficaria abaixo da média.

Comparando redes de video e imagem

Nessa etapa estarei comparando as redes de video e imagem, Tik Tok, instagram e SnapChat

Videos <- aplicativos[5:7,]

fig1 <- plot_ly(Videos, x = ~Rating, y = ~Aplicativo, type = 'bar', name = 'Redes de video e imagem  com maior avaliação',marker = list(color = c('#FE2C55','#F77737', '#fffc00'))) %>%   layout(yaxis = list(categoryorder = "total descending")) %>% layout(title = "Redes de video e imagem populares com maior avaliação")
                                                                                                                                                                             

fig1
fig1 <- plot_ly(Videos, x = ~Instalacoes, y = ~Aplicativo, type = 'bar', name = 'Redes de video e imagem com maior número de Downloads',marker = list(color = c('#FE2C55','#F77737', '#fffc00'))) %>%   layout(yaxis = list(categoryorder = "total descending")) %>% layout(title = "Redes de video e imagem com maior número de Downloads")
                                                                                                                                                                             

fig1

As 3 redes mais populares de Imagem tem praticamente o mesmo número de instalações segundo a Google, porém a mais bem avaliada é a Tik Tok com 4.4. Em Categorias mais bem avaliadas descobrimos que a média para aplicativos de vídeo é 4.06, nesse caso apenas o Tik Tok fica acima da média.

Comparando redes de video e imagem

Nessa etapa estarei comparando os players da categoria Entretenimento mais populares, o Youtube, Netflix e Amazon Prime.

Entretenimento <- aplicativos[9:11,]

fig1 <- plot_ly(Entretenimento, x = ~Rating, y = ~Aplicativo, type = 'bar', name = 'App de entretenimento  com maior avaliação',marker = list(color = c('#a8060e','#f10002', '#e39414'))) %>%   layout(yaxis = list(categoryorder = "total descending")) %>% layout(title = "App de entretenimento populares com maior avaliação")
                                                                                                                                                                             

fig1
fig1 <- plot_ly(Entretenimento, x = ~Instalacoes, y = ~Aplicativo, type = 'bar', name = 'App de entretenimento com maior número de Downloads',marker = list(color = c('#a8060e','#f10002', '#e39414'))) %>%   layout(yaxis = list(categoryorder = "total descending")) %>% layout(title = "App de entretenimento com maior número de Downloads")
                                                                                                                                                                             

fig1

Há uma diferença muito grande entre os principais players no Número de Downloads, nesse caso especifico a média de avaliação é 4.13, todos os players selecionados estão acima da média.

Games de maior popularidade

#games <- df$Category == "GAME"
#gamesListas <- df[games]
games <- df[]

games <- df[df$Category == "GAME",]
games <- games[games$Installs> 100,] #Tem que ser mais de 100 downloads para ser considerado

games <- games %>% distinct(App,Rating,Installs) #para tirar as diversas versões diferentes

gamesOrdenado <-games[order(-games$Installs, -games$Rating),]

gameTop30 <- gamesOrdenado[0:30,]

tab <- plot_ly( type='table',
        #collumnwidth= c(50,50),
        #collumnorder= c(0,1),
        header = list(
          values =c("App", "Número de Downloads"),
          align= c("center","center"),
          fill = list(color = c("#9ddcff", "#317ccf")),
          line= list(width= 1.5, color = 'black'),font= list(family= "Helvetica", size= 12, color = c("black"))
        ),
        cells =list(
          values = rbind(gameTop30$App, gameTop30$Installs),
          align= c("center","center"),
          line= list(width= 1.5, color = 'black'),font= list(family= "Helvetica", size= 12, color = c("black"))
        )
        )%>% layout(title = "30 Aplicativos mais populares")
tab
fig <- plot_ly(

  type='histogram',

  x=~ games$Rating , marker = list(color='orange') )  %>% layout(title = "Distribuição das médias de avaliação dos games com mais de 100 downloads") 

fig
fig2 <- plot_ly(

  type='histogram',

  x=~ gameTop30$Rating , marker = list(color='orange') )  %>% layout(title = "Distribuição das médias de avaliação dos 30 games mais populares") 

fig2

Games de maior Rating

#games <- df$Category == "GAME"
#gamesListas <- df[games]
games <- df[]

games <- df[df$Category == "GAME",]
games <- games[games$Installs> 100,]  #Tem que ser mais de 100 downloads para ser considerado

games <- games %>% distinct(App,Rating,Installs) #para tirar as diversas versões diferentes

gamesOrdenado <-games[order(-games$Rating, -games$Installs),]

gameTop30 <- gamesOrdenado[0:30,]

tab <- plot_ly( type='table',
        #collumnwidth= c(50,50),
        #collumnorder= c(0,1),
        header = list(
          values =c("App", "Rating"),
          align= c("center","center"),
          fill = list(color = c("#9ddcff", "#317ccf")),
          line= list(width= 1.5, color = 'black'),font= list(family= "Helvetica", size= 12, color = c("black"))
        ),
        cells =list(
          values = rbind(gameTop30$App, gameTop30$Rating),
          align= c("center","center"),
          line= list(width= 1.5, color = 'black'),font= list(family= "Helvetica", size= 12, color = c("black"))
        )
        )%>% layout(title = "30 games mais bem avaliados")



tab
fig <- plot_ly(

  type='histogram',

  x=~ games$Installs , marker = list(color='orange') )  %>% layout(title = "Distribuição das instalações de games com mais de 100 downloads") 

fig
fig2 <- plot_ly(

  type='histogram',

    x=~ gameTop30$Installs , marker = list(color='orange') )  %>% layout(title = "Distribuição das instalação dos 30 games melhores avaliados ") 

fig2

No caso dos games, os mais bem avaliados são totalmente diferente dos mais populares. Não havendo relação entre as avaliações e o número de Downloads.

Conclusões

Os Aplicativos mais populares nem sempre são os melhores avaliados. Em questão de popularidade para seu aplicativo viralizar a melhor estratégia é criar algo da categoria Social, Game ou Produtividade. A têndencia de se tornar algo padrão no mercado é mais importante do que ter boas reviews.

Referências

The R Foundation (2022) Plotly (2022) Amaral (2016) Aditya Gupta (2022)

Aditya Gupta. 2022. Google_play_data. Kaggle. https://www.kaggle.com/datasets/adityagupta152002/google-play.
Amaral, Fernando. 2016. Introdução à Ciência de Dados: Mineração de Dados e Big Data. Alta Books Editora.
Plotly. 2022. Plotly Graphing Libraries. Plotly. https://plotly.com/r/.
The R Foundation. 2022. R-Project Docs. The R Foundation. https://www.r-project.org/.