DESKRIPSI DATASET

Sumber Dataset

Dataset yaang digunakan untuk analisis pada project ini yaitu Customer Personality Analysis, bersumber dari platform Kaggle dan diunggah oleh Imakash3011. Dataset dapat diakses secara publik pada tautan:

https://www.kaggle.com/datasets/imakash3011/customer-personality-analysis

Dataset ini merupakan data pelanggan sebuah perusahaan ritel yang berisi informasi demografis, perilaku pembelian, serta respons terhadap program promosi.

Deskripsi Umum Dataset
Atribut Keterangan
Nama Dataset Customer Personality Analysis
Sumber Kaggle (imakash3011)
Jumlah Observasi 2.240 baris
Jumlah Variabel 29 kolom

Descriptive Variabel

Informasi Demografis Pelanggan

Perilaku Pengeluaran Produk

Saluran & Frekuensi Pembelian

Respons Promosi

Tujuan Analisis

Dataset Customer Personality Analysis dipilih karena memenuhi kriteria analisis multivariat lanjutan, khususnya Principal Component Analysis (PCA) dan feature selection. Tujuan analisis secara spesifik:

  1. Melakukan reduksi dimensi menggunakan PCA untuk mengidentifikasi struktur laten dari perilaku pelanggan.
  2. Memahami pola pengelompokan pelanggan berdasarkan perilaku pembelian, demografi, dan respons kampanye.
  3. Mengidentifikasi variabel paling informatif (feature selection) untuk prediksi variabel Response.
  4. Mengevaluasi tingkat multikolinearitas sebagai landasan empiris pemilihan metode PCA.
  5. Memberikan wawasan bisnis terkait segmentasi dan targeting pelanggan.

Proses Data Cleaning

Cek Struktur Data

## tibble [2,240 × 29] (S3: tbl_df/tbl/data.frame)
##  $ ID                 : num [1:2240] 5524 2174 4141 6182 5324 ...
##  $ Year_Birth         : num [1:2240] 1957 1954 1965 1984 1981 ...
##  $ Education          : chr [1:2240] "Graduation" "Graduation" "Graduation" "Graduation" ...
##  $ Marital_Status     : chr [1:2240] "Single" "Single" "Together" "Together" ...
##  $ Income             : num [1:2240] 58138 46344 71613 26646 58293 ...
##  $ Kidhome            : num [1:2240] 0 1 0 1 1 0 0 1 1 1 ...
##  $ Teenhome           : num [1:2240] 0 1 0 0 0 1 1 0 0 1 ...
##  $ Dt_Customer        : chr [1:2240] "2012-04-09" "2014-08-03" "2013-08-21" "2014-10-02" ...
##  $ Recency            : num [1:2240] 58 38 26 26 94 16 34 32 19 68 ...
##  $ MntWines           : num [1:2240] 635 11 426 11 173 520 235 76 14 28 ...
##  $ MntFruits          : num [1:2240] 88 1 49 4 43 42 65 10 0 0 ...
##  $ MntMeatProducts    : num [1:2240] 546 6 127 20 118 98 164 56 24 6 ...
##  $ MntFishProducts    : num [1:2240] 172 2 111 10 46 0 50 3 3 1 ...
##  $ MntSweetProducts   : num [1:2240] 88 1 21 3 27 42 49 1 3 1 ...
##  $ MntGoldProds       : num [1:2240] 88 6 42 5 15 14 27 23 2 13 ...
##  $ NumDealsPurchases  : num [1:2240] 3 2 1 2 5 2 4 2 1 1 ...
##  $ NumWebPurchases    : num [1:2240] 8 1 8 2 5 6 7 4 3 1 ...
##  $ NumCatalogPurchases: num [1:2240] 10 1 2 0 3 4 3 0 0 0 ...
##  $ NumStorePurchases  : num [1:2240] 4 2 10 4 6 10 7 4 2 0 ...
##  $ NumWebVisitsMonth  : num [1:2240] 7 5 4 6 5 6 6 8 9 20 ...
##  $ AcceptedCmp3       : num [1:2240] 0 0 0 0 0 0 0 0 0 1 ...
##  $ AcceptedCmp4       : num [1:2240] 0 0 0 0 0 0 0 0 0 0 ...
##  $ AcceptedCmp5       : num [1:2240] 0 0 0 0 0 0 0 0 0 0 ...
##  $ AcceptedCmp1       : num [1:2240] 0 0 0 0 0 0 0 0 0 0 ...
##  $ AcceptedCmp2       : num [1:2240] 0 0 0 0 0 0 0 0 0 0 ...
##  $ Complain           : num [1:2240] 0 0 0 0 0 0 0 0 0 0 ...
##  $ Z_CostContact      : num [1:2240] 3 3 3 3 3 3 3 3 3 3 ...
##  $ Z_Revenue          : num [1:2240] 11 11 11 11 11 11 11 11 11 11 ...
##  $ Response           : num [1:2240] 1 0 0 0 0 0 0 0 1 0 ...
## Dimensi: 2240 baris x 29 kolom
##  [1] "ID"                  "Year_Birth"          "Education"          
##  [4] "Marital_Status"      "Income"              "Kidhome"            
##  [7] "Teenhome"            "Dt_Customer"         "Recency"            
## [10] "MntWines"            "MntFruits"           "MntMeatProducts"    
## [13] "MntFishProducts"     "MntSweetProducts"    "MntGoldProds"       
## [16] "NumDealsPurchases"   "NumWebPurchases"     "NumCatalogPurchases"
## [19] "NumStorePurchases"   "NumWebVisitsMonth"   "AcceptedCmp3"       
## [22] "AcceptedCmp4"        "AcceptedCmp5"        "AcceptedCmp1"       
## [25] "AcceptedCmp2"        "Complain"            "Z_CostContact"      
## [28] "Z_Revenue"           "Response"
##                  ID          Year_Birth           Education      Marital_Status 
##           "numeric"           "numeric"         "character"         "character" 
##              Income             Kidhome            Teenhome         Dt_Customer 
##           "numeric"           "numeric"           "numeric"         "character" 
##             Recency            MntWines           MntFruits     MntMeatProducts 
##           "numeric"           "numeric"           "numeric"           "numeric" 
##     MntFishProducts    MntSweetProducts        MntGoldProds   NumDealsPurchases 
##           "numeric"           "numeric"           "numeric"           "numeric" 
##     NumWebPurchases NumCatalogPurchases   NumStorePurchases   NumWebVisitsMonth 
##           "numeric"           "numeric"           "numeric"           "numeric" 
##        AcceptedCmp3        AcceptedCmp4        AcceptedCmp5        AcceptedCmp1 
##           "numeric"           "numeric"           "numeric"           "numeric" 
##        AcceptedCmp2            Complain       Z_CostContact           Z_Revenue 
##           "numeric"           "numeric"           "numeric"           "numeric" 
##            Response 
##           "numeric"

Date

class(df$Dt_Customer)
## [1] "character"
head(df$Dt_Customer)
## [1] "2012-04-09" "2014-08-03" "2013-08-21" "2014-10-02" "2014-01-19"
## [6] "2013-09-09"
df$Dt_Customer <- as.Date(
  df$Dt_Customer,
  format = "%Y-%m-%d"
)

class(df$Dt_Customer)
## [1] "Date"

Missing Values

# MISSING VALUES
missing_summary <- data.frame(
  Variabel  = names(df),
  Missing_n = colSums(is.na(df))
) %>% filter(Missing_n > 0)
print(missing_summary)
##        Variabel Missing_n
## Income   Income        24
# Imputasi Income dengan median
df$Income[is.na(df$Income)] <- median(df$Income, na.rm = TRUE)
cat("Missing setelah imputasi:", sum(is.na(df)), "\n")
## Missing setelah imputasi: 0

Dari 29 variabel, hanya variabel Income yang memiliki nilai hilang, sebanyak 24 baris. Penanganan dilakukan dengan imputasi median dari variabel Income. Dibandingkan rata-rata (mean), median lebih robust terhadap keberadaan outlier karena nilainya ditentukan oleh posisi data di tengah distribusi, bukan oleh besar kecilnya seluruh nilai observasi. Oleh karena itu, penggunaan median dapat mempertahankan kecenderungan pusat data tanpa terpengaruh secara berlebihan oleh beberapa pelanggan dengan pendapatan yang sangat tinggi atau sangat rendah.

