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.
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 dadosComo 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")
tabdfOrdenadoPopularidade <-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")
fig2Aná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')
figCategorias 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"))
))
figtabA 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"))
))
figtabComunicaçã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"))
))
figtabOs 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"))
))
fig1tabJogos 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")
fig1aplicativos <- 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")
fig1Apesar 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")
fig1fig1 <- 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")
fig1As 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")
fig1fig1 <- 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")
fig1Há 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")
tabfig <- 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")
figfig2 <- 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")
fig2Games 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")
tabfig <- 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")
figfig2 <- plot_ly(
type='histogram',
x=~ gameTop30$Installs , marker = list(color='orange') ) %>% layout(title = "Distribuição das instalação dos 30 games melhores avaliados ")
fig2No 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)