Gráficos no R com qqplot() (Histograma, Gráficos de Dispersão e Boxplot)

A função qqplot() do R – pertencente ao pacote ggplot2 –  é uma das melhores para se fazer gráficos. Este post, sem muitas enrolações, é basicamente uma continuidade do Gráficos em R. Aqui vamos utilizar os dados da base Wage do pacote ISLR do R.

Para começar, apenas carregue os pacotes e visualize a base:

library(ggplot2);
library(ISLR);
View(Wage);
Como você pode ver, se trata de dados referentes a salário, escolaridade, saúde, etc.
Abaixo, você terá os códigos para gerar diferentes gráficos e comentários explicativos:
## Tracando grafico simples com qplot
## por default, temos um histograma bem simples
qplot(wage, data=Wage);

Você deve ter notado a mensagem: “`stat_bin()` using `bins = 30`. Pick better value with `binwidth`“. Isto quer dizer que por default, seu histograma é dividido em 30 barras diferentes, mas você pode escolher o melhor número de barras. Vamos testar com 15:
qplot(wage, data=Wage, bins=15);
## Agora, vamos visualizar cada barra separando pelo estado civil
qplot(wage, colour=maritl, data=Wage);

## Separar apenas com a cor do contorno nao ficou legal
## vamos trocar tambem a cor de preenchimento utilizando fill
qplot(wage, colour=maritl, fill=maritl, data=Wage);
## Podemos inclusive preencher os blocos com cores diferentes
## Por exemplo, para cada estado civil, queremos ver quantos sao
## saudaveis e quantos nao sao
qplot(wage, colour=maritl, fill=health, data=Wage);
## Podemos visualizar graficos de densidade
qplot(wage, colour=maritl, data=Wage, geom="density");
## Podemos tentar entender como duas variaveis interagem
## Exemplo: plotar salario vs idade
qplot(wage, age, data=Wage);
## Ou ate tentar ver alguma relacao nao linear
qplot(wage, age*age, data=Wage);
## Um pouco mais complexo, podemos verificar o comportamento de idade por salario
## para cada raca, dividindo ainda por pessoas que possuem ou nao plano de saude
## essa segunda divisao (raca por plano de saúde) eh feita utilizando facets
qplot(age, wage, data=Wage, facets=race~health_ins,
xlab="Idade", ylab="Salario");
## Por fim, podemos fazer um boxplot, mas divindo uma variavel por
## cada uma das diferentes classes de uma outra (categorica)
## vamos observar o boxplot de salario para cada classe de trabalhador
## main indica o titulo do grafico, ylab o titulo do eixo y
qplot(jobclass, wage, data=Wage, geom=c("boxplot"),
fill=jobclass, main="Salario por classe de trabalho",
xlab="", ylab="Salario")

Agora você já está pronto para fazer diversos gráficos diferentes no R!

Proc Means

No SAS, uma das melhores formas de se obter estatísticas descritivas é através do proc means. Além de ser possível obter média, mediana e moda, você consegue diferentes faixas de percentil, observações missing e até mesmo gerar estatísticas cruzando variáveis.

Veja algumas maneiras de se utilizar o proc means com a nossa conhecida base german_credit_2:

1.  Primeiro, vamos obter algumas informações para a variável DurationOfCreditMonth utilizando o proc means da maneira mais simples possível:

proc means data= german_credit_21;
    var DurationOfCreditMonth;
run;

2. Em alguns momentos você pode precisar gerar as informações segregadas por diferentes grupos. Por exemplo, você pode precisar da mediana da dívida dos clientes por cada estado, ou a média das notas dos alunos por matéria. Em nosso exemplo, vamos observar como a variável DurationOfCreditMonth se diferencia entre clientes com Creditability = 1 e Creditability = 0:

proc means data=tmp.german_credit_21;
    class Creditability;
    var DurationOfCreditMonth;
run;

3. Média, mediana e desvio padrão são medidas interessantes e auxiliam na interpretação dos números. No entanto, você pode estar interessado em entender mais a respeito da distribuição desses números. Uma forma de entender isso, é através de algum percentil:

proc means n mean std p10 p25 p50 p75 data=tmp.german_credit_21;
    class Creditability;
    var DurationOfCreditMonth;
run;

4. Agora que você já possui alguns números para entender melhor a variável, pode ser uma boa ideia deixar o seu resultado mais limpo limitando a duas casas decimais com o maxdec:

