Um pequeno experimento com uso de funções em Análise de Dados com R no Universo Tidy

July 6, 2017 no comments Posted in Análise de Dados, R

O tidyverse ou universo ‘arrumado’ é uma coleção de pacotes R que compartilham filosofias comuns e são projetados para trabalhar em conjunto de dados ditos “tidy” e que podem ser melhor conhecidos no site http://tidyverse.org/   . Grande parte dos pacotes foi desenvolvida pelo Hadley Wickham.

Se você é novo no tidyverse o melhor lugar para aprender a philsophy completa e como tudo se encaixa é o livro “R para de ciência dos dados” de autoria do Garrett Grolemund e do
Hadley Wickham. Este livro está disponível gratuitamente online .

A novidade que mais me interessou logo a princípio foi o  uso do tibble no lugar do data.frame. Em termos práticos de representação da informação são a mesma coisa, mas a sua manipulação é mais simples, mais direta e toda focalizada no uso de Pipes ( %>% ) e na estrutura de comandos no estilo do ‘dplyr’.  Dplyr por sua vez que merece cada vez mais uma revisão dada a enorme quantidade de funções implementadas nas versões mais recentes.

Existem N artigos interessantes sobre esse universo, mas ainda poucos na língua portuguesa. Espero que outros se animem.

Eu sou um usuário pouco sistemático, as vezes inicio de forma estruturada, mas com frequência me pego tendo que refatorar o código que cresceu demais sem os devidos cuidados. A medida que o código começa a ficar repetitivo quero usar funções e hoje resolvi testar como seria usar o ‘dplyr’ dentro de uma função recebendo os nomes das variáveis como parâmetros de uma função.

Em termos de operadores a coisa é meio “feia”, mas funciona que é uma maravilha.

Aqui um pequeno exemplo que pelas imagens já fica claro como proceder.

Primeiro o meu tibble, o equivalente a um data frame. 100 linhas, 9 colunas, ao imprimir primeira vantagem, observem o que tibble só imprime as 10 primeiras linhas por padrão e já exibe o tipo de dados de cada coluna, menos filtros do tipo [1:10,]  ou head(dataframe),  e muito menos um lapply( dataframe, class ) para investigar os tipos.

Um tibble quando lido de um arquivo externo ou convertido não faz aquela “eca” de converter strings em fator por padrão.

Então suponha que irei fazer N sumários de descrições dos dados usando o ‘dplyr’ e não quero ficar copiando e colando código e alterando nome de variáveis na mão. Usar funções é o racional nesse caso.

Aqui uma pequenina função que recebe o tibble,  dois parâmetros o nome da variável com a qual quero agregar/agrupar os meus dados que chamnei de group_by e outra variável expr, da qual pretendo contar ocorrências, média e soma dos seus valores.

Quais são os detalhes importantes?

  • a função enquo() que irá receber um parâmetro sem aspas, envolvê-lo para depois ser realizado como um nome de um atributo e não uma string. O ‘dplyr‘ entende que expr é uma variável que contem o nome de uma variável;
  • a função quo_name() que é realmente massa, pois irá permitir que concatenemos o nome da variável com outra string para ser usado no “lado direito” da atribuição;
  • operadores “!!”  e “:=” .

Pronto. Agora já podemos chamar a função para cada atributo de interesse e receber os sumários.

Adorei.

Para saber mais sobre Análise de Dados no Universo Tidy.

 

Hadley Wickham, o homem que revolucionou o R

July 6, 2017 no comments Posted in Análise de Dados, R

Uma das novidades mais impactantes no mundo R tem sido a contínua contribuição do Hadley Wickham e seus pacotes, inicialmente com o reshape e agora com um leque amplo de ferramentas que implementam o “Tidyverse”.

A lista é extensa demais 

O Hadley é uma máquina.
Interessante é que há já uma linha forte de instrutores de R e professores de Estatísitca que advogam o ensino do R via a visão e a notação do Tidyverse.
Eu uso parte do universo há algum tempo, mas de forma desleixada, e a cada dia descubro que existe um recurso que me facilitaria a vida se tivesse estudado de forma mais sistemática.

Aqui uma matéria extensa e muito boa que saiu na Priceonomics.

