terça-feira, 22 de março de 2011

Área Abaixo da Curva

Na minha postagem sobre Curvas ROC mencionei que uma medida bastante comum para comparação entre diversas técnicas é a área abaixo da curva (Area Under the Curve - AUC). A situação de cara ou coroa dá uma área abaixo da curva de 0,5. Qualquer outra técnica deve aumentar este número até chegar ao ideal que seria 1,0. Quanto mais alto o número, melhor a técnica de identificação.

 Existem diversas maneiras de fazer o cálculo da área abaixo da curva (AUC), cada uma com seu próprio grau de erro, ou suas próprias aproximações. Uma maneira bastante simples é fazer o somatório das áreas dos retângulos, onde a área individual dos retângulos é calculada multiplicando a largura vezes a média da altura (altura da esquerda somada à altura da direita, dividido por 2). Veja a figura abaixo. Quanto mais estreitos forem os retângulos, quanto mais o resultado final se aproximará do valor real.

quinta-feira, 24 de fevereiro de 2011

Fichas de membros em MySQL

Já foi falado sobre Banco de Dados MySQL e Campos Interessantes em um banco MySQL. Agora será mostrado com criar uma ficha genérica para cadastro de membros. No caso em particular como já foi mencionado em postagens anteriores é interessante iniciar a ficha com um ID, no caso específico, um user_id como "bigint", "auto increment". Assim, pode se indexar tudo com esse ID e usar em comandos de REPLACE, para atualizar qualquer ficha do banco de dados.

Outros campos óbvios, para acesso a um site restrito, são os de login e senha. Além destes, poderá ter o nome completo (full_name), a data do aniversário do usuário, e seu respectivo nível (user_level).

Dependendo da situação poderá ter campos para datas importantes, tais como, criação da conta, expiração da conta e último login. Se o site for multilíngue, poderá ser necessário um campo para a língua preferida do usuário.

Poderá ter campo para status do usuário, ou atividade do usuário, conforme o caso. Pode ser útil ter campos para RG, expedidor, data de expedição, CPF, filiação, tipo sanguíneo, naturalidade, nacionalidade, título de eleitor, etc. E por fim poderá ser acrescentado um campo para comentários sobre o usuário.

Existem outros campos que são importantes, mas talvez não para a ficha do usuário. Por exemplo, é importante ter o email do usuário. Mas se colocar uma tabela adicional com os seguintes campos: email_ID, user_ID, user_email, email_status, então cada usuário poderá ter inúmeros emails cadastrados no site. O user_ID é o ID do usuário na tabela de membros. O administrador poderá saber pelo status se o email foi confirmado (clique no link no email, caso receba o email) ou não. Poderá até acrescentar um campo para indicar o email primário, ou a ordem de preferência dos emails, conforme o caso.

O número telefônico também é bastante interessante o administrador poder lançar mão, mas segue o mesmo raciocínio da tabela de email, uma tabela em separado, só para fones, contendo: fone_ID, user_ID, fone, fone_tipo (cel, fixo, etc.). Assim poderão ser cadastrados quantos fones quiser para cada usuário.

O endereço segue a mesma lógica. Inclui-se o endereço_ID, o user_ID, endereço, e o tipo (residencial, comercial, caixa postal, contato, etc.). No caso o endereço pode ser dividido em vários campos: end_1, end_2, numero, CEP, cidade, UF, país, obs., status, etc. Então cada cliente pode ter vários endereços cadastrados.

Para incluir outras informações, pode ser interessante criar uma tabela para cada coisa. Assim os usuários não ficam limitados a ter apenas um de cada coisa.

Caso seja previsto que haverá muita mudança nos dados em uma determinada tabela, poderá ser acrescentado um campo de "em uso". Assim, para deletar uma ficha, basta zerar o campo de "em uso". Na próxima vez que for escrever um novo dado, procura-se pela ficha com o campo zerado. Assim não ficam "buracos" no banco de dados, e não se esgotam os IDs tão rapidamente.

segunda-feira, 7 de fevereiro de 2011

Curvas ROC

Curvas ROC foram criadas na segunda guerra mundial para interpretar dados do radar e identificar aviões inimigos. A curva ROC é bastante útil para comparar resultados.

A curva ROC (Receiver Operating Characteristic) é utilizada para mostrar o grau de acerto ou de erro. Suponha que se tenha um paciente e quer saber se ele tem determinada doença. Aplica-se um teste e verifica o resultado. A interpretação resulta em 4 grupos:
1) Doentes classificados como doentes.
2) Doentes classificados como sãos.
3) Sãos classificados como sãos.
4) Sãos classificados como doentes.

Ou escrito de outra forma:
1) Correta aceitação.
2) Falsa rejeição.
3) Correta rejeição.
4) Falsa aceitação.

Obviamente os grupos 2 e 4 devem ser minimizados.


