Este relatório tem como objetivo analisar dados publicitários e ajustar um modelo de regressão. Os dados utilizados neste relatório estão disponíveis publicamente no Kaggle e podem ser acessados através do link: Advertisement Click on Ad Dataset. Na seção inicial, será feita uma análise descritiva dos dados para compreender sua estrutura e características gerais.
Nesta etapa, os dados são carregados, e são realizadas as primeiras transformações e inspeções para entender sua estrutura e preparar o conjunto de dados para análises mais detalhadas.
## tibble [1,000 × 10] (S3: tbl_df/tbl/data.frame)
## $ Daily Time Spent on Site: num [1:1000] 69 80.2 69.5 74.2 68.4 ...
## $ Age : num [1:1000] 35 31 26 29 35 23 33 48 30 20 ...
## $ Area Income : num [1:1000] 61834 68442 59786 54806 73890 ...
## $ Daily Internet Usage : num [1:1000] 256 194 236 246 226 ...
## $ Ad Topic Line : chr [1:1000] "Cloned 5thgeneration orchestration" "Monitored national standardization" "Organic bottom-line service-desk" "Triple-buffered reciprocal time-frame" ...
## $ City : chr [1:1000] "Wrightburgh" "West Jodi" "Davidton" "West Terrifurt" ...
## $ Male : num [1:1000] 0 1 0 1 0 1 0 1 1 1 ...
## $ Country : chr [1:1000] "Tunisia" "Nauru" "San Marino" "Italy" ...
## $ Timestamp : POSIXct[1:1000], format: "2016-03-27 00:53:11" "2016-04-04 01:39:02" ...
## $ Clicked on Ad : num [1:1000] 0 0 0 0 0 0 0 1 0 0 ...
df2 <- df[-246, ]
# Exibir as primeiras linhas do dataframe
#head(df)
df2 <- as_tibble(df2)
#str(df2)Timestamp, representando o momento de registro, é
convertida para o formato de data e hora, facilitando análises temporais
caso necessário.Com essa base, seguimos para as análises descritivas gráficas que complementam esta investigação inicial.
Nesta seção, analisaremos graficamente as principais características das variáveis do conjunto de dados.
O gráfico abaixo mostra as idades mais frequentes no conjunto de dados, representando os 10 principais grupos em termos percentuais. Isso ajuda a identificar o perfil etário predominante dos usuários analisados.
# Percentual das idades mais comuns
df_percentual_age <- df %>%
count(Age) %>%
mutate(percent = n / sum(n) * 100) %>%
arrange(desc(percent)) %>%
head(10)
# Gráfico de barras das idades mais comuns
ggplot(df_percentual_age, aes(x = reorder(Age, -percent), y = percent)) +
geom_bar(stat = "identity", fill = "steelblue", color = "black") +
geom_text(aes(label = sprintf("%.2f%%", percent)), vjust = -0.5, size = 3.5) +
labs(x = "Idade", y = "Percentual", title = "Distribuição Percentual das Idades Mais Comuns") +
theme_minimal(base_size = 14)O gráfico destaca que a faixa etária de 31 anos é a mais prevalente, representando 6% dos dados. Em seguida, idades como 36, 28 e 29 anos aparecem com percentuais próximos de 5%. Esses resultados sugerem que o público analisado é majoritariamente adulto jovem, com idades concentradas entre 26 e 36 anos
Este histograma apresenta a distribuição geral das idades no conjunto de dados, oferecendo uma visão clara da dispersão e concentração dos valores.
# Histograma das idades
ggplot(df, aes(x = Age)) +
geom_histogram(bins = 30, fill = "dodgerblue", color = "black") +
labs(x = "Idade", y = "Frequência", title = "Histograma das Idades") +
theme_minimal(base_size = 14)O histograma evidencia que a distribuição das idades é levemente assimétrica à direita, com maior frequência em torno de 30 anos. Isso corrobora com o gráfico anterior, indicando que a maioria dos usuários está na faixa de 20 a 40 anos, com uma menor presença de indivíduos acima dos 50 anos.
Este gráfico apresenta a proporção de gêneros no conjunto de dados, identificando a representação masculina e feminina entre os usuários analisados.
# Percentual de gênero (Male)
df_percentual_male <- df %>%
count(Male) %>%
mutate(percent = n / sum(n) * 100)
# Gráfico de barras do percentual de gênero
ggplot(df_percentual_male, aes(x = factor(Male, labels = c("Feminino", "Masculino")), y = percent)) +
geom_bar(stat = "identity", fill = c("pink", "lightblue"), color = "black") +
geom_text(aes(label = sprintf("%.2f%%", percent)), vjust = -0.5, size = 3.5) +
labs(x = "Gênero", y = "Percentual", title = "Distribuição Percentual por Gênero") +
theme_minimal(base_size = 14)Este gráfico revela uma ligeira predominância de usuárias femininas (51.9%) em relação aos usuários masculinos (48.1%). Embora a diferença seja pequena, ela pode ser relevante dependendo do objetivo da campanha publicitária, indicando uma necessidade de segmentação ou personalização de conteúdos.
O gráfico exibe a proporção de usuários que clicaram e não clicaram no anúncio. Isso fornece insights sobre o comportamento geral dos usuários em relação às campanhas publicitárias.
# Percentual de cliques no anúncio
df_percentual_click <- df %>%
count(`Clicked on Ad`) %>%
mutate(percent = n / sum(n) * 100)
# Gráfico de barras dos cliques
ggplot(df_percentual_click, aes(x = factor(`Clicked on Ad`, labels = c("Não clicou", "Clicou")), y = percent)) +
geom_bar(stat = "identity", fill = c("tomato", "forestgreen"), color = "black") +
geom_text(aes(label = sprintf("%.2f%%", percent)), vjust = -0.5, size = 3.5) +
labs(x = "Clique no Anúncio", y = "Percentual", title = "Distribuição Percentual de Cliques") +
theme_minimal(base_size = 14)O gráfico de barras indica que a divisão entre usuários que clicaram e não clicaram no anúncio está exatamente balanceada, com 50% em cada grupo. Este equilíbrio pode facilitar as análises subsequentes, evitando vieses devido à desproporção entre as categorias.
Este boxplot compara o tempo diário gasto no site pelos usuários que clicaram e não clicaram no anúncio, indicando possíveis diferenças no engajamento.
# Boxplot: Tempo diário no site vs. clique no anúncio
ggplot(df, aes(x = factor(`Clicked on Ad`, labels = c("Não clicou", "Clicou")), y = `Daily Time Spent on Site`)) +
geom_boxplot(fill = "lightblue", color = "black") +
labs(x = "Clique no Anúncio", y = "Tempo Diário no Site", title = "Boxplot: Tempo Diário no Site por Clique") +
theme_minimal(base_size = 14)Este boxplot mostra que usuários que não clicaram no anúncio tendem a passar mais tempo diário no site (mediana acima de 80 minutos), enquanto aqueles que clicaram apresentam um tempo diário menor (mediana próxima de 60 minutos). Isso sugere que maior tempo de navegação não está diretamente associado a cliques nos anúncios.
Este boxplot avalia a relação entre a renda média da área e a probabilidade de clique no anúncio, destacando possíveis tendências econômicas
# Boxplot: Renda da área vs. clique no anúncio
ggplot(df, aes(x = factor(`Clicked on Ad`, labels = c("Não clicou", "Clicou")), y = `Area Income`)) +
geom_boxplot(fill = "lightgreen", color = "black") +
labs(x = "Clique no Anúncio", y = "Renda da Área", title = "Boxplot: Renda da Área por Clique") +
theme_minimal(base_size = 14)A análise do boxplot revela que usuários que clicaram no anúncio têm renda da área ligeiramente menor (mediana mais baixa) em comparação com os que não clicaram. Isso pode indicar uma relação entre o perfil socioeconômico da área e a propensão a interagir com os anúncios.
O mapa de calor apresenta as correlações entre as variáveis numéricas selecionadas. Ele fornece insights importantes sobre a relação entre as variáveis, ajudando a identificar padrões que podem ser explorados no modelo de regressão.
# Selecionar variáveis numéricas
numeric_vars <- dplyr::select(df, `Daily Time Spent on Site`, `Age`,`Area Income`, `Daily Internet Usage`, `Clicked on Ad`)
# Calcular a matriz de correlação e arredondar os valores
cor_matrix <- round(cor(numeric_vars), 2)
# Derreter a matriz de correlação para formato longo
cor_long <- melt(cor_matrix)
# Manter apenas a metade inferior da matriz
cor_long <- cor_long[as.numeric(cor_long$Var1) > as.numeric(cor_long$Var2), ]
# Heatmap de correlação triangular com anotações
ggplot(cor_long, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(color = "white") +
geom_text(aes(label = value), color = "black", size = 4) +
scale_fill_gradient2(low = "white", high = "red", mid = "lightpink", midpoint = 0,
limit = c(-1, 1), space = "Lab", name = "Correlação") +
labs(x = "", y = "", title = "Mapa de Calor das Correlações") +
theme_minimal(base_size = 14) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
panel.grid = element_blank()
) +
coord_fixed()O mapa de calor mostra que há uma forte correlação negativa entre o tempo diário no site e o uso diário da internet (-0.79), bem como entre o tempo diário no site e o clique no anúncio (-0.75), indicando que usuários que passam menos tempo no site têm maior propensão a clicar no anúncio. Além disso, há uma correlação positiva moderada entre a idade e o clique no anúncio (0.49), sugerindo que usuários mais velhos têm maior probabilidade de interação com o anúncio. As demais variáveis apresentam correlações mais fracas.
Nesta seção, iniciamos o ajuste do modelo de regressão logística para
prever a variável resposta Clicked on Ad com base nas
variáveis explicativas.No modelo original, a observação 246 parecia ter
influência significativa sobre o ajuste do modelo, portanto a modelagem
foi feita sem essa observação, o que deu mais robustez aos
resultados.
# Ajustar o modelo de regressão logística
# Converter `Clicked on Ad` e `Male` para fatores
df$Clicked_on_Ad <- as.factor(df$`Clicked on Ad`)
df$Male <- as.factor(df$Male)
# Selecionar as variáveis de interesse e a variável resposta
df_model <- dplyr::select(df, `Clicked on Ad`, Age, `Daily Time Spent on Site`, `Area Income`, `Daily Internet Usage`, Male)
#Base sem observação influente
df_model2 <- as.data.frame(df_model[-246, ])# Primeiro modelo
modelo_old <- glm(`Clicked on Ad` ~ Age + `Daily Time Spent on Site` + `Area Income` + `Daily Internet Usage`,
data = df_model, family = binomial)
# Modelo final
modelo <- glm(`Clicked on Ad` ~ Age + `Daily Time Spent on Site` + `Area Income` + `Daily Internet Usage`,
data = df_model2, family = binomial)
# Resumo do modelo
summary(modelo)##
## Call:
## glm(formula = `Clicked on Ad` ~ Age + `Daily Time Spent on Site` +
## `Area Income` + `Daily Internet Usage`, family = binomial,
## data = df_model2)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.4816 -0.1326 0.0012 0.0147 3.1919
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.752e+01 2.781e+00 9.893 < 2e-16 ***
## Age 1.843e-01 2.720e-02 6.778 1.22e-11 ***
## `Daily Time Spent on Site` -1.946e-01 2.111e-02 -9.218 < 2e-16 ***
## `Area Income` -1.441e-04 1.975e-05 -7.293 3.03e-13 ***
## `Daily Internet Usage` -6.438e-02 6.856e-03 -9.390 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1384.91 on 998 degrees of freedom
## Residual deviance: 178.77 on 994 degrees of freedom
## AIC: 188.77
##
## Number of Fisher Scoring iterations: 8
O modelo de regressão logística ajustado é estatisticamente
significativo, com todas as variáveis apresentando valores de p muito
baixos, sugerindo que elas têm um impacto relevante na probabilidade de
clique no anúncio. O coeficiente positivo para Age indica
que o aumento da idade está associado a uma maior probabilidade de
clique, enquanto os coeficientes negativos para
Daily Time Spent on Site, Area Income e
Daily Internet Usage sugerem que maiores valores dessas
variáveis estão relacionados a uma menor probabilidade de clique. A
deviance residual de 178.77, significativamente menor que a deviance
nula de 1384.91, indica que o modelo ajusta bem os dados. O AIC de
188.77 reflete um modelo relativamente bem ajustado com boa capacidade
de predição, considerando o equilíbrio entre qualidade do ajuste e
complexidade do modelo.
# Verificação do ajuste do modelo usando o desvio
n <- nrow(df2) # Tamanho amostral
D <- deviance(modelo) # Desvio do modelo
gl <- n - modelo$rank # Graus de liberdade
pvalor <- 1 - pchisq(D, gl) # Nível descritivo
cat("P-valor para o ajuste do modelo:", pvalor, "
")## P-valor para o ajuste do modelo: 1
### ANÁLISE DE DIAGNÓSTICO
residuos <- df_model2 %>%
mutate(
Index = row_number(), # Índice de cada observação
resid_deviance = residuals(modelo, type = "deviance") # Resíduo de deviance
)
# Criar o gráfico com ggplot
ggplot_residuos <- ggplot(residuos, aes(x = Index, y = resid_deviance, text = paste(
"indice:", Index,
"<br>Residuo de Deviance:", round(resid_deviance, 3)
))) +
geom_point(color = "forestgreen") +
geom_hline(yintercept = c(-2, 0, 2), linetype = "dashed", color = "red") +
labs(
title = "Resíduos de Deviance vs indices",
x = "indice",
y = "Residuo de Deviance"
) +
theme_minimal()
ggplotly(ggplot_residuos, tooltip = "text")O gráfico indica que a maioria dos resíduos está concentrada em torno de zero, com poucos valores fora das faixas de -2 a 2, representadas pelas linhas vermelhas tracejadas. Isso sugere que o modelo apresenta um bom ajuste para a maioria das observações, embora existam alguns pontos discrepantes que podem indicar potenciais outliers ou casos de alta influência.
## Binomial model
## Total points: 999
## Points out of envelope: 2 ( 0.2 %)
O gráfico indica como os resíduos se alinham em relação à distribuição teórica esperada. Observa-se que, para a maior parte dos pontos, os resíduos seguem o comportamento esperado (próximos da linha de referência), o que sugere que o modelo está adequadamente ajustado. No entanto, há desvios nas caudas, o que pode indicar algumas observações discrepantes ou uma leve inadequação na suposição do modelo para esses pontos específicos.
Identificar observações que exercem uma grande influência potencial no ajuste do modelo devido à sua posição no espaço das variáveis independentes.
# Alavancagem
alavancagem <- hatvalues(modelo)
df2$Alavancagem <- alavancagem
limiar_alavancagem <- 2 * mean(alavancagem)
pontos_alavancagem <- which(alavancagem > limiar_alavancagem)
cat("Pontos influentes por alavancagem (>", limiar_alavancagem, "):", pontos_alavancagem, "\n")## Pontos influentes por alavancagem (> 0.01001001 ): 10 16 34 57 72 91 92 112 117 119 120 122 133 140 151 158 160 164 172 174 182 189 214 224 225 226 233 237 238 239 247 262 266 273 278 289 290 292 294 303 311 312 316 329 345 346 349 363 397 408 412 419 426 432 436 439 449 454 464 480 486 492 517 525 527 529 532 558 562 563 568 573 583 584 585 590 609 612 623 625 638 641 643 653 657 661 668 678 700 706 712 718 723 728 730 738 749 759 766 771 776 780 786 787 792 798 847 854 855 860 862 864 891 895 919 927 939 941 948 949 954 959 963 969 978 981 988 998
# Gráfico de alavancagem por índice
ggplot_alavancagem <- ggplot(df2, aes(x = 1:nrow(df2), y = Alavancagem, text = paste("Índice:", 1:nrow(df2), "<br>Alavancagem:", round(Alavancagem, 3)))) +
geom_point(color = "steelblue") +
geom_hline(yintercept = limiar_alavancagem, linetype = "dashed", color = "red") +
labs(title = "Alavancagem por Índice", x = "Índice", y = "Alavancagem") +
theme_minimal()
ggplotly(ggplot_alavancagem, tooltip = "text")A maioria das observações apresenta valores de alavancagem baixos, indicando baixa influência individual no modelo. Os pontos que ultrapassam a linha de referência sugerem observações com maior potencial de impacto e devem ser investigados mais a fundo.
Medir a influência de uma observação na predição ajustada do modelo.
# DFFITS
dffits_vals <- dffits(modelo)
df2$DFFITS <- dffits_vals
# Calcular limiar de referência
n <- nrow(df2) # Número de observações
k <- length(coefficients(modelo)) # Número de preditores (incluindo intercepto)
limiar_dffits <- 2 * sqrt(k / n)
limiar_dffits <- 2 * sqrt(ncol(df2) / nrow(df2))
pontos_dffits <- which(abs(dffits_vals) > limiar_dffits)
ggplot_dffits <- ggplot(df2, aes(x = 1:nrow(df2), y = DFFITS, text = paste("Índice:", 1:nrow(df2), "<br>DFFITS:", round(DFFITS, 3)))) +
geom_point(color = "firebrick") +
geom_hline(yintercept = c(limiar_dffits, -limiar_dffits), linetype = "dashed", color = "blue") +
labs(title = "DFFITS por Índice", x = "Índice", y = "DFFITS") +
theme_minimal()
ggplotly(ggplot_dffits, tooltip = "text")## Pontos influentes por DFFITS (|>| 0.2191986 ): 57 112 120 122 140 151 160 172 182 189 214 226 234 238 247 278 289 294 305 312 345 349 363 397 412 419 432 436 480 486 525 529 532 562 563 568 573 584 585 609 623 625 643 657 661 668 678 700 702 718 723 730 746 749 759 771 780 786 787 798 822 854 855 860 927 939 941 948 949 954 969 981 988 995 998
O gráfico mostra que a maior parte das observações tem valores de DFFITS próximos de zero, sugerindo que elas não afetam substancialmente as previsões do modelo. No entanto, há alguns pontos com valores mais altos que indicam possíveis influências relevantes no ajuste.
Avaliar a influência geral de uma observação, considerando tanto sua posição (alavancagem) quanto seu impacto nos valores ajustados.
# Distância de Cook
cooks_dist <- cooks.distance(modelo)
df2$Cooks <- cooks_dist
# Cálculo dinâmico do limiar
n <- nrow(df2) # Número de observações
k <- length(coefficients(modelo)) - 1 # Número de preditores (excluindo intercepto)
limiar_cooks <- 4 / (n - k - 1)
ggplot_cooks <- ggplot(df2, aes(x = 1:nrow(df2), y = Cooks, text = paste("Índice:", 1:nrow(df2), "<br>Distância de Cook:", round(Cooks, 3)))) +
geom_point(color = "darkgreen") +
geom_hline(yintercept = limiar_cooks, linetype = "dashed", color = "blue") +
geom_hline(yintercept = c(0.5, 1), linetype = "dotted", color = "red") +
labs(title = "Distância de Cook por Índice", x = "Índice", y = "Distância de Cook") +
coord_cartesian(ylim = c(0, max(c(min(max(cooks_dist), 0.1), limiar_cooks + 0.01)))) + # Ajuste dinâmico no eixo y
theme_minimal()
ggplotly(ggplot_cooks, tooltip = "text")A maioria dos valores de distância de Cook está próxima de zero, mostrando que poucas observações têm grande impacto no ajuste do modelo. No entanto, algumas observações ultrapassam limites de referência, indicando casos que podem ser altamente influentes e exigem análise detalhada.
O gráfico de pseudo-R² apresenta medidas de qualidade do modelo ajustado.
## $CoxSnell
## [1] 0.7010088
##
## $Nagelkerke
## [1] 0.9346788
##
## $McFadden
## [1] 0.8709132
##
## $Tjur
## [1] 0.9041853
##
## $sqPearson
## [1] 0.906513
O valor de Cox & Snell (0.70) indica um ajuste razoável, enquanto o Nagelkerke (0.93) sugere um ajuste muito bom. McFadden (0.87) também reforça a adequação do modelo, sendo considerado excelente para valores acima de 0.4. As métricas de Tjur (0.90) e Pearson (0.91) confirmam que o modelo explica uma alta proporção da variação nos dados. Esses resultados indicam que o modelo de regressão logística ajustado é robusto para capturar as relações entre as variáveis preditoras e a resposta.
Todas as variáveis originais (Age,
Daily Time Spent on Site, Area Income e
Daily Internet Usage) permanecem estatisticamente
significativas, com coeficientes consistentes em relação ao modelo
inicial. O coeficiente para eta_hat² não é significativo (p = 0.1109),
indicando que não há evidências suficientes de inadequação da função de
ligação utilizada. A redução marginal na deviance residual (de 178.77
para 176.16) sugere que o modelo não melhora consideravelmente com a
inclusão de eta_hat², reforçando a adequação da função de ligação
inicial. O AIC (188.16) é semelhante ao modelo original, confirmando que
a inclusão de eta_hat² não resulta em um ganho significativo no ajuste
do modelo.
# Verificação da função de ligação
eta_hat <- modelo$fitted.values
eta_hat2 <- eta_hat^2
verificar_ligacao <- glm(`Clicked on Ad` ~ Age + `Daily Time Spent on Site` + `Area Income` + `Daily Internet Usage` + eta_hat2,
data = df2, family = binomial)
summary(verificar_ligacao)##
## Call:
## glm(formula = `Clicked on Ad` ~ Age + `Daily Time Spent on Site` +
## `Area Income` + `Daily Internet Usage` + eta_hat2, family = binomial,
## data = df2)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.67088 -0.16198 0.00344 0.02193 3.02053
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.962e+01 5.359e+00 3.661 0.000251 ***
## Age 1.364e-01 3.960e-02 3.443 0.000575 ***
## `Daily Time Spent on Site` -1.433e-01 3.664e-02 -3.910 9.22e-05 ***
## `Area Income` -1.088e-04 2.861e-05 -3.803 0.000143 ***
## `Daily Internet Usage` -4.761e-02 1.184e-02 -4.020 5.83e-05 ***
## eta_hat2 2.376e+00 1.491e+00 1.594 0.110927
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1384.91 on 998 degrees of freedom
## Residual deviance: 176.16 on 993 degrees of freedom
## AIC: 188.16
##
## Number of Fisher Scoring iterations: 8
A razão de Chances descreve a relação entre uma variável dependente binária (ou categórica) e uma ou mais variáveis independentes
# Dados para a tabela
variaveis <- c("Idade",
"Tempo diario no site",
"Renda anual",
"Uso diario da internet")
coeficientes <- c(0.1843, -0.1946, 0.0001441, -0.06438)
razao_de_chances <- exp(coeficientes)
interpretacao <- c("Aumenta as chances do evento em 20,2% para cada unidade adicional de idade.",
"Reduz as chances do evento em 17,7% para cada unidade a mais de tempo no site.",
"Aumenta as chances do evento em 0,0144% para cada unidade a mais na renda anual.",
"Reduz as chances do evento em 6,2% para cada unidade a mais de uso diario da internet.")
# Criando a tabela
tabela_resumo <- data.frame(
Variavel = variaveis,
Coeficiente = coeficientes,
`Razao de Chances (OR)` = round(razao_de_chances, 3),
Interpretacao = interpretacao
)
# Exibindo a tabela com kable (sem caracteres especiais)
kable(
tabela_resumo,
align = "c",
col.names = c("Variavel", "Coeficiente (beta)", "Razao de Chances (OR)", "Interpretacao")
)| Variavel | Coeficiente (beta) | Razao de Chances (OR) | Interpretacao |
|---|---|---|---|
| Idade | 0.1843000 | 1.202 | Aumenta as chances do evento em 20,2% para cada unidade adicional de idade. |
| Tempo diario no site | -0.1946000 | 0.823 | Reduz as chances do evento em 17,7% para cada unidade a mais de tempo no site. |
| Renda anual | 0.0001441 | 1.000 | Aumenta as chances do evento em 0,0144% para cada unidade a mais na renda anual. |
| Uso diario da internet | -0.0643800 | 0.938 | Reduz as chances do evento em 6,2% para cada unidade a mais de uso diario da internet. |
O modelo ajustado indicou que as variáveis idade, tempo diário no site, renda da área e uso diário da internet são todas estatisticamente significativas para prever a probabilidade de clique no anúncio, com p-valores < 0,001. Os coeficientes sugerem que o aumento na idade está associado a uma maior probabilidade de clique, enquanto maiores tempos diários no site, maiores rendas da área e maior uso diário da internet estão associados a uma menor probabilidade de clique.
A verificação de ajuste através dos pseudo-R² reforçou a qualidade do modelo, com valores elevados como Nagelkerke (0,93) e McFadden (0,87). Esses resultados indicam que o modelo explica uma proporção significativa da variância nos dados e é robusto em termos preditivos. A avaliação da função de ligação através da inclusão do termo eta_hat² mostrou que a ligação binomial logítica utilizada é adequada, uma vez que esse termo não foi estatisticamente significativo
Os gráficos de diagnóstico indicaram um bom ajuste para a maioria das observações, com os resíduos concentrados em torno de zero. Pontos com valores extremos de alavancagem e medidas de influência (como DFFITS e distância de Cook) foram identificados, mas constituem uma minoria e não comprometem a validade geral do modelo. Esses pontos podem ser analisados com maior profundidade para explorar padrões atípicos ou discrepâncias específicas nos dados.