Priceonomics turns data into great stories. We’re a collection of writers, data scientists, engineers and analysts that are obsessed with creating and spreading quality, data-driven information. We’re based in San Francisco, CA and funded by great investors like Y Combinator, Spark Capital, SV Angel and more.

https://priceonomics.com/hadley-wickham-the-man-who-revolutionized-r/

 

Bye Bye “Fortify” >> broom: let’s tidy up a bit #R

June 24, 2017 no comments Posted in Análise de Dados, R

[tradução Google Translated livremente adaptada]

O pacote “broom” tira a saída desordenada de funções incorporadas em R, como lm, nls ou t.test, e as transforma em quadros de dados arrumados.

O conceito de “TIDY DATA”, apresentado por Hadley Wickham, oferece uma estrutura poderosa para manipulação e análise de dados.

O artigo faz uma proposição convincente sobre o problema que este pacote tenta resolver (enfâse a minha): enquanto as entradas do modelo geralmente requerem entradas arrumadas, tal atenção aos detalhes não se aplica ao modelo  de saídas. Saídas como previsões e coeficientes estimados nem sempre são arrumadas. Isso torna mais difícil combinar resultados de vários modelos.

Por exemplo, em R, a representação padrão dos coeficientes do modelo não é organizada porque não possui uma variável explícita que registre o nome da variável para cada estimativa; em vez disso, elas são registradas como nomes de linhas.

Em R, os nomes de linha devem ser únicos, de modo a combinar coeficientes de muitos modelos (por exemplo, de resmastras de inicialização ou subgrupos) requerem soluções alternativas para evitar a perda de informações importantes. Isso o afasta do fluxo de análise e torna mais difícil combinar os resultados de vários modelos.

Atualmente, não conheço nenhum pacote que resolva esse problema.

O “broom” é uma tentativa de preencher a lacuna das saídas desordenadas de previsões e estimativas para os dados arrumados com os quais queremos trabalhar.

Centra-se em torno de três métodos S3, cada um dos quais obtém objetos comuns produzidos por funções estatísticas R (lm, t.test, nls, etc.) e converte-os em um quadro de dados.

O pacote “broom” é especialmente projetado para trabalhar com o pacote Dplyr de Hadley (veja a vassoura da vassoura + dplyr para mais).

O pacote “broom” deve ser distinguida de pacotes como reshape2 e tidyr, que reorganizam e remodelam os quadros de dados em diferentes formas. Esses pacotes executam tarefas críticas na análise de dados arrumados, mas se concentram na manipulação de quadros de dados em um formato específico para outro.

Em contraste, pacote “broom” é projetado para ter um formato que não está em um quadro de dados (às vezes, nem em qualquer lugar próximo) e convertê-lo em um quadro de dados arrumado.

A organização das saídas do modelo não é uma ciência exata, e é baseado em um julgamento dos tipos de valores que um cientista de dados normalmente deseja fora de uma análise arrumada (por exemplo, estimativas, estatísticas de teste e valores de p).

Você pode perder algumas das informações no objeto original que você queria, ou manter mais informações do que você precisa.

The broom package takes the messy output of built-in functions in R, such as lm, nls, or t.test, and turns them into tidy data frames. The concept of “tidy data”, as introduced by Hadley Wickham, offers a powerful framework for data manipulation and analysis. That paper makes a convincing statement of the problem this package tries to solve (emphasis mine): While model inputs usually require tidy inputs, such attention to detail doesn’t carry over to model outputs. Outputs such as predictions and estimate

Source: broom: let’s tidy up a bit

