Criando classes / categorias no SAS

Já expliquei no post Percentil – Conceito e Código SAS o que é percentil e como obtê-lo no SAS. Agora, uma coisa que é interessante, e eu precisei usar recentemente, é criar classes no SAS. Há uma forma bem direta de fazer isso através do proc rank. Porém, já havia um código mais “roots” para fazer isso e acho legal compartilhar. É interessante ver alternativas ao que já está preparado (outros softwares podem não ter o comando).

Para demonstrar melhor como criar classes, eu aumentei minha base de dados contendo as alturas dos indivíduos de uma amostra. Para não confundir com a tabela AMOSTRA, eu criei uma nova tabela chamada POPULACAO, contendo 60 alturas. O que vamos fazer no exemplo é criar uma coluna adicional na tabela com as letras de A a J indicando a qual percentil a altura do indivíduo pertence. Isso pode ser útil para obter dummies para regressões e até mesmo para tomar estatística descritiva dos indivíduos, e desse jeito é mais fácil do que utilizando o IF.

Para obter as classes, há dois passos:

  • Primeiro você deve obter o valor de cada percentil, nesse exemplo, comecei do 10° percentil e utilizei intervalos de 10 em 10, mas você pode dividir como for melhor para sua análise:
proc univariate data= work.populacao;
    var altura; output OUT=work.altura 
       pctlpre=p_altura_ pctlpts= 10 to 100 by 10;
run;
  • Agora, vou utilizar o CASE WHEN, que é uma função para lidar com condições no SAS. Veja abaixo que a gente inicia o código com o proc sql seguido de ponto e vírgula como sempre, até aí nenhuma novidade. Em seguida ‘dizemos’ para o SAS criar uma tabela (create table) com o nome populacao_classes na nossa work. Como nós queremos gerar essa nossa nova base a partir da base populacao criada anteriormente, é preciso dizer ao SAS quais campos ele deve trazer da base original. O asterisco após o select indica que o SAS vai trazer todos os campos da base de origem, que no caso é a tabela populacao que está na work. Em seguida vem o case when, que dá o comando ao SAS para atribuir uma letra caso a altura do indivíduo esteja no percentil em questão:
proc sql;
    create table populacao_classes as select *,

      case
      when altura <= (select p_altura_10 from work.altura) then 'A'
      when altura <= (select p_altura_20 from work.altura) then 'B'
      when altura <= (select p_altura_30 from work.altura) then 'C'
      when altura <= (select p_altura_40 from work.altura) then 'D'
      when altura <= (select p_altura_50 from work.altura) then 'E'
      when altura <= (select p_altura_60 from work.altura) then 'F'
      when altura <= (select p_altura_70 from work.altura) then 'G'
      when altura <= (select p_altura_80 from work.altura) then 'H'
      when altura <= (select p_altura_90 from work.altura) then 'I'
      when altura <= (select p_altura_100 from work.altura) then 'J'
      else 'outros'
    end AS classe_altura

    from work.populacao;
proc print;
run;

Para os que ainda estão com dúvidas, segue uma imagem para facilitar o entendimento (veja que as bases na imagem abaixo vão até a linha 25, e não até a linha 60 que é a última linha):

Visualizando seus dados: Histograma

Um histograma nada mais é do que uma forma de representar seus dados utilizando um gráfico de barras onde o eixo y representa a frequência e o eixo x os intervalos (chamados também de classes) dos seus dados. Simples assim. E já para dar uma ideia antes mesmo das definições mais formais, veja esse exemplo de um conjunto de dados e um histograma executado automaticamente pelo excel (veja o passo a passo no Canal da Educação):

Só de bater o olho, acho que a maioria já consegue entender o que o histograma apresenta. Ele nos dá uma ideia de como nossos dados estão distribuídos, mas para isso ele separa nossos dados em classes, ou, como o excel chamou, em blocos. Veja o que o excel fez, ele separou nossos dados em 5 intervalos:

Menor ou igual a 1, maior que 1 e menor ou igual a 25, maior que 25 e menor ou igual a 49, maior que 49 e menor ou igual a 73 e um último intervalo como sendo os números acima de 73. Para cada intervalo, ele contou o número de elementos dos nossos dados que fazem parte do intervalo em questão e a partir daí fez o gráfico de barras.

Quantos números do nosso conjunto de dados são menores ou iguais a 1? Apenas 1. Quantos são maiores que 1 e menor ou igual a 25? Apenas 6.

Eu não sou fã desse histograma do excel por achar pouco intuitivo os pontos 1, 25, 49, 73 e “Mais” estarem localizados no meio da barra mas não serem o ponto médio do intervalo. É bom se atentar a isso. Mas, deixando a crítica de lado e voltando ao assunto…

Nesse gráfico, o excel nos devolveu o resultado em termos da frequência absoluta, que nada mais é que o número de vezes em que determinado dado aparece. O histograma também pode ser construído com base na frequência relativa, que é o número de vezes em que determinado dado aparece dividido pelo número de elementos da nossa amostra ou população. Em outras palavras, é a representação percentual. Veja esse exemplo com os mesmos dados, mas utilizando a frequência relativa:

E NO SAS? COMO FAZEMOS UM HISTOGRAMA

A forma mais rápida que eu conheço é pelo proc univariate, é bem simples. Basta acrescentar histogram logo após você selecionar as variáveis que deseja visualizar o histograma. No exemplo abaixo, vamos inserir através do Datalines a data e o índice Ibovespa (índice na abertura, alta, baixa, etc.) e em seguida utilizamos o proc univariate para gerar o histograma:

data dados;
    input notas; 
    datalines;
    3.6
    3.6
    5
    6.4
    6.6
    6.6
    6.8
    7.5
    8
    8.7
    9
    9.5
    ;
proc print;
run;

proc univariate data = dados;
    var notas;
    histogram;
run;

Veja que o SAS criou seus intervalos também.

E se eu quiser alterar a forma como as classes estão divididas?

Bom, nesse caso podemos usar tanto o endpoints como o midpoints e escolher o intervalo inferior de todas as classes, o superior, e qual tamanho de cada classe. Veja esse exemplo com midpoints e tente brincar depois com endpoints:

proc univariate data = dados;
     var notas;
     histogram / midpoints=(3 to 10 by 2) ;
run;