Sistemas de Apoio à Decisão • Alternativas para modelar o processo de tomada de decisões: – consultar o gestor/perito e elaborar um modelo a partir dessa informação. – construir um modelo a partir de dados. 1. Recolher uma amostra de dados. – Descrição de situações concretas e respectivas decisões então tomadas. • Registo histórico das decisões dos peritos humanos. 2. Construír um modelo a partir desse registo histórico. Luís Torgo, 2002 FEP, UP O exemplo da concessão de crédito • Em vez de “extraírmos” dos peritos do banco o modelo de decisão que usam, podemos solicitar-lhes o registo histórico das suas decisões. Vantagens : Mais fácil e mais rápido. Poderiamos obter uma tabela de casos de decisões como a seguinte: Montante médio médio alto baixo alto … Luís Torgo, 2002 Idade junior junior senior junior senior … Salário médio baixo alto médio médio … Conta sim não sim sim não … Decisão concedido não concedido concedido concedido não concedido … FEP, UP Árvores de decisão • Existem métodos para obter um modelo de decisão a partir de dados como os da tabela anterior. – As árvores de decisão são um exemplo desses métodos. Exemplo de uma árvore de decisão: Esta árvore foi obtida de um registo histórico contendo 29 decisões de não conceder e 70 decisões de conceder (a decisão maioritária é “sim”) Luís Torgo, 2002 FEP, UP Obter uma árvore de decisão em R Passo 1: obter os dados (registo histórico) • Alternativas possíveis em R: – – – – – Introduzir os dados “à mão”. Carregar os dados que estão guardados num ficheiro qualquer. Carregar os dados da Internet. Carregar os dados de uma base de dados qualquer (ex. Access). Carregar os dados de uma outra aplicação qualquer (ex. um package estatístico como o SPSS, ou do Excel, etc.) Luís Torgo, 2002 FEP, UP Obter os dados • No site http://www.liacc.up.pt/~ltorgo/Ensino/FEP/AnaliseDados/credito.Rdata Está um ficheiro com dados de pedidos de concessão de crédito. • Vejamos como colocar estes dados num data frame do R > download.file(’http://www.liacc.up.pt/~ltorgo/Ensino/FEP/AnaliseDados/credito.Rdata’, + ’exp.data’) trying URL ‘http://www.liacc.up.pt/~ltorgo/Ensino/FEP/AnaliseDados/credito.Rdata’ Content type ‘text/plain’ length 2661 bytes Ler os dados da Internet opened URL para um ficheiro. downloaded 2661 bytes > dados <- read.csv(’exp.data’) > dados Ler os dados de um ficheiro montante idade salario conta emprestimo CSV para um data frame 1 medio junior baixo sim nao 2 medio junior baixo nao nao 3 baixo junior baixo sim sim 4 alto media baixo sim sim 5 alto senior alto sim sim ... Luís Torgo, 2002 FEP, UP Ficheiros CSV • Ficheiros de texto com o seguinte conteúdo A primeira linha tem o nome das colunas (variáveis) Cada linha tem um caso, com os valores das variáveis separados por vírgulas • Formato bastante comum para guardar dados tabulares como estes. – Usado em muitos programas para além do R, • Por exemplo, se tivermos os nossos dados numa folha de cálculo do Excel, podemos fazer “Save As” CSV, o que permitiria guardar os dados da folha de cálculo num ficheiro em formato CSV, que poderiam ser depois lidos para o R, usando a função “read.csv()” Luís Torgo, 2002 FEP, UP Exportar os dados de uma tabela do Access • Vamos supor que gostaríamos de ter os dados de uma tabela do Access num data frame do R para posterior análise. • Existem várias formas de o fazer. Uma delas é exportar esses dados para um ficheiro CSV, e depois lê-lo do R. Carregando no botão direito do rato aparece este menu Luís Torgo, 2002 FEP, UP (cont.) Luís Torgo, 2002 FEP, UP (cont.) • Depois de exportados os dados para um ficheiro CSV, podemos usar a função “read.csv()” para os ler para um data frame: > dados <- read.csv('Clientes.txt') > dados Cliente Morada Telf 1 Alvaro Silva lisboa 56456 2 Ana Castro faro 343454 3 Ana Silva Pereira coimbra 5467567867 4 Carlitos faro 434334345 5 Carlos Amaral faro 21 34345345 6 Claudia lisboa 22 4546756 7 José Carlos porto 4455 8 Pedro porto 225455465 9 Silva e filhos coimbra 6666666 Luís Torgo, 2002 FEP, UP Obter um árvore de decisão com os dados de um data frame Package extra do R, que contém as > library(rpart) funções para obter árvores de > árvore <- rpart(emprestimo ~ ., data=dados) decisão > árvore n= 99 node), split, n, loss, yval, (yprob) * denotes terminal node Fórmula que indica a forma funcional do modelo que o R deve obter. Neste caso é um modelo para prever a variável “emprestimo” usando todas as outras. 1) root 99 29 sim (0.29292929 0.70707071) 2) salario=baixo 31 11 nao (0.64516129 0.35483871) 4) montante=alto,medio 21 1 nao (0.95238095 0.04761905) * 5) montante=baixo 10 0 sim (0.00000000 1.00000000) * 3) salario=alto 68 9 sim (0.13235294 0.86764706) 6) conta=nao 27 9 sim (0.33333333 0.66666667) 12) montante=alto 9 0 nao (1.00000000 0.00000000) * 13) montante=baixo,medio 18 0 sim (0.00000000 1.00000000) * 7) conta=sim 41 0 sim (0.00000000 1.00000000) * Luís Torgo, 2002 FEP, UP Obter uma representação gráfica de uma árvore de decisão > plot(árvore) > text(árvore) • Usando alguns parâmetros destas duas funções é possível obter resultados gráficos muito melhores. • Por exemplo: > mostra.arvore <- function(árvore) { + plot(árvore,uniform=T,branch=0) + text(árvore,digits=3,cex=0.65, + font=10, pretty=0,fancy=T,fwidth=0, + fheight=0) + } > mostra.arvore(árvore) • Com mais parametrização é possível ainda melhor como na árvore mostrada anteriormente Luís Torgo, 2002 FEP, UP Avaliar a qualidade do modelo de decisão • Que confiança podemos ter no modelo de decisão que obtivemos a partir do registo histórico de decisões? • Podemos tentar responder a esta questão usando o modelo para tomar decisões, e verificando que percentagem destas é acertada. • Para isso vamos proceder do seguinte modo: – Vamos dividir a nossa amostra de decisões (para as quais sabemos a decisão correcta) em duas partes: • Uma para construir o modelo de decisão • Outra para o testar comparando as previsões do modelo com as decisões dos peritos. > > > > > > amostra <- sample(1:nrow(dados),as.integer(0.7*nrow(dados))) dados.modelo <- dados[amostra,] dados.teste <- dados[-amostra,] árvore <- rpart(emprestimo ~ .,data=dados.modelo) previsões.modelo <- predict(árvore,dados.teste) previsões.modelo A árvore prevê que existe 72% de probabilidade de nao sim 3 0.7200000 0.2800000 este ser um caso em que não se deve conceder crédito. 7 0.1590909 0.8409091 ... Luís Torgo, 2002 FEP, UP (cont.) > previsões.modelo <- predict(árvore,dados.teste,type='class') > previsões.modelo [1] nao sim nao sim sim sim sim sim nao sim sim sim sim sim sim sim sim nao sim [20] sim nao sim sim sim sim nao sim sim sim sim Levels: nao sim > table(dados.teste$emprestimo,previsões.modelo) previsões.modelo nao sim Matriz de confusão nao 2 2 sim 4 22 > m.conf <- table(dados.teste$emprestimo,previsões.modelo) > perc.erro <- 100*(m.conf[1,2]+m.conf[2,1])/sum(m.conf) > perc.erro [1] 20 • Nestes 30 casos de teste, a árvore acerta em 80% dos casos. Luís Torgo, 2002 FEP, UP