{"cells":[{"metadata":{"_uuid":"051d70d956493feee0c6d64651c6a088724dca2a","_execution_state":"idle","trusted":true},"cell_type":"code","source":"# This R environment comes with many helpful analytics packages installed\n# It is defined by the kaggle/rstats Docker image: https://github.com/kaggle/docker-rstats\n# For example, here's a helpful package to load\n\nlibrary(tidyverse) # metapackage of all tidyverse packages\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nlist.files(path = \"../input\")\n\n# You can write up to 5GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session\n# 1 - Entendimento do negócio\n# Descrição\n# Objetivo: Prever se o usuário fará o download de um aplicativo ou não\n# após clicar em um anúncio. Em suma, prever a ocorrência de fraudes\n# (cliques que não confirmam em download de aplicativos)\n\n# Definindo o diretório do local de trabalho\n# Descompacte o projeto e define o local\n#setwd(\"C:/FCD/BigDataRAzure/AnalisadorFraudes\")\n#getwd()\n\n# Pacotes\n#install.packages(\"lubridate\")\n#install.packages(\"caTools\")\n#install.packages(\"rpart\")\n#install.packages(\"e1071\")\n#install.packages(\"readr\")\n\nlibrary(lubridate)\nlibrary(caTools)\nlibrary(rpart)\nlibrary(e1071)\nlibrary(readr)\n\n# Processo de  ETL\n# 2 - Carregando o dataset\n# Opção pelo dataset de amostra devido aos recursos limitados do computador (armazenamento de memória)\n# principal e dataset muito grande\n# Descompacte o projeto e define o local\nregistros <- read.csv(\"../input/talkingdata-adtracking-fraud-detection/train_sample.csv\") #path = \"../input\nnrow(registros)\n\nregistros\n#View(registros)\nstr(registros)\n\n# Pré-processamento, limpeza, transformação e preparação\n# Transformação de variáveis numéricas para categóricas ou vice-versa, segundo\n# informações colhidas do dicionário de dados\nregistros$ip = as.factor(registros$ip)\nregistros$app = as.factor(registros$app)\nregistros$device = as.factor(registros$device)\nregistros$os = as.factor(registros$os)\nregistros$channel = as.factor(registros$channel)\nregistros$is_attributed = as.factor(registros$is_attributed)\n\n# Conversão para data\nregistros$click_time = ymd_hms(registros$click_time) \nregistros$attributed_time = ymd_hms(registros$attributed_time) \n\n\n# 3 - Análise Exploratória\n# Exploração de variáveis categóricas\ntable(registros$ip)\nrange(as.integer(table(registros$ip)))\ntop5IPsMaisFrequentes = head(sort((table(registros$ip)),decreasing = TRUE), 5L)\ntop5IPsMaisFrequentes\n#View(top5IPsMaisFrequentes)\npng(\"Img1.png\", width = 500, height = 500, res = 72)\nbarplot(top5IPsMaisFrequentes,main = \"TOP 5 (Quantidade) IDS dos Usuários\",\n        xlab = \"ID do Usuário\",ylab = \"Quantidade\",col = c(\"pink\",\"red\",\n                                                           \"darkgreen\",\"green\",\n                                                           \"gold\"))\n# hist(as.integer(registros$ip),main = \"Frequência(Quantidade) Endereços IP\",\n# xlab = \"Valores IP\", ylab = \"Frequência\", col = \"yellow\")\ndev.off()\n\n\ntable(registros$app)\nrange(as.integer(table(registros$app)))\n#hist(as.integer(registros$app),main = \"Frequência(Quantidade) IDs do APP na Loja\",\n#     xlab = \"ID do App\", ylab = \"Quantidade\", col = \"yellow\")\n# TOP 5 categorias mais frequentes\ntop5AppsMaisFrequentes = head(sort((table(registros$app)),decreasing = TRUE), 5L)\ntop5AppsMaisFrequentes\n#View(top5AppsMaisFrequentes)\n\n#barplot(table(registros$app),main = \"(Quantidade) IDS dos APPs\",\n#        xlab = \"ID do Dispositivo\",ylab = \"Quantidade\",col = \"yellow\")\npng(\"Img2.png\", width = 500, height = 500, res = 72)\nbarplot(top5AppsMaisFrequentes,main = \"TOP 5 - (Quantidade) IDS dos APPs\",\n        xlab = \"ID do Dispositivo\",ylab = \"Quantidade\",col = c(\"pink\",\"red\",\n                                                               \"darkgreen\",\"green\",\n                                                               \"gold\"))\ndev.off()\n\n\ntable(registros$device)\nrange(as.integer(table(registros$device)))\ntop5DispositivosMaisFrequentes = head(sort((table(registros$device)),decreasing = TRUE), 5L)\ntop5DispositivosMaisFrequentes\n#View(top5DispositivosMaisFrequentes)\n#barplot(table(registros$device),main = \"Dispositivos usados\",\n#        xlab = \"Código do tipo de dispositivo\",ylab = \"Quantidade\",col = \"yellow\")\npng(\"Img3.png\", width = 500, height = 500, res = 72)\nbarplot(top5DispositivosMaisFrequentes,main = \"TOP 5 - Dispositivos usados\",\n        xlab = \"Código do tipo de dispositivo\",ylab = \"Quantidade\",col = c(\"pink\",\"red\",\n                                                                           \"darkgreen\",\"green\",\n                                                                           \"gold\"))\ndev.off()\nhist(as.integer(registros$device),main = \"Frequência(Quantidade) Dispositivos usados\",\n     xlab = \"ID do Dispositivo\", ylab = \"Quantidade\", col = \"yellow\")\n\ntable(registros$os)\nrange(as.integer(registros$os))\ntop5SistemasMaisFrequentes = head(sort((table(registros$os)),decreasing = TRUE), 5L)\ntop5SistemasMaisFrequentes\n#View(top5SistemasMaisFrequentes)\n#barplot(table(registros$os),main = \"Sistemas Operacionais usados\",\n#        xlab = \"Código do tipo de sistema operacional\",ylab = \"Quantidade\", col = \"yellow\")\npng(\"Img4.png\", width = 500, height = 500, res = 72)\nbarplot(top5SistemasMaisFrequentes,main = \"TOP 5 - Sistemas Operacionais usados\",\n        xlab = \"Código do tipo de sistema operacional\",ylab = \"Quantidade\", col = c(\"pink\",\"red\",\n                                                                                    \"darkgreen\",\"green\",\n                                                                                    \"gold\"))\ndev.off()\nhist(as.integer(registros$os),main = \"Frequência(Quantidade) Sistemas usados\",\n     xlab = \"ID do Sistema\", ylab = \"Quantidade\", col = \"yellow\")\n\ntable(registros$channel)\nrange(as.integer(table(registros$channel))) # Menor e maior categoria\ntop5CanaisMaisFrequentes = head(sort((table(registros$channel)),decreasing = TRUE), 5L)\ntop5CanaisMaisFrequentes\n#View(top5CanaisMaisFrequentes)\n#barplot(table(registros$channel),main = \"Canais usados\",\n#        xlab = \"Código do tipo do canal\",ylab = \"Quantidade\", col = \"yellow\")\npng(\"Img5.png\", width = 500, height = 500, res = 72)\nbarplot(top5CanaisMaisFrequentes,main = \"TOP 5 - Canais usados\",\n        xlab = \"Código do tipo do canal\",ylab = \"Quantidade\", col = c(\"pink\",\"red\",\n                                                                      \"darkgreen\",\"green\",\n                                                                      \"gold\"))\n#hist(as.integer(registros$channel),main = \"Frequência(Quantidade) dos Canais Usados\",\n#     xlab = \"ID do Canal\", ylab = \"Quantidade\", col = \"yellow\")\ndev.off()\n\ntable(registros$is_attributed)\n#barplot(table(registros$is_attributed),main = \"Resultado DOWNLOAD vs NÃO DOWNLOAD\",\n#        xlab = \"NÃO FEZ DOWNLOAD (0) FEZ DOWNLOAD (1)\",ylab = \"Quantidade\",col = \"yellow\")\n\nmodel_table <- table(registros$is_attributed)\nmodel_table <- prop.table(model_table) * 100\npaste(round(model_table, digits = 1),\"%\")\n\n\nrotulos = c('NÃO DOWNLOAD (0) ','FEZ DOWNLOAD (1)')\npercent = round(model_table/sum(model_table)*100,digits = 1)\nrotulos = paste(rotulos,percent) # SES 40%\nrotulos = paste(rotulos,\"%\",sep = \"\") # SES 40%\npng(\"Img6.png\", width = 500, height = 500, res = 72)\npie(model_table,labels = rotulos, col = c(\"blue\",\"pink\"),main = \"Resultado DOWNLOAD vs NÃO DOWNLOAD\",\n    radius = 0.4)\ndev.off()\n\nstr(registros$click_time)\ntable(wday(registros$click_time,label = TRUE)) \npng(\"Img7.png\", width = 500, height = 500, res = 72)\nbarplot(table(wday(registros$click_time,label = TRUE)) ,main = \"Dia (da semana) do click\",\n        xlab = \"Dia da semana\",ylab = \"Quantidade\", col = c(\"gray\",\"red\",\n                                                            \"darkgreen\",\"green\",\n                                                            \"gold\",\"blue\",\"pink\"))\ndev.off()\n\ntable(month(registros$click_time,label = TRUE)) \npng(\"Img8.png\", width = 500, height = 500, res = 72)\nbarplot(table(month(registros$click_time,label = TRUE)) ,main = \"Mês do click\",\n        xlab = \"MêS\",ylab = \"Quantidade\", col = c(colors()))\ndev.off()\n\ntable(hour(registros$click_time)) \npng(\"Img9.png\", width = 500, height = 500, res = 72)\nbarplot(table(hour(registros$click_time)) ,main = \"Hora do click\",\n        xlab = \"MêS\",ylab = \"Quantidade\", col = c(colors()))\ndev.off()\npng(\"Img10.png\", width = 500, height = 500, res = 72)\nhist(x = hour(registros$click_time),breaks = 24, main = \"Frequência da Hora do click\",\n     xlab = \"Hora\", ylab = \"Frequência\", col = c(colors()))\ndev.off()\n\nsummary(hour(registros$click_time))\npng(\"Img11.png\", width = 500, height = 500, res = 72)\nboxplot(x = hour(registros$click_time),main = \"Hora do click\",\n        ylab = \"Hora\", col = \"gold\")\ndev.off()\ntable(mday(registros$click_time))\npng(\"Img12.png\", width = 500, height = 500, res = 72)\nbarplot(table(mday(registros$click_time)) ,main = \"Dia do mês do click\",ylab = \"Quantidade\",\n        xlab = \"Dia do MêS\",breaks = 31,col = c(colors()))\ndev.off()\n\ntable(hour(registros$attributed_time)) \ntable(minute(registros$attributed_time)) \npng(\"Img13.png\", width = 500, height = 500, res = 72)\nbarplot(table(hour(registros$attributed_time)) ,main = \"Tempo do app download em HORAS\",ylab = \"Quantidade\",\n        xlab = \"Horas\",breaks = 31,col = c(colors()))\ndev.off()\n\ntop5MinutosMaisFreqDownload = head(sort(table(minute(registros$attributed_time)),decreasing = TRUE), 5L)\npng(\"Img14.png\", width = 500, height = 500, res = 72)\nbarplot(top5MinutosMaisFreqDownload,main = \"TOP 5 - Tempo do app download em minutos\",ylab = \"Quantidade\",\n        xlab = \"Minutos\",col = c(colors()))\ndev.off()\n\n# 4 - Construção do modelo preditivo\n# Algoritmo de Machine Learning (treinamento,teste)\namostra <- sample.split(registros$is_attributed, SplitRatio = 0.70)\ndados_treino = subset(registros, amostra == TRUE)\ndados_teste = subset(registros, amostra == FALSE)\n\n\nmodelo_rf_v1 = rpart(is_attributed ~ ., data = dados_treino, control = rpart.control(cp = .0005)) #0.9974333 \ntree_pred = predict(modelo_rf_v1, dados_teste, type='class')\nresultadosM1 = cbind(tree_pred,dados_teste$is_attributed)\n# Tabela de Resultados com acertos e erros\ncolnames(resultadosM1) <- c('Previsto','Real')\nresultadosM1 <- as.data.frame(resultadosM1)\nresultadosM1\n\n# Escrevendo num arquivo - arquivos de saída vão para output aqui\nwrite_csv2(resultadosM1, \"resultadosModelo1.csv\")\ndir()\ndf_resultados <- read_csv(\"resultadosModelo1.csv\")\ndf_resultados\n\n\n# Confusion matrix\ntabelaConfusionM1 = table(pred = tree_pred, true = dados_teste$is_attributed)\nwrite.csv2(as.data.frame(tabelaConfusionM1),\"confusionMatrixModelo1.csv\")\ndir()\n\n\n# Percentual de previsões corretas com dataset de teste\nmediaModeloR1 = mean(tree_pred == dados_teste$is_attributed) \nwrite.csv2(mediaModeloR1,\"precisaoModelo1.csv\")\npaste(round(mean(tree_pred==dados_teste$is_attributed) * 100, digits = 1),\"%\")\n\n# 5 - Otimização do modelo\n\n# Tentativa 1 = Alterar algoritmo de ML (naiveBayes)\n\n# Treine o modelo\n?naiveBayes\nmodeloNaive = naiveBayes(formula = dados_treino$is_attributed ~., data = dados_treino)\n# Fazendo previsões com os dados de teste\nprevisoes = predict(modeloNaive,dados_teste[,-1])\nprevisoes\n\n# Fazendo comparações entre o original e as previsões, quantos acertos e quantos errou\nresultadosM2 = cbind(previsoes,dados_teste$is_attributed)\ncolnames(resultadosM2) <- c('Previsto','Real')\nresultadosM2 <- as.data.frame(resultadosM2)\n\n# Cálculo do Erro médio\nmse <- mean((resultadosM2$Real - resultadosM2$Previsto)^2)\nprint(mse)*100\n\n# RMSE\nrmse <- mse^0.5\nrmse\n\n# Confusion matrix\n# tabelaConfusionM1 = table(pred = tree_pred, true = dados_teste$is_attributed)\nconfusionMatrixM2 = table(pred = previsoes, true = dados_teste$is_attributed)\nclass(confusionMatrixM2)\nwrite_csv2(resultadosM2, \"resultadosModelo2.csv\")\nwrite_csv2(as.data.frame(confusionMatrixM2), \"confusionMatrixModelo2.csv\")\n\n\n# Média\nmediaModeloR2 = mean(previsoes == dados_teste$is_attributed) #0.9876 98.8 %3 O algoritmo 1 teve melhor desempenho \npaste(round(mean(previsoes == dados_teste$is_attributed) * 100, digits = 1),\"%\")\nwrite.csv2(mediaModeloR2,\"precisaoModelo2.csv\")\n\n# svm não possível pelo tamanho 9,1 G\n\n# Tentativa 2 = Alterar variáveis preditoras do modelo\n# Retirando variáveis para verificar se melhora ou modelo? Técnica subjetiva!\n\n# Retreinando o modelo tirando 1 variável (ip)\ndados_treino$ip = NULL\ndados_teste$ip = NULL\nmodelo_rf_v2 = rpart(is_attributed ~ . , \n                     data = dados_treino, \n                     control = rpart.control(cp = .0005))\n\n# Teste (para as previsões)\n# Previsões nos dados de teste\ntree_pred = predict(modelo_rf_v2, dados_teste, type='class')\n\n# Percentual de previsões corretas com dataset de teste\nmediaModelo3 = mean(tree_pred == dados_teste$is_attributed)  \npaste(round(mean(tree_pred==dados_teste$is_attributed) * 100, digits = 1),\"%\")\n\n# Fazendo comparações entre o original e as previsões, quantos acertos e quantos errou\nresultadosM3 = cbind(tree_pred,dados_teste$is_attributed)\ncolnames(resultadosM3) <- c('Previsto','Real')\nresultadosM3 <- as.data.frame(resultadosM3)\n\nconfusionMatrixM3 = table(pred = tree_pred, true = dados_teste$is_attributed)\nwrite_csv2(resultadosM3, \"resultadosModelo3.csv\")\nwrite_csv2(as.data.frame(confusionMatrixM3), \"confusionMatrixModelo3.csv\")\nwrite.csv2(mediaModelo3,\"precisaoModelo3.csv\") # não teve impacto\n\n# Poderíamos ainda continuar o trabalho de experimento tirando outras variáveis para alcançar\n# um precisão MAIOR, mas no caso 99,7% tá excelente!\n# Tentativa 3 = Alteração parâmetros do ML\n# Alteração do cp da árvore (0-1 0 mais complexo, 1 menos complexo)\n# Ajuste para encontrar o CP ótimo\n#printcp(modelo_rf_v1) # note que a menor taxa relativa de erros com cp 0.000500, tendo 6 divisões na árvore\n#plotcp(modelo_rf_v1)\n#modelo_rf_v2 = rpart(is_attributed ~ ., data = dados_treino, control = rpart.control(cp = 0.0022))\n\n#tree_pred2 = predict(modelo_rf_v2, dados_teste, type='class')\n#mean(tree_pred2 == dados_teste$is_attributed) #0.9974333\n#paste(round(mean(tree_pred2==dados_teste$is_attributed) * 100, digits = 1),\"%\")\n\n# comparação dos modelos e qual teve melhor desempenho (precisão) \n# usamos a métrica 'PRECISÃO' para comparar os modelos, mas poderíamos usar outras ...\nresultadosFinais <- data.frame(nome = c(\"Modelo 1\", \"Modelo 2\",\"Modelo 3\"),\n                               algoritmo = c(\"R-part\", \"naiveBayes\",\"R-parte com variavel IP tirada\"),\n                               precisao = c(mediaModeloR1,mediaModeloR2,mediaModelo3))\nwrite_csv2(resultadosFinais,\"resultadoFinal.csv\")\n# modelo escolhido foi o modelo_rf_v2\n\n# 6 - Deploy\n# Escolhemos apenas optar por subir para o GITHUB. Outras alternativas: construir uma interface\n# gráfica e disponibilizá para o cliente (por meio da nuvem).\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"name":"ir","display_name":"R","language":"R"},"language_info":{"name":"R","codemirror_mode":"r","pygments_lexer":"r","mimetype":"text/x-r-source","file_extension":".r","version":"3.6.3"}},"nbformat":4,"nbformat_minor":4}