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