quarta-feira, junho 11, 2014

A Parábola dos Lenhadores


Este conto eu ouvi do consultor da IBM Gustavo Grillo e achei uma excelente parábola sobre o uso errado de uma ferramenta.
Consegui encontrar na internet o link do post do próprio Gustavo. Segue o link e o conteúdo da "estória".
https://www.ibm.com/developerworks/community/blogs/rationalbrasil/entry/a_f_c3_a1bula_dos_lenhadores10?lang=en

Era uma vez, nas profundezas de uma densa floresta, uma vila de lenhadores. A vila era sustentada pelos lenhadores que cortavam árvores com seus reluzentes, ainda que antigos, machados. Eles eram bons nisso.
A cada ano que passava eles precisavam cortar mais e mais árvores para acompanhar a demanda, que era cada vez maior. Ao mesmo tempo, alguns lenhadores, decepcionados com a vida dura que levavam, acabavam indo embora da vila para tentar novos trabalhos, e não eram substituídos pois não haviam mais jovens na vila.
Um belo dia, um dos lenhadores pensou: "Não é possível, deve haver uma maneira melhor de fazer isso!" e resolveu viajar até uma vila do outro lado da montanha para descobrir como eles cortavam as árvores por lá.
Eis que ele volta todo entusiasmado e com uma nova ferramenta: uma serra de corte transversal, dessas que lembram um serrote, só que com a lâmina bem mais comprida em que fica um lenhador de cada lado e quando um puxa o outro empurra. Ele havia aprendido como usar a nova serra e desenvolveu um novo processo para cortar as árvores com esta nova ferramenta.
Este lenhador treinou toda a vila à exaustão, fazendo com que todos aprendessem a usar a nova serra e seguissem o novo processo. Os lenhadores se tornaram mais produtivos e ficaram felizes apesar de alguns pequenos problemas que a nova serra causava.
Algum tempo depois, um vendedor itinerante chegou à vila dos lenhadores e percebeu que eles usavam a serra transversal. Ele reuniu os lenhadores e anunciou:"Eu tenho uma ferramenta que vai revolucionar a forma como vocês trabalham". E mostrou a ferramenta.
Os lenhadores ficaram um pouco céticos, e disseram: "Ok, vamos testar a sua ferramenta, mas temos uma exigência. Sabe, nós gastamos tanto tempo e esforço, treinando no uso da serra transversal e no processo que nós não queremos mudar a forma como trabalhamos, nem o nosso processo. Deu muito trabalho desenvolver isso tudo e vamos tentar usar a sua ferramenta, mas do nosso jeito"
O vendedor coçou a cabeça, ficou meio apreensivo, mas acabou concordando. Ele trouxe os melhores técnicos da sua empresa para ensinar os lenhadores a usar a nova ferramenta, mas depois de poucos dias de testes e demonstrações os lenhadores concluíram que eles eram mais produtivos com as suas velhas serras transversais do que com a nova ferramenta.
Desapontado, o vendedor voltou com os técnicos para a sua empresa. O dono da empresa o chamou para que explicasse como não havia conseguido efetuar a venda:
- Nós temos a melhor ferramenta do mercado para cortar madeira! Ela é insuperável no corte de árvores! A economia deles é baseada no corte de árvores! Como as demonstrações não mostraram isso?
E ele respondeu:
- Bom, nós realmente temos a melhor ferramenta. Mas os lenhadores precisariam ter ligado as motosserras, e as utilizado da forma que uma motosserra deve ser usada.

Moral da história: Se você usa uma motosserra como machado, não reclame que ela não atende às suas necessidades.

segunda-feira, junho 09, 2014

Funções principais para programação em R

Antes de falar das funções principais, aquelas funções que a gente sempre vai usar, vou passar a tradução de "Por que usar R?" do site Quick-R - Stat Methods:

Se você atualmente usa outro pacote estatístico, pro que usar R?
  • É gratuito! Se você é professor ou estudante, os benefícios são óbvios.
  • Roda em uma variedade de plataformas incluindo Windows, Unix e MacOS.
  • Provê uma plataforma sem paralelo para programação de novos métodos estatísticos de uma maneira fácil e direta... honesta.
  • Contém rotinas estatísticas avançadas ainda não disponível em outros pacotes.
  • Tem capacidades gráficas no estado-da-arte.
Bom... vamos ao objetivo principal do post: as funções interessantes, funções principais de trabalho e para se usar no ambiente R. A maioria delas tem mais parâmetros possíveis e só estão aqui as que trabalham com o ambiente e com os objetos (vetores, listas, matrizes etc), do post anterior. Há muitas outras funções com finalidade matemática, geração de gráficos entre outras, mas vamos ver um pouco de cada vez...

