Library:

> # install.packages("knitr")
> # install.packages("rmarkdown")
> # install.packages("prettydoc")
> # install.packages("equatiomatic")

1 PENDAHULUAN

1.1 Latar Belakang

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.

1.2 Tinjauan Pustaka

1.2.1 Analisis regresi

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.

1.2.2 Analisis regresi logistik biner

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).

1.2.3 Uji Asumsi Multikolinearitas

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.

1.2.4 Pendugaan Parameter

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.

1.2.5 Odds Ratio

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

1.3 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.

  1. Variabel bebas (Y): Clicked on Ad.
  2. Variabel Terikat (X):
  1. Gender(\(X_1\)): 1= Laki-Laki, 0= perempuan
  2. Age(\(X_2\)): tahun
  3. Area income(\(X_3\)): dollar
  4. Daily Internet Usage (\(X_5\)): menit
  5. Daily Time Spent on Site (\(X_5\)): menit

source: https://www.kaggle.com/datasets/gabrielsantello/advertisement-click-on-ad

1.4 Tujuan

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.

2 SOURCE CODE

2.1 Library

> library(readxl)
> library(car)
> library(pscl)
> library(ResourceSelection)

2.2 Impor Data

> #input data
> data<-read_xlsx("E:/dataiklan.xlsx")
Error: `path` does not exist: 'E:/dataiklan.xlsx'
> 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)  

2.3 Membentuk Data Frame

