As funções esquecidas do Oracle

 

Olá leitores, voltamos com mais uma coluna e desta vez vou falar do meu banco de dados favorito. Gosto pessoal, nada contra os outros. Nem estou alegando que ele seja o melhor de todos, apenas que tenho preferência por ele. Dias atrás, estava fazendo uso de algumas funcionalidades do banco que poucas pessoas usam e algumas desconhecem sua existência. Porém, são interessantes e em alguns casos conhecê-las pode fazer com que pedidos desesperados de diretores, às 18h00min horas de uma sexta-feira, possam ser entregues.

 

Aproveitando que estou falando em Oracle, farei propaganda do blog de um grande amigo meu. Algumas pessoas devem conhecê-lo de listas Oracle ou de cursos oficiais: Márcio Portes. Se vocês tiverem dúvidas de Oracle, principalmente de desempenho, acessem o blog do tio (como é conhecido): http://mportes.blogspot.com/. Praticamente um Ask Tom em português.

 

Mas, bem, vamos as funções. Quantos de vocês conhecem as funções estatísticas do banco? Quantos já usaram? Levantem as mãos.

 

Tempos atrás fiz uma apresentação sobre o Oracle Statistical Functions em um cliente em São Paulo. Cliente antigo, usa Oracle há anos, utiliza muita Estatística no seu dia-a-dia e na minha opinião eles têm o perfil da empresa que deveria conhecer algumas destas funções. Mas, para minha surpresa, eles nem sabiam que elas estavam ali, ao lado deles! E nada era usado!

 

Com as funções estatísticas do banco nós podemos obter desde o básico da estatística descritiva como count, max, mean, min e um standard deviation, bem como determinar a importância de relações usando testes de hipóteses, dentre os quais temos t-test, f-test ou Análise de Variância (ANOVA).

 

Dentre as características do Oracle Statistical Functions nós temos:

 

  • Estatística Descritiva
  • Teste de Hipótese
  • Análise de Correlação (Paramétrica e Não Paramétrica)
  • Funções de Rank
  • Qui-quadrado
  • Regressão Linear
  • Análise de Variância (ANOVA)
  • Teste de Distribuição
  • Funções de Agregação
  • Análise de Pareto
  • Funções Analíticas (essas até já bem usadas ultimamente)

 

Um fato importante é que todas essas funções não fazem parte de um pacote que deve ser pago separadamente, já estão inclusas nas edições Standard e Enterprise a partir da versão 10g e são free!

 

Vamos a alguns exemplos. Comecemos pelo básico, estatística descritiva. Média, Moda e Mediana:

 

Como fazer a média usando Oracle? Bem, aos iniciantes é normal não conhecer, mas para os já experientes programadores, DBA’s, etc, isso pode parecer básico. No entanto, não custa nada relembrar. Vamos usar os seguintes dados:

 

 

ID_PACIENTE     NOME                                IDADE

--------------- ------------------------------ ----------

                 1      Joao Silva                                50

                 2      Jose Souza                              30

                 3      Maria Faria                              50

        4      Antonia Xavier                         65

 

 

SQL> select avg(idade), median(idade), stats_mode(idade)

  2  from fat_linfoma li,

  3          dim_paciente pac

  4  where li.id_paciente = pac.id_paciente;

 

AVG(IDADE)     MEDIAN(IDADE)     STATS_MODE(IDADE)

-------------- ------------------ -----------------

 49                   50                     50

 

 

Neste exemplo temos as três medidas: média, mediana e moda da idade de pacientes com linfomas. Sempre podemos programar mais uma consulta! E se quisermos obter o resultado de qual a mediana de redução do tamanho do linfoma por grupo de tratamento, faremos o seguinte, usando os dados abaixo:

 

NOME                               TAMANHO_REDUCAO

--------------------------- ---------------

Radioterapia                   ,5

Quimioterapia                 ,25