A curva ROC plota os dados de 0,0 a 1,1 da seguinte forma:
O eixo X é da falsa aceitação, e o eixo Y da correta aceitação. Portanto o ideal é uma reta de 0,0 para 0,1 e outra reta de 0,1 para 1,1. Veja a figura 1.

Se utilizar uma moeda (cara ou coroa) para determinar se está doente, iriamos obter uma reta de 0,0 para 1,1, cortando o quadrado no meio, diagonalmente, como na figura 2. Qualquer outra técnica utilizada deverá levantar a curva para o canto superior esquerdo. Quanto mais no canto, melhor a técnica. A figura 3 mostra uma curva ROC típica.



Também é comum usar a área abaixo da curva como medida de comparação entre diversas técnicas. A situação de cara ou coroa dá uma área abaixo da curva de 0,5. Qualquer outra técnica deve aumentar este número até chegar ao ideal que seria 1,0. Quanto mais alto o número, melhor a técnica de identificação.

Para um método de cálculo da área abaixo da curva veja este tutorial: Área Abaixo da Curva.

quinta-feira, 13 de janeiro de 2011

PHP criando gráficos .png

Como já mencionamos em post anterior, PHP é uma linguagem de programação genérico, muito parecido com a linguagem C. Mas também tem muitas facilidades para utilizar na criação de páginas web.

Aqui vamos mostrar a facilidade de se utilizar o PHP para criação de gráficos, ou seja criação de imagem tipo PNG.

A primeira rotina a ser utilizada é a seguinte:
$im = imagecreatetruecolor ( int $width , int $height );
Esta rotina cria um apontador para uma imagem ($im) com largura ($width) e altura ($height); Não se esqueça de definir $width e $height antes de utilizá-los.

A segunda  rotina a ser utilizada define as cores que pretendemos utilizar no nosso gráfico:
$background = imagecolorallocate($im, 0, 0, 0);
Os parâmetros para esta rotina são o ponteiro que criamos na primeira rotina ($im) e os níveis de cada cor R, G, B ou seja Vermelho, Verde, e Azul. A primeira vez que esta rotina é chamada, define a cor do fundo da imagem. Neste exemplo, criei um fundo preto (zero vermelho, zero verde, e zero azul). A rotina retorna um ponteiro para a cor na palete de cores do gráfico. Esta rotina deve ser chamada diversas vezes para a definição das cores que pretendemos utilizar.
 $text_color = imagecolorallocate($im, 255, 255, 255);
 $line_color = imagecolorallocate($im, 0, 0, 255);
 $bar_color = imagecolorallocate($im, 0, 255, 0);
Assim criamos um gráfico com fundo preto, texto branco, cor da linha azul e cor da barra verde.

Após criarmos o ponteiro para a imagem e definirmos as cores que pretendemos utilizar, podemos desenhar segmentos de retas entre dois pontos utilizando a função:
imageline($im, $x1, $y1, $x2, $y2, $line_color);
onde $im é o ponteiro para o nosso gráfico, criado pela primeira rotina; $x1 e $y1 definem o ponto inicial da reta; $x2 e $y2 definem o ponto final da reta; e a variável $line_color aponta para a cor que desejamos na palete de cores que criamos com o segundo comando (neste exemplo, o azul).

O comando para acrescentar texto no nosso gráfico é a função:
 imagestring($im, $font_size, $x, $y, $text, $text_color);
onde $im é o ponteiro para o nosso gráfico; $font_size indica o tamanho da fonte de caracteres (pode variar de 1 a 5 para as fontes pre-definidas); $x e $y são as coordenadas onde o texto deve ser escrito; $text é a string de texto a ser escrito; e $text_color aponta para a cor que desejamos na palete de cores que criamos com o segundo comando (neste exemplo, o branco).

Tendo finalizado o nosso gráfico, utilizamos a rotina
imagepng($im);
para enviar a imagem pela saída padrão. Ou seja, este comando (se usado em uma página web) envia a imagem criada para o navegador do visitante.

A última rotina que devemos utilizar é:
imagedestroy($im);
que libera a memória reservada para o ponteiro pelo primeiro comando que mencionamos.

Observações importantes:
1) Para visualizar a imagem em uma página web, é necessário colocar
<img src="image.php" >
dentro do código HTML da página.

2) O arquivo image.php deve gerar a imagem desejada.

3) O arquivo image.php deve enviar ao navegador o seguinte texto, antes de enviar a imagem
 header("Content-type: image/png");
para indicar que os dados a seguir devem ser interpretados como uma imagem.

4) Na definição do espaço a ser utilizado pelo gráfico, a posição 0,0 é a do canto superior esquerdo. X na horizontal e Y na vertical.


Exemplos de gráficos que criei utilizando PHP podem ser vistos na minha página de estatísticas de banners.