Materi ini diproduksi oleh tim dari Algoritma untuk Correspondence Analysis for Brand Personalities. Materi berikut hanya ditujukan untuk kalangan terbatas, meliputi individu/personal yang menerima materi ini secara langsung dari lembaga pelatihan. Materi ini dilarang untuk direproduksi, didistribusikan, diterjemahkan, atau diadaptasikan dalam bentuk apapun di luar izin dari individu dan organisasi yang berkepentingan.
Algoritma adalah pusat pendidikan Data Science di Jakarta. Kami mengadakan workshop dan program pelatihan untuk membantu para profesional dan pelajar untuk mendapatkan keahlian dalam berbagai bidang dalam ruang lingkup Data Science: data visualization, machine learning, data modeling, statistical inference, dan lain-lainnya.
Sebelum masuk ke dalam materi dan menjalankan kode-kode di dalam materi ini, silakan Anda melihat bagian Library and Setup untuk melihat dan memastikan semua persyaratan dasar untuk mengikuti materi ini sudah terpenuhi termasuk package-package yang diperlukan. Pada bagian Tujuan Pembelajaran Anda dapat melihat secara umum apa saja yang akan dipelajari dalam modul materi ini. Kami harap materi ini akan bermanfaat bagi karir ataupun menambah keahlian peserta.
Istilah “Brand Personality” merujuk pada karakteristik sifat manusia yang dikaitkan dengan nama suatu brand. Perusahaan akan berusaha meningkatkan keuntungannya dengan cara memiliki seperangkat sifat konsisten yang disukai oleh target segmen konsumennya. Seperangkat sifat inilah yang disebut sebagai brand personality. Brand Personality merupakan aspek penting dari branding karena konsumen sering membuat keputusan pembelian berdasarkan seberapa cocok Brand Personality suatu produk dengan kepribadian mereka.
Perusahaan sebaiknya mendefinisikan Brand Personality mereka sehingga dapat menyasar konsumen atau pasar yang tepat untuk memaksimumkan profitnya. Brand personality juga menjadi sangat penting di tengah era digital ini dengan adanya Artificial Intelligence dan otomatisasi. Dengan demikian, pemetaan untuk brand personality dari tiap perusahaan dapat digunakan untuk mengembangkan strategi branding yang lebih efektif dan lebih sesuai dengan kebutuhan serta preferensi konsumen.
Correspondence Analysis adalah teknik statistik yang telah banyak digunakan dalam market research untuk memahami hubungan antara Brand Personality dan persepsi konsumen. Dengan analisis korespondensi, diperoleh plot yang menunjukkan interaksi dua variabel kategorik bersama yaitu variabel nama brand dan variabel brand personality. Sehingga dapat diketahui personality yang melekat dari masing-masing brand.
Materi ini bertujuan untuk memberikan pemahaman kepada peserta workshop terkait penggunaan Correspondence Analysis dalam mengidentifikasi Brand Personality dari suatu brand. Adapun setelah mempelajari materi ini peserta diharapkan dapat memahami kegunaan dan potensi Correspondence Analysis sesuai dengan proses bisnis pada bidang industri yang dijalani oleh peserta.
Untuk dapat mengikuti materi ini, peserta diharapkan sudah menginstall beberapa packages di bawah ini. Apabila package tersebut belum terinstall, silahkan jalankan chunk atau baris kode di bawah ini. Apabila sudah ter-install, lewati chunk tersebut dan muat package yang dibutuhkan dengan menjalankan chunk selanjutnya.
# install.packages(c("FactoMineR","factoextra", "dplyr", "ggpubr", "graphics", "ggplot2", "datasets"))#data wrangling
library("dplyr")
#data analysis
library("FactoMineR")
library("factoextra")
#data visualization
library("ggpubr") #untuk balloonplot
library("graphics") #untuk mosaicplot
library("ggplot2")
#data reference
library("datasets")Tujuan utama dari workshop ini adalah untuk memberikan pengenalan yang komprehensif mengenai tools dan perangkat lunak yang digunakan untuk melakukan correspondence analysis, yakni sebuah open-source populer: R. Adapun materi ini akan mencakup:
Analisa data di R dimulai dengan membaca data yang sudah tersedia.
Terdapat banyak format penyimpanan data mulai dari yang terstruktur
hingga yang tidak terstruktur. Salah satu format data yang sering
digunakan yaitu .csv. Untuk membaca data dengan format
.csv bisa menggunakan fungsi read.csv().
brand_df <- read.csv("data/brand.csv")
brand_dfDeskripsi Data
brand_df merupakan data yang akan digunakan pada
implementasi Correspondence Analysis for Brand Personalities, diperoleh
dari paper milik Jack Hoare & Tim Bock (2019). Data tersebut terdiri
dari 29 brand (baris) dan 15 atribut personality (kolom). Data
dikumpulkan menggunakan metode nonprobability sampling dari 3173 orang
dewasa di Australia pada tahun 2005. Responden diminta untuk menentukan
tiga atribut personality untuk setiap brand yang ditunjukkan.
Salah satu cara untuk melihat data adalah menggunakan fungsi
head()
#your code here
head(brand_df, n = 10)Data di atas merupakan data brand dengan deskripsi dari setiap kolom sebagai berikut:
Brand : nama brandcharming : skor atribut/personality “menarik”cheerful : skor atribut/personality “ceria”daring : skor atribut/personality “berani”down_to_earth : skor atribut/personality
“bersahaja”honest : skor atribut/personality “jujur”imaginative : skor atribut/personality
“imajinatif”intelligent : skor atribut/personality “cerdas”outdoorsy : skor atribut/personality “tipe luar
ruangan”reliable : skor atribut/personality “dapat
diandalkan”spirited : skor atribut/personality “bersemangat”successful : skor atribut/personality “sukses”tough : skor atribut/personality “tangguh”up_to_date : skor atribut/personality “terkini”upper_class : skor atribut/personality “kelas sosial
atas”wholesome : skor atribut/personality “sehat/baik”Untuk mengetahui 10 baris terakhir pada data, kita dapat menggunakan
fungsi tail().
#your code here
tail(brand_df, n=10)Kita sudah mempelajari bagaimana mengecek sampel dari data, sekarang
kita perlu mengetahui tipe data dari masing masing kolom yang ada. Kita
bisa menggunakan fungsi glimpse() untuk melihat struktur
serta dimensi dari data.
#your code here
library(dplyr)
glimpse(brand_df)#> Rows: 29
#> Columns: 16
#> $ Brand <chr> "AmericanExpress", "Applecomputers", "Avoncosmetics", "C…
#> $ charming <int> 20, 25, 33, 59, 22, 20, 13, 20, 58, 11, 12, 19, 12, 9, 2…
#> $ cheerful <int> 9, 27, 33, 25, 30, 45, 43, 18, 57, 10, 48, 42, 22, 51, 3…
#> $ daring <int> 15, 23, 7, 50, 8, 13, 20, 36, 6, 16, 12, 8, 24, 9, 49, 3…
#> $ down_to_earth <int> 10, 14, 26, 7, 62, 51, 21, 8, 28, 12, 68, 35, 40, 45, 47…
#> $ honest <int> 14, 27, 25, 13, 50, 56, 20, 6, 51, 26, 45, 50, 14, 49, 3…
#> $ imaginative <int> 17, 54, 20, 31, 11, 17, 26, 14, 54, 51, 17, 33, 12, 58, …
#> $ intelligent <int> 44, 71, 10, 16, 11, 32, 9, 7, 24, 75, 17, 38, 5, 32, 16,…
#> $ outdoorsy <int> 14, 4, 6, 11, 16, 12, 35, 22, 4, 2, 30, 54, 59, 6, 72, 3…
#> $ reliable <int> 26, 32, 23, 21, 53, 82, 31, 9, 50, 56, 46, 67, 19, 41, 5…
#> $ spirited <int> 14, 34, 7, 38, 14, 19, 29, 18, 24, 18, 13, 16, 23, 17, 4…
#> $ successful <int> 63, 43, 23, 44, 31, 56, 48, 21, 44, 65, 45, 50, 17, 37, …
#> $ tough <int> 20, 13, 6, 5, 12, 23, 10, 18, 5, 31, 12, 12, 44, 32, 71,…
#> $ up_to_date <int> 30, 53, 20, 30, 19, 37, 43, 27, 23, 55, 29, 33, 24, 20, …
#> $ upper_class <int> 69, 33, 6, 81, 11, 9, 6, 36, 35, 38, 3, 17, 11, 5, 30, 7…
#> $ wholesome <int> 8, 24, 26, 10, 80, 52, 17, 6, 49, 26, 45, 29, 10, 39, 26…
brand_df merupakan sebuah ‘data.frame’ atau tabel dengan
29 baris dan 16 kolom. Nama dari setiap kolom tertera di sebelah kanan
(Brand, charming, dll). Teks chr, int
menunjukkan tipe data dari masing - masing kolom.
Terdapat berbagai macam tipe data di R, berikut intuisi dari setiap tipe data tersebut.
# character
a_char <- c("Algoritma", "Indonesia", "e-Commerce", "marketing")
# factor (data categorical)
a_factor <- factor(c("AB", "O", "B", "A", "B", "AB", "O"))
# numeric
a_num <- c(-1, 1, 2, 3/4, 0.5)
# integer
an_int <- c(1L, 2L)
# date
a_date <- c("24/Jan/2019", "10-12-1994")
# logical
a_log <- c(TRUE, TRUE, FALSE)Cara untuk mengetahui tipe data dari suatu objek, Anda dapat
menggunakan fungsi class()
class(a_factor)#> [1] "factor"
Lalu, apa yang akan terjadi jika dalam satu vector memiliki beberapa tipe data yang berbeda seperti chunk dibawah ini?
mix <- c("Algoritma", 2021, TRUE)
mix#> [1] "Algoritma" "2021" "TRUE"
Bila Anda perhatikan setiap nilai pada vector mix
memiliki petik dua, artinya nilai tersebut merupakan sebuah
objek dengan tipe character. Proses perubahan paksa dari suatu vector
bisa disebut sebagai implicit coercion. Ilustrasi terjadinya
implicit coercion dapat dilihat pada gambar di bawah ini:
#your code here
class(mix)#> [1] "character"
Ketika melakukan analisis pada suatu data tidak jarang data yang dimiliki tidak dapat langsung digunakan. Beberapa tahapan perlu dilakukan seperti subseting data, membuat kolom baru, sampai melakukan aggregasi data. Hal tersebut penting dilakukan agar seorang analis paham betul dengan data yang diolah dan sesuai dengan analisis yang diinginkan.
Tabel kontingensi atau cross-tabulation adalah tabel yang berisi nilai frekuensi/kemunculan suatu kategori data.
Correspondence Analysis memerlukan input yang disebut sebagai tabel kontingensi. Tabel kontingensi terdiri dari baris dan kolom, dengan setiap baris mewakili kategori dari variabel pertama, dan setiap kolom mewakili kategori dari variabel kedua.
Jika kita memiliki dataframe biasa dimana terdapat beberapa kolom dengan tipe data yang berbeda-beda (biasanya tipe kategorik dan numerik), perlu dilakukan data aggregation untuk membentuk tabel kontingensi.
Untuk pembelajaran pembuatan tabel kontingensi dari dataframe,
perhatikan dataframe buit in di R dari package datasets
yang dapat dipanggil dengan nama esoph berikut.
# Memanggil data esoph
library(datasets)
esophData esoph adalah data dari studi kasus-kontrol kanker esofagus di Ille-et-Vilaine, Prancis. Terdiri dari 88 observasi dan 5 kolom, dengan deskripsi sebagai berikut.
agegp : Kelompok usia (25-34, 35-44, 45-54, 55-64,
65-74, 75+)alcgp : Konsumsi alkohol (0-39g/day, 40-79, 80-119,
120+)tobgp : Konsumsi tembakau (0-9g/day, 10-19, 20-29,
30+)ncases : Jumlah kasus kankerncontrols : Jumlah kontrolData esoph di atas dapat kita bentuk menjadi tabel kontingensi
menggunakan fungsi table() di R.
Fungsi table() adalah untuk menampilkan frekuensi tiap kategori dari dua variabel
Untuk membuat tabel kontingensi, pertama-tama kita harus
mengidentifikasi variabel kategorik mana yang ingin dianalisis. Misalkan
kita ingin menganalisis hubungan dari kelompok usia seseorang dengan
konsumsi tembakau. Berikut akan dibuat tabel kontingensi dari variabel
agegp dan tobgp.
#your code here
table(esoph$agegp, esoph$tobgp)#>
#> 0-9g/day 10-19 20-29 30+
#> 25-34 4 4 3 4
#> 35-44 4 4 4 3
#> 45-54 4 4 4 4
#> 55-64 4 4 4 4
#> 65-74 4 4 4 3
#> 75+ 4 4 1 2
Tabel kontingensi di atas menunjukkan jumlah orang-orang di Ille-et-Vilaine yang berusia kategori usia tertentu dengan ketegori konsumsi tembakau tertentu.
Insight:
Untuk menginterpretasikan tabel kontingensi, Anda dapat melihat frekuensi di setiap sel, dan membandingkannya dengan frekuensi di sel lain melintasi baris dan kolom. Anda juga dapat menghitung persentase atau proporsi untuk lebih memahami distribusi pengamatan. Correspondence Analysis yang akan kita bahas merupakan salah satu teknik advance untuk interpretasi tabel kontingensi.
Question?
Apakah data brand_df merupakan tabel kontingensi?
brand_dfJawaban: brand_df bukan merupakan tabel kontingensi, karena tabel kontingensi seharusnya punya index kolom dan index baris, sementara brand_df belum memiliki index baris (index baris menjadi isi dari suatu kolom)
Untuk membuat databrand_df menjadi tabel kontingensi,
kolom Brand akan dijadikan indeks baris. Sehingga index
baris pada tabel menunjukkan variabel brand dan index kolom menunjukkan
atribut personality.
# Assign nilai dari kolom brand menjadi index baris
rownames(brand_df) <- brand_df$Brand
brand_df# Membuang kolom yang tidak digunakan
brand_table <- brand_df %>%
select(-Brand)
brand_table#Alternative cara buat index baris utk contingency table (Pak Alif Aziz)
read.csv("data/brand.csv", row.names = 'Brand')Sebelum melakukan analisis, kita harus mengenali data yang akan kita
gunakan yaitu brand_table yang merupakan contingency table
dengan baris adalah nama brand dan kolom adalah atribut-atribut
personality. Kita dapat dengan cepat memperoleh rangkuman dari data kita
yang berisi five number summary menggunakan fungsi
summary() di R.
summary(brand_table)#> charming cheerful daring down_to_earth
#> Min. : 7.00 Min. : 9.00 Min. : 6.00 Min. : 5.00
#> 1st Qu.:12.00 1st Qu.:22.00 1st Qu.:11.00 1st Qu.:14.00
#> Median :20.00 Median :27.00 Median :20.00 Median :24.00
#> Mean :24.72 Mean :31.48 Mean :24.24 Mean :26.52
#> 3rd Qu.:33.00 3rd Qu.:43.00 3rd Qu.:32.00 3rd Qu.:35.00
#> Max. :59.00 Max. :64.00 Max. :76.00 Max. :68.00
#> honest imaginative intelligent outdoorsy reliable
#> Min. : 6.00 Min. :11.00 Min. : 5.00 Min. : 2.00 Min. : 9.0
#> 1st Qu.:18.00 1st Qu.:17.00 1st Qu.:15.00 1st Qu.:11.00 1st Qu.:30.0
#> Median :27.00 Median :29.00 Median :24.00 Median :22.00 Median :41.0
#> Mean :29.14 Mean :31.66 Mean :30.93 Mean :30.21 Mean :42.9
#> 3rd Qu.:38.00 3rd Qu.:43.00 3rd Qu.:44.00 3rd Qu.:48.00 3rd Qu.:55.0
#> Max. :56.00 Max. :62.00 Max. :75.00 Max. :87.00 Max. :82.0
#> spirited successful tough up_to_date upper_class
#> Min. : 7 Min. :17.00 Min. : 4.00 Min. :19.00 Min. : 3.00
#> 1st Qu.:16 1st Qu.:37.00 1st Qu.:12.00 1st Qu.:29.00 1st Qu.: 9.00
#> Median :24 Median :48.00 Median :20.00 Median :37.00 Median :33.00
#> Mean :27 Mean :47.38 Mean :26.38 Mean :38.48 Mean :32.48
#> 3rd Qu.:35 3rd Qu.:56.00 3rd Qu.:36.00 3rd Qu.:51.00 3rd Qu.:40.00
#> Max. :64 Max. :83.00 Max. :79.00 Max. :78.00 Max. :94.00
#> wholesome
#> Min. : 6.00
#> 1st Qu.:16.00
#> Median :23.00
#> Mean :25.66
#> 3rd Qu.:29.00
#> Max. :80.00
Nama brand sudah kita jadikan index row sehingga summary hanya ditampilkan untuk setiap kolom yang ada pada data yang merupakan atribut personality. Dikarenakan tujuan analisis kali ini adalah ingin mengidentifikasi atribut personality yang melekat pada tiap brand, maka nilai statistik yang menarik untuk diperhatikan adalah nilai maksimum.
Insight:
Dari summary, kita bisa mendapatkan bahwa terdapat beberapa atribut personality yang nilai maksimumnya sangat tinggi dibanding atribut lainnya. Sepertinya, semakin tinggi nilai maksimum untuk suatu atribut personality pada suatu brand maka semakin yakin suara dari para responden. Karena nilai yang maksimum dihasilkan dari suara banyak responden yang memberikan skor tinggi..
Meskipun fungsi summary memberikan rangkuman data, kita tetap kesulitan untuk menginterpretasikan data. Sehingga kita perlu suatu visualisasi untuk membantu kita menjelaskan data. Dikarenakan data input kita spesial yaitu merupakan tabel kontingensi, maka akan dikenalkan visualisasi khusus untuk tabel kontingensi.
Balloon plot adalah salah satu jenis plot untuk memvisualisasikan data kategorik yang berukuran besar.
Fungsi balloon plot adalah membuat tabel grafis dimana setiap sel menampilkan lingkaran berwarna yang ukurannya mencerminkan besar nilainya.
Secara visual, plot ini dapat menghighlight poin data yang nilainya menonjol ditunjukkan semakin besarnya lingkaran. Prinsip dasar pada ballon plot, semakin besar ukuran lingkaran maka semakin besar pula nilai datanya.
ggballoonplot(brand_table) +
labs(title = "Balloonplot for Brand Personalites") +
theme(plot.title = element_text(hjust = 0.5))Untuk memudahkan kita dalam membaca ballon plot, kita dapat memberikan warna untuk perbedaan ukuran lingkaran pada ballon plot seperti sebagai berikut.
my_cols <- c("#0D0887FF", "#6A00A8FF", "#B12A90FF","#E16462FF", "#FCA636FF", "#F0F921FF")
ggballoonplot(brand_table, fill = "value") +
scale_fill_gradientn(colours = my_cols) +
labs(title = "Balloonplot for Brand Personalites") +
theme(plot.title = element_text(hjust = 0.5))Plot di atas sudah dimodifikasi agar warna lingkaran juga dapat menunjukkan besarnya nilai, yaitu warna kuning menunjukkan nilai yang semakin besar sementara warna navy menunjukkan nilai semakin kecil. Pada ballon plot di atas, dapat diketahui bahwa terdapat beberapa brand dengan nilai frekuensi atribut yang tinggi dibanding brand lainnya.
Dari balloon plot di atas, kita dapat melihat bahwa:
Dengan menggunakan balloon plot kita dapat dengan cepat menginterpretasikan data kategorik meskipun kita memiliki data yang berukuran besar.
Balloonplot interactive:
library(plotly)
plot1 <- ggballoonplot(brand_table, fill = "value") +
scale_fill_gradientn(colours = my_cols) +
labs(title = "Balloonplot for Brand Personalites") +
theme(plot.title = element_text(hjust = 0.5))
#Catatan: perlu disesuaikan tinggi & lebar plot
ggplotly(plot1,height = 800, width = 800)Mosaic plot digunakan untuk memvisualisasikan tabel kontingensi dan untuk memeriksa hubungan antara variabel kategori. Untuk setiap sel, tinggi batang sebanding dengan frekuensi relatif yang diamati yang dikandungnya:
\[ \frac{cell.value}{column.sum}\]
Warna pada plot menunjukkan standardized residuals, yang memberikan intuisi signifikansi hubungan. Standardized residuals adalah akar dari statistik Chi-square yang akan dibahas pada section selanjutnya.
Mosaic plot dapat diinterpresaikan sebagai berikut:
Formula: mosaicplot() dengan parameter:
datalas: style of axis label (1/2)shade = T -> colour gradientoff: spacing of cellmain: title of plot# Mosaic plot of observed values
mosaicplot(brand_table,
las = 2,
shade = T,
off = 25,
main = "Mosaic plot for brand personalities")Dari mosaic plot di atas, kita dapat melihat bahwa:
Uji chi-square adalah sebuah tes statistik yang membantu kita menentukan apakah ada hubungan yang signifikan antara dua variabel kategorik.
Uji ini sering digunakan dalam social science research, studi medis, dan bidang lain di mana kita ingin memeriksa hubungan antara variabel.
Sebagai contoh, misalnya kita ingin mengetahui apakah terdapat hubungan yang signifikan antara usia seseorang dengan tingkat merokok. Kita bisa mengumpulkan data dari sekelompok orang dan menggunakan uji chi-square untuk melihat apakah ada perbedaan yang signifikan kelompok usia tertentu dengan tingkat merokoknya.
Uji hipotesis untuk Chi-Square Test adalah sebagai berikut.
Untuk sel tertentu pada contingency table, nilai yang diharapkan dihitung sebagai berikut: \[E_{ij}=\frac{row_i.marginal * column_j.marginal}{grand.total}\]
Statistik Chi square dihitung sebagai berikut: \[χ^2= \sum\frac{(O_{ij} - E_{ij})^2}{E_{ij}}\]
keterangan:
Catatan:
chisq.test().Question
Uji hipotesis Chi-Square Test untuk menguji apakah ada perbedaan yang signifikan kelompok usia tertentu dengan tingkat merokoknya.
#chi_squared test in R
#chisq.test(kolom_kategorikal, kolom_kategorikal)
chisq.test(esoph$agegp, esoph$tobgp)#>
#> Pearson's Chi-squared test
#>
#> data: esoph$agegp and esoph$tobgp
#> X-squared = 2.4, df = 15, p-value = 0.9999
Catatan: Tolak H0 jika pvalue < 0.05
Kesimpulan: p-value = 0.9999 > 0.05, gagak tolak H0 maka tidak ada hubungan antara kelompok usia dan tingkat merokoknya
Question: Bagaimana melakukan chi-square test pada tabel kontingensi
brand_table
chisq.test(brand_table)#>
#> Pearson's Chi-squared test
#>
#> data: brand_table
#> X-squared = 3841.8, df = 392, p-value < 0.00000000000000022
Correspondence Analysis (CA) adalah jenis teknik dimentionality reduction yang dapat digunakan untuk memvisualisasikan dan mengeksplorasi hubungan variabel kategorikal dalam sebuah dataset.
Analisis korespondensi (CA) diperlukan untuk tabel kontingensi besar untuk memvisualisasikan titik baris dan titik kolom secara grafis dalam ruang berdimensi dua dimensi.
Plot hasilnya menampilkan:
Misal kita ingin menganalisis apakah terdapat hubungan antara tipe
pekerjaan rumah dengan role keluarga. CA akan menghasilkan plot berikut
untuk menunjukkan hubungan dari kedua variabel tersebut.
Glossary:
Pada bagian sebelumnya kita sudah melakukan eksplorasi data pada data brand. Sekarang kita akan menerapkan CA untuk menganalisis hubungan variabel brand dan personality pada data brand CA pada data brand akan membantu kita memperoleh plot visualisasi untuk mengidentifikasi personality pada setiap brand.
Untuk melakukan CA, dapat digunakan fungsi CA() dari
package factomineR
CA(X, ncp = 5, graph = TRUE)
Keterangan:
X: data (tabel kontingensi)ncp: jumlah dimensi yang disimpan di hasil akhir.graph: nilai boolean. Jika TRUE grafik
ditampilkan.brand.ca <- CA(brand_table, graph = FALSE)
brand.ca#> **Results of the Correspondence Analysis (CA)**
#> The row variable has 29 categories; the column variable has 15 categories
#> The chi square of independence between the two variables is equal to 3841.76 (p-value = 0 ).
#> *The results are available in the following objects:
#>
#> name description
#> 1 "$eig" "eigenvalues"
#> 2 "$col" "results for the columns"
#> 3 "$col$coord" "coord. for the columns"
#> 4 "$col$cos2" "cos2 for the columns"
#> 5 "$col$contrib" "contributions of the columns"
#> 6 "$row" "results for the rows"
#> 7 "$row$coord" "coord. for the rows"
#> 8 "$row$cos2" "cos2 for the rows"
#> 9 "$row$contrib" "contributions of the rows"
#> 10 "$call" "summary called parameters"
#> 11 "$call$marge.col" "weights of the columns"
#> 12 "$call$marge.row" "weights of the rows"
Dalam menginterpretasikan hasil dari analisis korespondensi, terdapat beberapa output yang dihasilkan yaitu statistik Chi-square, nilai Eigen, komponen baris dan komponen kolom. Selanjutnya, akan dibahas satu per satu terkait output ini.
Untuk menginterpretasikan CA, perlu dilakukan uji chi square untuk memeriksa hubungan antara variabel brand dan variabel atribut personality.
Dengan rumusan hipotesis sebagai berikut.
Catatan: H0 ditolak jika pvalue < 0.05
Kesimpulan: p-value = 0 maka H0 ditolak, artinya ada hubungan antara brand dan personality
Sama seperti di PCA, eigen atau variance juga menunjukkan banyak
informasi yang dipertahankan oleh setiap dimensi. Dimensi 1 menjelaskan
variansi terbanyak, diikuti oleh dimensi 2 dan seterusnya. Pada summary
brand.ca kita dapat memanggil nilai eigen dengan
$eig.
brand.ca$eig#> eigenvalue percentage of variance cumulative percentage of variance
#> dim 1 0.1016068450 35.98514267 35.98514
#> dim 2 0.0762365463 26.99998211 62.98512
#> dim 3 0.0356997982 12.64346247 75.62859
#> dim 4 0.0309644217 10.96637863 86.59497
#> dim 5 0.0114072819 4.04000996 90.63498
#> dim 6 0.0072451320 2.56594041 93.20092
#> dim 7 0.0060861501 2.15547467 95.35639
#> dim 8 0.0036043001 1.27650116 96.63289
#> dim 9 0.0034801183 1.23252085 97.86541
#> dim 10 0.0027901258 0.98815267 98.85357
#> dim 11 0.0014229304 0.50394591 99.35751
#> dim 12 0.0009812083 0.34750532 99.70502
#> dim 13 0.0005686232 0.20138394 99.90640
#> dim 14 0.0002642847 0.09359923 100.00000
Note: pada data brand, menggunakan 2 dimensi CA berhasil merangkum data kita sebesar 62.98512%
Komponen fungsi brand-ca$row berisi:
$coord: koordinat setiap titik baris pada setiap
dimensi (1,2,dst). Digunakan untuk membuat plot.$cos2: kualitas representasi baris.$contrib: kontribusi baris (dalam %) terhadap definisi
dimensi.CA menghasilkan koordinat baru untuk variabel baris pada dimensi
baru, yang dapat dipanggil dengan $coord.
brand.ca$row$coord#> Dim 1 Dim 2 Dim 3 Dim 4
#> AmericanExpress -0.43009425 -0.26274259 -0.14006556 0.135092794
#> Applecomputers -0.10963034 -0.29594656 -0.21293975 -0.204124786
#> Avoncosmetics 0.42438497 -0.24395914 0.23683297 0.004318099
#> CalvinKleinPerfume -0.48332589 -0.33917232 0.45242792 0.010585488
#> Campbell’sSoup 0.67062192 -0.09390081 0.08016308 0.390171002
#> ColgateToothpaste 0.43267403 -0.08456799 -0.11733869 0.145138207
#> DietCoke 0.13845095 0.15600975 0.11953343 -0.249355669
#> GuessJeans -0.41720526 0.09320176 0.33934509 -0.033210574
#> HallmarkCards 0.28831092 -0.39169337 0.18727979 -0.022121380
#> IBMComputers -0.13369114 -0.25361416 -0.44885590 -0.068520237
#> Kmart 0.57560715 0.08070950 0.03867825 0.101839612
#> KodakFilm 0.24587565 0.04802314 -0.09816621 0.023963298
#> LeeJeans 0.03300983 0.65347110 0.15642295 0.105167710
#> Lego 0.45979331 -0.05957126 -0.14167135 -0.140679892
#> Levi’sJeans -0.04609905 0.38717552 0.09220936 0.091533031
#> Lexus -0.40986057 -0.17017633 -0.01589640 0.112549791
#> MattelToys 0.34747860 -0.04306142 0.03569126 -0.423766292
#> McDonald’s 0.32884129 0.04576167 0.05670141 -0.329354152
#> Mercedes -0.32962291 -0.15638998 -0.02759191 0.145498412
#> MichelinTires -0.11120486 0.43676393 -0.22899279 0.236361250
#> NikeAthleticShoes -0.28028576 0.42626900 0.03149350 -0.085704410
#> OilofOlayLotion 0.16419368 -0.35488553 0.20532061 0.312919722
#> PepsiCola 0.12450525 0.21986183 0.21396336 -0.341123738
#> Porsche -0.42659856 -0.06127262 0.05948155 -0.020034025
#> ReebokAthleticShoes -0.18702663 0.42251965 0.02456882 -0.082647000
#> RevlonCosmetics -0.03759488 -0.32382707 0.26871649 0.008619822
#> SonyTelevisions -0.10220444 -0.27676463 -0.25675379 -0.168268932
#> Toyota 0.08827826 0.26648649 -0.15448323 0.088026201
#> Visa -0.13992008 -0.05706729 -0.18574731 0.058274423
#> Dim 5
#> AmericanExpress -0.1143892938
#> Applecomputers 0.0945932165
#> Avoncosmetics 0.0520569517
#> CalvinKleinPerfume 0.0197906060
#> Campbell’sSoup -0.0006043648
#> ColgateToothpaste -0.1105428705
#> DietCoke -0.1900414684
#> GuessJeans -0.0060201842
#> HallmarkCards 0.1568561664
#> IBMComputers 0.0304423575
#> Kmart -0.1438087567
#> KodakFilm -0.0744302335
#> LeeJeans 0.0664311687
#> Lego 0.2254639656
#> Levi’sJeans 0.0214432137
#> Lexus 0.0027901335
#> MattelToys 0.2228290816
#> McDonald’s -0.2519975124
#> Mercedes -0.0170428985
#> MichelinTires 0.1174489130
#> NikeAthleticShoes 0.0432409217
#> OilofOlayLotion 0.0581036972
#> PepsiCola -0.1140364893
#> Porsche 0.0096438616
#> ReebokAthleticShoes 0.0365513704
#> RevlonCosmetics -0.0221898703
#> SonyTelevisions -0.0495074649
#> Toyota 0.0378954455
#> Visa -0.1796737922
Gunakan fungsi fviz_ca_row() [in factoextra] untuk
memvisualisasikan hanya titik baris:
fviz_ca_row(brand.ca, repel = TRUE)Kita dapat mengidentifikasi kesamaan atau ketidaksamaan dalam kategori baris dengan memperhatikan jarak antar titik koordinat baris.
Sehingga, berdasarkan plot titik koordinat baris insight yang didapatkan adalah:
CA dapat merangkum data dan memvisualisasikannya dalam plot dua dimensi. Perhatikan bahwa dua dimensi baru (dimensi 1 & 2) dapat mempertahankan 62.89% dari variasi yang terkandung dalam data. Namun, tidak semua titik data ditampilkan dengan sama baiknya dalam dua dimensi. Kualitas representasi baris pada peta faktor disebut cosinus kuadrat (cos2). \[cos2 = \frac{row.coord^2}{d^2}\] dengan row.coord adalah koordinat baris pada sumbu \(d^2\) adalah jarak kuadrat dari rata-rata profil baris.
head(brand.ca$row$cos2)#> Dim 1 Dim 2 Dim 3 Dim 4
#> AmericanExpress 0.47865009 0.17862894 0.050763739 0.0472231809
#> Applecomputers 0.05094028 0.37121579 0.192182277 0.1766002553
#> Avoncosmetics 0.53539088 0.17692336 0.166738278 0.0000554289
#> CalvinKleinPerfume 0.41313819 0.20344923 0.362004553 0.0001981696
#> Campbell’sSoup 0.66951479 0.01312633 0.009566509 0.2266285701
#> ColgateToothpaste 0.70784155 0.02704123 0.052059124 0.0796485554
#> Dim 5
#> AmericanExpress 0.0338580256331
#> Applecomputers 0.0379244968931
#> Avoncosmetics 0.0080557958669
#> CalvinKleinPerfume 0.0006926812326
#> Campbell’sSoup 0.0000005437547
#> ColgateToothpaste 0.0462036061552
Catatan: * Nilai cos2 adalah 0 sampai 1 * Jika kategori baris terwakili dengan baik oleh dua dimensi, jumlah dari cos2 mendekati 1
Berikut divisualisasikan nilai cos2 untuk masing-masing brand. Semakin oranye warna suatu brand, semakin bagus kualitas representasi suatu brand tersebut pada plot CA.
# Color by cos2 values: quality on the factor map
fviz_ca_row(brand.ca, col.row = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE,
title="Row Poins based on Their Quality Cos2")Note: semakin dekat suatu titik koordinat dengan pusat kuadran, biasanya semakin sedikit informasi yang diperoleh. Sehingga umumnya titik koordinat yang jauh dari kuadran yang memiliki banyak insight
Variabel baris dengan nilai yang lebih besar, berkontribusi paling besar terhadap definisi dimensi. Baris yang paling berkontribusi pada Dim.1 dan Dim.2 adalah yang paling penting dalam menjelaskan variabilitas dalam kumpulan data.
head(brand.ca$row$contrib)#> Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
#> AmericanExpress 4.9909437 2.4824248 1.5065215 1.615770807 3.1446111483
#> Applecomputers 0.4146927 4.0276460 4.4528252 4.717549052 2.7499558788
#> Avoncosmetics 3.5304969 1.5549262 3.1293734 0.001199392 0.4731666399
#> CalvinKleinPerfume 7.4518700 4.8908655 18.5840840 0.011729161 0.1112869233
#> Campbell’sSoup 13.9884797 0.3655220 0.5688805 15.537637760 0.0001011939
#> ColgateToothpaste 7.0957696 0.3612848 1.4853114 2.620000369 4.1255335476
Besar kontribusi variabel baris pada dimensi 1 dan 2 dapat dilihat dengan visualisasi berikut:
# Contributions of rows to dimension 1
fviz_contrib(brand.ca, choice = "row", axes = 1)# Contributions of rows to dimension 2
fviz_contrib(brand.ca, choice = "row", axes = 2)Insight:
Interpretasi untuk komponen kolom sama persis dengan komponen baris.
Komponen fungsi brand-ca$col berisi:
$coord: koordinat setiap titik kolom pada setiap
dimensi (1,2,dst). Digunakan untuk membuat plot.$cos2: kualitas representasi kolom.$contrib: kontribusi kolom (dalam %) terhadap definisi
dimensi.# Koordinat kolom
head(brand.ca$col$coord)#> Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
#> charming -0.11737879 -0.418163663 0.40396413 0.15319744 0.08982199
#> cheerful 0.41831869 -0.008226802 0.22189043 -0.32437698 -0.04503380
#> daring -0.43244316 0.155536449 0.23846887 -0.04804722 -0.03034045
#> down_to_earth 0.59226080 0.162709583 0.07327456 0.15314815 -0.05017338
#> honest 0.35335280 -0.099681167 -0.07699910 0.12707796 0.07533147
#> imaginative 0.04052672 -0.156084506 -0.04996894 -0.36735381 0.22016171
# Kualitas representasi tiap kategori kolom pada plot 2 dimensi
head(brand.ca$col$cos2)#> Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
#> charming 0.033127834 0.4204422544 0.39237325 0.05643088 0.019398990
#> cheerful 0.493577624 0.0001908987 0.13887308 0.29678433 0.005720292
#> daring 0.572866461 0.0741070791 0.17420424 0.00707183 0.002819937
#> down_to_earth 0.784165294 0.0591844903 0.01200295 0.05243305 0.005627667
#> honest 0.666850851 0.0530686284 0.03166525 0.08624862 0.030308505
#> imaginative 0.007462045 0.1106864590 0.01134423 0.61311790 0.220220875
# Kontribusi tiap kategori kolom ke dimensi CA
head(brand.ca$col$contrib)#> Dim 1 Dim 2 Dim 3 Dim 4 Dim 5
#> charming 0.7145703 12.08698709 24.0884326 3.9941901 3.7271069
#> cheerful 11.5566478 0.00595716 9.2544727 22.8022329 1.1929861
#> daring 9.5095497 1.63955506 8.2304292 0.3852107 0.4169527
#> down_to_earth 19.5118693 1.96272261 0.8500345 4.2811101 1.2472700
#> honest 7.6316834 0.80944856 1.0314109 3.2389465 3.0895622
#> imaginative 0.1090617 2.15609846 0.4718964 29.4048067 28.6690710
Seperti titik baris, titik kolom juga dapat diwarnai berdasarkan kualitas representasinya pada plot CA yang ditunjukkan nilai cos2:
fviz_ca_col(brand.ca, col.col = "cos2",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE)Sementara itu, untuk memvisualisasikan kontribusi kolom ke dua dimensi pertama:
# Contributions of columns to dimension 1
fviz_contrib(brand.ca, choice = "col", axes = 1)# Contributions of columns to dimension 2
fviz_contrib(brand.ca, choice = "col", axes = 2)Insight:
Plot standar analisis korespondensi adalah biplot simetris di mana baris (titik biru) dan kolom (segitiga merah) direpresentasikan dalam ruang yang sama menggunakan koordinat baru.
Biplot pada CA artinya gabungan dua plot, yaitu plot untuk
variabel baris dan plot untuk variabel kolom.
Koordinat pada biplot CA mewakili profil baris dan kolom. Biplot CA di R
dapat diperoleh menggunakan fungsi
fviz_ca_biplot(ca objek, repel = TRUE)
fviz_ca_biplot(brand.ca, repel = TRUE)Berikut adalah beberapa poin yang perlu diperhatikan dalam menginterpretasi biplot CA:
CA() sudah secara otomatis melakukan scaling.arrow untuk menampilkan panah baris dan kolom pada
biplot.fviz_ca_biplot(brand.ca, repel = TRUE, arrows = c(TRUE, TRUE))Cara interpretasi hubungan dari kategori baris dan kategori kolom:
Dengan demikian, berdasarkan profil baris (personality), berikut adalah pemetaan untuk data brand personality:
Correspondence Analysis memberikan hasil visualisasi yang mudah diinterpretasi sehingga kita dengan mudah menemukan asosiasi dari dua kategori variabel. CA dapat membantu kita mendefinisikan personality (variabel kolom) dari suatu brand (variabel baris). Sebelumnya, telah dibahas juga detail komponen analisis korespondensi dan intuisi matematikanya. Berdasarkan analisis yang telah dilakukan, diperoleh terdapat beberapa pemetaan personality untuk brand-brand yang ada. Jika dibandingkan dengan ballon plot dan mosaicplot, ada beberapa hasil pemetaan yang sama. Namun, CA memberikan hasil pemetaan yang lebih kuat dengan memvisualisasikan hubungan kedua variabel pada biplot.
Setelah mengetahui pemetaan personality untuk masing-masing brand, perusahaan dapat memaksimalkan marketingnya dengan memperkuat personality yang telah melekat serta merumuskan strategi brand positioning.
Correspondence Analysis Workflow