# script name: plumber_survey.R
# set API title and description to show up in http://localhost:8001/__swagger__/
#' @apiTitle Run predictions for Customer Satisfaction with Decision Tree
#' @apiDescription This API takes takes inputs and returns a prediction on whether a customer will be satisfied or not.
library(plumber)
#Load the current RDA files
load(file = "C:/Data_Science/SurveyPrediction/data/survey_model_pruned.rda")
load(file = "C:/Data_Science/SurveyPrediction/data/survey_model.rda")
MODEL_VERSION <- "0.0.1"
VARIABLES <- list(
survey.Ticket.Country = "Ticket Country",
survey.Ticket.Assigned.Group = "survey Ticket Assigned Group",
survey.Product.Name = "Product Name",
survey.Category.Tier1 = "Category Tier1",
survey.Category.Tier3 = "Category.Tier3",
survey.Satisfaction.Rating = "Successful submission will result in a calculated customer satisfaction Probability of either SATISFIED or DISSATIAFIED"
)
#' @get /Healthcheck
health_check <- function() {
result <- data.frame(
"input" = "",
"status" = 200,
"model_version" = MODEL_VERSION
)
return(result)
}
# A Simple Landing Page
#' @get /Homepage
#' @html
home <- function() {
title <- "Survey Prediction API"
body_intro <- "Welcome to the Survey Prediction API!"
body_model <- paste("We are currently serving model version:", MODEL_VERSION)
body_msg <- paste("To receive a prediction on Customer Satisfaction,",
"submit the following variables to the <b>/survival</b> endpoint:",
sep = "\n")
body_reqs <- paste(VARIABLES, collapse = "<br>")
result <- paste(
"<html>",
"<h1>", title, "</h1>", "<br>",
"<body>",
"<p>", body_intro, "</p>",
"<p>", body_model, "</p>",
"<p>", body_msg, "</p>",
"<p>", body_reqs, "</p>",
"</body>",
"</html>",
collapse = "\n"
)
return(result)
}
validate_input <- function(survey.Ticket.Country, survey.Ticket.Assigned.Group, survey.Product.Name,survey.Category.Tier1,survey.Category.Tier3) {
survey.Ticket.Country.VALID <- (survey.Ticket.Country %in% c(
"United States",
"Czech Republic",
"India",
"Germany",
"France",
"Spain",
"Mexico",
"Singapore",
"China",
"Japan",
"Russian Federation",
"Italy",
"Australia",
"Denmark",
"Brazil",
"Canada",
"Morocco",
"Belgium",
"Indonesia",
"Latvia",
"Turkey",
"Saudi Arabia",
"Laos",
"Viet Nam",
"Sweden",
"New Zealand",
"Hungary",
"Thailand",
"Philippines",
"Austria",
"United Kingdom",
"Pakistan",
"Chile",
"Taiwan, Province Of China",
"Korea, Republic Of",
"Slovakia",
"Serbia",
"Poland",
"Colombia",
"Oman"))
survey.Ticket.Assigned.Group.VALID <- (survey.Ticket.Assigned.Group %in% c(
"ANALYTICS_WW_L2",
"SYMPHONY_WW_L2",
"MASTERDATA_WW_L3",
"FJTU_SERVICE_DESK_RD_L2",
"PHENIX_WW_L3",
"PIM_SUPPORT_WW_L1",
"SYMPHONY_ADMIN_WW_L1",
"MCAD_WW_L2",
"USER_ADMIN_CHINA_CC_L1",
"SPOT_WW_L2",
"CADENCE_WW_L2",
"DOCEMEDIA_ADMIN_FR_L2",
"CREO_VIEW_WW_L3",
"CASE_WW_L2",
"SCAN_WW_L2",
"SYMPHONY_WW_L3",
"TEMPO_WW_L3",
"USER_ADMIN_IN_CC_L1",
"CADENCE_WW_L3",
"USER_ADMIN_EMEA_CC_L1",
"EFILE_WW_L2",
"USER_ADMIN_MX_CC_L1",
"AUTOCAD_WW_L2",
"ETO_TMA_WW_L2",
"TEMPO_WW_L2",
"MOTIF_WW_L2",
"GEOMAGIC_WW_L2",
"GENESIS_WW_L2",
"VALOR_WW_L3" ))
survey.Product.Name.VALID <- (survey.Product.Name %in% c("Flux 3D",
"Symphony",
"Inventor",
"Tempo",
"Phenix",
"Other",
"Genesis",
"PDM",
"ProEngineer",
"Autocad",
"Autocad - 2016",
"SPoT",
"PTC Creo Parametric",
"eFile",
"Network Drive",
"DocEmedia",
"PTC CreoView",
"Viewer",
"Git Repo CLI client",
"Autocad - Mechanical",
"TeamForge",
"Cadence",
"Squoring",
"TeamForge Full",
"TeamForge Contributor",
"ODM Sys Admin",
"Autocad - Electrical",
"Phoenix Cubes",
"Microsoft Visual Studio Professional",
"Coda",
"Tango",
"Windchill",
"Autocad - ETO",
"Allegro PCB Designer",
"ANSYS",
"Software Tools",
"Galaxy",
"Flux 2D",
"TeamForge Editor",
"Microsoft Visual Studio Test Pro",
"Autocad Applications",
"Microsoft Visual Studio Enterprise",
"Other Software",
"Autodesk - Revit",
"Revit MEP",
"Opus",
"PSPICE Capture CIS",
"MOTIF-Arbortext",
"Geomagic",
"ETO",
"On/Offboarding",
"Outlook" ))
survey.Category.Tier1.VALID <- (survey.Category.Tier1 %in% c("Request",
"Troubleshoot",
"Reset"))
survey.Category.Tier3.VALID <- (survey.Category.Tier3 %in% c("License",
"Application Functionality",
"Administration",
"Installation",
"n/a",
"Role Management",
"Functionality",
"Issue",
"Other",
"ODM Plus",
"Activate",
"Account",
"Detailing/Drawing",
"Access",
"Product View",
"PIM Launcher",
"Exports",
"Group Rename",
"Password",
"Document Management",
"Dwg True View",
"Consolidated UIS",
"Eng Dwg Viewer",
"Folder Management",
"Login",
"Production Issue",
"Intralink/MDM",
"Deactivate",
"Autocad Electrical",
"Loading Data",
"Other Tools",
"Order Viewer",
"Project",
"3D Modeling and Assembly",
"Interfaces (Coda, ProE, ERP, Other)",
"Group Creation",
"OE Tools",
"Editing",
"ProE Crash/Trial Files/Fatal Errors",
"Viewing and Printing"
))
test_results <- c(survey.Ticket.Country.VALID, survey.Ticket.Assigned.Group.VALID, survey.Product.Name.VALID,survey.Category.Tier1.VALID,survey.Category.Tier3.VALID)
if(!all(test_results)) {
failed <- which(!test_results)
return(test_results[failed])
} else {
return("OK")
}
}
transform_input <- function(survey.Ticket.Country, survey.Ticket.Assigned.Group, survey.Product.Name,survey.Category.Tier1,survey.Category.Tier3) {
survey.Ticket.Country <- as.factor(tolower(survey.Ticket.Country))
survey.Ticket.Assigned.Group <- as.factor(c(survey.Ticket.Assigned.Group))
survey.Product.Name <- as.factor(tolower(survey.Product.Name))
survey.Category.Tier1 <- as.factor(tolower(survey.Category.Tier1))
survey.Category.Tier3 <- as.factor(tolower(survey.Category.Tier3))
}
source(file = "C:/Data_Science/SurveyPrediction/R/survey.R")
#' @get /Generate_Survey_Model
#' @html
create_model <- function() {
filenames <- "C:/Data_Science/SurveyPrediction/IPO_R&D_Raw.xlsx"
survey(filenames)
return("The model has been generated.")
}
#' @get /Survey_Prediction
#' @html
#' @param Category.Tier3 Examples: License, Application Functionality, Administration, Installation etc
#' @param Category.Tier1 Examples: Request, Troubleshoot, Reset etc
#' @param Ticket.Assigned.Group Examples: ANALYTICS_WW_L2,SYMPHONY_WW_L2,MASTERDATA_WW_L3,FJTU_SERVICE_DESK_RD_L2,PHENIX_WW_L3 etc
#' @param Ticket.Country Examples: Spain, Mexico, Singapore, China, Japan etc
#' @param Product.Name Examples: PTC CreoView, Viewer, Git Repo CLI client, Autocad - Mechanical, TeamForge, Cadence, Squoring etc
predict_survey <- function(Ticket.Country, Ticket.Assigned.Group, Product.Name, Category.Tier1, Category.Tier3)
{
survey.Ticket.Country = Ticket.Country
survey.Ticket.Assigned.Group = Ticket.Assigned.Group
survey.Product.Name = Product.Name
survey.Category.Tier1 = Category.Tier1
survey.Category.Tier3 = Category.Tier3
valid_input <- validate_input(survey.Ticket.Country, survey.Ticket.Assigned.Group, survey.Product.Name,survey.Category.Tier1,survey.Category.Tier3)
if (valid_input == "OK") {
transform_input(survey.Ticket.Country, survey.Ticket.Assigned.Group, survey.Product.Name,survey.Category.Tier1,survey.Category.Tier3)
newdata <- data.frame(survey.Ticket.Country, survey.Ticket.Assigned.Group, survey.Product.Name,survey.Category.Tier1,survey.Category.Tier3)
#incident_model is included with the package
newdata$survey.Satisfaction.Rating <- as.vector(predict(survey_model_pruned, newdata = newdata, type="class"))
newdata$survey.Satisfaction.Probability <- predict(survey_model_pruned, newdata = newdata, type="prob")
#pruned models are having some issues - the numbers don't change for any combination of input- need to check
newdata$survey.Satisfaction.Rating <- as.vector(predict(survey_model, newdata = newdata, type="class"))
newdata$survey.Satisfaction.Probability <- predict(survey_model, newdata = newdata, type="prob")
#Write the result output to a csv file
write.csv(newdata,file="C:/Data_Science/SurveyPrediction/output.csv", row.names = FALSE)
Satisfaction.Rating <- paste("Satisfaction Rating",newdata$survey.Satisfaction.Rating,sep=": ")
sat_prob <- gsub("[[:space:]]", "", paste(round(newdata$survey.Satisfaction.Probability[2] *100),"%"))
dissat_prob <- gsub("[[:space:]]", "", paste(round(newdata$survey.Satisfaction.Probability[1] *100),"%"))
Satisfaction.Probability <- paste("Satisfaction Probability",sat_prob,sep=": ")
Dissatisfaction.Probability <- paste("Dissatisfaction Probability",dissat_prob,sep=": ")
result <- paste(Satisfaction.Probability,Dissatisfaction.Probability,Satisfaction.Rating,survey_model,sep= "\n")
#result <- newdata$survey.Satisfaction.Probability[2]
}
else {
result <- list(
input = list(survey.Ticket.Country, survey.Ticket.Assigned.Group, survey.Product.Name,survey.Category.Tier1,survey.Category.Tier3),
response = list(input_error = valid_input),
status = 400,
model_version = MODEL_VERSION)
}
return(result)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.