Paradoxo de Simpson

O paradoxo de Simpson é um caso em que quando examinamos grupos diferentes observamos uma tendência que se altera quando combinamos estes grupos.

Um exemplo clássico é o caso de admissão de mulheres na Universidade de Berkeley. Acreditava-se que as mulheres estavam sendo discriminadas na admissão, pois o percentual de mulheres admitidas era muito menor que o percentual de homens, conforme podemos observar na tabela abaixo:

Entretanto, quando a análise era feita por departamento, isto não ocorria. A tabela abaixo apresenta os dados dos seis maiores departamentos da universidade, veja que dos 6, em apenas 2 o percentual de homens admitidos era menor:

A interpretação equivocada ocorreu porque havia maior concentração de mulheres aplicando em departamentos com menor taxa de admissão.

Isso ocorre simplesmente porque existe uma variável que se correlaciona tanto com a variável dependente quanto com a independente. Em outras palavras, é mais um caso de viés de variável omitida.

Obs.: Variável omitida é uma variável não considerada/avaliada por quem está fazendo a pesquisa. Esta variável é incorporada ao erro, porém, se uma variável importante é deixada de fora do modelo, o modelo poderá ter seus estimadores com viés e inconsistentes.

 

 

Criando variáveis dummy no R

Uma curtinha só para começar bem a semana…

Utilizando a base de dados german_credit_2 abaixo temos um exemplo de como criar uma variável binária – i.e., uma variável que recebe dois valores, 0 e 1 – com valor 1 para os clientes que possuem um montante de crédito acima de $ 1.000, e valor 0 para os que possuem menos que $ 1.000. Em outras palavras, criamos uma dummy n R. Incluímos uma forma de ler os dados em csv e uma forma de ler em excel:

## Le a base de dados csv
dados = read.csv("../database/german_credit_2.csv");

## le a base de dados excel - Primeiro instala pacote xlsx
install.packages("xlsx");
library("xlsx");
dados = read.xlsx("../database/german_credit_2.xlsx", sheetIndex=1);

## cria variavel para quem tem montante maior que mil
dados$valor1000 = as.numeric(dados$CreditAmount >= 1000);
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 missing no R

Essa é bem curtinha. Já expliquei como tirar os missings de seus cálculos no post Evitando “NA” nos cálculos do R, mas às vezes a gente quer construir uma base sem esses valores. Para fazer isso no R é simples, basta usar a função na.omit():

matriz_teste
      [,1] [,2]
 [1,]  10    5
 [2,]  NA    2
matriz_teste_sem_na = na.omit(matriz_teste)
matriz_teste_sem_na
      [,1] [,2]
 [1,]  10    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!

SQL dentro do SAS

O SQL é uma linguagem utilizada comumente na manipulação de dados. É bastante intuitiva e fácil de utilizar. Para selecionar, por exemplo, uma coluna denominada Nome contendo os nomes de clientes da tabela XYZ, o comando a ser utilizado é praticamente a frase “selecionar nome da tabela XYZ”, mas em inglês:

SELECT Nome from tabela XYZ

Ou então, você pode selecionar todas as colunas da base XYZ com o comando ‘*’:

SELECT * from tabela XYZ

Como você pode ver, é bem intuitivo.

O SQL é uma das linguagens embutidas no SAS e você pode acioná-la utilizando o comando proc sql seguido pelo tradicional ponto e vírgula e finalizá-lo com o comando run do SAS. Para você ver como pouco muda, o comando de SQL utilizado acima ficaria da seguinte forma no SAS:

proc sql;
    select * from tabela XYZ;
run;

Caso você já acompanhe o blog, ou tenha lido alguns outros códigos, você deve ver muitas vezes ao invés do asterisco sozinho, algo como a.*. Isso ocorre porque quando temos duas tabelas, nós as denominamos de ‘a ‘e ‘b’ (ou t1, t2, etc.), sendo assim você precisa mencionar de qual tabela você está selecionando a coluna. O código acima, caso quiséssemos chamar a tabela XYZ de ‘a‘, ficaria da seguinte forma:

proc sql;
    select a.* from tabela XYZ as a;
run;

Veja que para uma tabela só não tem muita diferença, mas imagine com duas ou três como já complicaria escrever simplesmente select Nome. Se o SAS pudesse falar, ele diria: seleciono de onde? De XYZ ou das outras tabelas?