Standarisasi Nilai Kolom Marital_Status

## [1] "Single"   "Together" "Married"  "Divorced" "Widow"    "Alone"    "Absurd"  
## [8] "YOLO"
## 
##   Absurd    Alone Divorced  Married   Single Together    Widow     YOLO 
##        2        3      232      864      480      580       77        2

Kolom Marital_Status ditemukan memiliki beberapa nilai yang tidak valid sebagai kategori status pernikahan, yaitu Alone, Absurd, dan YOLO. Nilai-nilai ini kemungkinan berasal dari kesalahan input saat pengumpulan data. Karena tidak dapat dikategorikan secara pasti, ketiganya digabungkan ke dalam kategori Single sebagai nilai yang paling netral.

df <- df %>%
  mutate(Marital_Status = case_when(
    Marital_Status %in% c("Alone", "Absurd", "YOLO") ~ "Single",
    TRUE ~ Marital_Status
  ))

table(df$Marital_Status)
## 
## Divorced  Married   Single Together    Widow 
##      232      864      487      580       77

Variabel Tidak Informatif

table(df$Z_CostContact)
## 
##    3 
## 2240
table(df$Z_Revenue)
## 
##   11 
## 2240
df <- df %>%
  select(-Z_CostContact, -Z_Revenue)

Variabel Z_CostContact dan Z_Revenue dihapus karena bersifat konstanta (semua nilai = 3 dan 11 berturut-turut), sehingga tidak memberikan informasi analitik.

Tahun Lahir Tidak Realistis

table(df$Year_Birth)
## 
## 1893 1899 1900 1940 1941 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 
##    1    1    1    1    1    7    7    8   16   16   21   30   29   43   52   35 
## 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 
##   50   49   55   43   53   51   49   36   44   45   42   74   50   44   51   71 
## 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 
##   77   87   79   74   69   83   89   52   77   53   39   39   45   42   38   32 
## 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 
##   42   27   29   30   18   15   13    5    3    5    2
df <- df %>% filter( Year_Birth > 1900)

Income Tidak Realistis

range(df$Income, na.rm = TRUE)
## [1]   1730 666666
median(df$Income, na.rm = TRUE)
## [1] 51381.5
boxplot(df$Income)

# Cek observasi dengan Income tertinggi
df[which.max(df$Income), ]
## # A tibble: 1 × 27
##      ID Year_Birth Education  Marital_Status Income Kidhome Teenhome Dt_Customer
##   <dbl>      <dbl> <chr>      <chr>           <dbl>   <dbl>    <dbl> <date>     
## 1  9432       1977 Graduation Together       666666       1        0 2013-02-06 
## # ℹ 19 more variables: Recency <dbl>, MntWines <dbl>, MntFruits <dbl>,
## #   MntMeatProducts <dbl>, MntFishProducts <dbl>, MntSweetProducts <dbl>,
## #   MntGoldProds <dbl>, NumDealsPurchases <dbl>, NumWebPurchases <dbl>,
## #   NumCatalogPurchases <dbl>, NumStorePurchases <dbl>,
## #   NumWebVisitsMonth <dbl>, AcceptedCmp3 <dbl>, AcceptedCmp4 <dbl>,
## #   AcceptedCmp5 <dbl>, AcceptedCmp1 <dbl>, AcceptedCmp2 <dbl>, Complain <dbl>,
## #   Response <dbl>
# Persentil penting
quantile(
  df$Income,
  probs = c(0.90, 0.95, 0.99, 1),
  na.rm = TRUE
)
##       90%       95%       99%      100% 
##  79776.60  83957.00  94440.32 666666.00
# Batas persentil ke-99
income_q99 <- quantile(df$Income, 0.99, na.rm = TRUE)

# Ganti nilai ekstrem dengan median
df$Income[df$Income > income_q99] <-
  median(df$Income, na.rm = TRUE)

terdapat 1 data dengan nilai income sebesar 666.666. Nilai ini 13 kali lebih besar dibandingkan median pendapatan pelanggan (51.381), menunjukkan adanya observasi yang sangat berbeda dari pola umum data. Kemudian data diimputasi dengan nilai median dari variabel Income.

Hasil Data Bersih

cat("Dimensi final:", nrow(df), "baris x", ncol(df), "kolom\n")
## Dimensi final: 2237 baris x 27 kolom
cat("Total missing:", sum(is.na(df)), "\n")
## Total missing: 0
print(sapply(df, class))
##                  ID          Year_Birth           Education      Marital_Status 
##           "numeric"           "numeric"         "character"         "character" 
##              Income             Kidhome            Teenhome         Dt_Customer 
##           "numeric"           "numeric"           "numeric"              "Date" 
##             Recency            MntWines           MntFruits     MntMeatProducts 
##           "numeric"           "numeric"           "numeric"           "numeric" 
##     MntFishProducts    MntSweetProducts        MntGoldProds   NumDealsPurchases 
##           "numeric"           "numeric"           "numeric"           "numeric" 
##     NumWebPurchases NumCatalogPurchases   NumStorePurchases   NumWebVisitsMonth 
##           "numeric"           "numeric"           "numeric"           "numeric" 
##        AcceptedCmp3        AcceptedCmp4        AcceptedCmp5        AcceptedCmp1 
##           "numeric"           "numeric"           "numeric"           "numeric" 
##        AcceptedCmp2            Complain            Response 
##           "numeric"           "numeric"           "numeric"

Simpan dataset bersih

write_xlsx(df, "C:/Users/riefa/OneDrive - untirta.ac.id/Documents/Riefan Abdul Hakim/Kuliah/Mata Kuliah/Semester 4/Eksplorasi & Visualisasi Data/Tugas Projek/marketing_clean.xlsx")
cat("Dataset bersih disimpan: marketing_clean.xlsx\n")
## Dataset bersih disimpan: marketing_clean.xlsx

Statistika Deskriptif

dfc <- read_excel("C:/Users/riefa/OneDrive - untirta.ac.id/Documents/Riefan Abdul Hakim/Kuliah/Mata Kuliah/Semester 4/Eksplorasi & Visualisasi Data/Tugas Projek/marketing_clean.xlsx")

num_data <- dfc[, sapply(dfc, is.numeric)]

desc_stats <- data.frame(
  Variabel = names(num_data),
  N = sapply(num_data, function(x) sum(!is.na(x))),
  Mean = sapply(num_data, mean, na.rm = TRUE),
  SD = sapply(num_data, sd, na.rm = TRUE),
  Min = sapply(num_data, min, na.rm = TRUE),
  Median = sapply(num_data, median, na.rm = TRUE),
  Max = sapply(num_data, max, na.rm = TRUE)
)

print(desc_stats, row.names = FALSE)
##             Variabel    N         Mean           SD  Min  Median   Max
##                   ID 2237 5.590726e+03 3.245119e+03    0  5455.0 11191
##           Year_Birth 2237 1.968902e+03 1.170192e+01 1940  1970.0  1996
##               Income 2237 5.129777e+04 2.018427e+04 1730 51381.5 94384
##              Kidhome 2237 4.443451e-01 5.384671e-01    0     0.0     2
##             Teenhome 2237 5.064819e-01 5.445929e-01    0     0.0     2
##              Recency 2237 4.910460e+01 2.895607e+01    0    49.0    99
##             MntWines 2237 3.039955e+02 3.365744e+02    0   174.0  1493
##            MntFruits 2237 2.627045e+01 3.971597e+01    0     8.0   199
##      MntMeatProducts 2237 1.669169e+02 2.256612e+02    0    67.0  1725
##      MntFishProducts 2237 3.752302e+01 5.463991e+01    0    12.0   259
##     MntSweetProducts 2237 2.706884e+01 4.129395e+01    0     8.0   263
##         MntGoldProds 2237 4.396871e+01 5.205432e+01    0    24.0   362
##    NumDealsPurchases 2237 2.326777e+00 1.932923e+00    0     2.0    15
##      NumWebPurchases 2237 4.087170e+00 2.779461e+00    0     4.0    27
##  NumCatalogPurchases 2237 2.662494e+00 2.923456e+00    0     2.0    28
##    NumStorePurchases 2237 5.794367e+00 3.250940e+00    0     5.0    13
##    NumWebVisitsMonth 2237 5.319177e+00 2.426386e+00    0     6.0    20
##         AcceptedCmp3 2237 7.286544e-02 2.599736e-01    0     0.0     1
##         AcceptedCmp4 2237 7.465355e-02 2.628903e-01    0     0.0     1
##         AcceptedCmp5 2237 7.241842e-02 2.592374e-01    0     0.0     1
##         AcceptedCmp1 2237 6.437193e-02 2.454692e-01    0     0.0     1
##         AcceptedCmp2 2237 1.341082e-02 1.150517e-01    0     0.0     1
##             Complain 2237 8.940545e-03 9.415187e-02    0     0.0     1
##             Response 2237 1.493071e-01 3.564706e-01    0     0.0     1