Photo:  Santeri Viinamäki [CC BY-SA 4.0 (http://creativecommons.org/licenses/by-sa/4.0)], via Wikimedia Commons

Como Instalar o R no Android  | Linux Journal

June 22, 2017 no comments Posted in R

Este mês, você também aprenderá a instalar o software de estatística R completo em um dispositivo Android móvel. Os dispositivos móveis são poderosos o suficiente para instalar esses pacotes, e com a ajuda de Marius Hofert e Kurt Hornik, você aprenderá a usar o Linux em um ambiente chroot no Android. Mesmo que você não esteja interessado em instalar o R, o processo de instalação do Linux no Android é fascinante e divertido! Marius e Kurt passam por todo o processo, incluindo informações sobre desbloqueio de bootloaders e dispositivos de rooting.

LINUX JORNAL

Sources:

June 2016 Issue of Linux Journal | Linux Journal

How we R in android

How we R in Android (pdf)

 

Calcular a hora do nascer e do pôr do Sol usando R. sunrise.set {package: StreamMetabolism}

May 17, 2017 no comments Posted in Código, R

sunrise.set {StreamMetabolism}

Esta função calcula o horário do nascer do sol no formato POSIXct e o retorna em um formato acessível para  exportação como um arquivo csv ou uso direto em seu código. Esta função é baseada em mapas que se baseiam na calculadora NOAA de horários de nascer e por do sol.

Exemplo de uso:

http://artax.karlin.mff.cuni.cz/r-help/library/StreamMetabolism/html/sunrise.set.html

Uma aplicação interativa em Shiny, R e Radarchart para visualização de Diagramas Kiviat

March 28, 2017 no comments Posted in Análise de Dados, R, RStudio, Shiny

Na publicação anterior (Diagramas Kiviat (Spider Charts) em R!)  vimos como é simples produzir  um diagrama de Kiviat ou Radar Chart no R com o pacote radarchart.

Aqui a versão do exemplo para o Shiny.

O visitante tem apenas a opção de escolher o nome de uma ou mais pessoas o grafico se atualiza automaticamente.

Uma aplicação Shiny é composta por 2 seções, a interface e o servidor, que podem ser definidos em um mesmo arquivo ou em dois (ui.R, server.R). O RStudio oferece facilidades para o desenviolvimento de aplicações Shiny. Saiba mais em “Aplicações “Shiny”, um primeiro contato usando o RStudio.

O código a seguir é capaz de produzir a aplicação cuja interface podemos ver abaixo. O gráfico é redesenhado em função das seleções no checkbox e dados são exibidos sobre os pontos no gráfico.

 

A interface:

 

 

 

O Servidor:

Referências Bibliográficas, Métricas, Fatores de Impacto, Co-citação? > Bibliometrix

December 1, 2016 no comments Posted in Análise de Dados, R

Pouco tempo para escrever, mas continuo tentando coletar coisas interessantes do mundo R e assemelhados. O conteúdo desse post interessa aos que lidam referências bibliográficas e gostam de gráficos.

Com a falta de tempo aqui terei uma enxurrada de links relacionados a gráficos relacionais, associações, publicações e conexões entre autores.

As descobertas da semana vieram no curso de tentar representar de forma hierárquica e também histórica um conjunto de referências bibliográficas disponíveis em sites especializados como o Web of Science, Scopus e Google Scholar.

A representação que desejo se assemelha a uma árvore onde os níveis são função das datas e cada nó pode ter mais pai, ou seja, um grafo acíclico direcionado,  mas com um layout de representação bem particular, similar ao da figura a seguir.

Alguns autores chamam de lattice, o que geral provoca alguma confusão com lattices em cristais, pelo menos em buscas no Google isso fica evidente.

Ou seja tenho alguns problemas para resolver, obter a informação, extrair a parte interessante e isso com frequência é muito mais complicado do que parece e ao fim representar os achados no formato desejado.

As fontes das informações priorizei as do Scopus e Web of Science em função do primeiro achado, o BIBLIOMETRIX. Um pacote para R que opera sobre referências bibliométricas em vários formatos entre eles o BIBTex.

 

Resumidamente, o Bilbiometrix é capaz de a partir de suas referências bibliográficas extrair uma série de indicadores de produção dos autores, fatores de impacto de revistas etc e tal, e o mais importante, as referências e  as citações, permitindo análises de co-citação.

Alguns dos relatórios que o Bibliometrix é capaz de produzir.

 

O Bibliometrix produz grafos de co-citação, mas acho de pouco utilidade, vejam o exemplo.

Parte da dificuldade é oriunda de diversidade de formatos das referências que ocorrem em cada referência, aqui um pequeno exemplo

Onde para os meus objetivos de exibir em diagrama a principal dificuldade é a existência de informações adicionais depois do título e que podem estar ou não presentes. Alem disso o ano está embebido no título e entre parêntesis e para piorar existem títulos que adotam vírgulas, mas isso é outra conversa.  Até o presente momento já consegui extrair o núcleo da informação no formato <ano> | < primeiro autor> | < parte inicial do título >

[1] “1993 | AGRAWAL, R | MINING ASSOCIATION RULES BETWEE…;1995 |  AGRAWAL, R | MINING SEQUENTIAL PATTERNS (199…;1996 |  AGRAWAL, R | FAST DISCOVERY OF ASSOCIATION R…;1995 |  BAIROCH, A | THE PROSITE DATABASE, ITS STATU…;1996 |  BETTINI, C | TESTING COMPLEX TEMPORAL RELATI…;1997 |  DAS, G | EPISODE MATCHING (1997) PROCEED…”

A seguir irei produzir o lattice desejado a partir dessa estrutura de informação. Veremos. Hei, esqueci em falar nos pacotes gráficos que encontrei nessa busca. Sem tempo agora, fica para a próxima.

Bye,

João Carlos

Qual o Caminho mais rápido com R? O Problema do Delivery de Sushi – Pizza. parte 1 de 3

November 23, 2016 no comments Posted in R para não Programadores

Iremos explorar um assunto interessante, como calcular o caminho que leva menos tempo saindo de local passando por outros e retornando ao local de origem.

Esse problema esta relacionado ao nosso capítulo sobre mapas de uma forma indireta, não só porque podemos representar rotas entre dois ou mais pontos em um mapa Leaflet, como podemos com R acessar serviços como o Google Maps ou OpenStreetMap e desenvolver uma aplicação “nossa” envolvendo caminhos, tempos e mapas.

Interessou?

Para ser didático o caminho será longo, talvez 3 publicações para não cansar os leitores.

Esse problema me ocorreu a pensar em estratégias para tentar reduzir o tempo de entrega em sistemas de delivery. Em geral as rotas são traçadas em conhecimento da região e muito sentimento, mas como seria um modo “algorítmico” de resolver o problema?

Aviso que esse é tema muito estudado por cientistas da computação e que envolve a busca de caminhos mínimos e otmização, mas como somos “não-programadores“, vamos nos permitir uma solução simples, usaremos de “força-bruta”.

Força-bruta

porque iremos coletar todas as rotas possíveis, somar os seus tempos, e escolher a que for menor. Existem soluções sofisticadas que estão no escopo da Teoria dos Grafos e envolvem os chamados Circuitos Hamiltonianos. Você verá que esse exercício irá oferecer oportunidades interessantes de aprendizado de R e estruturas básicas de programação.

Primeiro vamos explorar as rotas possíveis e relembrar  noções de permutação.

No caso mais simples um entregador sai da loja, vai apenas a um cliente e retorna a loja, certo?

Se usarmos letras para representar os pontos do trajeto podemos usar L(oja) > C(liente)  > L(oja) , ou L > C > L, ou um sistema numerado 1 > 2 > 1. Nesse caso fica claro que não existem variações possíveis, só existe essa sequência  1 > 2 > 1.

Adicionando 2 clientes agora temos mais de um rota possível, vejamos:

  • Rota 1 : Loja > Cliente 1 > Cliente 2 > Loja  ou
  • Rota 2: Loja > Cliente 2 > Cliente 1 > Loja

Supondo que eu sei o tempo de deslocamento entre Loja e Cliente 1 , Cliente 1 e Cliente 2, Cliente 2 e Loja, já podemos pensar em com contabilizar e escolher o que demora menos, mas precisamos organizar melhor esses conceitos para facilitar as nossas contas, uma tabela talvez?

Origem Destino Tempo (minutos)
Loja Cliente 1 10
Cliente 1 Cliente 2 5
Cliente 2 Loja 8

 

E como ficariam as nossas contas?

Tempo 100 + 50 + 80 = 23

Na forma como está colocado as 2 rotas são indiferentes porque assumimos silenciosamente que os tempos de ir de A para B é igual ao de B para A, algo que no trânsito não é verdade.

A nossa tabela deve ter tambem os tempos de volta em cada trecho possível.

Origem Destino Tempo
Loja Cliente 1 10
Cliente 1 Cliente 2 5
Cliente 2 Loja 8
Cliente 1 Loja 8
Cliente 2 Cliente 1 7
Loja Cliente 2 6

Uma situação que pode ser visualizada na figura a seguir.

Diagrama de Rotas Possíveis entre 3 locais

Opa

E agora temos algo mais realista e uma conta simples irá revelar qual a rota é a mais rápida, vejamos:

Rota 1 Tempo Rota 2 Tempo
Loja > Cliente 1 10 Loja > Cliente 2 6
Cliente 1 > Cliente 2 5 Cliente 2 > Cliente 1 7
Cliente 2 > Loja 8 Cliente 1 > Loja 8
23

21

Uma representação bem condensada para todas as distâncias possíveis entre um conjunto de locais quaisquer é uma matriz de adjacências, nela as linhas e colunas são os locais e nas células as distâncias, tempos ou outras grandezas que as relacionem.

Loja

Cliente 1

Cliente 2

Loja

10 8

Cliente 1

8

5

CLiente 2

8 7

A loja de onde partem as entregas é o nosso ponto fixo e as rotas possíveis são todas as permutações entres os destinos das entregas.

Para estimar as possibilidades de rotas em uma entrega para 4 clientes temos que calcular as permutações entre os 4, ou 4! = 4 x 3 x 2 x 1 -> 24 rotas possíveis. Duvida? Vamos verificar.

Análise Combinarória

Esse capítulo não é sobre contagens ou análise combinatória, estamos querendo resolver o problema de nossa loja de delivery, mas estamos vendo que quem odiou esse item na escola agora pode ver um exemplo real da sua utilidade. Outro detalhe importante é que mesmo que o R ou qualquer outro programa ou o Excel realize a conta, sem estudarmos os conceitos e analisar as possibilidades não saberíamos qual a formulação correta a aplicar. Logo se o assunto lhe está parecendo espinhoso ou esquecido nas brumas do passado, que tal recordar um pouqinho sobre análise combinatória?

Mas e o R?  Como ele pode nos ajudar, primeiro no pacote básico temos a função combm, que gera as combinações possíveis de M elementos N a N sem que esses r. Lembram?

Dados 4 elementos quantas combinações possíveis 2 a 2?

combn(1:4,2)
combn(c(“a”, “b”, “c”, “d”) , 2)
pessoas = c(“joão”, “maria”, “pedro”, “leonardo”)
combn( pessoas, 2)

Acima alguns exemplos de como podemos explorar combinações no R, uma sequência “1:4”, um vetor anônimo c(“a”, “b”, “c”, “d”) e um vetor chamado pessoas, o resultado é uma matriz com as combinações possíveis.

Teste no seu console. Eu espero. 🙂

Para mim o resultado é o que está na figura abaixo.

Screen Shot 2016-11-24 at 08.31.34.png

Felizmente, tudo de acordo com a Lei.  Combinações de M objetos N a N é calculado como M!/ ((M-N)! N!)  no caso acima 4! / 2! x 2! = ( 4 x 3 x 2 x 1) / (2 x 1) x (2x 1) = 6.

Se pretendemos usar esse resultado depois, precisamos armazenar o resultado em alguma varíavel, digamos “pares”, faremos assim

 

> pessoas = c(“joão”, “maria”, “pedro”, “leonardo”)
> pares = combn( pessoas, 2)
> pares
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] “joão” “joão” “joão” “maria” “maria” “pedro”
[2,] “maria” “pedro” “leonardo” “pedro” “leonardo” “leonardo”

e porque essa preocupação com variáveis?  

Bem o nome sugere, é algo que esperemos que possa ser utilizado com valores diferentes. Já logo imagino que o vetor “pessoas” não será digitado no meio do nosso script, mas lido de arquivo ou resultado de uma seleção do usário em uma aplicação R/Shiny.

Disse ante que combm retorna um objeto do tipo “matrix” e como podemos verificar o tipo ou a classe de um objeto?  “class”.  Teste.

class(pares)
[1] “matrix”

Esse comando é importante porque a medida que avançamos em R você verá que para cada Classe de objetos existem operações que só podem ser realizadas em um determinado tipo de objeto e que eventualmente teremos que converter um objeto em outro.

Um objeto matriz é acessado por referências as linhas e as colunas assim matriz [ linha, coluna ]. A seguir algumas possibilidades, teste no seu console.

pares[1,1]
[1] “joão”
> pares[1,2:3]
[1] “joão” “joão”
> pares[1,]
[1] “joão” “joão” “joão” “maria” “maria” “pedro”
> pares[,1]
[1] “joão” “maria”
> pares[]
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] “joão” “joão” “joão” “maria” “maria” “pedro”
[2,] “maria” “pedro” “leonardo” “pedro” “leonardo” “leonardo”

O combn retorna os pares formados como colunas, um possiblidade para impressão do resultado.

for ( i in 1:6)
{
cat(i, pares[,i], “\n”)
}
1 joão maria
2 joão pedro
3 joão leonardo
4 maria pedro
5 maria leonardo
6 pedro leonardo
>

Epa!!  Uau!

Aqui esbarramos com a nossa primeira estrutura de loop e de controle de um programa. Falaremos muito mais sobre loops posteriormente, mas veja que é tranquilo.

O comando FOR é uma instrução que automatiza a geração de valores e a execução do que está entre os colchetes { } .

No caso acima o FOR irá gerar valores para variável  “i” como 1, 2,3, 4, 5, 6 e para cada valor gerado, o que está dentro dos colchetes é executado.

Dentro do colchetes um comando para imprimir no console os valores que estão dentro dos parentênsis   cat(i, pares[,i], “\n”), ou seja, o valor do “i”, mais o valor de “pares[,i]”  e uma instrução para pular de linha “\n”.  Experimente retirar o  “,”\n”” e terás algo assim:

for ( i in 1:6)
{
cat(i, pares[,i])
}
1 joão maria2 joão pedro3 joão leonardo4 maria pedro5 maria leonardo6 pedro leonardo

Bem já dispersamos bastante, mas estamos construindo conceitos para programas cada vez mais poderosos.

Retornando ao nosso problema do entregador de sushi, precisamos de uma forma rápida de calcular permutações e para isso recorrer a um pacote extra, o “combinat“.

Nessa altura instalar pacotes não deve ser mais um problema, no RStudio, menu, Tools > Install Packages.

Pacote instalado vamos explorar as permutações.

Outra coisa do base do R para ajudar em nossos exercícios é o que alguns vetores pré-instalados já estão disponíveis, um deles o  “letters”, veja

letters
[1] “a” “b” “c” “d” “e” “f” “g” “h” “i” “j” “k” “l” “m” “n” “o” “p” “q” “r” “s” “t” “u” “v” “w” “x”
[25] “y” “z”

é um vetor, logo podemos referenciar  assim letters[1:3]

letters[1:3]
[1] “a” “b” “c”

Logo,

library(combinat)
permn(letters[1:2])
[[1]]
[1] “a” “b”

[[2]]

[1] “b” “a”

Recordando que usamos o library() para carregar para a memória a biblioteca antes de usar as funções que ela implementa.

Com 3 elementos começa a ficar interessante.

permn(letters[1:3])
[[1]]
[1] “a” “b” “c”

[[2]]
[1] “a” “c” “b”

[[3]]
[1] “c” “a” “b”

[[4]]
[1] “c” “b” “a”

[[5]]
[1] “b” “c” “a”

[[6]]
[1] “b” “a” “c”

Listas?

Pena que o resultado de “permn” é do tipo “list”, assunto que não queria tratar agora, pois são estruturas mais complexas. Listas podem armazenar listas de objetos de qualquer tipo e dependendo da complexidade da lista navegar por elas pode as vezes ser doloroso. 🙂  Sempre prefiro os data frames por sua equivalência com planilhas do Excel.

Ok, mas não precisamos arrancar os cabelos agora. A lista aqui é simples e podemos acessar os valores usando a notação dos colchetes duplos [[ ]] .

Vamos lá. Direto no console do RStudio.

Screen Shot 2016-11-24 at 09.26.58.png

Legal, não?

Usamos a função permn para gerar todas as permutações possíveis de 3 letras, armazenamos os resultados em uma lista chamada “p” e usamos os [[]] para extrair os resultados.

Mas quantas são as permutações possíveis?  Se você reviu a matéria, ja sabem que o número de permutações de 3 elementos é igual ao fatorial de 3, ou 3!, ou 3 x 2 x 1 = 6, mas temos outro meio de saber isso sem ter que fazer essa conta, basta verificar qual é o “tamanho” da lista “p”.

Se lá estão todas as combinações, logo está resolvido. E ai entra em jogo um eterno aliado em nossos scripts, a função “length”, de length em inglês, o comprimento ou tamanho.

Os exemplos abaixo deixam claro.

length(pessoas)
[1] 4
> length(1:5)
[1] 5
> length(letters[1:7])
[1] 7
> pessoas = c(“joão”, “maria”, “pedro”, “leonardo”)
> length(pessoas)
[1] 4

no caso das nossas permutações, quantas podem existir entre 3,4,5 elementos?

length(permn(3))
[1] 6
> length(permn(4))
[1] 24
> length(permn(5))
[1] 120

Em cima outro detalhe interessante, o uso de função dentro de função length( permn())  e podemos ir longe, como em length(permn(c(“joão”, “maria”, “pedro”, “leonardo”))).

Atenção, a função permn gera as combinações possíveis e a length conta o resultado, logo pode ser lenta para se o número de elementos for alto.

Se quiser apenas calcular o fatorial de um número use a função “factorial”, por exemplo para 10 elementos vemos rapidamente que existem 3.628.800 permutações possíveis.

factorial(10)
[1] 3628800

Pronto agora podemos finalmente retornar ao nosso problema original,

uma loja, x clientes, quantas rotas?

clientes <- c(“c1”, “c2”, “c3”)
rotas <- permn(clientes)
length(rotas)
rotas
“c1” “c2” “c3”
“c1” “c3” “c2”
“c3” “c1” “c2”
“c3” “c2” “c1”
“c2” “c3” “c1”
“c2” “c1” “c3”

mas falta ainda componente essencial, para determinar a rota mais rápida precisamos dos tempos de ida e de volta entre as lojas e os clientes. Ou seja as combinações 2 a 2 entre 4 locais, a loja e os 3 clientes.

> locais <- c(“loja”, “c1”, “c2”, “c3”)
> trechos <- combn(locais,2)
> trechos
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] “loja” “loja” “loja” “c1” “c1” “c2”
[2,] “c1” “c2” “c3” “c2” “c3” “c3”

