Plotando gráficos de caixas com dados sumarizados de média, mediana e quartis com R

Fala galera, dentro da área de estudo da Estatística Descritiva tem um conjunto de valores sumarizados que são utilizados com bastante frequência por analistas dos mais diversos ramos. Cálculos de Média, Mediana, 1º Quartil, 3º Quartil, Mínimo valor, Máximo valor, são alguns dados sumarizados que podem ser facilmente calculados e analisados nos nossos aplicativos.

Quando estamos estudando R, aprendemos a usar o método SUMMARY para olhar estes dados estatísticos na nossa amostragem. Quando este método é disparado contra um dataframe, o R calcula estes sumarizadores nas colunas numéricas e faz algumas outras amostragens em colunas de outros tipos de dados. Vamos focar na coluna numérica e então ver estes valores tanto no resultado do método summary quanto em um gráfico de caixas.

Para este estudo, vamos usar novamente uma base de dados pública da Universidade da Califórnia. Você pode ver mais detalhes desta base de dados no link: http://archive.ics.uci.edu/ml/datasets/Contraceptive+Method+Choice É um dataset que mostra algumas informações sobre a idade da mulher e uso de métodos contraceptivos (e algumas outras variáveis). O objetivo não é entrar em detalhes sobre o resultado do estudo, mas sim, entender estes dados estatísticos e como fazer gráficos com eles em R.

Primeira coisa é colocar a URL para baixar os dados, e então, colocar isso num Dataframe.

Carregar os dado no dataframe

url <- "http://archive.ics.uci.edu/ml/machine-learning-databases/cmc/cmc.data"
data <- read.csv(url, sep=",")

summary(data)

 

Este método summary apresenta o seguinte resultado:

 

Reparem que os dados são sumarizados através dos métodos:

  • Min (Mínimo valor)
  • 1st qu. (1º Quartil)
  • Median (Mediana)
  • Mean (Média)
  • 3rd Qu. (3º Quartil)
  • Max (Máximo valor)

Estes valores são calculados automaticamente com base em cada valor numérico da coluna. Porém, com o nome genérico que o R colocou em cada coluna, não é tão simples saber o que cada coluna representa. Voltando ao site da UCI e lendo os dados relativos à pesquisa, temos as colunas na seguinte ordem:

  • Wife’s age (numerical)
  • Wife’s education (categorical) 1=low, 2, 3, 4=high
  • Husband’s education (categorical) 1=low, 2, 3, 4=high
  • Number of children ever born (numerical)
  • Wife’s religion (binary) 0=Non-Islam, 1=Islam
  • Wife’s now working? (binary) 0=Yes, 1=No
  • Husband’s occupation (categorical) 1, 2, 3, 4
  • Standard-of-living index (categorical) 1=low, 2, 3, 4=high
  • Media exposure (binary) 0=Good, 1=Not good
  • Contraceptive method used (class attribute) 1=No-use, 2=Long-term, 3=Short-term

Vamos colocar estes nomes traduzidos no dataframe e facilitar nossa manipulação. Para isso, veja o código abaixo:

colunas <- c("IdadeEsposa","EducacaoEsposa"
            ,"EducacaoMarido","Filhos"
            ,"ReligiaoEsposa","EsposaTrabalha"
            ,"OcupacaoMarido","PadraoDeVida"
            ,"ExposicaoMidia","MetodoContraceptivo")

colnames(data) <- colunas
summary(data)

 

Analisando novamente o método summary, veja que agora temos cara coluna com um nome apropriado.

Plotando estes dados no gráfico

Para plotar estes dados em um gráfico, é possível usar o Gráfico de Caixa, que representa todos estes valores em uma única representação gráfica visual. Em R o método chamado é o Boxplot, vamos ver isso no código abaixo:

boxplot(IdadeEsposa~MetodoContraceptivo,
        data=data,
        col=unique(data$MetodoContraceptivo)+1,
        ylab="Idade Mulher",
        xlab="Método Contraceptivo",
        main="Boxplot de uso de métodos contraceptivos"
)

 

