Library:
> # install.packages("knitr")
> # install.packages("rmarkdown")
> # install.packages("prettydoc")
> # install.packages("equatiomatic")
Perkembangan zaman yang seiring dengan pesatnya kemajuan ilmu dan teknologi memengaruhi perkembangan berbagai sektor kehidupan, tak luput pada penggunaan media pemasaran. Menurut micom (2017) kurang lebih 60% konsumen mencari tahu produk secara lebih lanjut setelah melihat iklan online. Cakupan jangkuan yang luas, fleksibelitas dalam pemilihan segmentasi sasaran konsumen, dan hanya memerlukan modal yang relatif kecil membuat pengiklanan dengan media online dirasa lebih efektif. Penempatan iklan yang tepat harus dipertimbangakan dengan baik agar dampak yang dihasilkan juga lebih maksimal. Dengan memetakan karakteristik pengguna media online pihak usaha akan sangat terbantu dalam memilih media dan target konsumen yang sesuai untuk ditawari produk yang mereka sediakan sehingga pemasaran lebih efektif dalam menjaring calon konsumen.
Analisis regresi digunakan untuk mempelajari hubungan antara satu atau beberapa variabel bebas dengan satu variabel terkait yang dinyatakan dalam bentuk fungsi atau model regresi. Variabel bebas atau dinyatakan dalam (X) adalah sebab timbulnya perubahan pada variabel terikat, dan variabel terikat (Y) adalah variabel acak yang nilainya dipengaruhi oleh variabel bebas.
Analisis regresi logistik biner adalah model regresi yang mempelajari hubungan satu atau beberapa variabel bebas(X) dengan satu variabel terikat(Y), ketika variabel terikat berupa variabel biner (variabel yang bernilai nol dan satu) sedangkan varibel bebas merupakan data numerik atau kategorik. Variabel terikat (Y) bernilai 1 ketika suatu karakteristik adalah benar dan akan bernilai 0 ketika ketidakbenaran suatu karakteristik (contoh: gagal=0, sukses=1).
Multikolinearitas merupakan keadaan dimana terjadi hubungan linear yang sempurna atau mendekati antar variabel independen dalam model regresi. Suatu model regresi dikatakan mengalami multikolinearitas jika ada fungsi linear yang sempurna pada beberapa atau semua independen variabel dalam fungsi linear. Gejala adanya multikoliniearitas antara lain dengan melihat nilai Variance Inflation Factor(VIF) dan Tolerancenya.Jika nilai VIF< 10 dan Tolerance> 0,1 maka dinyatakan tidak terjadi multikolinearitas.
Penyelesaian untuk mengestimasi parameter yang belum diketahui dapat menggunakan metode Maximum Likelihood Estimation (MLE). Pada dasarnya metode maximum likelihood memberikan nilai estimasi 𝛽 untuk memaksimumkan fungsi likelihood.
Odds ratio (rasio peluang) adalah ukuran statistik yang digunakan dalam analisis regresi logistik dan studi kasus-kontrol untuk mengukur kekuatan hubungan antara variabel independen dan variabel dependen.
Dalam konteks regresi logistik biner, di mana variabel dependen bersifat biner (biasanya “1” untuk kejadian positif dan “0” untuk kejadian negatif), odds ratio dihitung sebagai berikut: \[ Odds Ratio = e^\beta \] ### Uji Kelayakan Model Uji kelayakan model adalah pengujian yang dilakukan untuk menguji apakah model regresi yang diusulkan dapat diterima atau ditolak. Uji Hosmer-Lemeshow pada regresi logistik adalah sebuah metode yang digunakan untuk menguji kecocokan (goodness-of-fit) antara model regresi logistik yang telah dibangun dengan data yang diamati. Tujuan dari uji ini adalah untuk mengevaluasi seberapa baik model regresi logistik dapat memprediksi hasil observasi dengan membandingkan antara nilai yang diprediksi oleh model dengan nilai yang diamati. Hipotesis yang dapat digunakan adalah sebagai berikut.
\(H_0\) : Model yang digunakan sesuai dengan data
\(H_1\) : Model yang digunakan tidak sesuai dengan data
Pada analisis ini akan dibuktikan pengaruh gender, usia, pendapatan, rata-rata lama akses internet per hari, dan waktu yang dihabiskan untuk mengakses situs per hari pada pengaksesan iklan online. Apakah variabel-variabel tersebut melatarbelakangi perilaku pengguna internet untuk tertarik dalam mencari tahu produk lebih lanjut setelah melihat pemasarannya lewat iklan online.
source: https://www.kaggle.com/datasets/gabrielsantello/advertisement-click-on-ad
Dengan mengetahui karakteristik pengguna internet yang mengakses iklan dengan memencetnya di media online pihak usaha dapat mengatur strategi pemasaran yang lebih terperinci sehingga diharapkan akan lebih banyak produk yang terjual dan pemasarannya dilakukan lebih tepat sasaran. Sehingga analisis ini dapat membantu pelaku usaha dalam penyusunan strategi marketing dan mengenali karakteristik konsumen lebih baik lagi.
> library(readxl)
> library(car)
> library(pscl)
> library(ResourceSelection)
> #input data
> data<-read_xlsx("E:/dataiklan.xlsx")
: `path` does not exist: 'E:/dataiklan.xlsx'
Error> head(data)
1 function (..., list = character(), package = NULL, lib.loc = NULL,
2 verbose = getOption("verbose"), envir = .GlobalEnv, overwrite = TRUE)
3 {
4 fileExt <- function(x) {
5 db <- grepl("\\\\.[^.]+\\\\.(gz|bz2|xz)$", x)
6 ans <- sub(".*\\\\.", "", x)
> str(data)
function (..., list = character(), package = NULL, lib.loc = NULL, verbose = getOption("verbose"),
envir = .GlobalEnv, overwrite = TRUE)
> data.frame<-data.frame(
+ Y<-data$'Clicked on Ad',
+ X1<-data$Gender,
+ X2<-data$Age,
+ X3<-data$'Area Income',
+ X4<-data$'Daily Internet Usage',
+ X5<-data$'Daily Time Spent on Site'
+ )
in data$"Clicked on Ad": object of type 'closure' is not subsettable
Error > data.frame
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
fix.empty.names = TRUE, stringsAsFactors = FALSE)
{<- if (check.rows && is.null(row.names))
data.row.names function(current, new, i) {
if (is.character(current))
<- as.character(new)
new if (is.character(new))
<- as.character(current)
current if (anyDuplicated(new))
return(current)
if (is.null(current))
return(new)
if (all(current == new) || all(current == ""))
return(new)
stop(gettextf("mismatch of row names in arguments of 'data.frame', item %d",
domain = NA)
i),
}else function(current, new, i) {
if (is.null(current)) {
if (anyDuplicated(new)) {
warning(gettextf("some row.names duplicated: %s --> row.names NOT used",
paste(which(duplicated(new)), collapse = ",")),
domain = NA)
current
}else new
}else current
}<- as.list(substitute(list(...)))[-1L]
object <- missing(row.names)
mirn <- is.null(row.names)
mrn <- list(...)
x <- length(x)
n if (n < 1L) {
if (!mrn) {
if (is.object(row.names) || !is.integer(row.names))
<- as.character(row.names)
row.names if (anyNA(row.names))
stop("row names contain missing values")
if (anyDuplicated(row.names))
stop(gettextf("duplicate row.names: %s", paste(unique(row.names[duplicated(row.names)]),
collapse = ", ")), domain = NA)
}else row.names <- integer()
return(structure(list(), names = character(), row.names = row.names,
class = "data.frame"))
}<- names(x)
vnames if (length(vnames) != n)
<- character(n)
vnames <- !nzchar(vnames)
no.vn <- vnames <- as.list(vnames)
vlist <- ncols <- integer(n)
nrows for (i in seq_len(n)) {
<- if (is.character(x[[i]]) || is.list(x[[i]]))
xi as.data.frame(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors)
else as.data.frame(x[[i]], optional = TRUE)
<- .row_names_info(xi)
nrows[i] <- length(xi)
ncols[i] <- names(xi)
namesi if (ncols[i] > 1L) {
if (length(namesi) == 0L)
<- seq_len(ncols[i])
namesi <- if (no.vn[i])
vnames[[i]]
namesielse paste(vnames[[i]], namesi, sep = ".")
}else if (length(namesi)) {
<- namesi
vnames[[i]]
}else if (fix.empty.names && no.vn[[i]]) {
<- deparse(object[[i]], nlines = 1L)[1L]
tmpname if (startsWith(tmpname, "I(") && endsWith(tmpname,
")")) {
<- nchar(tmpname, "c")
ntmpn <- substr(tmpname, 3L, ntmpn - 1L)
tmpname
}<- tmpname
vnames[[i]]
}if (mirn && nrows[i] > 0L) {
<- attr(xi, "row.names")
rowsi if (any(nzchar(rowsi)))
<- data.row.names(row.names, rowsi,
row.names
i)
}<- abs(nrows[i])
nrows[i] <- xi
vlist[[i]]
}<- max(nrows)
nr for (i in seq_len(n)[nrows < nr]) {
<- vlist[[i]]
xi if (nrows[i] > 0L && (nr%%nrows[i] == 0L)) {
<- unclass(xi)
xi <- TRUE
fixed for (j in seq_along(xi)) {
<- xi[[j]]
xi1 if (is.vector(xi1) || is.factor(xi1))
<- rep(xi1, length.out = nr)
xi[[j]] else if (is.character(xi1) && inherits(xi1, "AsIs"))
<- structure(rep(xi1, length.out = nr),
xi[[j]] class = class(xi1))
else if (inherits(xi1, "Date") || inherits(xi1,
"POSIXct"))
<- rep(xi1, length.out = nr)
xi[[j]] else {
<- FALSE
fixed break
}
}if (fixed) {
<- xi
vlist[[i]] next
}
}stop(gettextf("arguments imply differing number of rows: %s",
paste(unique(nrows), collapse = ", ")), domain = NA)
}<- unlist(vlist, recursive = FALSE, use.names = FALSE)
value <- as.character(unlist(vnames[ncols > 0L]))
vnames if (fix.empty.names && any(noname <- !nzchar(vnames)))
<- paste0("Var.", seq_along(vnames))[noname]
vnames[noname] if (check.names) {
if (fix.empty.names)
<- make.names(vnames, unique = TRUE)
vnames else {
<- nzchar(vnames)
nz <- make.names(vnames[nz], unique = TRUE)
vnames[nz]
}
}names(value) <- vnames
if (!mrn) {
if (length(row.names) == 1L && nr != 1L) {
if (is.character(row.names))
<- match(row.names, vnames, 0L)
row.names if (length(row.names) != 1L || row.names < 1L ||
> length(vnames))
row.names stop("'row.names' should specify one of the variables")
<- row.names
i <- value[[i]]
row.names <- value[-i]
value
}else if (!is.null(row.names) && length(row.names) !=
nr) stop("row names supplied are of the wrong length")
}else if (!is.null(row.names) && length(row.names) != nr) {
warning("row names were found from a short variable and have been discarded")
<- NULL
row.names
}class(value) <- "data.frame"
if (is.null(row.names))
attr(value, "row.names") <- .set_row_names(nr)
else {
if (is.object(row.names) || !is.integer(row.names))
<- as.character(row.names)
row.names if (anyNA(row.names))
stop("row names contain missing values")
if (anyDuplicated(row.names))
stop(gettextf("duplicate row.names: %s", paste(unique(row.names[duplicated(row.names)]),
collapse = ", ")), domain = NA)
row.names(value) <- row.names
}
value
}<bytecode: 0x00000188d84d9748>
<environment: namespace:base>
> reglog_x1<-lm(X1~X2+X3+X4+X5, data=data)
in model.frame.default(formula = X1 ~ X2 + X3 + X4 + X5, data = data, : 'data' must be a data.frame, environment, or list
Error > vif_x1<-1/(1-summary(reglog_x1)$r.squared)
in eval(expr, envir, enclos): object 'reglog_x1' not found
Error > reglog_x2<-lm(X2~X1+X3+X4+X5, data=data)
in model.frame.default(formula = X2 ~ X1 + X3 + X4 + X5, data = data, : 'data' must be a data.frame, environment, or list
Error > vif_x2<-1/(1-summary(reglog_x2)$r.squared)
in eval(expr, envir, enclos): object 'reglog_x2' not found
Error > reglog_x3<-lm(X3~X1+X2+X4+X5, data=data)
in model.frame.default(formula = X3 ~ X1 + X2 + X4 + X5, data = data, : 'data' must be a data.frame, environment, or list
Error > vif_x3<-1/(1-summary(reglog_x3)$r.squared)
in eval(expr, envir, enclos): object 'reglog_x3' not found
Error > reglog_x4<-lm(X4~X1+X2+X3+X5, data=data)
in model.frame.default(formula = X4 ~ X1 + X2 + X3 + X5, data = data, : 'data' must be a data.frame, environment, or list
Error > vif_x4<-1/(1-summary(reglog_x4)$r.squared)
in eval(expr, envir, enclos): object 'reglog_x4' not found
Error > reglog_x5<-lm(X5~X1+X2+X3+X4, data=data)
in model.frame.default(formula = X5 ~ X1 + X2 + X3 + X4, data = data, : 'data' must be a data.frame, environment, or list
Error > vif_x5<-1/(1-summary(reglog_x5)$r.squared)
in eval(expr, envir, enclos): object 'reglog_x5' not found
Error > nilai_VIF<-data.frame(vif_x1,vif_x2,vif_x3,vif_x4,vif_x5)
in eval(expr, envir, enclos): object 'vif_x1' not found
Error > nilai_VIF
in eval(expr, envir, enclos): object 'nilai_VIF' not found Error
Karena seluruh hasil uji non-multikoliearitas menunjukan nilai kurang dari 10 pada semua variabel maka kita dapat menyimpulkan bahwa tidak terjadi multikolinieritas antar variabel prediktor atau masing-masingnya tidak saling berkorelasi. Sehingga data-data ini dapat digunakan dan analisis bisa dilanjutkan. ## Analisis Regresi Logistik Biner
> #membuat model reglog
> model_reglog<-glm(Y~X1+X2+X3+X4+X5, family="binomial", data=data)
in model.frame.default(formula = Y ~ X1 + X2 + X3 + X4 + X5, data = data, : 'data' must be a data.frame, environment, or list
Error > summary(model_reglog)
in eval(expr, envir, enclos): object 'model_reglog' not found Error
Dengan menggunakan function glm(), diperoleh model regresi logistik sebagi berikut: \[g(x)=27.36 -0.4217X1+0.1709X-0.1361X3-0.06351X4-0.1927X5\]
Interpretasi masing-masing parameter yaitu:
27.36 ( \(\beta_0\) ), maka saat seluruh variabel prediktor bernilai 0 (konstan) maka pengguna internet yang mengakses iklan dengan memencetnya adalah 27.36 orang.
-0.4217( \(\beta_1\) ), maka saat pengguna internet bergender laki-laki pengaksesan iklan online akan berkurang 0.4217 orang.
0.1709 ( \(\beta_2\) ), sehingga ketika bertambahnya satu satuan usia (makin tua satu tahun usia) pengguna, pegaksesan iklan di media online bertambah 0.1709 orang.
-0.1361 ( \(\beta_3\) ), maka ketika bertambahnya 1 satuan pemasukan (1 dollar income) pengguna internet yang memencet iklan online berkurang 0.1361 orang.
-0.06351 ( \(\beta_4\) ), sehingga ketika bertambah 1 menit lama waktu pengaksesan internet per-harinya akan menyebabkan berkurangnya orang yang mengakses iklan online sebanyak 0.06351 orang.
-0.1927 ( \(\beta_5\) ), berarti saat bertambah 1 menit lama waktu pengaksesan situs per-harinya akan menyebabkan berkurangnya orang yang mengakses iklan online sebanyak 0.1927 orang.
> beta<-(coef(model_reglog))
in eval(expr, envir, enclos): object 'model_reglog' not found
Error > beta
function (a, b)
.Internal(beta(a, b))
<bytecode: 0x00000188e2b53620>
<environment: namespace:base>
>
> OR_beta<- exp(beta)
in exp(beta): non-numeric argument to mathematical function
Error > OR_beta
in eval(expr, envir, enclos): object 'OR_beta' not found
Error >
> cbind(beta, OR_beta)
in eval(expr, envir, enclos): object 'OR_beta' not found Error
Gender \((X1)\)
Ketika pengguna internet bergender laki-laki maka kecenderungan untuk mengakses/memencet iklan oline akan meningkat 0.65594 kali lipat
Usia \((X2)\)
Apabila usia pengguna internet bertambah satu tahun maka kecenderungan untuk mengakses/memencet iklan oline akan meningkat 1.186353 kali lipat
Income \((X3)\)
Saat pemasukan (income) pengguna internet bertambah 1 dollar maka kecenderungan untuk mengakses/memencet iklan oline akan meningkat 0.99853 kali lipat
Lama waktu mengakses internet per hari\((X4)\)
ketika lama waktu mengakses internet per hari pengguna internet bertambah 1 menit maka kecenderungan untuk mengakses/memencet iklan oline akan meningkat 0.938161 kali lipat
Lama waktu mengakses situs per hari\((X5)\)
ketika lama waktu mengakses internet per hari pengguna situs bertambah 1 menit maka kecenderungan untuk mengakses/memencet iklan oline akan meningkat 0.8247 kali lipat
> library(ResourceSelection)
> HLT<- hoslem.test(data$'Clicked on Ad', fitted(model_reglog))
in eval(expr, envir, enclos): object 'model_reglog' not found
Error > HLT
in eval(expr, envir, enclos): object 'HLT' not found Error
Hipotesis:
\(H_0\) : Model yang digunakan sesuai dengan data
\(H_1\) : Model yang digunakan tidak sesuai dengan data
Keputusan: \(p-value (0.284 ) > \alpha (0,05)\) , maka \(H_0\) ditolak.
Kesimpulan: Dengan taraf nyata 5% dapat disimpulkan bahwa model yang digunakan sesuai dengan data.
Santoso, E. D., & Larasati, N. (2019). Benarkah iklan online efektif untuk digunakan dalam promosi perusahaan. Jurnal Ilmiah Bisnis Dan Ekonomi Asia, 13(1), 28-36.
Micom,RO.(2017).Nielsen:Iklan Online Mendorong Konsumen Mencari Informasi. MediaIndonesia.com, 28 Maret 2018. Dari:http://mediaindonesia.com/read/detail/114724-nielsen-iklan-online-mendorong-konsumen-mencari-informasi
Roflin, E., Riana, F., Munarsih, E., & Liberty, I. A. (2023). Regresi Logistik Biner dan Multinomial. Penerbit NEM.
Mardiatmoko, G. (2020). Pentingnya uji asumsi klasik pada analisis regresi linier berganda (studi kasus penyusunan persamaan allometrik kenari muda [canarium indicum l.]). BAREKENG: Jurnal Ilmu Matematika Dan Terapan, 14(3), 333-342.