e claro as rotas opostas,

trechos[1:2,]
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] “loja” “loja” “loja” “c1” “c1” “c2”
[2,] “c1” “c2” “c3” “c2” “c3” “c3”
> trechos[2:1,]
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] “c1” “c2” “c3” “c2” “c3” “c3”
[2,] “loja” “loja” “loja” “c1” “c1” “c2”

Observe os índices da matriz trechos.

Nossa, avançamos bastante.

Agora já temos um modelo para trabalhar. Dado uma loja e N clientes, sabemos como calcular de forma genérica todas as rotas possíveis e temos um método de explicitar todas as distâncias que precisamos calcular para estimar a rota mais rápida.

Próximos passos?

  1. Usar a API do Google para obter os tempos em todos os trechos;
  2. Calcular a rota ótima;
  3. Exibir no mapa.

Vamos nessa?

Bye, não deixe de enviar o seu comentário em caso de dúvidas.

João Carlos

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

R para não Programadores – [6] Finalmente gerando uma página HTML

November 22, 2016 no comments Posted in R para não Programadores

Após longo e tenebroso inverno aqui estamos!.

O que falta para fechar esse pequeno ciclo de nossa aplicação de mapas é passear um pouco pelas possibilidades de exportar o que foi produzido enquanto um página na web.