Berdasarkan hasil statistik deskriptif, dataset setelah melalui proses data cleaning terdiri dari 2.237 observasi. Variabel Income memiliki rata-rata sebesar 51.297,77 dengan median sebesar 51.381,50. Nilai rata-rata yang dekat dengan median menunjukkan distribusi pendapatan seimbang setelah dilakukan penanganan nilai ekstrem. Dengan endapatan terkecil sebesar 1.730 dan terbesar 94.384.

Dari data Year_Birth, tahun kelahiran pelanggan antara 1940 sampai 1996 dengan rata-rata tahun kelahiran 1968,90. Ini menunjukkan bahwa sebagian besar pelanggan berada pada kelompok usia dewasa hingga lanjut usia.

Variabel Recency memiliki rata-rata 49,10 hari dengan median 49 hari. Nilai minimum sebesar 0 dan maksimum sebesar 99 menunjukkan bahwa terdapat pelanggan yang baru saja melakukan transaksi maupun pelanggan yang sudah cukup lama tidak melakukan transaksi.

Dari sisi pengeluaran produk, rata-rata pengeluaran terbesar terdapat pada kategori anggur (MntWines) sebesar 303,99, diikuti produk daging (MntMeatProducts) sebesar 166,92. Sebaliknya, pengeluaran untuk buah, ikan, dan produk manis relatif lebih rendah. Perbedaan yang cukup besar antara nilai maksimum dan median pada sebagian besar kategori pengeluaran menunjukkan adanya variasi perilaku belanja yang tinggi antar pelanggan.

Berdasarkan aktivitas pembelian, rata-rata jumlah pembelian di toko fisik (NumStorePurchases) sebesar 5,79 kali, lebih tinggi dibandingkan pembelian melalui web (4,09 kali) maupun katalog (2,66 kali). Hal ini mengindikasikan bahwa toko fisik masih menjadi saluran pembelian yang paling sering digunakan oleh pelanggan dalam dataset ini. Selain itu, pelanggan rata-rata mengunjungi situs web perusahaan sebanyak 5,32 kali per bulan.

Variabel kampanye pemasaran menunjukkan tingkat keberhasilan yang relatif rendah. Hal ini terlihat dari nilai rata-rata AcceptedCmp1 hingga AcceptedCmp5 yang seluruhnya berada di bawah 0,10. Variabel Response memiliki rata-rata sebesar 0,149, yang berarti hanya sekitar 14,9% pelanggan yang merespons kampanye pemasaran terakhir. Dengan kata lain, sebagian besar pelanggan tidak memberikan respons terhadap kampanye yang dilakukan perusahaan.

Variabel Complain memiliki rata-rata sebesar 0,009 atau kurang dari 1%, menunjukkan bahwa jumlah pelanggan yang pernah mengajukan keluhan sangat sedikit. Temuan ini mengindikasikan bahwa secara umum tingkat keluhan pelanggan dalam dataset relatif rendah.

Visualisasi Data

Histogram

# Ambil variabel numerik
df_num <- dfc %>%
  select(where(is.numeric))

# Ubah ke format long
df_long <- df_num %>%
  pivot_longer(
    cols = everything(),
    names_to = "Variabel",
    values_to = "Nilai"
  )

# Histogram
ggplot(df_long, aes(x = Nilai)) +
  geom_histogram(
    bins = 30,
    fill = "#4A90D9",
    color = "white"
  ) +
  facet_wrap(
    ~ Variabel,
    scales = "free",
    ncol = 5
  ) +
  labs(
    title = "Distribusi Variabel Numerik",
    x = NULL,
    y = "Frekuensi"
  ) +
  theme_minimal()

Boxplot

# Ambil variabel numerik
df_num <- dfc %>%
  select(where(is.numeric))

# Ubah ke format long
df_long <- df_num %>%
  pivot_longer(
    cols = everything(),
    names_to = "Variabel",
    values_to = "Nilai"
  )

# Boxplot
ggplot(df_long, aes(y = Nilai)) +
  geom_boxplot(
    fill = "#4A90D9",
    color = "#2E4057",
    outlier.color = "red",
    outlier.alpha = 0.5
  ) +
  facet_wrap(
    ~ Variabel,
    scales = "free_y",
    ncol = 5
  ) +
  labs(
    title = "Boxplot Variabel Numerik",
    x = NULL,
    y = "Nilai"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_blank()
  )

Analisis Korelasi & Multikolinearitas (VIF)

ANALISIS KORELASI