proc means n mean std skew p10 p25 p50 p75 data=tmp.german_credit_21 maxdec=2;
    class Creditability;
    var DurationOfCreditMonth;
run;

5. Não é tão interessante quanto os primeiros itens, mas salvar seus resultados em uma tabela – que aqui chamamos de tabela_saida – pode ser útil, principalmente em processos mais automáticos:

proc means data=tmp.german_credit_21;
    class Creditability;
    var DurationOfCreditMonth;
    output out=tabela_saida sum=soma mean=media p50=mediana;
run;

6. Outra coisa que podemos fazer, semelhante ao que fizemos no item 2, é gerar essas medidas para mais variáveis dividindo todas pelo Creditability ou então, gerar as medidas da variável por outras classes:

proc means data=tmp.german_credit_21;
    class Creditability;
    var DurationOfCreditMonth Purpose;
    output out=tabela_saida sum=soma mean=media p50=mediana;
run;
proc means data=tmp.german_credit_21;
    class Creditability Purpose;
    var DurationOfCreditMonth;
    output out=tabela_saida sum=soma mean=media p50=mediana;
run;

BÔNUS:

Para incluir os dados missing e ainda contar o número de observações missing, acrescente missing e nmiss no proc means:

proc means  data= <nome da base> missing nmiss;
    class <classe - nao obrigatorio>;
    var <variavel>;
run;

Demonstrando dados com a função aggregate no R

A função aggregate no R é bem interessante. Como o próprio nome diz, ela agrega as informações de um dataframe, incluindo alguma função que é especificada por um parâmetro chamado FUN. Sendo assim, é algo bem interessante para você analista ou cientista de dados! Continuar a ler “Demonstrando dados com a função aggregate no R”

SAS: Executando diversos códigos em um só com o include

Assim como é possível chamar outros códigos no R e utilizar algumas funções prontas, no SAS algo semelhante pode ser feito declarando INCLUDE.

Quando você utiliza o include seguido de um caminho com um programa SAS, o que vai acontecer é que esse programa será executado. Sendo assim, você pode rodar diversos códigos em um projeto só, pode consolidar as suas libnames em um lugar só, enfim, há várias alternativas, todas com o include.

Uma situação hipotética: sua empresa possui uma base padrão, dentro de um DW qualquer, com um campo de data no formato string “ddmmaaaa”. Vamos supor que você tenha criado um projeto no qual um dos programas seja uma macro, denominada trata_data, que recebe a base padrão e converte o campo string para o formato data padrão do SAS. Você utilizou essa macro nesse projeto, mas ela é pode ser útil em vários outros estudos. O que você pode fazer é salvar essa macro como um programa em um diretório e quando você precisar utilizá-la em outro código, você utilizará algo como a sintaxe:

*chama a macro que tratara a data da base padrao (base_in) 
*e gera uma base com campo tratado (base_out);
%include '/sasdata/minhaempresa/macro_trata_data.sas';
%trata_data(base_in, base_out);

Outra forma de utilizar o include é na automatização de alguns processos. Vamos supor que você tenha criado um modelo estatístico que gera o rating das empresas clientes do seu banco e você deseja automatizar o processo de geração de rating para várias bases diferentes que chegarão mensalmente. Para isso, você pode criar diversos programas que receberão algumas variáveis, como a base de entrada e uma base de cadastro que enriquecerá a base de entrada, e rodá-los todos com o include. O exemplo abaixo pressupõe um programa chamado gera_rating_empresa.sas e dentro desse programa você possui duas variáveis/bases que devem ser passadas pelo usuário chamadas base_in e base_endereco (lembre-se que no programa elas precisam ser chamadas com &base_in e &base_endereco):

*insira o nome da base de entrada com campo CNPJ com 14 dígitos (string);
%let base_in = base_entrada_yyyymmdd;

*passe a base que enriquecera com as informacoes de endereco;
%let base_endereco = base_endereco_yyyymmdd;

*execute o programa;
%include "/sasdata/.../gera_rating_empresa.sas";

Não se esqueça de ficar craque em macros / let: Macros e a expressão Let no SAS

Mascarando os dados (~Contar e criar flag para campo único)

Suponha que você esteja fazendo um modelo qualquer em que um dos campos para identificar os indivíduos seja o nome completo ou algum documento. Talvez não seja legal você passar essa base para outras pessoas com essas informações, e mesmo assim você pode não querer excluir a coluna se o campo fizer parte da análise. Uma forma legal de substituir esse campo é criando um contador que some um apenas quando surge um campo novo. Veja abaixo como criar um campo (aqui chamado de Cliente_id) com o que será a nova identificação do cliente:

## mascarando documentos na base base_dados
base_dados$cliente_id <- with(base_dados, as.numeric(factor(Documento,levels=unique(Documento) )));
base_dados$cliente_id;

## traz coluna id para primeira posicao e exclui campo documento
base_dados <- base_dados[,c(4,2,3)];

## poderiamos ter feito passo a passo excluindo a coluna Documento
## utilizando: base_dados <- base_dados[,-1];

Ps.: Os dados são fictícios (obviamente)!

R: Ordenando colunas

Mais uma dica rápida de R, vamos aprender a ordenar as colunas de um conjunto de dados qualquer. Isso geralmente é útil para visualizações, ou no caso de trabalhos com séries temporais.

Utilizando a base de dados german_credit_2, abaixo três formas de mudar as colunas de ordem:

## Le o dataset

dados = read.csv("../database/german_credit_2.csv");

## Traz a coluna 21 para a primeira posicao pelos indices

dados = dados[, c(21,1,2,3,...,20];

## Traz a coluna 21 para a primeira posicao pelos nomes das colunas

dados = dados[, c("Foreign Worker","Creditability",...,"Telephone")];

## Traz a coluna 21 pelos indices, mas criando uma sequencia

dados = dados[, c(21, 1:20)];

Para quem não se lembra, ‘1 : 20′ tem como resposta a sequência 1, 2, 3, …, 20.

Claro que o que foi criado acima pode ser modificado de diversas formas:

## Traz a coluna 21, 20 e 19 para a primeira posicao
dados = dados[, c(21,20,19,1,2,3,...,18];
## Traz as colunas de 1 a 5, seguidas pelas de 10 a 20, deixando
## as demais fora
dados = dados[, c(1:5, 10:20)];
E aí, curtiu o post?

E aí? Gostou do conteúdo? Se inscreva para receber todas as novidades. Deixe seu e-mail em INSCREVA-SE na barra à direita, logo abaixo de pesquisar. E, por favor, não deixe de comentar, dar seu feedback e, principalmente, compartilhar com seus amigos. De verdade, isso faz toda a diferença. Além disso, você também pode acompanhar mais do meu trabalho seguindo a conta de Twitter @UniDosDados, no Instagram @universidadedosdados ou por alguma das redes que você encontra em Sobre o Estatsite / Contato, como meu canal de Youtube Canal Universidade dos Dados.

Aproveite e adquira sua camiseta de data science na LOJA DA UNIVERSIDADE DOS DADOS. Vai ficar estiloso e me ajudar neste projeto!

BONS ESTUDOS!

Excluindo linhas de um dataset no R

Mais uma dica rápida que saiu enquanto eu fazia minha tese…

Estava tratando um conjunto de dados no R, quando vi que precisava excluir as linhas que tivessem o campo referente ao mês com valor igual a 1 ou igual a 5. Sempre fiz isso no SAS com um if bem simples, mas não lembrava no R, talvez já tenha feito aqui, mas quem lê o blog sabe que não é lá tão organizado. Enfim, a lógica no R é tão simples quanto a do SAS, mas não tão intuitiva (ao menos para mim). Veja o antes e depois de uma tabela chamada dados retirando as linhas nas quais o campo s seja igual a 1 ou 5 e quais os códigos utilizar em algumas linguagens que já mencionamos aqui (é tão simples que vou colocar tudo junto mesmo):

No R, podemos resolver com um indexador lógico (! indicando negação):

dados[(dados$mes!=5 & dados$mes!=1),];

Ou então com um subset:

subset(dados, mes != 1 & mes != 5)

Da forma que escrevemos acima, você vai obter uma nova tabela, mas ela não está sendo salva com nome algum. Se você quiser, pode facilmente criar uma nova, como a tabela_nova que criamos no exemplo a seguir:

tabela_nova = subset(dados, mes!=1 & mes !=5)

Se você quiser ver como é no SAS, aqui vai um exemplo com data step:

data dados_v2;
    set dados;
    if mes ne 1 and mes ne 5; *ou if mes <> 1;
run;

E agora, um exemplo com proc sql:

PROC SQL;
    CREATE TABLE dados_v2 AS
    SELECT * FROM dados WHERE mes <> 1 AND mes <> 5; 
RUN;

Se quiser fazer no SQL:

SELECT * FROM dados WHERE mes <> 1 and mes <> 5;
E aí, curtiu o post?

E aí? Gostou do conteúdo? Se inscreva para receber todas as novidades. Deixe seu e-mail em INSCREVA-SE na barra à direita, logo abaixo de pesquisar. E, por favor, não deixe de comentar, dar seu feedback e, principalmente, compartilhar com seus amigos. De verdade, isso faz toda a diferença. Além disso, você também pode acompanhar mais do meu trabalho seguindo a conta de Twitter @UniDosDados, no Instagram @universidadedosdados ou por alguma das redes que você encontra em Sobre o Estatsite / Contato, como meu canal de Youtube Canal Universidade dos Dados.

Aproveite e adquira sua camiseta de data science na LOJA DA UNIVERSIDADE DOS DADOS. Vai ficar estiloso e me ajudar neste projeto!

BONS ESTUDOS!

Visualizando a assertividade do seu experimento

Este post é um complemento ao Teorema de Bayes na prática: interpretando falso positivo e Probabilidade Condicional e o Teorema de Bayes. Apresento aqui uma demonstração visual de algumas medidas muito utilizadas na estatística.

Dado um experimento em que queremos verificar se um exame é capaz de diagnosticar uma doença, temos os seguintes resultados possíveis:

 

  • True Positive (TP) ~ Verdadeiro Positivo: O paciente foi diagnosticado como portador da doença e ele realmente é portador dela;
  • False Positive (FP) ~ Falso Positivo: O paciente foi diagnosticado como portador da doença, porém, ele não é portador dela;
  • False Negative (FN) ~ Falso Negativo: O paciente foi diagnosticado como não sendo portador da doença, porém, ele é portador dela;
  • True Negative (TN) ~ Verdadeiro Negativo: O paciente foi diagnosticado como não sendo portador da doença, e ele realmente não é portador dela.

A partir deste quadro, temos as seguintes medidas:

  • Sensibilidade: Probabilidade do exame ser positivo, dado que o paciente é portador da doença. Ou seja, capacidade do exame de acertar o diagnóstico de um paciente portador da doença;
  • Especificidade: Probabilidade do exame ser negativo, dado que o paciente não é portador da doença. Ou seja, capacidade do exame de acertar o diagnóstico de um paciente saudável;
  • Acurácia: Probabilidade do diagnóstico do exame estar correto.

Colocando em fórmulas matemáticas:

  • Sensibilidade = TP / (TP+FN)
  • Especificidade = TN / (FP+TN)
  • Acurácia = (TP+TN) / (TP+FN+FP+TN)

Veja que estamos falando de exames e doenças, mas essas medidas são utilizadas de diversas formas. Por exemplo, se você fizer uma regressão logística para prever inadimplência, você pode calcular a sensibilidade do seu modelo, qual a probabilidade de identificar um mau pagador, dado que o indivíduo é realmente mau pagador.

Viés de Variável Omitida: Um exemplo prático

Já mencionei o viés de variável omitida no post Quanto mais polícia, mais crimes? e Paradoxo de Simpson, vamos ver mais um exemplo prático.

Vamos supor que você queira analisar o impacto do número de professores em uma escola com as notas dos alunos. Ou seja, você gostaria de estimar os beta 1 da seguinte equação:

média das notas = β0 + β1*n° de professores + u

É de se esperar que β1 seja maior que 0, pois a expectativa é que um número maior de professores seja benéfico para os alunos por diversos motivos.

Entretanto, pensemos nas variáveis não utilizadas no modelo e que “alocamos” em u. Dentre essas variáveis, temos, por exemplo, o investimento do governo nessas escolas. Afinal, um governo que investe mais, tenderá a contratar mais professores para suprir todas as necessidades da escola. Ou seja, a correlação entre número de professores e investimento do governo é positiva, quanto maior o investimento feito, maior o número de professores. Note que a esperança do u dado o parâmetro n° de professores não é zero. Afinal, como já dissemos, quanto maior o investimento de um governo, maior o número de professores, sendo assim, violamos uma premissa da nossa regressão OLS (ordinal least squares).

Ε (u | n° de professores) ≠ 0

É provável que se calcularmos um coeficiente de valor 10, este valor seja na verdade um valor menor qualquer como 7 ou 5. Isso ocorre porque o parâmetro n° de professores está absorvendo parte do impacto que o investimento do governo causa. O resultado é que nosso coeficiente está com viés, superestimando o impacto da variável.

Este é o problema de se omitir uma variável relevante.

Baseado em: Omitted Variable Bias – Ben Lambert