A página será estática, mas o mapa graças aos recursos do “leaflet” não.

O passo é pequeno em termos de linhas de código, mas tem grandes implicações e algumas barreiras a serem vencidas se realmente pretendermos publicar na web.

Recapitulando rapidamente

estamos agora no estágio de termos uma pequena aplicação que lê dados sobre as capitais do Brasil, filtra aquelas com altitude superior a 200 metros e as exibe em um mapa. Vide aqui.

img_582e0b79ca322

O script e os arquivos de dados podem ser baixados aqui.

O mapa leaflet pertence a uma categoria especial de aplicativos autônomos que podem ser incorporados em páginas web denominados “widgets”. Os mais conhecidos são os aplicativos em Flash, mas que são cada vez menos usados e sendo substituídos por soluções que empregam html5, css e javascript.

htmlwidgets

O time do RStudio desenvolveu um pacote de widgets html que facilita a inserção de código R em páginas da web, os chamados htmlwidgets. Os “htmlwidgets” são blocos de código cujo principal objetivo é trazer para o R alguns dos avanços alcançados em bibliotecas de visualização empregando html5, css e javascript.

O showcase é impressionante. http://www.htmlwidgets.org/showcase_leaflet.html

e vai de facilidades de representação de dados em tabela, passando por mapas 3D, séries históricas

 , diagramas e fluxogramas.

