Comparando graficamente dois grupos em R

Recentemente tive que demonstrar graficamente algumas informações de dois grupos em um estudo. Isso é comum, principalmente porque normalmente analisamos os grupos de controle e tratamento.

No R, o pacote sm permite que façamos um gráfico com as densidades de dois grupos distintos para uma mesma variável de uma forma bem simples.

Para esta análise, o conjunto de dados sleep que temos no R será muito útil. Para quem não o conhece, basta acessar o R e escrever View(sleep). Este conjunto de dados contém informações de estudantes que receberam dois remédios distintos para dormir. Estes dois grupos são separados pela variável group. A coluna extra contém o número de horas a mais que o estudante dormiu após a ingestão da droga. Ou seja, se quisermos observar a distribuição do número de horas dormidas, pelos dois grupos em um mesmo gráfico, podemos utilizar exatamente o pacote sm e o gráfico de densidade separando estes dois grupos. Vamos construir este gráfico:

## instala e carrega pacote
install.packages("sm");
library("sm");

## carrega os dados de 'sleep'
attach(sleep);

## plota as densidades por cada grupo, com cores padrao 1 e 2
sm.density.compare(extra, group, xlab="Horas adicionadas ao sono",
col=c(1:2));

# adiciona titulo
title(main="Distribuicao da Idade por flag de Banco Cadastra");

## adiciona legenda no canto superior direito (topright)
legend("topright", levels(sleep$group),fill=c(1:2),
legend=c("Grupo 1","Grupo 2"))

Podemos fazer a mesma coisa para grupos maiores (3, 4, 5 ou até mais). Vejamos outro exemplo, dessa vez com os dados de mtcars, outro conjunto de dados que já está no R por default. Dessa vez, os dados são de diferentes automóveis e temos as informações de milhas por galão (mpg) e número de cilindros (cyl). Abaixo, veja como construímos os gráficos de densidade de mpg comparando os carros com 4, 6 e 8 cilindros:

## carrega os dados de 'mtcars'
attach(mtcars);

## plota as densidades por cada grupo
sm.density.compare(mpg, cyl, xlab="Milhas por galao",col=c(1:3));

# adiciona um titulo ao grafico
title(main="Distribuicao do consumo por n de cilindros");

## adiciona legenda para os dois grupos
legend("topright", levels(sleep$group),fill=c(1:3),
legend=c("4 cilindros","6 cilindros", "8 cilindros"));

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)!