Geral:
help(nome_da_funcao) # abre no navegador a definição/ajuda da função; no RStudio a página é aberta em uma janela lateral.
?função # idem ao help.
getwd() # mostra o diretório (caminho) configurado para o workspace atual.
setwd("caminho/para/diretorio") # configura o diretório para o workspace; qualquer referência de arquivos, por exemplo, serão feitas a partir do "work directory".
library(biblioteca) # carrega a biblioteca para uso de suas funções.
source("script.R") # carrega o script/fonte para uso das funções.
dir() # exibe os arquivos e pastas do diretório do workspace; similar ao "dir" do prompt do DOS/Windows ou o 'ls" dos Unix like.
ls() # lista os objetos existentes no ambiente; no Linux usa-se "ls" para listar o conteúdo do diretório e no R para listar o conteúdo corrente carregado no ambiente.
objects() # igual ao ls().
rm(objeto) # remove um objeto do ambiente; deleta.
julian(data_dia_juliano,origin=data_base) # retorna o dia juliano (o dia a partir da data passada ou 1/1/1970 se omitido).
Sys.getenv(variável_x) # obtém o valor da variável de ambiente "variável_x".
Sys.putenv(variável_x) # atribui o valor da variável de ambiente "variável_x".
Sys.time() # retorna a data e hora do sistema, respeitando o fuso do sistema ("t" minúsculo)
Sys.Date() # retorna a data do sistema ("D" maiúsculo; respeitando o fuso do sistema, sem exibir a hora, claro).
system("cmd") # executa o comando "cmd" do sistema operacional (Windows).

Para objetos:
length(objeto) # retorna o número de elementos ou componentes de um objeto; seu tamanho.
cat(objeto) # imprime os elementos/argumentos do objeto.
str(objeto) # imprime a estrutura de um objeto (structure).
class(objeto) # imprime a classe ou tipo de um objeto.
identical(objeto1, objeto2) # testa se 2 objetos são idênticos (TRUE/FALSE).
vector(tamanho) # retorna um vetor com determinado tamanho.
matrix(linhas,colunas) # retorna uma matriz com as dimensões passadas.
mat.or.vec(linhas,colunas) # retorna uma matriz se o segundo parâmetro for maior que 1 ou um vetor para o segundo parâmetro igual a 1.
subset(objeto, condição, select=colunas) # retorna um subconjunto do objeto com elementos/linhas que obedeçam à condição e, se informado e o objeto se tratar de um dataframe, um vetor com as colunas para esse subset.

Para strings:
toupper(objeto) # retorna o conteúdo do "objeto" passado para letras maiúsculas.
tolower(objeto) # retorna o conteúdo do "objeto" passado para letras minúsculas.
grep(padrão, objeto) # busca o padrão no objeto.
regexpr(padrão, objeto) # busca o padrão no objeto.
sub(padrão, novo_valor, objeto) # substitui o padrão encontrado pelo novo_valor no objeto.
formatC(objeto, ...) # formata números usando a especificação no estilo C.

Para vetores:
c(objeto1,objeto2,...) # combina objetos em um vetor.
sequence(valor) # retorna um vetor com a sequencia de 1 até o "valor" passado; se "valor" for um vetor de valores, cria sequencias de 1 até cada valor de forma concatenada.
seq(inicio,limite,quantidade) # cria uma sequência de valores respeitando a quantidade de itens e o limite.
rep(objeto, quantidade) # repete o objeto tantas vezes a quantidade indicar; pode ser um número ou um vetor que será repetido de forma sequencial.
rev(objeto) # retorna de "objeto" em ordem um a um de trás para frente.
range(objeto) # retorna o valor mínimo e o valor máximo do "objeto".
paste(objeto) # concatena de forma sequencial o objeto (vetor) convertendo esse resultado em caracteres; gera uma string unindo os elementos.
append(objeto1, objeto2, after=posição) # adiciona elementos "objeto2" (pode ser de um vetor) a um vetor "objeto1", podendo indicar a posição de inserção dos elementos que por padrão é no final.
sort(objeto) # retorna os elementos de "objeto" de forma ordenada.
order(objeto) # retorna os elementos de "objeto" de forma ordenada.
unique(objeto) # retorna o vetor "objeto" sem elementos repetidos, que são removidos.
rnorm(quantidade) # retorna um vetor com valores aleatórios

Para dataframe:
names(objeto) # nomes das colunas do objeto/dataframe.
cbind(objeto1, objeto2, ...) # combina objetos como colunas; anexa o objeto2 ao objeto1.
rbind(objeto1, objeto2, ...) # combina objetos como linhas; anexa o objeto2 ao objeto1.

Funções matemáticas simples:
sign(objeto) # retorna um objeto do mesmo tamanho de "objeto", porém com conteúdo representando o sinal do valor em "objeto", podendo ser "-1" se o valor daquela posição em "objeto" for negativa, 0 se for 0 e 1 se for positiva.
abs(objeto) # retorna o valor absoluto dos elementos do objeto.
floor(objeto) # retorna o arredondamento do valor ou dos elementos do objeto para baixo.
ceiling(objeto) # retorna o arredondamento do valor ou dos elementos do objeto para cima.
round(objeto, digitos) # retorna o arredondamento do valor ou dos elementos contendo a quantidade de dígitos informada.
signif(objeto, digitos) # retorna o arredondamento do valor ou dos elementos contendo a considerando a quantidade de dígitos informada e retornando um a menso.
trunc(objeto) #trunca o valor do objeto ou dos elementos.

Foi difícil, mas acho que a organização ficou coerente, não?
Lembre-se que o R foi feito para trabalhar com conjunto de dados e sua análise.

quarta-feira, junho 04, 2014

As sete ferramentas da qualidade

Segue o link para um post que descreve muito bem as 7 ferramentas de qualidade organizadas por Ishikawa. Estas ferramentas conseguiriam tratar a grande maioria dos problemas.


São elas:
  • Diagrama de pareto
  • Diagrama de causa e efeito
  • Histograma
  • Folhas de verificação
  • Gráfico de dispersão
  • Fluxogramas
  • Cartas de controle
Vale a pena ler!