> 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'
+ )
Error in data$"Clicked on Ad": object of type 'closure' is not subsettable
> data.frame
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, 
    fix.empty.names = TRUE, stringsAsFactors = FALSE) 
{
    data.row.names <- if (check.rows && is.null(row.names)) 
        function(current, new, i) {
            if (is.character(current)) 
                new <- as.character(new)
            if (is.character(new)) 
                current <- as.character(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", 
                i), domain = NA)
        }
    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
    }
    object <- as.list(substitute(list(...)))[-1L]
    mirn <- missing(row.names)
    mrn <- is.null(row.names)
    x <- list(...)
    n <- length(x)
    if (n < 1L) {
        if (!mrn) {
            if (is.object(row.names) || !is.integer(row.names)) 
                row.names <- as.character(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"))
    }
    vnames <- names(x)
    if (length(vnames) != n) 
        vnames <- character(n)
    no.vn <- !nzchar(vnames)
    vlist <- vnames <- as.list(vnames)
    nrows <- ncols <- integer(n)
    for (i in seq_len(n)) {
        xi <- if (is.character(x[[i]]) || is.list(x[[i]])) 
            as.data.frame(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors)
        else as.data.frame(x[[i]], optional = TRUE)
        nrows[i] <- .row_names_info(xi)
        ncols[i] <- length(xi)
        namesi <- names(xi)
        if (ncols[i] > 1L) {
            if (length(namesi) == 0L) 
                namesi <- seq_len(ncols[i])
            vnames[[i]] <- if (no.vn[i]) 
                namesi
            else paste(vnames[[i]], namesi, sep = ".")
        }
        else if (length(namesi)) {
            vnames[[i]] <- namesi
        }
        else if (fix.empty.names && no.vn[[i]]) {
            tmpname <- deparse(object[[i]], nlines = 1L)[1L]
            if (startsWith(tmpname, "I(") && endsWith(tmpname, 
                ")")) {
                ntmpn <- nchar(tmpname, "c")
                tmpname <- substr(tmpname, 3L, ntmpn - 1L)
            }
            vnames[[i]] <- tmpname
        }
        if (mirn && nrows[i] > 0L) {
            rowsi <- attr(xi, "row.names")
            if (any(nzchar(rowsi))) 
                row.names <- data.row.names(row.names, rowsi, 
                  i)
        }
        nrows[i] <- abs(nrows[i])
        vlist[[i]] <- xi
    }
    nr <- max(nrows)
    for (i in seq_len(n)[nrows < nr]) {
        xi <- vlist[[i]]
        if (nrows[i] > 0L && (nr%%nrows[i] == 0L)) {
            xi <- unclass(xi)
            fixed <- TRUE
            for (j in seq_along(xi)) {
                xi1 <- xi[[j]]
                if (is.vector(xi1) || is.factor(xi1)) 
                  xi[[j]] <- rep(xi1, length.out = nr)
                else if (is.character(xi1) && inherits(xi1, "AsIs")) 
                  xi[[j]] <- structure(rep(xi1, length.out = nr), 
                    class = class(xi1))
                else if (inherits(xi1, "Date") || inherits(xi1, 
                  "POSIXct")) 
                  xi[[j]] <- rep(xi1, length.out = nr)
                else {
                  fixed <- FALSE
                  break
                }
            }
            if (fixed) {
                vlist[[i]] <- xi
                next
            }
        }
        stop(gettextf("arguments imply differing number of rows: %s", 
            paste(unique(nrows), collapse = ", ")), domain = NA)
    }
    value <- unlist(vlist, recursive = FALSE, use.names = FALSE)
    vnames <- as.character(unlist(vnames[ncols > 0L]))
    if (fix.empty.names && any(noname <- !nzchar(vnames))) 
        vnames[noname] <- paste0("Var.", seq_along(vnames))[noname]
    if (check.names) {
        if (fix.empty.names) 
            vnames <- make.names(vnames, unique = TRUE)
        else {
            nz <- nzchar(vnames)
            vnames[nz] <- make.names(vnames[nz], unique = TRUE)
        }
    }
    names(value) <- vnames
    if (!mrn) {
        if (length(row.names) == 1L && nr != 1L) {
            if (is.character(row.names)) 
                row.names <- match(row.names, vnames, 0L)
            if (length(row.names) != 1L || row.names < 1L || 
                row.names > length(vnames)) 
                stop("'row.names' should specify one of the variables")
            i <- row.names
            row.names <- value[[i]]
            value <- value[-i]
        }
        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")
        row.names <- NULL
    }
    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)) 
            row.names <- as.character(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>

2.4 Asumsi Non-Multikolinearitas

> reglog_x1<-lm(X1~X2+X3+X4+X5, data=data)
Error in model.frame.default(formula = X1 ~ X2 + X3 + X4 + X5, data = data, : 'data' must be a data.frame, environment, or list
> vif_x1<-1/(1-summary(reglog_x1)$r.squared)
Error in eval(expr, envir, enclos): object 'reglog_x1' not found
> reglog_x2<-lm(X2~X1+X3+X4+X5, data=data)
Error in model.frame.default(formula = X2 ~ X1 + X3 + X4 + X5, data = data, : 'data' must be a data.frame, environment, or list
> vif_x2<-1/(1-summary(reglog_x2)$r.squared)
Error in eval(expr, envir, enclos): object 'reglog_x2' not found
> reglog_x3<-lm(X3~X1+X2+X4+X5, data=data)
Error in model.frame.default(formula = X3 ~ X1 + X2 + X4 + X5, data = data, : 'data' must be a data.frame, environment, or list
> vif_x3<-1/(1-summary(reglog_x3)$r.squared)
Error in eval(expr, envir, enclos): object 'reglog_x3' not found
> reglog_x4<-lm(X4~X1+X2+X3+X5, data=data)
Error in model.frame.default(formula = X4 ~ X1 + X2 + X3 + X5, data = data, : 'data' must be a data.frame, environment, or list
> vif_x4<-1/(1-summary(reglog_x4)$r.squared)
Error in eval(expr, envir, enclos): object 'reglog_x4' not found
> reglog_x5<-lm(X5~X1+X2+X3+X4, data=data)
Error in model.frame.default(formula = X5 ~ X1 + X2 + X3 + X4, data = data, : 'data' must be a data.frame, environment, or list
> vif_x5<-1/(1-summary(reglog_x5)$r.squared)
Error in eval(expr, envir, enclos): object 'reglog_x5' not found
> nilai_VIF<-data.frame(vif_x1,vif_x2,vif_x3,vif_x4,vif_x5)
Error in eval(expr, envir, enclos): object 'vif_x1' not found
> nilai_VIF
Error in eval(expr, envir, enclos): object 'nilai_VIF' not found

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)
Error in model.frame.default(formula = Y ~ X1 + X2 + X3 + X4 + X5, data = data, : 'data' must be a data.frame, environment, or list
> summary(model_reglog)
Error in eval(expr, envir, enclos): object 'model_reglog' not found

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.

2.5 Odds Ratio

> beta<-(coef(model_reglog))
Error in eval(expr, envir, enclos): object 'model_reglog' not found
> beta
function (a, b) 
.Internal(beta(a, b))
<bytecode: 0x00000188e2b53620>
<environment: namespace:base>
> 
> OR_beta<- exp(beta)
Error in exp(beta): non-numeric argument to mathematical function
> OR_beta
Error in eval(expr, envir, enclos): object 'OR_beta' not found
> 
> cbind(beta, OR_beta)
Error in eval(expr, envir, enclos): object 'OR_beta' not found
  1. Gender \((X1)\)

    Ketika pengguna internet bergender laki-laki maka kecenderungan untuk mengakses/memencet iklan oline akan meningkat 0.65594 kali lipat

  2. Usia \((X2)\)

    Apabila usia pengguna internet bertambah satu tahun maka kecenderungan untuk mengakses/memencet iklan oline akan meningkat 1.186353 kali lipat

  3. Income \((X3)\)

    Saat pemasukan (income) pengguna internet bertambah 1 dollar maka kecenderungan untuk mengakses/memencet iklan oline akan meningkat 0.99853 kali lipat

  4. 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

  5. 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

2.6 Uji Kelayakan Model

> library(ResourceSelection)
> HLT<- hoslem.test(data$'Clicked on Ad', fitted(model_reglog))
Error in eval(expr, envir, enclos): object 'model_reglog' not found
> HLT
Error in eval(expr, envir, enclos): object 'HLT' not found

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.

3 DAFTAR PUSTAKA

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.