# Matriks korelasi
cor_matrix <- cor(df_num, use = "complete.obs", method = "pearson")
print(cor_matrix)
##                                ID   Year_Birth        Income      Kidhome
## ID                   1.0000000000  0.003024161  0.0009052512  0.002201838
## Year_Birth           0.0030241607  1.000000000 -0.2181727637  0.234132783
## Income               0.0009052512 -0.218172764  1.0000000000 -0.523409050
## Kidhome              0.0022018379  0.234132783 -0.5234090501  1.000000000
## Teenhome            -0.0035428661 -0.363350310  0.0524568046 -0.035752826
## Recency             -0.0467548189 -0.019670022  0.0122524663  0.007544380
## MntWines            -0.0211805067 -0.163035413  0.7227774047 -0.496366852
## MntFruits            0.0070804983 -0.013750644  0.5337791189 -0.372488087
## MntMeatProducts     -0.0026222825 -0.030926622  0.6654626799 -0.437058776
## MntFishProducts     -0.0231808695 -0.042519264  0.5427271501 -0.387536072
## MntSweetProducts    -0.0064443157 -0.019570864  0.5291661775 -0.370655940
## MntGoldProds        -0.0106605522 -0.057598645  0.4105072777 -0.349632733
## NumDealsPurchases   -0.0369168760 -0.067998998 -0.1152437955  0.221798582
## NumWebPurchases     -0.0179125125 -0.153972860  0.4793836514 -0.362063466
## NumCatalogPurchases -0.0018925116 -0.125438543  0.6685293276 -0.502437887
## NumStorePurchases   -0.0140617453 -0.139465104  0.6815592344 -0.500387193
## NumWebVisitsMonth   -0.0081042359  0.117569791 -0.6332144270  0.447641013
## AcceptedCmp3        -0.0359593612  0.061012918 -0.0107287228  0.014605689
## AcceptedCmp4        -0.0252917122 -0.064340545  0.2080649403 -0.161775327
## AcceptedCmp5        -0.0050624314  0.015322267  0.3793280033 -0.204994475
## AcceptedCmp1        -0.0215241312 -0.008226631  0.3187538077 -0.172512450
## AcceptedCmp2        -0.0150268590 -0.007656707  0.1042657003 -0.081793654
## Complain             0.0315197473 -0.004478566 -0.0264769217  0.036283499
## Response            -0.0218104984  0.018424293  0.1549848479 -0.080176293
##                         Teenhome       Recency     MntWines    MntFruits
## ID                  -0.003542866 -0.0467548189 -0.021180507  0.007080498
## Year_Birth          -0.363350310 -0.0196700216 -0.163035413 -0.013750644
## Income               0.052456805  0.0122524663  0.722777405  0.533779119
## Kidhome             -0.035752826  0.0075443797 -0.496366852 -0.372488087
## Teenhome             1.000000000  0.0171151926  0.005409456 -0.175950738
## Recency              0.017115193  1.0000000000  0.016668404 -0.003591871
## MntWines             0.005409456  0.0166684044  1.000000000  0.388517935
## MntFruits           -0.175950738 -0.0035918708  0.388517935  1.000000000
## MntMeatProducts     -0.260820456  0.0237054109  0.561993458  0.542056997
## MntFishProducts     -0.203899789  0.0015319579  0.399072954  0.594438329
## MntSweetProducts    -0.162218429  0.0230448403  0.385991906  0.567054131
## MntGoldProds        -0.020186242  0.0174116157  0.386375609  0.390042200
## NumDealsPurchases    0.387792189 -0.0009865534  0.010829370 -0.131886360
## NumWebPurchases      0.155776071 -0.0106157768  0.542177275  0.297023558
## NumCatalogPurchases -0.110285099  0.0254487538  0.634783526  0.487306599
## NumStorePurchases    0.050516998  0.0011170318  0.642433298  0.463168272
## NumWebVisitsMonth    0.134491123 -0.0219587942 -0.320336689 -0.417427179
## AcceptedCmp3        -0.042822903 -0.0329755281  0.062201198  0.014983211
## AcceptedCmp4         0.038789726  0.0188902177  0.373531584  0.010401574
## AcceptedCmp5        -0.190226963  0.0009564815  0.471969014  0.212026809
## AcceptedCmp1        -0.140287598 -0.0192576125  0.354364615  0.195379632
## AcceptedCmp2        -0.015663557 -0.0017637184  0.206040386 -0.009700701
## Complain             0.007591494  0.0053983360 -0.035930341 -0.002799739
## Response            -0.154730249 -0.1985677750  0.247391836  0.125904289
##                     MntMeatProducts MntFishProducts MntSweetProducts
## ID                     -0.002622283   -0.0231808695     -0.006444316
## Year_Birth             -0.030926622   -0.0425192644     -0.019570864
## Income                  0.665462680    0.5427271501      0.529166177
## Kidhome                -0.437058776   -0.3875360717     -0.370655940
## Teenhome               -0.260820456   -0.2038997888     -0.162218429
## Recency                 0.023705411    0.0015319579      0.023044840
## MntWines                0.561993458    0.3990729545      0.385991906
## MntFruits               0.542056997    0.5944383291      0.567054131
## MntMeatProducts         1.000000000    0.5678797895      0.523417578
## MntFishProducts         0.567879789    1.0000000000      0.579552863
## MntSweetProducts        0.523417578    0.5795528627      1.000000000
## MntGoldProds            0.348845048    0.4221032254      0.369193155
## NumDealsPurchases      -0.122464723   -0.1394397189     -0.120277624
## NumWebPurchases         0.293578739    0.2934888806      0.348303917
## NumCatalogPurchases     0.723518536    0.5340325953      0.490497095
## NumStorePurchases       0.480110308    0.4600991947      0.448801399
## NumWebVisitsMonth      -0.539203437   -0.4457596325     -0.423249416
## AcceptedCmp3            0.018330590    0.0003698553      0.001490518
## AcceptedCmp4            0.103053264    0.0168642388      0.028611565
## AcceptedCmp5            0.372212478    0.1981628379      0.258848015
## AcceptedCmp1            0.310095747    0.2609084325      0.241874850
## AcceptedCmp2            0.043090152    0.0025831149      0.009972115
## Complain               -0.020719834   -0.0188177550     -0.020403739
## Response                0.236639779    0.1114148536      0.117366325
##                     MntGoldProds NumDealsPurchases NumWebPurchases
## ID                   -0.01066055     -0.0369168760     -0.01791251
## Year_Birth           -0.05759864     -0.0679989983     -0.15397286
## Income                0.41050728     -0.1152437955      0.47938365
## Kidhome              -0.34963273      0.2217985817     -0.36206347
## Teenhome             -0.02018624      0.3877921888      0.15577607
## Recency               0.01741162     -0.0009865534     -0.01061578
## MntWines              0.38637561      0.0108293698      0.54217728
## MntFruits             0.39004220     -0.1318863601      0.29702356
## MntMeatProducts       0.34884505     -0.1224647231      0.29357874
## MntFishProducts       0.42210323     -0.1394397189      0.29348888
## MntSweetProducts      0.36919316     -0.1202776241      0.34830392
## MntGoldProds          1.00000000      0.0499417443      0.42273084
## NumDealsPurchases     0.04994174      1.0000000000      0.23377237
## NumWebPurchases       0.42273084      0.2337723714      1.00000000
## NumCatalogPurchases   0.43699676     -0.0087282518      0.37810816
## NumStorePurchases     0.38326419      0.0680623174      0.50227710
## NumWebVisitsMonth    -0.24909286      0.3472607618     -0.05625050
## AcceptedCmp3          0.12373417     -0.0233752227      0.04195772
## AcceptedCmp4          0.02262271      0.0153388537      0.15573379
## AcceptedCmp5          0.17638202     -0.1829102847      0.13895756
## AcceptedCmp1          0.16714519     -0.1235301945      0.15499059
## AcceptedCmp2          0.05025208     -0.0378142025      0.03410323
## Complain             -0.02987355      0.0035988400     -0.01323338
## Response              0.14069252      0.0018540640      0.14845270
##                     NumCatalogPurchases NumStorePurchases NumWebVisitsMonth
## ID                         -0.001892512      -0.014061745      -0.008104236
## Year_Birth                 -0.125438543      -0.139465104       0.117569791
## Income                      0.668529328       0.681559234      -0.633214427
## Kidhome                    -0.502437887      -0.500387193       0.447641013
## Teenhome                   -0.110285099       0.050516998       0.134491123
## Recency                     0.025448754       0.001117032      -0.021958794
## MntWines                    0.634783526       0.642433298      -0.320336689
## MntFruits                   0.487306599       0.463168272      -0.417427179
## MntMeatProducts             0.723518536       0.480110308      -0.539203437
## MntFishProducts             0.534032595       0.460099195      -0.445759633
## MntSweetProducts            0.490497095       0.448801399      -0.423249416
## MntGoldProds                0.436996761       0.383264186      -0.249092859
## NumDealsPurchases          -0.008728252       0.068062317       0.347260762
## NumWebPurchases             0.378108157       0.502277101      -0.056250497
## NumCatalogPurchases         1.000000000       0.518883896      -0.520400179
## NumStorePurchases           0.518883896       1.000000000      -0.429886178
## NumWebVisitsMonth          -0.520400179      -0.429886178       1.000000000
## AcceptedCmp3                0.104750260      -0.067987949       0.060954617
## AcceptedCmp4                0.139288404       0.179144396      -0.032463819
## AcceptedCmp5                0.321419464       0.216147061      -0.276371216
## AcceptedCmp1                0.308240375       0.183043051      -0.192947688
## AcceptedCmp2                0.099890509       0.085097560      -0.007329888
## Complain                   -0.018278937      -0.011524482       0.020783505
## Response                    0.220894435       0.038854761      -0.004449482
##                      AcceptedCmp3 AcceptedCmp4  AcceptedCmp5 AcceptedCmp1
## ID                  -0.0359593612  -0.02529171 -0.0050624314 -0.021524131
## Year_Birth           0.0610129183  -0.06434054  0.0153222665 -0.008226631
## Income              -0.0107287228   0.20806494  0.3793280033  0.318753808
## Kidhome              0.0146056891  -0.16177533 -0.2049944753 -0.172512450
## Teenhome            -0.0428229029   0.03878973 -0.1902269633 -0.140287598
## Recency             -0.0329755281   0.01889022  0.0009564815 -0.019257612
## MntWines             0.0622011983   0.37353158  0.4719690139  0.354364615
## MntFruits            0.0149832106   0.01040157  0.2120268088  0.195379632
## MntMeatProducts      0.0183305903   0.10305326  0.3722124779  0.310095747
## MntFishProducts      0.0003698553   0.01686424  0.1981628379  0.260908433
## MntSweetProducts     0.0014905183   0.02861156  0.2588480148  0.241874850
## MntGoldProds         0.1237341743   0.02262271  0.1763820160  0.167145186
## NumDealsPurchases   -0.0233752227   0.01533885 -0.1829102847 -0.123530195
## NumWebPurchases      0.0419577219   0.15573379  0.1389575554  0.154990590
## NumCatalogPurchases  0.1047502599   0.13928840  0.3214194636  0.308240375
## NumStorePurchases   -0.0679879490   0.17914440  0.2161470607  0.183043051
## NumWebVisitsMonth    0.0609546169  -0.03246382 -0.2763712165 -0.192947688
## AcceptedCmp3         1.0000000000  -0.07962739  0.0809303593  0.094661402
## AcceptedCmp4        -0.0796273915   1.00000000  0.3078120150  0.251225308
## AcceptedCmp5         0.0809303593   0.30781201  1.0000000000  0.404615933
## AcceptedCmp1         0.0946614022   0.25122531  0.4046159334  1.000000000
## AcceptedCmp2         0.0719805904   0.29218396  0.2223330504  0.175283294
## Complain             0.0099156837  -0.02697772 -0.0082155479 -0.024913158
## Response             0.2541442515   0.17688960  0.3281821410  0.293882451
##                     AcceptedCmp2      Complain      Response
## ID                  -0.015026859  0.0315197473 -0.0218104984
## Year_Birth          -0.007656707 -0.0044785661  0.0184242926
## Income               0.104265700 -0.0264769217  0.1549848479
## Kidhome             -0.081793654  0.0362834990 -0.0801762927
## Teenhome            -0.015663557  0.0075914941 -0.1547302490
## Recency             -0.001763718  0.0053983360 -0.1985677750
## MntWines             0.206040386 -0.0359303410  0.2473918364
## MntFruits           -0.009700701 -0.0027997385  0.1259042889
## MntMeatProducts      0.043090152 -0.0207198340  0.2366397794
## MntFishProducts      0.002583115 -0.0188177550  0.1114148536
## MntSweetProducts     0.009972115 -0.0204037386  0.1173663251
## MntGoldProds         0.050252085 -0.0298735539  0.1406925150
## NumDealsPurchases   -0.037814203  0.0035988400  0.0018540640
## NumWebPurchases      0.034103231 -0.0132333780  0.1484527002
## NumCatalogPurchases  0.099890509 -0.0182789367  0.2208944353
## NumStorePurchases    0.085097560 -0.0115244817  0.0388547607
## NumWebVisitsMonth   -0.007329888  0.0207835047 -0.0044494815
## AcceptedCmp3         0.071980590  0.0099156837  0.2541442515
## AcceptedCmp4         0.292183958 -0.0269777182  0.1768896029
## AcceptedCmp5         0.222333050 -0.0082155479  0.3281821410
## AcceptedCmp1         0.175283294 -0.0249131580  0.2938824507
## AcceptedCmp2         1.000000000 -0.0110736709  0.1692486819
## Complain            -0.011073671  1.0000000000  0.0001846593
## Response             0.169248682  0.0001846593  1.0000000000

Secara umum, pendapatan pelanggan (Income) merupakan variabel yang paling berpengaruh terhadap perilaku pembelian. Pelanggan dengan pendapatan tinggi cenderung memiliki pengeluaran yang lebih besar, frekuensi pembelian yang lebih tinggi, dan lebih aktif berbelanja melalui berbagai saluran. Selain itu, terdapat hubungan yang cukup kuat antar kategori produk dan antar saluran pembelian, yang mengindikasikan adanya pola konsumsi yang konsisten pada sebagian pelanggan.

Multikolinearitas

vif_cols <- c("Income","NumWebVisitsMonth","Recency")
 
lm_formula <- as.formula(
  paste("Response ~", paste(vif_cols, collapse = " + "))
)
vif_model  <- lm(lm_formula, data = df)
vif_result <- vif(vif_model)
 
# Tabel VIF
vif_df <- data.frame(
  Variabel = names(vif_result),
  VIF      = round(vif_result, 2),
  Status   = ifelse(vif_result > 10, "Berat (>10)",
             ifelse(vif_result > 5,  "Sedang (5-10)",
             ifelse(vif_result > 2.5,"Moderat (2.5-5)","Rendah (<2.5)")))
)
print(vif_df, row.names = FALSE)
##           Variabel  VIF        Status
##             Income 1.67 Rendah (<2.5)
##  NumWebVisitsMonth 1.67 Rendah (<2.5)
##            Recency 1.00 Rendah (<2.5)

Berdasarkan hasil pengujian Variance Inflation Factor (VIF), seluruh variabel independen memiliki nilai VIF yang rendah, yaitu Income sebesar 1,67, NumWebVisitsMonth sebesar 1,67, dan Recency sebesar 1,00. Seluruh nilai tersebut berada jauh di bawah batas umum 5 maupun 10 yang sering digunakan sebagai indikator adanya multikolinearitas.

Nilai VIF Income dan NumWebVisitsMonth yang sama-sama sebesar 1,67 menunjukkan adanya hubungan antarvariabel yang relatif lemah dan masih berada dalam batas yang dapat diterima. Sementara itu, nilai VIF Recency sebesar 1,00 menunjukkan bahwa variabel tersebut hampir tidak memiliki korelasi linear dengan variabel independen lainnya.

Dengan demikian, dapat disimpulkan bahwa tidak terdapat masalah multikolinearitas pada variabel Income, NumWebVisitsMonth, dan Recency. Kondisi ini menunjukkan bahwa masing-masing variabel memberikan informasi yang relatif berbeda sehingga layak digunakan secara bersamaan dalam proses pemodelan tanpa menimbulkan distorsi pada estimasi parameter model.

FEATURE ENGINEERING

Feature engineering merupakan proses pembentukan variabel baru yang lebih informatif berdasarkan variabel-variabel asli pada dataset. Tahap ini dilakukan dengan tujuan untuk menyederhanakan struktur data, meningkatkan interpretabilitas, serta memperkuat representasi makna bisnis dalam analisis perilaku pelanggan.

Dalam penelitian ini, dilakukan pembentukan empat variabel baru yang merupakan hasil agregasi dari beberapa variabel asli pada dataset Customer Personality Analysis.

# FEATURE ENGINEERING
# 1. Total pengeluaran pelanggan
df$Total_Spending <- df$MntWines +
  df$MntFruits +
  df$MntMeatProducts +
  df$MntFishProducts +
  df$MntSweetProducts +
  df$MntGoldProds

# 2. Total aktivitas pembelian (jumlah transaksi)
df$Total_Purchases <- df$NumDealsPurchases +
  df$NumWebPurchases +
  df$NumCatalogPurchases +
  df$NumStorePurchases

# 3. Usia pelanggan
df$Age <- 2014 - df$Year_Birth

# 4. Lama menjadi pelanggan (tenure)
max_date <- max(df$Dt_Customer)

df$Tenure <- as.numeric(max_date - df$Dt_Customer)

# Preview hasil
head(df[, c("Total_Spending", "Total_Purchases", "Age", "Tenure")])
## # A tibble: 6 × 4
##   Total_Spending Total_Purchases   Age Tenure
##            <dbl>           <dbl> <dbl>  <dbl>
## 1           1617              25    57    971
## 2             27               6    60    125
## 3            776              21    49    472
## 4             53               8    30     65
## 5            422              19    33    321
## 6            716              22    47    453

1. Total Spending (Total Pengeluaran Produk)

Variabel Total_Spending merupakan total pengeluaran pelanggan pada seluruh kategori produk yang tersedia dalam dataset, yaitu wine, buah, daging, ikan, produk manis, dan produk emas.

  • Alasan : Variabel ini dibentuk untuk memberikan gambaran menyeluruh mengenai nilai kontribusi ekonomi setiap pelanggan tanpa harus menganalisis setiap kategori produk secara terpisah.
  • Interpretasi: Semakin tinggi nilai Total_Spending, semakin besar kontribusi pelanggan terhadap total pendapatan perusahaan.

2. Total Purchases (Total Transaksi)

Variabel Total_Purchases menunjukkan total jumlah transaksi pelanggan dari berbagai kanal pembelian, yaitu pembelian melalui web, katalog, toko fisik, serta pembelian dengan penawaran diskon.

  • Alasan: Variabel ini digunakan untuk menggambarkan tingkat aktivitas pembelian pelanggan.
  • Interpretasi: Semakin tinggi nilai Total_Purchases, semakin sering pelanggan melakukan transaksi, yang menunjukkan tingkat keterlibatan pelanggan yang lebih tinggi..

3. Age (Usia Pelanggan)

Variabel Age dihitung berdasarkan selisih antara tahun referensi penelitian (2014) dengan tahun kelahiran pelanggan.

  • Alasan: Penggunaan tahun 2014 disesuaikan dengan periode pengumpulan data pada dataset Customer Personality Analysis, sehingga dapat merepresentasikan kondisi usia pelanggan pada saat observasi dilakukan.
  • Interpretasi: Variabel ini digunakan untuk menganalisis perbedaan pola perilaku pelanggan berdasarkan kelompok usia.

4. Tenure (Lama Menjadi Pelanggan)

Variabel Tenure menunjukkan lamanya pelanggan terdaftar sebagai pelanggan perusahaan

  • Alasan: untuk dihitung berdasarkan selisih antara tanggal akuisisi pelanggan dengan tanggal referensi data terakhir.
  • Interpretasi: Semakin besar nilai Tenure, semakin lama hubungan pelanggan dengan perusahaan, yang berpotensi mencerminkan tingkat loyalitas pelanggan yang lebih tinggi.

KESIMPULAN

Berdasarkan proses feature engineering, diperoleh empat variabel baru yaitu Total_Spending, Total_Purchases, Age, dan Tenure. Variabel-variabel tersebut merupakan hasil transformasi dari beberapa variabel asli yang bertujuan untuk menyederhanakan struktur data sekaligus meningkatkan interpretasi dalam analisis.

Dengan adanya variabel baru ini, data menjadi lebih ringkas, informatif, dan lebih sesuai untuk analisis lanjutan seperti Principal Component Analysis (PCA) maupun segmentasi pelanggan.

FEATURE SELECTION

Feature selection merupakan proses pemilihan variabel yang paling relevan untuk digunakan dalam analisis, sekaligus mengurangi variabel yang memiliki informasi serupa atau bersifat redundan. Tujuan dari tahap ini adalah untuk memperoleh subset variabel yang lebih ringkas, tidak saling tumpang tindih, namun tetap mampu merepresentasikan karakteristik utama data.

Dalam penelitian ini, feature selection dilakukan menggunakan dua pendekatan, yaitu analisis korelasi dan Variance Inflation Factor (VIF).

METODE KORELASI

Analisis korelasi digunakan untuk mengukur kekuatan hubungan antar variabel numerik. Variabel dengan korelasi yang tinggi menunjukkan adanya kemungkinan informasi yang serupa, sehingga dapat dipertimbangkan untuk direduksi atau direpresentasikan oleh variabel lain.

# FEATURE SELECTION - KORELASI
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.5.3
## corrplot 0.95 loaded
library(dplyr)

# Ambil hanya variabel numerik
num_df <- df %>% select(where(is.numeric))

# Matriks korelasi
cor_matrix <- cor(num_df, use = "complete.obs")

# Visualisasi korelasi
corrplot(cor_matrix,
         method = "color",
         tl.cex = 0.7,
         order = "hclust")

Interpretasi Analisis Korelasi (Exploratory)

Pada visualisasi heatmap korelasi, hubungan antarvariabel ditunjukkan melalui gradasi warna. Warna biru menunjukkan korelasi positif, sedangkan warna merah menunjukkan korelasi negatif. Tingkat kekuatan hubungan ditentukan oleh intensitas warna, di mana biru tua atau merah tua menunjukkan korelasi yang kuat, sedangkan warna yang mendekati putih menunjukkan korelasi yang lemah atau hampir tidak ada hubungan linear.

Secara umum, pola korelasi pada data dapat dikelompokkan menjadi beberapa cluster berdasarkan kemiripan karakteristik variabel.

1. Kelompok 1: Variabel Pengeluaran dan Pembelian (Korelasi Positif Kuat – Biru Tua)

Kelompok pertama ditandai dengan warna biru tua yang dominan, yang menunjukkan korelasi positif yang cukup kuat antarvariabel. Kelompok ini terdiri dari:

  • MntWines
  • MntMeatProducts
  • MntFishProducts
  • MntSweetProducts
  • MntGoldProds
  • NumWebPurchases
  • NumCatalogPurchases
  • NumStorePurchases
  • Total_Spending
  • Total_Purchases
  • Income

Pola ini menunjukkan bahwa pelanggan yang memiliki pengeluaran tinggi pada satu kategori produk cenderung juga tinggi pada kategori lainnya, serta memiliki frekuensi pembelian yang lebih tinggi pada berbagai channel (web, katalog, dan toko). Selain itu, variabel Income juga memiliki korelasi positif terhadap kelompok ini, yang mengindikasikan bahwa semakin tinggi pendapatan pelanggan, semakin besar kecenderungan mereka untuk melakukan pembelian dan pengeluaran yang lebih tinggi.

2. Kelompok 2: Variabel Ringkasan (Representasi Utama)

Masih dalam kelompok biru, terdapat variabel Total_Spending dan Total_Purchases yang menunjukkan warna biru tua yang konsisten terhadap seluruh variabel pembentuknya.

Hal ini terjadi karena:

  • Total_Spending merupakan agregasi dari seluruh variabel pengeluaran produk
  • Total_Purchases merupakan agregasi dari seluruh variabel jumlah transaksi

Dengan demikian, kedua variabel ini memiliki korelasi tinggi secara alami (matematis) terhadap variabel penyusunnya. Oleh karena itu, kedua variabel ini dapat dianggap sebagai variabel representatif (summary variables) yang merangkum informasi kompleks menjadi bentuk yang lebih sederhana.

3. Kelompok 3: Variabel Marketing Campaign (Biru Muda – Korelasi Sedang)

Kelompok berikutnya ditandai dengan warna biru muda hingga biru sedang, yang menunjukkan korelasi positif tetapi tidak sekuat kelompok pertama.

Variabel dalam kelompok ini meliputi:

  • AcceptedCmp1
  • AcceptedCmp2
  • AcceptedCmp3
  • AcceptedCmp4
  • AcceptedCmp5
  • Response

Pola ini menunjukkan bahwa pelanggan yang menerima satu campaign cenderung memiliki kecenderungan untuk menerima campaign lainnya, meskipun tidak selalu kuat. Hal ini mengindikasikan adanya segmentasi perilaku pelanggan terhadap respons kampanye pemasaran, namun tidak sekuat hubungan pada variabel pembelian.

4. Kelompok 4: Variabel Demografis (Merah – Korelasi Negatif)

Kelompok ini ditandai dengan warna merah hingga merah muda, yang menunjukkan hubungan negatif terhadap variabel pengeluaran dan pembelian.

Variabel yang termasuk:

  • Kidhome
  • Teenhome
  • Age

Interpretasinya adalah:

  • Semakin tinggi jumlah anak/teen dalam rumah tangga (Kidhome dan Teenhome), cenderung diikuti oleh penurunan aktivitas pembelian (korelasi negatif lemah hingga sedang).
  • Variabel Age juga menunjukkan kecenderungan negatif terhadap beberapa variabel pembelian, yang mengindikasikan bahwa kelompok usia tertentu memiliki pola konsumsi yang berbeda, meskipun tidak terlalu kuat.

Namun perlu dicatat bahwa warna merah pada kelompok ini tidak terlalu gelap, sehingga hubungan negatif tersebut masih tergolong lemah hingga moderat, bukan hubungan yang dominan.

5. Kelompok 5: Variabel dengan Korelasi Lemah (Putih / Mendekati Netral)

Beberapa area pada heatmap menunjukkan warna mendekati putih, yang menandakan tidak adanya hubungan linear yang kuat antarvariabel.

Kelompok ini biasanya mencakup:

  • ID
  • Beberapa kombinasi variabel demografis dengan variabel campaign
  • Variabel dengan pola acak atau tidak terstruktur secara linear

Hal ini menunjukkan bahwa tidak semua variabel dalam dataset memiliki hubungan linear yang signifikan.

Kesimpulan Eksplorasi Korelasi

Secara keseluruhan, heatmap menunjukkan adanya struktur data yang jelas dalam beberapa kelompok utama:

  • Kelompok pengeluaran dan pembelian (biru tua) → hubungan kuat dan saling menguatkan
  • Variabel ringkasan (Total_Spending & Total_Purchases) → representasi dari variabel lain
  • Variabel campaign (biru muda) → hubungan moderat antar campaign acceptance
  • Variabel demografis (merah) → hubungan negatif terhadap aktivitas pembelian
  • Variabel netral (putih) → tidak memiliki hubungan linear yang kuat

Berdasarkan pola tersebut, dapat disimpulkan bahwa struktur data didominasi oleh hubungan positif pada perilaku konsumsi pelanggan, sementara variabel demografis cenderung berperan sebagai faktor yang memengaruhi arah (negatif ringan) terhadap aktivitas pembelian.

VARIANCE INFLATION FACTOR (VIF)

Variance Inflation Factor (VIF) digunakan untuk mengukur tingkat multikolinearitas antar variabel independen. Nilai VIF yang tinggi menunjukkan adanya hubungan linear yang kuat antar variabel, sedangkan nilai VIF di bawah 5 umumnya menunjukkan bahwa tidak terdapat masalah multikolinearitas yang serius.

# FEATURE SELECTION - VIF
library(car)

# Model dummy digunakan hanya untuk menghitung VIF
# Variabel Income hanya sebagai variabel dependen sementara dan tidak dianalisis dalam model ini
vif_model <- lm(
  Income ~ Age + Recency + Tenure +
    Total_Spending + Total_Purchases,
  data = df
)

# Menghitung nilai VIF
vif_values <- vif(vif_model)

# Membuat tabel hasil VIF
vif_df <- data.frame(
  Variabel = names(vif_values),
  VIF = round(vif_values, 2),
  Status = ifelse(vif_values < 5, "Tidak ada multikolinearitas",
           ifelse(vif_values < 10, "Multikolinearitas sedang",
                  "Multikolinearitas tinggi"))
)

print(vif_df)
##                        Variabel  VIF                      Status
## Age                         Age 1.04 Tidak ada multikolinearitas
## Recency                 Recency 1.00 Tidak ada multikolinearitas
## Tenure                   Tenure 1.04 Tidak ada multikolinearitas
## Total_Spending   Total_Spending 2.33 Tidak ada multikolinearitas
## Total_Purchases Total_Purchases 2.42 Tidak ada multikolinearitas

Interpretasi VIF

Hasil perhitungan Variance Inflation Factor (VIF) menunjukkan bahwa seluruh variabel memiliki nilai yang rendah, yaitu Age (1.04), Recency (1.00), Tenure (1.04), Total_Spending (2.33), dan Total_Purchases (2.42). Seluruh nilai tersebut berada di bawah ambang batas 5, sehingga dapat disimpulkan bahwa tidak terdapat masalah multikolinearitas antar variabel independen.

Hal ini menunjukkan bahwa masing-masing variabel memberikan informasi yang berbeda dan tidak saling tumpang tindih secara berlebihan. Dengan demikian, seluruh variabel yang digunakan masih layak untuk dianalisis lebih lanjut.

Hasil Feature Selection

Berdasarkan hasil analisis korelasi dan VIF, dipilih beberapa variabel yang dianggap mampu mewakili informasi penting dalam dataset tanpa menimbulkan masalah multikolinearitas.

Variabel yang Dipilih

Variabel yang dipilih untuk digunakan pada analisis selanjutnya adalah:

  • Income
  • Age
  • Recency
  • Tenure
  • Total_Spending
  • Total_Purchases

Alasan Pemilihan

Variabel-variabel tersebut dipilih karena mampu merepresentasikan karakteristik utama pelanggan dari aspek pendapatan, usia, lama menjadi pelanggan, aktivitas pembelian, dan total pengeluaran. Selain itu, berdasarkan hasil pengujian Variance Inflation Factor (VIF), seluruh variabel memiliki nilai di bawah 5 sehingga tidak menunjukkan adanya masalah multikolinearitas dan layak digunakan dalam analisis selanjutnya.

Variabel-variabel tersebut juga merupakan hasil ringkasan dari beberapa variabel asli melalui proses feature engineering. Oleh karena itu, penggunaan variabel asli secara bersamaan dengan variabel hasil ringkasan dapat menyebabkan terjadinya redundansi informasi dalam analisis.

Variabel yang Dieliminasi

Variabel yang tidak digunakan pada analisis selanjutnya adalah:

  • Year_Birth
  • Dt_Customer
  • Kidhome
  • Teenhome
  • MntWines
  • MntFruits
  • MntMeatProducts
  • MntFishProducts
  • MntSweetProducts
  • MntGoldProds
  • NumDealsPurchases
  • NumWebPurchases
  • NumCatalogPurchases
  • NumStorePurchases

Alasan Eliminasi

Variabel Year_Birth dieliminasi karena informasinya telah direpresentasikan oleh variabel Age. Variabel Dt_Customer juga dieliminasi karena telah diringkas menjadi variabel Tenure.

Variabel Kidhome dan Teenhome juga dieliminasi karena termasuk variabel demografis yang informasinya sudah tercermin secara tidak langsung dalam pola pengeluaran dan aktivitas pembelian pelanggan. Selain itu, setelah proses agregasi variabel utama, kontribusi informasinya menjadi tidak signifikan terhadap variabel yang digunakan dalam analisis.

Sementara itu, variabel MntWines, MntFruits, MntMeatProducts, MntFishProducts, MntSweetProducts, dan MntGoldProds telah diringkas ke dalam variabel Total_Spending. Variabel NumDealsPurchases, NumWebPurchases, NumCatalogPurchases, dan NumStorePurchases juga telah diringkas ke dalam variabel Total_Purchases.

Karena seluruh informasi pada variabel-variabel tersebut sudah diwakili oleh variabel hasil ringkasan yang lebih sederhana, maka variabel tersebut tidak digunakan lagi secara terpisah pada analisis selanjutnya. Selain itu, variabel-variabel tersebut memiliki korelasi yang tinggi dengan variabel representatifnya sehingga dapat menimbulkan redundansi informasi apabila digunakan secara bersamaan dalam analisis.

Kesimpulan Feature Selection

Berdasarkan feature selection menggunakan metode korelasi dan Variance Inflation Factor (VIF), diperoleh enam variabel utama yang dipertahankan, yaitu Income, Age, Recency, Tenure, Total_Spending, dan Total_Purchases. Variabel-variabel tersebut dinilai mampu mewakili informasi penting dalam dataset serta tidak menunjukkan adanya masalah multikolinearitas, sehingga layak digunakan pada tahap analisis selanjutnya.

FEATURE EXTRACTION

Feature extraction adalah proses mengekstrak informasi penting dari data, lalu mengubahnya menjadi representasi baru yang lebih ringkas dan informatif.

Tujuan

  • Mengurangi dimensi data,
  • Mempertahankan informasi penting,
  • Meningkatkan performa analisis/model.

Pada penelitian ini, kami akan menggunakan Principal Component Analysis (PCA) untuk mereduksi dimensi. Principal Component Analysis (PCA) adalah teknik reduksi dimensi (feature extraction) yang menyederhanakan banyak variabel menjadi beberapa komponen utama.

Analisis PCA

Analisis PCA menggunakan fungsi prcomp() yang berasal package bawaan R dan standardisasi Z-score (scale) sebelum menganalis menggunakan PCA

# Membuat data frame baru berdasarkan tahapan analisis sebelumnya
df_final <- df %>% select(Income, 
                          Age, 
                          Recency,
                          Tenure, 
                          Total_Spending, 
                          Total_Purchases)
print(df_final)
## # A tibble: 2,237 × 6
##    Income   Age Recency Tenure Total_Spending Total_Purchases
##     <dbl> <dbl>   <dbl>  <dbl>          <dbl>           <dbl>
##  1  58138    57      58    971           1617              25
##  2  46344    60      38    125             27               6
##  3  71613    49      26    472            776              21
##  4  26646    30      26     65             53               8
##  5  58293    33      94    321            422              19
##  6  62513    47      16    453            716              22
##  7  55635    43      34    753            590              21
##  8  33454    29      32    488            169              10
##  9  30351    40      19    548             46               6
## 10   5648    64      68    268             49               2
## # ℹ 2,227 more rows
df_scaled <- scale(df_final) # Standardisasi
pca <- prcomp(df_scaled) # PCA

Interpretasi

Variasi Komponen

summary(pca)
## Importance of components:
##                           PC1    PC2    PC3    PC4     PC5     PC6
## Standard deviation     1.6049 1.0294 1.0014 0.9530 0.53991 0.40234
## Proportion of Variance 0.4293 0.1766 0.1671 0.1514 0.04858 0.02698
## Cumulative Proportion  0.4293 0.6059 0.7731 0.9244 0.97302 1.00000
  • Komponen pertama (PC1) mampu menjelaskan 42.93% variasi data. Artinya PC1 (dari total 6 variabel) tergolong kuat dan sebagian informasi sudah dirangkum dalam variabel Income, Age, Recency, Tenure, Total_Spending, Total_Purchases oleh PC1.
  • Jika kita menetapkan standar bahwa data baru harus mempertahankan sekitar 70% - 80% informasi awal, maka kita cukup mengambil 3 Komponen Utama (PC1, PC2, dan PC3). Gabungan ketiganya menghasilkan Cumulative Proportion sebesar 0.7731 (77.31%).
  • Kesimpulan: berdasarkan cumulative proportion, reduksi dimensi data dari 6 variabel (V1 sampai V6) menjadi hanya 3 dimensi saja sudah cukup kuat. (hanya kehilangan sekitar ~22% noise atau informasi yang tidak signifikan).

Loading Factor

Loading factor (angka-angka dalam matriks) berkisar dari -1 hingga 1. Semakin angkanya menjauhi nol (baik positif maupun negatif), semakin besar pengaruh variabel tersebut terhadap PC pembentuknya.

pca$rotation # Melihat loading factor
##                         PC1         PC2          PC3          PC4         PC5
## Income          -0.56177317  0.16762874 -0.006878867  0.161718718 -0.49305628
## Age             -0.18140177  0.45462918  0.357061990 -0.790042867 -0.01851362
## Recency         -0.01850299 -0.26018903  0.926116979  0.271843734  0.01781378
## Tenure          -0.10420624 -0.82783283 -0.085348358 -0.499049768 -0.18959358
## Total_Spending  -0.57678383 -0.05778346 -0.064941420  0.163212313 -0.25781635
## Total_Purchases -0.55463810 -0.09417254 -0.057140414  0.009559198  0.80859163
##                          PC6
## Income          -0.622098664
## Age              0.091662173
## Recency         -0.007092583
## Tenure          -0.107485494
## Total_Spending   0.752765948
## Total_Purchases -0.162269185
  • Karakteristik PC1: Variabel dominannyayaitu Total_Spending (-0.576), Income (-0.561), dan Total_Purchases (-0.554). Maknanya PC1 secara serentak mengelompokkan variabel pendapatan, pengeluaran, dan jumlah pembelian . Dimensi ini bisa diartikan sebagai PC1 sebaga “Kekuatan Beli dan Finansial”. Ketiga nilai ini bertanda negatif, artinya pelanggan dengan pendapatan tinggi, pengeluaran tinggi, dan pembelian yang banyak justru akan menghasilkan skor PC1 yang rendah (semakin negatif).
  • Karakteristik PC2: Variabel dominannya yaitu Tenure (-0.827) dan Age (0.454). Maknanya PC2 sangat kuat dikendalikan oleh variabel Tenure (lama waktu menjadi pelanggan). Dimensi ini bisa diartikan sebagai “Tingkat Loyalitas”. Nilai Tenure yang negatif sangat kuat menunjukkan bahwa pelanggan yang sudah lama setia (tenure tinggi) akan ditarik ke arah nilai PC2 yang negatif. Sebaliknya, pelanggan baru yang lebih tua akan ditarik ke arah PC2 yang positif (karena Age positif).
  • Karakteristik PC3: Variabel dominannya yaitu Recency (0.926). Maknanya PC3 hampir sepenuhnya didominasi oleh variabel Recency (seberapa baru pelanggan melakukan transaksi terakhir). Angka 0.926 sangat mendekati 1, yang berarti PC3 pada dasarnya murni merepresentasikan dimensi “Aktivitas Terkini”.

Visualisasi

1. Scree Plot

plot(pca, type = "l") # Visualisasi scree plot

  • Panah yang Searah (Nempel berdekatan): Artinya variabel-variabel itu punya korelasi positif yang kuat. Kalau nilai yang satu naik, yang lain ikut naik.
  • Panah yang Berlawanan Arah (~180 derajat): Artinya punya korelasi negatif yang kuat. Kalau satu naik, yang lain pasti turun. .
  • Panah yang Membentuk Sudut Siku-Siku (~90 derajat): Artinya tidak ada hubungannya sama sekali (independen). (Contoh: Panah V3/V6 yang ke atas tegak lurus dengan panah V1 yang ke kanan. Artinya kelompok variabel ini mengukur hal yang sama sekali berbeda).
  • Sumbu X mendatar adalah PC1 (yang merangkum 42.93% informasi). Panah yang posisinya sangat rebah ke kiri atau kanan (seperti V1, V4, V5) berarti variabel tersebut adalah “penyumbang utama” atau yang paling mendominasi pembentukan PC1.
  • Sumbu Y vertikal adalah PC2 (17.66% informasi). Panah yang posisinya tegak lurus ke atas atau bawah (seperti V3 dan V6) berarti merekalah yang menguasai PC2.
  • Semakin panjang panahnya (sampai hampir menyentuh garis lingkaran luar), berarti variabel tersebut direpresentasikan dengan sangat sempurna oleh PC1 dan PC2.

Grafik ini membuktikan bahwa kita memiliki dua kelompok perilaku utama di dalam data. Kelompok pertama dipengaruhi oleh tarik-menarik antara V1 melawan V4 dan V5 (Sumbu mendatar). Sedangkan kelompok kedua sepenuhnya dikendalikan oleh V3 dan V6 (Sumbu vertikal).

2. Biplot

biplot(pca) # Visualisasi biplot

  • Titik di sebelah Kanan: baris data (misal titik nomor 17, 21, atau 23) yang posisinya jauh di kanan, itu artinya observasi tersebut memiliki skor V1 yang sangat tinggi, tapi V4 dan V5-nya rendah.
  • Titik di sebelah Kiri: baris data yang ada di kiri (misal titik 24, 25, 29) adalah kelompok observasi yang nilai V4 dan V5-nya mendominasi (sangat tinggi).
  • Posisi Atas vs Bawah (Sumbu Y = PC2) Sumbu vertikal ini (Dim2) dikuasai oleh V3 dan V6 (yang di grafik sebelumnya panahnya menunjuk ke atas).
  • Titik di bagian Atas: Observasi yang posisinya melayang tinggi di atas garis tengah berarti memiliki nilai V3 dan V6 yang di atas rata-rata.
  • Titik di bagian Bawah: Baris data yang berada di bawah garis tengah memiliki skor V3 dan V6 yang rendah.
  • Titik-titik yang menumpuk di tengah persis adalah observasi yang sifatnya “biasa-biasa saja” atau sangat mendekati nilai rata-rata populasi.

Semakin jauh sebuah titik menjauhi angka 0 (baik ke atas, bawah, kiri, atau kanan), makin ekstrem atau unik karakteristik baris data tersebut. Titik yang paling ujung bisa dicurigai sebagai Outlier (pencilan).

KESIMPULAN

Berdasarkan analisis reduksi dimensi menggunakan metode PCA pada data Customer Personality Analysis dinilai berhasil karena mampu meringkas 6 variabel awal menjadi hanya 3 Komponen Utama (PC) namun tetap mempertahankan 77,31% total variasi informasi. Secara substantif, komponen-komponen ini memetakan pelanggan ke dalam tiga dimensi utama: PC1 (“Kekuatan Beli dan Finansial”) yang didorong oleh variabel paling penting dalam dataset yaitu Total_Spending, Income, dan Total_Purchases; PC2 (“Tingkat Loyalitas”) yang dikendalikan oleh lama berlangganan (Tenure) dan usia; serta PC3 (“Aktivitas Terkini”) yang bertumpu pada Recency.

Dari pengelompokan profil tersebut serta eksplorasi data secara keseluruhan, diperoleh insight bahwa pelanggan didominasi oleh kalangan dewasa hingga lansia berpendapatan stabil yang memiliki preferensi kuat pada produk anggur (wine) dan daging, serta lebih suka berbelanja langsung di toko fisik meskipun angka kunjungan ke website cukup tinggi. Secara bisnis, hal ini menunjukkan bahwa meskipun tingkat kepuasan pelanggan sangat baik (keluhan di bawah 1%), perusahaan mendesak untuk merombak strategi kampanye pemasarannya yang saat ini memiliki tingkat respons sangat rendah (di bawah 15%), misalnya dengan menargetkan promosi produk unggulan secara lebih spesifik pada segmen pelanggan dengan skor PC1 (kekuatan finansial) yang tinggi.