Veja que a linguagem de SQL embutida no SAS facilita bastante a manipulação dos dados e fornece aos usuários alternativas quando a lógica com o data step for mais complicada.

Como o código acima vai apenas mostrar para você a seleção feita, para utilizarmos a informação gerada dentro do próprio SAS podemos criar uma tabela. E, novamente, o código é uma mera tradução do inglês: Create Table:

proc sql;
    create table Tabela_Nomes as
    select Nome from tabela XYZ;
run;

Vamos utilizar a tabela abaixo com algumas pessoas, a renda que elas possuem e a origem dessa renda, para demonstrar outros comandos utilizados no proc sql:

Os principais comandos a serem lembrados no SQL, além do select, são:

  • Where: Um tipo de filtro, semelhante ao if. Vamos supor que a base contenha a coluna renda com o salário dos clientes e você queira apenas o nome de quem possui renda superior a mil reais. Agora, você terá que selecionar duas colunas, Nome e Renda, e a tabela com esses clientes seria criada da seguinte forma:
proc sql;
    create table Tabela_Renda as
    select id, Nome, Renda
    from tabela_exemplo
    where renda > 1000;
run;

  • Group by: Serve para agrupar os dados por algum campo em comum. Vamos pensar agora nos clientes que possuem várias fontes de renda, aquela pessoa que além do salário da empresa também possui rendas com aluguéis ou trabalhos de freelancer. Sendo assim, a base terá várias linhas com rendas diferentes para esse cliente. Se você quiser a renda total dele, você terá que somar essas rendas diferentes e agrupar pelo nome:
proc sql;
    create table Tabela_Renda_Cliente as
    select id, Nome, sum(Renda) as Renda_Total
    from tabela_exemplo
    group by id, nome
    having Renda_Total > 1000;
run;

  • Having : Bem semelhante ao where, é utilizado para o filtro depois de alguma tratativa. Como queríamos selecionar os clientes com renda acima de mil reais, e com o where só considerávamos a renda de um emprego, agora podemos filtrar os clientes com renda total acima de mil reais utilizando o having:
proc sql;
    create table Tabela_Renda_Cliente_2 as
    select id, Nome, sum(Renda) as Renda_Total
    from tabela_exemplo
    group by id, nome
    having Renda_Total > 1000;
run;

Order By: Ordena a tabela de acordo com algum campo, na ordem crescente.

Poderíamos ter gerado a renda dos clientes, mas ordenando pela renda:

proc sql;
    create table Tabela_Renda_Cliente_3 as
    select id, Nome, sum(Renda) as Renda_Total
    from tabela_exemplo
    group by id, nome
    having Renda_Total > 1000
order by Renda_Total;
Run;

Pratique SQL !

Escrevi bastante sobre SQL esses dias, quem quiser praticar e não tiver em casa, ou não quiser instalar nenhuma versão, você pode utilizar no seu browser com o link abaixo:

SQL Fiddle

Veja que na tela da esquerda você já tem uma construção da tabela localizado ao final da tela e do lado direito você pode escrever diversas queries e executá-las com o botão RUN SQL. Vamos praticar!

Combinando três tabelas com o left join

Utilizando as informações do post Como combinar tabelas no SAS utilizando left join e full join, vamos imaginar que não tenhamos apenas duas tabelas, mas sim três, sendo que a terceira tabela contém as notas dos alunos que cursam Física:
Para montar uma única query que traga a nota de física, basta continuar o left join:
* notas dos alunos de calculo incluindo as de fisica dos que fizeram;
proc sql;
    create table exemplo_left_join as
    select a.*, b.nota_estat, c.nota_fis
        from turma_calc as a
          left join (select * from turma_estat ) as b
          on a.nome = b.nome
            left join (select * from turma_fis) as c
            on a.nome= c.nome;
run;
E você poderia inclusive filtrar antes de aplicar o left join. Como?
Bem, para quem leu o post SQL dentro do SAS sobre SQL fica bem claro o que foi feito acima: foi aplicado um left join em uma base construída entre parênteses. Ou seja, se para extrair as informações da turma de Física usamos select * from turma_fis, pra extrair os alunos aprovados na disciplina bastaria utilizar select * from turma_fis where Nota_Fis >= 6, teríamos então:
* excluindo os alunos reprovados em fisica;
proc sql;
    create table exemplo_left_join_2 as
    select a.*, b.nota_estat, c.nota_fis
    from turma_calc as a
    left join (select * from turma_estat ) as b
      on a.nome = b.nome
    left join (select * from turma_fis where Nota_Fis >= 6) as c
      on a.nome= c.nome;
