knitr::opts_chunk$set(echo=TRUE, warning=FALSE, message=FALSE, fig.width=12, fig.height=6)
library(ggplot2)
library(dplyr)
library(reshape2)
#install_github('rNVD3', 'ramnathv')
#install_github(c("slidify", "slidifyLibraries"), "ramnathv", ref = "dev")
#require(devtools)
#library(shiny)
#library(rCharts)
O GitHub é um serviço de armazenamento para projetos mundialmente utilizado. A seguir serão respondidas algumas perguntas que julgamos relevantes, levando em conta o dataset explicado a seguir (o conjunto de dados utilizado por ser encontrado aqui).
# Leitura dos dados
dados <- read.csv("atividade-no-github-archive-2012-2015.csv", header = TRUE)
O dataset é composto por 6861 registros de atividades realizadas em repositórios no GitHub entre os anos de 2012 e 2015, cada atividade possui 6 atributos caracterizadores da mesma. Abaixo podemos nos familizarizar com o formato dos dados:
head(dados, 5)
## repository_language type active_repos_by_url events year quarter
## 1 Ruby ForkEvent 24540 73049 2014 3
## 2 Rust PushEvent 1787 24706 2014 2
## 3 Shell WatchEvent 15192 77166 2014 4
## 4 Haskell WatchEvent 2689 11350 2014 4
## 5 Arduino PushEvent 5307 25115 2014 4
## ano_criacao
## 1 2005
## 2 2010
## 3 1977
## 4 1990
## 5 2005
A partir dos dados acima supomos algumas perguntas que poderiam ser feitas:
* O número de eventos possui alguma relação com a quantidade de repositórios ativos?
* O número de eventos em um repositório tem alguma relação com a linguagem utilizada no mesmo?
* A quantidade de 'watch events' é maior naqueles repositórios cujas linguagens surgiram há pouco tempo?
* Escolha 5 linguagens da questão anterior e analise ao menos um parâmetro ao longo do tempo.
* O trimestre do ano, o número de repositórios ativos e eventos estão, de alguma maneira, relacionados?
* Comente sobre a distribuição dos valores, há registros extremos? Outliers?
* Quais as linguagens que possuem uma comunidade mais ativa?
* E quais as linguagens mais populares? Esses dois grupos coincidem?
Serão escolhidas 4 a serem respondidas.
Considerando a quantidade de repositórios ativos e a quantidade de eventos ocorridos, podemos perceber dois cenários: 1) a quantidade de eventos pode crescer ou decrescer em relação ao número de repositórios ativos; 2) uma pequena quantidade de repositórios é reponsável por uma grande quantidade de realizações (criação de evento, fork, issue, watch e push) ou a grande quantidade de eventos realizada é devido a um grande número de repositórios ativos.
Neste caso apenas estudaremos a primeira questão, visto que a segunda está relacionada a causalidade dos eventos.
Utilizando o método par a par de Kendall calcularemos a correlação entre: número de repositórios ativos e número de eventos ocorridos, e esperamos que esta seja positiva.
cor(dados$active_repos_by_url, dados$events, method="kendall")
## [1] 0.8235343
ggplot(dados, aes(events/1e6, active_repos_by_url/1e2)) + geom_point(aes(colour=type)) +
xlab("Eventos Ocorridos (em Milhões)") + ylab("Repositórios ativos (* 1000)") + geom_smooth(method=lm) + ggtitle("Relação entre Repositórios ativos e Eventos ocorridos")
O resultado confirma o achismo de que a relação entre as duas variáveis é alta. Podemos visualizar a tendência dos valores no gráfico acima. A medida que o número de eventos cresce, a quantidade de repositórios ativos também cresce, caracterizando uma relação positiva.
Quando uma linguagem nova é criada, espera-se a curiosidade da comunidade de programadores em relação a mesma, logo, esperamos que a quantidade de watch events nos repositórios seja maior quando uma linguagem foi criada recentemente. Para tanto, complementamos o dataset com o ano de criação ou primeiro release da linguagem (não foi encontrada essa informação para algumas poucas linguagens) e filtramos as linguagens criadas de 2012 até 2015.
dados_wide <- dcast(dados, repository_language + year + quarter + ano_criacao ~ type, value.var="events")
novas <- subset(dados_wide, dados_wide$ano_criacao == 2012 | dados_wide$ano_criacao == 2013 | dados_wide$ano_criacao == 2014 | dados_wide$ano_criacao == 2015)
# Neste caso podemos considerar que os dados faltantes serão iguais a zero
novas[is.na(novas)] <- 0
dados_wide[is.na(dados_wide)] <- 0
ggplot(novas, aes(ano_criacao,WatchEvent, color = repository_language))+ geom_point() + xlab("Ano de criação da linguagem") + ylab("Qnt. de watch events") + ggtitle("Watch events ~ ano de criação")
ggplot(novas, aes(ano_criacao,WatchEvent, color = repository_language))+ geom_point() + facet_wrap(~repository_language) + xlab("Ano de criação da linguagem") + ylab("Qnt. de watch events") + ggtitle("Watch events ~ ano de criação") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
Nos gráficos acima, junto e separadamente, podemos visualizar a quantidade de watch events por ano nas linguagens criadas entre 2012 e 2015. A grande maioria das linguagens não ultrapassa os 10 mil watch, com excessão da linguagem Swift.
Swift é uma linguagem de propósito geral e multi-paradigma criada pela Apple em 2014. Com o propósito de substituir o Objective-C nos produtos da empresa (por possuir um maior desempenho), é classificada em algumas matérias como o mais rápido crescimento na história - o que talvez explique o boom de inscrições em repositórios da linguagem.
Comparando com as linguagens criadas nos demais anos, podemos responder a pergunta feita.
ggplot(dados_wide, aes(ano_criacao,WatchEvent, color = repository_language))+ geom_point() + xlab("Ano de criação da linguagem") + ylab("Qnt. de watch events") + ggtitle("Watch events ~ ano de criação") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
Linguagens com ano de criação iguais a 0: não foi possível identificar o ano de criação.
Claramente notamos que o maior número de WatchEvents não são nas linguagens criadas entre 2012 e 2015. Podemos conferir no quadro abaixo o top 5 dos repositórios mais assistidos, o ano de criação das respectivas linguagens e a quantidade total de WatchEvents neste tipo de repositório:
#head(dados_wide[order(dados_wide$WatchEvent, decreasing = TRUE), ], 5)
agregandoWatch <- aggregate(dados_wide$WatchEvent, list(repository_language=dados_wide$repository_language,ano_criacao=dados_wide$ano_criacao), FUN=sum, na.rm=TRUE)
head(agregandoWatch[order(agregandoWatch$x, decreasing = TRUE), ], 5)
## repository_language ano_criacao x
## 110 JavaScript 1995 7753803
## 166 Ruby 2005 2384333
## 97 Python 1991 2272933
## 74 Objective-C 1983 1931203
## 109 Java 1995 1791809
Com excessão de Objective-C todas as outras linguagens estão no top 10 de linguagens mais populares feito pelo IEEE Spectrum , como podemos conferir neste link. Com base no que vimos, o interesse pela linguaguem não se dá exclusivamente pelo atrativo da novidade, mas talvez pela sua versatilidade ou mercado já angariados.
Por conter um fato interessante, no tópico 5 falaremos um pouco mais sobre os valores vistos sobre Swift.
Utilizando as linguagens do top 5 da questão anterior, vamos falar um pouco sobre a evolução temporal dos eventos Create, Fork, Issue, Push e Watch nessas linguagens.
top5 <- subset(dados_wide, dados_wide$repository_language == "JavaScript" | dados_wide$repository_language == "Ruby" | dados_wide$repository_language == "Python" | dados_wide$repository_language == "Objective-C" | dados_wide$repository_language == "Java")
top5_long <- subset(dados, dados$repository_language == "JavaScript" | dados$repository_language == "Ruby" | dados$repository_language == "Python" | dados$repository_language == "Objective-C" | dados$repository_language == "Java")
top5_long["anot"] <- paste(top5_long$year, top5_long$quarter, sep="-")
top5["anot"] <- paste(top5$year, top5$quarter, sep="-")
ggplot(data=top5_long, aes(x=anot, y=events/1e6, fill=type)) +
geom_bar(stat="identity", position=position_dodge()) +
xlab("Ano - Trimestre") + ylab("Quant. de Eventos (em Milhões)") +
ggtitle("Evolução da Quantidade de Eventos por Trimestre")
ggplot(data=top5_long, aes(x=anot, y=active_repos_by_url/1e2, fill=type)) +
geom_bar(stat="identity", position=position_dodge()) +
xlab("Ano - Trimestre") + ylab("Quant. de Rep. Ativos (* 1000)") +
ggtitle("Evolução da Quantidade de Repositórios Ativos por Trimestre")
#ggplot(top5_long, aes(x=anot, y=events/1e6, fill=type)) + geom_bar(stat="identity") + xlab("Ano - Trimestre") + ylab("Quant. de Rep. Ativos (* 1000)") + ggtitle("Evolução da Quantidade de Repositórios Ativos por Trimestre")
É interessante notar que:
No primeiro gráfico a quantidade de ForkEvent e IssuesEvent varia pouquíssimo ao longo dos anos analisados;
O número de CreateEvent (criar repositório, branch ou tag) é muito baixo, quase inexistente;
No começo de 2013 estimou-se 5 milhoes de repositórios hospedados no GiHub, entretanto o número de PushEvent não chega nem a 2 milhões. Ainda que considerássemos 1 push por repositório, o que não podemos afirmar certamente, ainda haveriam mais de 3 milhões de repositórios inativos;
A pouca quantidade de eventos e repositórios ativos no primeiro trimestre de 2015 talvez possa ser explicado por poucas horas / dias de coleta;
O fechamento de outros serviços de hosting pode explicar o boom sofrido pelo GitHub, visto que os usuários migragram.
Aparentemente a suspensão temporária do serviço em alguns países não afeta significativamente o panorama das atividades no site. Como por exemplo o bloqueio do serviço na Russia e Índia no final de 2014 por hospedaram conteúdos considerados ilegais.
Em ambos os gráficos notamos que o cresimento de eventos e repositórios ativos acompanha a evolução do próprio site GitHub. Por exemplo, de 2 para 10 milhões foi o salto do número de repositórios armazenados de abril de 2011 até 2015.
Podemos falar sobre a distribuição de duas variáveis: número de eventos ocorridos em repositórios daquela linguagem e a quantidade de repositórios envolvidos em determinados eventos. Em ambos a distribuição dos valores apresenta-se assimétrica e com alguns valores extremos. Geralmente esses valores extremos pode ser explicado por alguma moodificação substancial em linguagens, surgimento de uma linguagem nova, dentre outros.
dados["anot"] <- paste(dados$year, dados$quarter, sep="-")
ggplot(data=dados, aes(x=anot, y=events/1e6, fill=type)) +
geom_bar(stat="identity", position=position_dodge()) +
xlab("Ano - Trimestre") + ylab("Quant. de Eventos (em Milhões)")
ggplot(data=dados, aes(x=anot, y=active_repos_by_url/1e2, fill=type)) +
geom_bar(stat="identity", position=position_dodge()) +
xlab("Ano - Trimestre") + ylab("Quant. de Repositórios (* 1000)")
Como já comentado acima, a proibição temporária do serviço em alguns países não aparenta refletir nas estatísticas de utilização, entretanto no primeiro trimestre de 2015 dos dados vemos uma baixíssima quantidade de observações.
d2015 <- subset(dados, dados$year == 2015)
ggplot(data=d2015, aes(x=anot, y=active_repos_by_url, fill=type)) +
geom_bar(stat="identity", position=position_dodge()) +
xlab("Ano - Trimestre") + ylab("Quant. de Repositórios")
ggplot(data=d2015, aes(x=anot, y=events, fill=type)) +
geom_bar(stat="identity", position=position_dodge()) +
xlab("Ano - Trimestre") + ylab("Quant. de Eventos")
Tomando como exemplo o PushEvent, por ser o de maior ocorrência, quando comparamos a quantidade máxima de push events nos demais anos e em 2015 percebe-se que este é mais de 200 vezes menor que nos demais. Ao compararmos essas observações com a dos demais primeiros trimestres vemos que realmente são valores incomuns, podem ter sido ocasionados pela coleta de apenas poucos dias no primeiro trimestre desse ano (em uma hipótese plausível).
Por conter um fato interessante, isolaremos o caso da linguagem Swift: quando foi criada em 2012 em sua primeira versão, possuia código fechado - não aberto a comunidade.
Com a promessa de otimizar os sistemas da Apple e substituir o Objective-C, teve um grande impacto na comunidade com uma popularidade cada vez mais crescente. Após apenas 5 dias do anúncio que a Apple doaria a linguagem para a iniciativa open source se tornou a linguagem mais favoritada em repositórios no GitHub.
swift <- subset(dados, dados$repository_language == "Swift")
#swiftw <- subset(dados_wide, dados_wide$repository_language == "Swift")
swift["anot"] <- paste(swift$year, swift$quarter, sep="-")
ggplot(data=swift, aes(x=anot, y=events, fill=type)) +
geom_bar(stat="identity", position=position_dodge()) +
xlab("Ano - Trimestre") + ylab("Quant. de Eventos") +
ggtitle("Evolução da Quantidade de Eventos por Trimestre")
ggplot(data=swift, aes(x=anot, y=active_repos_by_url, fill=type)) +
geom_bar(stat="identity", position=position_dodge()) +
xlab("Ano - Trimestre") + ylab("Quant. de Repositórios") +
ggtitle("Evolução de Repositórios Ativos por Trimestre")
Nos gráficos acima podemos claramente identificar o enorme crescimento da linguagem ao longo dos trimestres - tanto em eventos quanto na quantidade de repositórios ativos.