Quimo e Radio                ,25

Experimental                  ,5

Radioterapia                   ,3

 

SQL> select trat.nome, median(tamanho_reducao)

  2  from fat_linfoma lin,

  3          dim_tratamento trat

  4  where lin.id_tratamento = trat.id_tratamento

  5  group by trat.nome;

 

NOME                               MEDIAN(TAMANHO_REDUCAO)

------------------------------ -----------------------

Experimental                     ,5

Quimioterapia                    ,25

Quimo e Radio                   ,25

Radioterapia                      ,4

 

Isso que vimos são coisas simples. Agora, outro exemplo. Digamos que um pesquisador, com o conjunto de dados a seguir, gostaria de investigar o tempo de vida médio de pacientes com determinado tipo de linfoma. Estabelecemos como hipótese nula que o tempo de vida médio desses pacientes é de 12 meses e como hipótese alternativa que o tempo de vida médio dos pacientes é diferente de 12 meses. Para testar essas hipóteses, voltamos à prancheta do SQL*PLus. Neste caso a estatística faz uso dos testes de hipóteses e nós vamos usar o teste t.

 

NOME                                   TEMPO_VIDA

------------------------------ ----------

Nao-Hodgkin                     24

Hodgkin                            12

Hodgkin                            6

Nao-Hodgkin                        36

Hodgkin                               100

 

SQL> select avg(tempo_vida) media_grupo,

  2              stats_t_test_one(tempo_vida, 12, 'STATISTIC') vlr_observado,

  3              stats_t_test_one(tempo_vida, 12) p_vlr

  4  from fat_linfoma;

 

MEDIA_GRUPO        VLR_OBSERVADO      P_VLR

----------------- -------------------- ----------

 35,6                1,39608315         0,235187133

 

Pelo resultado encontrado, não existem evidências suficientes para admitirmos que o tempo de vida médio dos pacientes com este tipo de linfoma seja diferente de 12 meses, pois o p_vlr é maior que 0,05. Para que a hipótese nula fosse considerada verdadeira, o resultado do p_vlr deveria ser menor que 5%.

 

Vamos dar uma olhada em como fazer o teste de qui-quadrado utilizando Oracle. Neste caso vou usar a estrutura da tabela Customer, que faz parte o owner SH, dos demos do Oracle. Este exemplo está na documentação da Oracle, quem quiser testar pode usar em casa ou no trabalho.

 

SQL> select stats_crosstab

  2                (cust_gender, cust_income_level, 'CHISQ_OBS') qui_quadrado,

  3               stats_crosstab

  4                (cust_gender, cust_income_level, 'CHISQ_SIG') p_vlr,

  5               stats_crosstab

  6                (cust_gender, cust_income_level, 'PHI_COEFFICIENT') coef_corr

  7  from sh.customers;

 

QUI_QUADRADO        P_VLR             COEF_CORR

------------------- -------------- ----------------------

251,690705        1,2364E-47   ,067367056

 

Esta consulta procura determinar se existe uma relação significativa entre renda e sexo. O resultado mostra que o p_vlr é de 1,23, portanto existe uma relação significativa entre renda e sexo. Adicionalmente a nossa query fornece o valor do coeficiente de correlação, que no caso foi de 0,06.

 

Enfim, estas são só algumas funções estatísticas do Oracle que podemos usar no nosso dia-a-dia. São interessantes e úteis, pois podem nos ajudar em diversas situações e com certeza nos poupam um bom tempo desenvolvendo funções miraculosas para termos os resultados que nos pedem.

 

Bom pessoal, é isso! Espero que tenham gostado e espero também que estejam gostando do que publicamos até aqui. Se tiverem mais interesse sobre este e outros assuntos, mandem e-mails.

 

Um abraço a todos e até a próxima.

 

Vander Emiro Muniz

vmuniz@triscal.com.br

www.triscal.com.br

 

Leia também