O resultado desta plotagem é esse gráfico abaixo:

O gráfico foi dividido no eixo X pelos métodos contraceptivos 1 (Não Usa), 2 (Uso de Longo Tempo) e 3 (Uso de Curto Tempo). Todos eles analisando a idade da mulher (no eixo Y) que o consumiu. Porém, quando olhamos o método summary ele fez isso com os dados de todo o dataframe e não separado por tipo de método contracpetivo, igual foi plotado no gráfico.

Para fazer esta separação, vamos criar outros três dataframes cada um baseado em um tipo de método contraceptivo, e então olhar os dados sumarizados destes novos dataframes. Para isso, veja o código abaixo:

data1 <- subset(data, MetodoContraceptivo==1)
data2 <- subset(data, MetodoContraceptivo==2)
data3 <- subset(data, MetodoContraceptivo==3)

summary(data1$IdadeEsposa)
summary(data2$IdadeEsposa)
summary(data3$IdadeEsposa)

 

O resultado destes dataframes só para a coluna IdadeEsposa são os seguintes:

Comparando estes valores do método summary com o apresentado no gráfico de caixas, verão que os dados são os mesmos!

Caso queira saber um pouco mais sobre a Estatística Descritiva, dê uma olhada neste link: https://pt.wikipedia.org/wiki/Estat%C3%ADstica_descritiva

E também se quiser saber mais sobre o Gráfico de Caixa, use este link: https://pt.wikipedia.org/wiki/Diagrama_de_caixa

0  

Implementando o algoritmo K-Means com linguagem R

Fala galera, para implementar o conceito do algoritmo K-Means que foi explicado aqui, vamos hoje escrever um pouco de código na linguagem R e tentar entender um pouco mais esse método de aprendizado de máquinas não supervisionado.

Para este experimento vou usar um dataset público existente no diretório da UC Irvine, que tive o prazer de conhecer quando fiz uma Especialização de Ensino Virtual. Para acessar o repositório e encontrar as dezenas de dataset disponíveis, acesse este link: http://archive.ics.uci.edu/ml/datasets.html. O dataset que vamos usar será Daily and Sports Activities Data Set que apresenta informações capturadas a cada 5 minutos de 8 pessoas (4 mulheres e 4 homens) entre 20 e 30 anos que realizaram 19 atividades físicas coletadas (eixos X, Y e Z) pelos sensores Acelerómetro, Magnetómetro e Giroscópio totalizando 9 amostragens de dados em cada uma das 5 partes do corpo, sendo Dorso, Braço Direito, Braço Esquerdo, Perna Direita e Perna Esquerda. O arquivo com os dados coletados está no link: http://archive.ics.uci.edu/ml/machine-learning-databases/00256/. Para exemplificar, vamos analisar somente os dados coletados dos sensores das pernas e de um único exercício, mas fique a vontade para fazer com qualquer sensor ou exercício.

Vou entender que você já tem o RStudio em sua máquina, caso não tenha, recomendo fortemente a leia disso.

Acessando e recebendo os dados externos

Usando R é possível trabalhar com a leitura e tratamento de dados externos em diversas origens. Pode ser um JSON, um XML, ZIP, e mais uma porção de outros formatos de dados. Neste caso vamos baixar um arquivo Zip e extrair seu conteúdo, em seguida vamos ler os dados e trabalhar com um pouco de descoberta em cima disso com os clusters.

Para baixar o arquivo via código e poder replicar o experimento sempre que precisar, vamos informar qual será o diretório de trabalho e quais os dados do arquivo que deve ser baixado. Depois de baixar o aquivo de 160MB, é necessário extrair os dados e ver o que aparece.

Veja o código abaixo como fazer isso:

setwd("C:/Temp/KMeans")

url <- "http://archive.ics.uci.edu/ml/machine-learning-databases/00256/data.zip"
destfile <- "data.zip"

download.file(url, destfile, mode="wb")

unzip("data.zip")

O resultado é um conjunto de pastas com diversos arquivos dentro. Se navegar pra dentro das pastas, vai encontrar os 60 arquivos txt em cada uma das pastas p* (que é uma pra cada das 8 pessoas) e por sua vez estão dentro das pastas a* (que representam as atividades). Se abrir um dos arquivos txt, irá encontrar as 45 colunas com as coletas de cada um dos sensores. Não se assuste com esse monte de números, tudo ficará mais claro no decorrer do texto.

Transformando os dados do arquivo em um DataFrame do R

Quando se abre o arquivo txt bruto não é tão simples de identificar o que são esses números. Lendo a documentação do Dataset fornecido no link lá em cima, entendemos a estrutura de como os dados são armazenados e quais são as colunas. Para este experimento, vamos usar a atividade número 15 – Pedalar na bicicleta ergométrica na horizontal – e analisar somente os sensores de pernas. Veja o código abaixo:

atividade <- 15
DadosDeOrigem <- gsub(" ","",paste(getwd(), "/data/a", atividade))
setwd(DadosDeOrigem)
Diretorios <- list.files()
TotalPessoas <- length(Diretorios)

DadoBruto <- NULL

i <- 1
while (i <= TotalPessoas)
{
  setwd( gsub(" ","",paste(DadosDeOrigem, "/", Diretorios[i])) )
  LerArquivos <- list.files()
  j <- 1
  while (j <= length(LerArquivos))
  {
    DadoBruto <- rbind(DadoBruto, read.table(LerArquivos[j], sep=","))
    j <- j+1
  }
  i <- i+1
}

#Colocar as colunas que são interessantes analisar
SoPernas <- DadoBruto[,28:45]

colnames(SoPernas) <- c("DAX", "DAY", "DAZ", "DGX", "DGY", "DGZ", "DMX",
 "DMY", "DMZ", "EAX", "EAY", "EAZ", "EGX", "EGY", "EGZ", "EMX", "EMY", "EMZ") 

Para terminar esta parte de acesso, todos os dados de pernas (coluna 28 até 45) da atividade 15 foram armazenados em um novo Dataframe chamado SoPernas. Foi dado um nome para coluna, seguindo a lógica:

  • D = Direita
  • E = Esquerda
  • A = Acelerómetro
  • G = Giroscópio
  • M = Magnetómetro

A coluna DAX significa D (direita) A (acelerómetro) X (eixo X). A coluna EGZ significa E (esquerda) G (Giroscópio) Z (eixo Z). E assim por diante.

Separando os dados em clusters

Depois dos dados tratados, usar o algoritmo de Kmeans é relativamente simples. Ele recebe o dataset que deve ser consultado e o conjunto de segmentos que deve criar. Como já sabemos que são 8 pessoas que fazem parte da amostragem, não precisamos rodar aquele algoritmo de Elbow Method para descobrir quando grupos é possível criar. Veja o código simples abaixo, que recebe o processamento do K-Means e depois mostra a quantidade de elementos do dataframe que foi classificado em cada um dos clusters .

Resultado <- kmeans(SoPernas[1:2], 8);
Resultado$size 

Após a execução do KMeans, pode-se plotar os dados em um gráfico e ver como o algoritmo separou os dados nos 8 grupos que foram solicitados. Para facilitar o entendimento, vou plotar somente os dados de DAX e DAY, para um gráfico simples de duas dimensões, usando o recurso de poder plotar cada grupo em uma cor diferente para facilitar a análise de quem está observando.

plot(SoPernas[1:2], col = Resultado$cluster, pch= 19)

Se quiser colocar cada ponto central de um centróide, pode usar este código abaixo na sequência da plotagem do gráfico:

points(Resultado$centers[,1:2], col="orange", pch=8, cex=2)

Após plotar o gráfico com os 8 segmentos, é possível identificar facilmente os grupos que o Kmeans separou.

Quando um novo item for inserido no dataset, ele ficará associado a algum dos clusters. Com isso, você não precisa necessariamente saber se o dado é de uma mulher de 20 anos ou de um homem de 30, simplesmente ao analisar o dado novo contra os dados já processados, o computador vai entender onde estes dados se enquadram e vai te retornar qual é o genero e a idade que ele estima que seja. Simples, não?!

0  

Entendendo como funciona o algoritmo de Cluster K-Means

Fala galera, uma das formas que existe para se trabalhar com aprendizado de máquinas (machine learning) é o aprendizado não supervisionado. Diferente do aprendizado supervisionado onde você informa o computador o que ele deve procurar e aprender, no aprendizado não supervisionado a gente não sabe exatamente o que estamos tentando ensinar o computador a aprender, então precisamos recorrer à agrupadores lógicos de segmentação para encontrar similaridade entre os dados da amostra e com isso, definir um padrão e assumir que este padrão encontrado é o que estamos tentando ensinar o computador, que por sua vez, vai aprender a encontrar esse padrão sempre quando for solicitado. Depois de descoberto o padrão, qualquer item novo que tenha uma similaridade com aquele segmento (cluster) pode ser inferido que ele “faz parte daquilo”.

A proposta deste post é mostrar com um certo nível de detalhes como segmentar a amostragem em grupos e descobrir padrões nos dados, usando tanto o Azure Machine Learning quanto a linguagem R. Vamos comerçar entendendo o algoritmo, em seguida vou publicar explicando a aplicação disso com códigos em R e em outro post faremos o mesmo processo no AzureML.

 

Agrupando os dados

Para exemplificar, pense em um dataset com algumas amostras dispostas nos eixo X e Y, como o gráfico abaixo. Seu objetivo é agrupar estes dados baseado em sua similaridades. Consegue fazer isso?

É possível bater o olho neste gráfico e ver a separação em alguns grupos. Cada um de nós que olhar o gráfico pode tentar criar um número diferente de cluster, ou até mesmo quando a quantidade de cluster for igual, pode-se pensar em agrupamentos de formas diferentes. Por exemplo, alguns podem ver a separação com apenas 2 clusters, e o gráfico poderia ser assim:



Qual é o certo? Todos estão certos! Isso pode acontecer de acordo com a interpretação de cada um dos observadores que encontraram apenas 2 grupos nestes dados. Outros podem encontrar 3 grupos, e não apenas dois, podendo chegar a definições como estas:



E aqui, qual dos gráficos é o certo? O certo é com 2 grupos ou com 3 grupos? Mais uma vez isso é dificil de responder, todos os 6 gráficos estão corretos de acordo com a visão de cada observador. Para ajudar a responder esta questão, existem alguns métodos usados e bem aceitos no meio científico, leia mais sobre eles aqui: https://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set. Um destes métodos é o Elbow Method, que voltaremos a falar sobre ele mais pra frente.

Entendendo como funciona o algoritmo

Para entender o funcionamento vamos separar em 2 clusters e entender os passos que o algoritmo K-Means faz como os dados para convergir em um resultado. Neste caso o K será igual a 2, criando os 2 clusters que estamos buscando. O K, de K-Means, é a quantidade de centróides (pontos centrais dos grupos) que serão criados e ajudará a encontrará a similaridade dos dados.

Uma das formas de iniciar o processo é o algoritmo inserir o K pontos (centróides) aleatórios iniciais. Pode ser qualquer lugar do plano, para em seguida começar as iterações e encontrar os resultados.

Veja dois pontos aleatórios criados no gráfico, e uma linha tracejada que é calculada aproximadamente na metade da distância dos pontos Vermelho e Azul. Com este segmento, os ítens que estão plotados acima da linha tracejada fazem parte do grupo vermelho e os de baixo da linha fazem parte do grupo azul.

A primeira iteração do algoritmo é calcular a distância média de todos os pontos que estão atrelados ao centróide, e então mudar a posição do centróide para o novo ponto que foi calculado, que é a distância média de todos os pontos que se ligaram à aquele centróide. Essa mudança de posição do centróide pode alterar os itens que fazem parte daquele grupo. Veja isso na imagem abaixo:



