An R script to calculate the Kano Model


The procedure I described in is a bit intricate so I wrote a script to make the calculation with R, starting from the survey outcome file. Here it is. In order to give you an idea on how to implement it yourself,  it starts with reading an excel file with the survey outcome, then it classifies every intersection of Functional/Dysfunctional answer into the Kano categories.

# like=1, expect=2, neutral=3, live with = 4, dislike 5
# Assigning each functional/dysfunctional combination to a category
feature_A<-feature_A %>% 
  mutate(category = case_when(
    Functional =="1" & Dysfunctional == "1" ~ "Questionable",
    Functional =="1" &  Dysfunctional >"1" &  Dysfunctional <"5" ~ "Delighters", Functional =="1" & Dysfunctional =="5" ~ "Desired", Functional >"1" & Functional <"5" & Dysfunctional == "1" ~ "Reverse", Functional >"1" & Functional <"5" & Dysfunctional >"1" &  Dysfunctional <"5" ~ "Indifferent", Functional >"1" & Functional <"5" & Dysfunctional =="5" ~ "Required",
    Functional =="5" & Dysfunctional <"5" ~ "Reverse",
    Functional =="5" & Dysfunctional =="5" ~ "Questionable"

The script goes on counting each Functional/Dysfunctional intersection, classifies them into categories and then groups by categories, summing up again.  Then, it plots out the output matrix, with a heatmap style. Here’s the plotting code with  ggplot:

final_prod_cat %>% 
ggplot( aes( Dysfunctional, Functional))+
  geom_tile(aes(fill=total_count), colour="black") +
  scale_fill_gradient(low="white", high="steelblue") +
  ggtitle("Kano Analysis - Product categories")+
  facet_grid(rows = vars(cat2))

And here’s the output of the process:

Note that we are using the second approach here, so all cells with the same category are summed up, i.e the Required category is the result of 623+38+2=663

So, based on the Analysis, product feature A-GPS Navigator, is a Required Must-Have product and should be implemented first. Customers are not interested in the B-freeride on birthday feature and we should cancel it from the product backlog, while the C-Trivia Contest (with the free ride) received inconsistent answers and we should double check the way it was presented on the survey.