e o mais interessante, são funcionalidades interativas. O usuário da sua aplicação pode alterar as visualizações dentro de certos parâmetros.

E será justamente um dos recursos da biblioteca “htmlwidgets” que usaremos para exportar o nosso mapa e faremos isso tudo com apenas 1 linha de código.

que por sua vez auto explicativa, “savewidget”. Salvar o widget em um arquivo. Aquichamado mapaMetrico.html.

Se temos algo de mais complicado para explicar é sobre o tratamento dado para especificar o caminho do arquivo e o comando paste0.

Vamos lá.

Primeiro não esqueça de rever a publicação onde falamos sobre referências relativas no sistema de arquivos quando estamos executando um script em R. Referências relativas a pastas e arquivos no RStudio.

O seu script/programa em R assim como qualquer outro arquivo existe fisicamente dentro do sistema de pastas do sistema operacional.

Quando fazemos referência a outros “locais” no sistema de arquivos é necessário ou que saibamos o caminho físico exato do arquivo, ou que adotemos uma referência relativa. As referências relativas são as mais recomendadas pois permitem que o script possa ser re-utilizado ou movido sem maiores consequências.

Veja que lá no início usamos um comando para que scripts que rodem a partir do RStudio “saibam” aonde estão.

Após executar comando setwd(), o diretório de trabalho é definido como sendo aquele aonde o seu script está.