run;
Agora que você sabe extrair informações utilizando o SQL e sabe que você pode fazer o que quiser dentro do parênteses antes de aplicar o left join, você poderia inclusive ser mais ousado e criar uma marcação de alunos aprovados, onde o campo Aprovado receberia 1 quando o aluno tem nota superior ou igual a 6 e 0 caso contrário:
* cria uma flag = 1 para trazer quem foi aprovado em fisica e estatistica;
proc sql;
    create table exemplo_left_join_3 as
    select a.*, b.Aprovado_Estat, c.Aprovado_Fis
    from turma_calc as a
    left join (
            select *, case when Nota_Estat >= 6 then 1
            else 0 end as Aprovado_Estat from turma_estat ) as b
      on a.nome = b.nome
    left join (
             select *, case when Nota_Fis >= 6 then 1
             else 0 end as Aprovado_Fis from turma_fis) as c
      on a.nome= c.nome;
run;

Como combinar tabelas no SAS utilizando left join e full join

Provavelmente a tarefa mais comum de alguém que trabalha com dados seja combinar diferentes tabelas para se obter toda a informação que precisa. Por exemplo, se em uma tabela você tiver o nome dos seus clientes e a informação de idade em uma base de dados, e em uma segunda tabela tiver informações como endereço e sexo, é bem provável que ao fazer um estudo, um modelo estatístico, você tenha que combinar estas duas tabelas. Vamos ver agora como combinar duas tabelas de algumas formas diferentes.

Vamos utilizar como exemplo duas turmas da faculdade, uma do curso de Cálculo e outra do curso de Estatística.Podemos ter alguns alunos matriculados em uma delas e não matriculados na outra e vice-versa. As duas tabelas abaixo contêm os alunos de cada turma, o sexo, a idade e a nota final da disciplina:

Caso alguém ainda não saiba criar sua própria tabela para treinar, segue o código utilizado para gerar as que serão utilizadas aqui:

data turma_calc;
    length nome $22.;
    input Nome $ Sexo $ Idade Nota_Calc;
    datalines;
      Roberto M 22 10
      Maria F 24 10
      Pedro M 17 6
      Renata F 18 9
      Andre M 23 9
      Marcos M 27 8
      Patricia F 19 7.5 
      Luciana F 19 6.2
      Adriana F 22 4.5 
      Fernando M 21 6.6 
      Felipe M 20 7
      Flavia F 20 6
      Fabio M 18 1
;
run;

data turma_estat;
    length nome $22.;
    input Nome $ Sexo $ Idade Nota_Estat;
    datalines;
      Roberto M 22 4 
      Maria F 24 3
      Jose M 19 6 
      Renata F 18 8
      Andre M 23 9
      Alexandre M 17 8
      Patricia F 19 6 
      Luciana F 15 6
      Fernanda F 29 5
      Fernando M 21 6 
      Marcelo M 17 5 
      Flavia F 20 7 
      Fabio M 18 5
;
run;

Vamos supor que você queira completar a primeira tabela com as notas de estatística para os alunos que cursaram as duas matérias, mas quer manter os demais também na tabela. Ou seja, pensando em dois conjuntos, você quer adicionar a informação que está na intersecção dos conjuntos A e B à informação do conjunto A. Abaixo temos a representação desse caso em um Diagrama de Venn seguido pelo código em SAS e a tabela de saída deste código:

* traz as notas de estatisticas para a tabela com os alunos de calculo;
proc sql;
create table exemplo_1 as
    select a.*, b.*
    from turma_calc as a
    left join turma_estat as b
    on a.nome = b.nome;
run;
E se você quiser apenas os alunos que cursaram somente cálculo, excluindo quem cursou a outra disciplina:
* traz os alunos que cursaram apenas Calculo;
proc sql;
    create table exemplo_2 as
    select a.*, b.*
    from turma_calc as a
    left join turma_estat as b
    on a.nome = b.nome
    where b.nome is NULL;