Reparem que após a iteração do cálculo da média, alguns pontos mudaram de centróide, os pontos que estão marcados em verde passaram do centróide azul para o vermelho, e o que está marcado em azul passou do centróide vermelho para o azul. Essa iteração de cálculo da média da distância dos pontos até o centróide ocorre em loop até que nenhum ponto mude de centróide, isso acontece quando os centróides param de se mover porque já estão na posição central da distância entre os pontos.



Veja que entre a penúltima iteração e esta não ouve mais mudança de pontos entre o gráfico e o centróide, fazendo com que o algoritmo K-Means pare sua execução chegando ao resultado esperado e criando dois grupos. Assim, quando um novo item for incluído no gráfico, ele já terá um grupo que atende aquela região e o computador já saberá do que se trata o dado novo.

Escolhendo a quantidade de K (clusters) no algoritmo

Como falado alguns parágrafos atrás, o Elbow Method é uma das formas usadas. Ele tem esse nome por se parecer com o formato de um “braço” e nós sempre procurarmos o “cotovelo” pra definir que este é o número aceitável de K (clusters) a serem criados com base nos dados da amostra. Este método vai crescendo a quantidade de clusters a partir de 1 e analisando o resultado melhorado a cada incremento. Quando o benefício parar de ser relevante (um salto entre uma quantidade de cluster e a próxima quantidade) ele entra em um modelo platô, no qual a diferença da distância é quase insignificante. É neste momento que entende-se que o algoritmo é relevante com aquela quantidade de K e então ele deve ser usado pra segmentar os dados do gráfico.

Depois de executar o código do algoritmo do Elbow Method e olhando para os dados que estamos apresentando como exemplo, um bom número de K para ele é o número 4.

Rodando o algoritmo com 4 centróides, é possível ver a transformação acontecendo nesta segmentação:



Neste cenário, quando qualquer item novo for adicionado na base de dados, o algoritmo saberá classificar a qual grupo este novo item pertence. Nos próximos posts vou mostrar uma implementação em R e depois outro post com a implementação em Azure Machine Learning.

0  

Instalando o R e o RStudio para começar a trabalhar com Data Science

Fala galera, uma das ferramentas [free] mais interessantes e usadas por cientistas de dados é o R. Esta poderosa linguagem de programação criada na década de 70 é usada até hoje por matemáticos, estatísticos e cientistas ao redor do mundo. Com alguns poucos passos você consegue instalar o Framework R e o Rstudio em sua máquina e conseguirá usar todo o potencial de análise e exploração de dados existente nos pacotes criados por desenvolvedores até os dias de hoje.

A primeira coisa a se fazer é acessar o CRAN [The Comprehensive R Archive Network] pra fazer o download do Framework R para seu sistema operacional. Vou fazer pra Windows que é o que uso, mas existe também pra Mac OS ou distribuições Linux. Para isso, acesse o link https://cran.r-project.org/ e procure a área pra download.

Você será encaminhado para a página de download para Windows. Se quiser acessar diretamente, use o link https://cran.r-project.org/bin/windows/base/

A versão pra Windows tem por volta de 64MB… Depois de baixar é só instalar, pode usar as configurações padrão sem problema.

Após a instalação do framework, uma IDE é fornecida mas ela é bem menos interessante de se trabalhar do que o R Studio. Vamos fazer o download e instalação do RStudio para ter produtividade com a ferramenta. Para baixar o RStudio, acesse o link: https://www.rstudio.com/products/rstudio/ e procure o download para desktop [que também é free]. Ao clicar para fazer download da versão Desktop, você será redirecionado para uma nova página, que pode ser acessada diretamente em https://www.rstudio.com/products/rstudio/download/

Após fazer o download, abra e siga as intruções padrão do wizard de instalação. Dentro de instantes o RStudio estará disponível para uso.

Abra a instalação e divirta-se com as possibilidades de análise e exploração de dados!

0  

The Developers Conference 2015 – Trilha de Banco de Dados

Fala galera, dia 21/07 rolou em São Paulo a trilha de Banco de Dados do TDC – The Developers Conference – edição 2015 em São Paulo. Nesta trilha me juntei ao Marcus Vinicius Bittencourt (twitter|blog) como coordenadores pra fazer esta parte do evento acontecer. Acompanhe aqui todas as palestras da trilha de Banco de Dados do TDC 2015!

Depois de analisar as diversas palestras submetidas, foi difícil definir quais seriam as 7 palestras que entrariam na grade do evento. Bom, pra dar um gostinho do que rolou nesta trilha do evento, vejam as palestras:


 

10:10 às 11:00 | A “Metamorfose Ambulante” do Postgres – Fábio Telles Rodriguez (twitter|blog)

De “Sistema Gerenciador de Banco de Dados Relacional” até “Plataforma de Persistência Aberta”, ou algo parecido. Acompanhe como as coisas evoluíram de 1970 para cá e fizeram do Postgres uma das mais flexíveis e confiáveis plataformas para persistência de dados, passando pelos bancos “Orientados a Objeto” e pelo NoSQL.


11:10 às 12:00 | O problema não é no banco de dados – Marcos Freccia (twitter|blog)

Nessa sessão junte-se ao MVP em SQL Server Marcos Freccia e vamos debater maneiras de mostrar que o problema não está no banco de dados. Vamos criar baselines e reports utilizando apenas o Database Engine, SSIS e SSRS. Ferramentas essas que você ja paga quando licencia o seu banco de dados.


13:10 às 14:00 | Quer ser um excelente DBA? Pergunte-me como – Vitor Tadeu Fava (twitter|blog)

Nesta seção discutiremos quais as características um excelente administrador de banco de dados necessita no mundo corporativo atual e como adquirir e desenvolver estas habilidades.


14:10 às 15:00 | Novidades do Universo MySQL – Airton Lastori (twitter|blog)

Os engenheiros da Oracle andam ocupados: o MySQL 5.7 já está em estágio de Release Candidate e muitas novidades. Nesta apresentação abordaremos as novidades desta versão e também algumas melhorias do MySQL Cluster, detalhando os novos recursos como: interfaces NoSQL, Memcached API, JSON e HTTP, mais operações online, melhorias de desempenho no InnoDB e Otimizador, replicação multi-source entre outras.


15:40 às 16:30 | Como lidar com dados temporais e intervalos com a linguagem SQL – Mauro Pichiliani (twitter|blog)

A manipulação de dados por meio de intervalos de datas é uma das poucas tarefas na qual a linguagem SQL não é muito útil. O motivo é operações como intersecção , precedência, combinação e operações relacionadas a intervalos de datas requerem a construções de instruções SQL muito complexas e com pouca manutenabilidade. Esta palestra vai apresentar os principais problemas relacionados à pesquisas por intervalos de data e explicar porquê a linguagem SQL não é adequada para lidar com eles. Em seguida a palestra vai se conentrar nas soluções existentes, incluindo as extensões da linguagem SQL para manipulação de data, interfaces para ferramentas OLAP e ferramentas específicas para pesquisas por intervalo.


16:40 às 17:30 | As boas praticas de programação para SQL Server – Marcelo Fernandes (twitter|blog)

Será apresentando as boas praticas de programação de SQL visando o publico de developers, a apresentação seguirá o modelo onde é apresentando um proposta comum de solução e qual seria a maneira mais eficaz e performática para a solução. Será discutidos temas como Índices, Estatísticas, T-SQL, Planos de Execução e inmemory database.


17:40 às 18:30 | Super Hybrid – Murilo Miranda (twitter)

Esta sessão reúne todas as opções existentes, até então, que permitem a integração do SQL Server com o Azure.
Além da teoria, irei abordar e demonstrar esta soluções.


Espero que tenham gostado das palestras do evento, caso queira ver os vídeos, o TDC também oferece as gravações

Nos vemos novamente em 2016!

0