Agora no momento de salvarmos a nossa página desejamos faze-lo em uma sub-pasta chamada html. A decisão é minha aqui, você pode alterar a gosto.

O importante é que preciso dizer para o comando savewidget o nome e o endereço do arquivo por meio do parâmetro “file” em

file=paste0(getwd(),”html/mapa.html”

e aqui 2 novidades, o comando paste0 e o getwd().

O getwd() recupera o caminho fisico do diretório de trabalho corrente, não importa qual seja. Fazendo assim nós, os programadores, ficamos livres para não nos preocupar o caminho exato, se o script movido, o comando simplesmente recupera e pronto.

E o paste0 ?  O paste0 é combinador de strings de caracteres. Para os usuários do Excel é o CONCATENAR.

Faça um teste no seu console.

paste0( “Curso de R”, “Salvando Mapas”)

Observe que o R e Salvando ficaram unidos sem qualquer espaço, vem daí o Zero, zero espaço.

O irmão do paste0 é o paste e esse inclui por padrão 1 espaço em branco, mas com a opção “sep” podemos especificar outros separadores.

pronto o que faz então o comando

file=paste0(getwd(),”html/mapa.html”  ?

Concatena o nome do diretório corrente na minha máquina com a sub pasta “html/”  mais  o nome do arquivo  “mapaMetrico.html”

 “/Volumes/APPLEHDD/wordpress metrico/scripts R metrico/leaflet/html/mapaMetrico.html”

No seu computador será diferente dado que irá corresponder aos nomes de pastas onde salvou o seu script.

Pronto.

Ao final o que temos?  Vamos o painel Files do Rstudio.

O diretório e a pasta html/

e dentro da pasta html, o arquivo html como o nome que propusemos e uma pasta com arquivos de apoio. Clique no arquivo .html.

Duas opções, abrir no editor ou no browser.

No editor o cenário não é bonito, pois o que estamos vendo é o código de parte do widget.

mas no browser é o que esperávamos.

Eu coloque o resultado no meu servidor web e pode ser visualizado aqui http://metrico.statanything.com/html/mapaMetrico.html

Ainda não é um programa interativo, mas o mapa é.  É possível deslocar, aproximar, afastar, clicar sobre os marcadores etc.

Gostou?  Avise aos colegas e amigos. 🙂

Bye

João Carlos