run;
Caso você não quisesse essa última coluna, bastaria não ter selecionado nada da tabela b:
proc sql;
    create table exemplo_2b as
    select a.*
    from turma_calc as a
    left join turma_estat as b
    on a.nome = b.nome
    where b.nome is NULL;
run;
Se quiser trazer os alunos das duas turmas:
* traz todos os alunos das duas turmas;
proc sql;
    create table exemplo_3 as
    select coalesce (a.nome, b.nome) as Nome
             , coalesce (a.sexo, b.sexo) as Sexo
             , coalesce(a.idade, b.idade) as Idade
             , a.*
             , b.*
    from turma_calc as a
    full join turma_estat as b
    on a.nome = b.nome;
run;
 
Se você não quiser os alunos que cursaram as duas matérias, quiser apenas quem cursou uma:
* traz os alunos que cursam somente um dos dois cursos;
proc sql;
    create table exemplo_4 as
    select coalesce (a.nome, b.nome) as Nome
             , coalesce(a.sexo, b.sexo) as Sexo
             , coalesce(a.idade, b.idade) as Idade
             , a.*
             , b.*
    from turma_1 as a
    full join turma_2 as b
    on a.nome = b.nome
    where a.nome is NULL or b.nome is NULL;
run;
Se você já programou em sas ou sql, também já ouviu falar do right join, que muda muito pouco com relação ao left join. Como o próprio nome implica, você vai inverter a ordem das tabelas que serão unidas. Veja abaixo uma imagem completa que descreve todas as funções join do sql:
Imagem retirada do site Guia DBA

 

Dúvidas? Erros? Deixe um comentário ou um e-mail.

Teorema de Bayes na prática: interpretando falso positivo

As pessoas, e eu me incluo nessa, fazem uma enorme confusão com probabilidades condicionais no cotidiano. Por exemplo, é considerada a mesma coisa a chance de um exame dar positivo se a pessoa não tem a doença e a chance de não se ter a doença se o exame dá positivo. Veja que não estamos falando da mesma coisa.

O livro “O andar do bêbado” de Leonard Mlodinow explica bem essa situação. O autor recebeu um exame de HIV com resultado positivo para a doença. Junto com o resultado, o médico lhe deu a notícia de que a chance de ele viver mais de uma década era de 1 em 1 mil.

Como o médico chegou nesse número?

Ele já sabia que o resultado do exame de HIV gera um resultado positivo com o sangue não infectado somente uma vez a cada mil amostras. Ou seja, Leonard tinha 1/1000 chance de não ter HIV. Certo?

Não. Novamente, havia 1/1000 de probabilidade de uma pessoa ter um exame positivo, sendo que ela não tinha a doença. Porém, isso não quer dizer que se o exame for positivo a chance de ela não ter a doença é 1/1000. Vamos verificar com números!

Tome uma população de 10 mil homens. Vamos considerar que o número de falsos negativos seja 0, ou seja, se o exame der negativo, a pessoa não tem HIV. Destes 10 mil, 1 possui HIV. Pelos dados do doutor, com uma simples regra de três, é fácil perceber que de 10 mil homens, com todos realizando o exame de HIV, temos 10 que terão exames com resultado positivo para a doença, mas que não estão infectados. Resumo: 1 homem com resultado positivo e com HIV, 10 com resultado positivo mas sem HIV e 9989 com exame negativo e sem HIV.

Voltando agora ao resultado de Leonard, se o exame foi positivo, ele está entre as 11 pessoas com resultado positivo. Porém, desses 11 somente 1 possui a doença. Logo, dado que o resultado foi positivo, a chance de Leonard ter a doença é de 1/11! E tudo isso graças a um pequeno erro de interpretação do teorema!

Para entender mais sobre o tema, leia o post Probabilidade Condicional e o Teorema de Bayes e o livro O andar do bêbado

Empréstimos inteligentes para pessoas sem histórico de crédito

 

Muitas pessoas não sabem o que faz uma pessoa que trabalha com modelagem estatística. E olha que isso pode estar presente no job description de muitos cargos: analista de risco de crédito, inteligência de cobrança, inteligência de mercado, cientista de dados, CRM, big data, pesquisa de mercado, só para citar alguns.

Então vai aí um exemplo prático, e nobre, do uso de modelagem estatística e mineração de dados: