Perceptual map is quick and effective chart used by asset marketers to depict and understand how customers or potential customers view and feel about a given product or brand. It can also be used to identify. Lets use cars data to demonstrate how we can use perceptual maps.
#libraries
library(ggplot2)
#Load data
data("mtcars")
data = mtcars[1:15,]
If only, each brand had two attributes, it would have been very easy to visualize. One attribute can be on x-axis and other on the y like in the example below.
# Scatter plot comparing Fuel Econom and Power
ggplot(data = data, aes(x= mpg, y = hp)) +
geom_point(size = 4, color = "blue") +
annotate(geom = "text", x = data$mpg, y = data$hp, label = row.names(data), vjust = 1)+
ggtitle("Comparing Power and Economy of cars") +
xlab("Miles per Gallon") + ylab("Horse Power")
We can vary the width of the bubble to represent one more attribute. However, we will need special technique to represent more than three attributes of a brand in two dimensions.
# we can add additional variable by changing size of bubbles
ggplot(data = data, aes(x= mpg, y = hp)) +
geom_point(aes(size = disp) , color = "blue") +
annotate(geom = "text", x = data$mpg, y = data$hp, label = row.names(data), vjust = 2)+
ggtitle("Comparing Power and Fuel Economy of cars, size of bubble represents displacement") +
xlab("Miles per Gallon") + ylab("Horse Power")
Special techniques like Multidimensional scaling is required to visualize more than 3 attributes. Multidimensional scaling (MDS) is a means of visualizing the level of similarity of individual cases of a data set. It refers to a set of related ordination techniques used in information visualization, in particular to display the information contained in a distance matrix. Example below will make it clear.
# euclidean distances between the rows
d = dist(data)
# k is the number of dim
fit = cmdscale(d,eig=TRUE, k=2)
# view results
fit
## $points
## [,1] [,2]
## Mazda RX4 -82.331713 -4.327423
## Mazda RX4 Wag -82.334565 -4.308484
## Datsun 710 -136.818880 -9.837229
## Hornet 4 Drive 7.068089 35.894579
## Hornet Sportabout 126.768011 18.101987
## Valiant -24.993089 26.892434
## Duster 360 155.437116 -45.902129
## Merc 240D -114.182201 34.292862
## Merc 230 -106.093827 1.856720
## Merc 280 -70.056823 -13.054241
## Merc 280C -70.020703 -13.080043
## Merc 450SE 52.035528 -20.927213
## Merc 450SL 52.006367 -20.893154
## Merc 450SLC 52.064447 -20.947698
## Cadillac Fleetwood 241.452242 36.239031
##
## $eig
## [1] 1.737089e+05 8.727866e+03 4.377450e+01 3.159351e+01 9.776100e+00
## [6] 4.692479e+00 1.411145e+00 5.331502e-01 2.864443e-01 9.528196e-02
## [11] 6.761627e-03 6.699415e-12 4.743064e-12 2.083373e-12 -4.035670e-12
##
## $x
## NULL
##
## $ac
## [1] 0
##
## $GOF
## [1] 0.999495 0.999495
#save results in new dataset
new_data = data.frame(fit$points)
colnames(new_data) = c("Coordinate1", "Coordinate2")
# plot solution
ggplot(data = new_data, aes(x= Coordinate1, y = Coordinate2)) +
geom_point(size = 4, color = "blue") +
annotate(geom = "text", x = new_data$Coordinate1, y = new_data$Coordinate2, label = row.names(new_data), vjust = 2)+
ggtitle("Metric MDS")