aephiday's picture
Update app.R
e17d161 verified
raw
history blame
64.4 kB
library(shiny)
library(shinyWidgets)
library(echarts4r)
library(bslib)
library(tidyverse)
library(leaflet)
library(readxl)
library(vetiver)
library(janitor)
telco_customer <- readr::read_csv("data/telco_customer_churn_dashboard.csv")
locations <- readxl::read_xlsx("data/telco_customer_churn_location.xlsx") %>%
clean_names() %>%
select(customer_id, city, latitude, longitude)
ui <- fluidPage(
tags$head(
tags$style("
body {
background-color: #8ec2ed;
}")
),
title = "Customer Churn Prevention Dashboard",
tabsetPanel(
tabPanel(h5("Dashboard", style="font-weight:bold;margin-top:5px;margin-bottom:5px;"),
h1("Customer Churn Prevention Dashboard", style="font-weight:bold;text-align:center;color:#000;"),
fluidRow(
column(12,
column(2,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:0.5em;border-width:medium;box-shadow: 2px 2px #888888;",
h5("Customer", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
h2(scales::number(nrow(telco_customer), big.mark = ","), style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
),
column(2,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:0.5em;border-width:medium;box-shadow: 2px 2px #888888;",
h5("Potential Churn Customer", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
h2(paste0(scales::number(sum(telco_customer$churn_label == "Yes"), accuracy = 1, big.mark = ","), " (", scales::percent(sum(telco_customer$churn_label == "Yes")/nrow(telco_customer), accuracy = 0.01), ")"), style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
),
column(2,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:0.5em;border-width:medium;box-shadow: 2px 2px #888888;",
h5("Avg Monthly Charges", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
h2(scales::number(mean(telco_customer$monthly_charge), accuracy = 0.01, big.mark = ",", prefix = "$"), style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
),
column(2,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:0.5em;border-width:medium;box-shadow: 2px 2px #888888;",
h5("Total Charges", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
h2(scales::number(sum(telco_customer$total_charges), big.mark = ",", prefix = "$"), style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
),
column(2,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:0.5em;border-width:medium;box-shadow: 2px 2px #888888;",
h5("Avg Monthly Long Dist. Chrg", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
h2(scales::number(mean(telco_customer$avg_monthly_long_distance_charges), accuracy = 0.01, big.mark = ",", prefix = "$"), style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
),
column(2,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:0.5em;border-width:medium;box-shadow: 2px 2px #888888;",
h5("Avg CLTV", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
h2(scales::number(mean(telco_customer$cltv), accuracy = 0.01, big.mark = ","), style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
)
)
),
fluidRow(
column(4,
h3("Customer Demographics", style="font-weight:bold;text-align:center;color:#fff;"),
column(6,
wellPanel(style="background-color:transparent;text-align:center;margin:0 0 0.5em 0;padding:1em;height:200px;border-width:medium;box-shadow: 2px 2px #888888;",
# h5("% by Gender", style="margin:0;padding:0;"),
# hr(style="margin:0.5em;padding:0;"),
telco_customer |>
count(gender) |>
mutate(pct = round(n/sum(n)*100, 2)) |>
e_charts(gender) |>
e_pie(pct,
startAngle = 90) |>
e_title("% by Gender") |>
e_legend(show = TRUE, type = "plain", orient = "vertical", left = "right") |>
e_dims(height = 200) |>
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + params.value + '%')
}")
)
)
),
column(6,
div(style="display:flex;",
wellPanel(style="background-color:transparent;text-align:center;margin:0 0.5em 0.5em 0;padding:1em;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
h5("Sr. Citizen", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
h3(telco_customer %>%
mutate(senior_citizen = age > 65) %>%
pull(senior_citizen) %>%
mean() %>%
scales::percent(accuracy = 0.01), style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
),
wellPanel(style="background-color:transparent;text-align:center;margin:0 0 0.5em 0.5em;padding:1em;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
h5("Married", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
h3(telco_customer %>%
mutate(married = married == "Yes") %>%
pull(married) %>%
mean() %>%
scales::percent(accuracy = 0.01), style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
),
div(style="display:flex;",
wellPanel(style="background-color:transparent;text-align:center;margin:0.5em 0.5em 0 0;padding:1em;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
h5("Dependents", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
h3(telco_customer %>%
mutate(dependents = number_of_dependents > 0) %>%
pull(dependents) %>%
mean() %>%
scales::percent(accuracy = 0.01), style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
),
wellPanel(style="background-color:transparent;text-align:center;margin:0.5em 0 0 0.5em;padding:1em;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
h5("Ref Friend", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
h3(telco_customer %>%
mutate(referred_a_friend = referred_a_friend == "Yes") %>%
pull(referred_a_friend) %>%
mean() %>%
scales::percent(accuracy = 0.01), style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
)
),
column(12,
wellPanel(style="background-color:transparent;text-align:center;margin:0.5em 0 0 0;padding:0;border-width:medium;box-shadow: 2px 2px #888888;",
uiOutput("map")
)
)
),
column(4,
h3("Customer Account Information", style="font-weight:bold;text-align:center;color:#fff;"),
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:1em;height:200px;border-width:medium;box-shadow: 2px 2px #888888;",
# telco_customer |>
# count(payment_method) |>
# mutate(pct = round(n/sum(n)*100, 2)) |>
# e_charts(payment_method) |>
# e_pie(pct,
# startAngle = 120) |>
# e_title("Payment Method") |>
# e_legend(show = TRUE, type = "plain", orient = "vertical", left = "right") |>
# e_dims(height = 200) |>
# e_tooltip(
# formatter = htmlwidgets::JS("function(params){
# return(params.name + ': ' + params.value + '%')
# }")
# )
telco_customer |>
count(payment_method) |>
# top_n(3, n) %>%
mutate(pct = round(n/sum(n), 4)) |>
arrange(pct) %>%
e_charts(payment_method, reorder = TRUE) |>
e_bar(pct, legend = FALSE) |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_title("Payment Method") |>
e_dims(width = 600, height = 200) |>
e_grid(left = "20%", top = "12.5%", bottom = "25%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
),
div(style="display: flex;",
wellPanel(style="background-color:transparent;text-align:center;margin:1em 0.5em 0.5em 0;padding:1em;height:190px;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
telco_customer %>%
count(paperless_billing) |>
mutate(pct = round(n/sum(n)*100, 2)) |>
e_charts(paperless_billing) %>%
e_pie(pct) |>
e_title("Paperless Billing") |>
e_legend(show = TRUE, type = "plain", orient = "vertical", left = "right") |>
e_dims(height = 190) |>
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + params.value + '%')
}")
)
),
wellPanel(style="background-color:transparent;text-align:center;margin:1em 0 0.5em 0.5em;padding:1em;height:190px;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
telco_customer |>
count(offer) |>
mutate(offer = str_remove(offer, "Offer "),
pct = round(n/sum(n), 4)) |>
arrange(n) %>%
e_charts(offer) |>
e_bar(pct, legend = FALSE) |>
e_title("Offer") |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_dims(height = 200) |>
e_grid(left = "15%", top = "12.5%", bottom = "25%", right = "10%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
)
),
div(style="display: flex;",
wellPanel(style="background-color:transparent;text-align:center;margin:0.5em 0.5em 0 0;padding:1em;height:200px;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
telco_customer %>%
mutate(tenure_grp = case_when(tenure_in_months < 12 ~ " < 1 year",
tenure_in_months < 24 ~ " < 2 year",
tenure_in_months < 36 ~ " < 3 year",
tenure_in_months < 48 ~ " < 4 year",
TRUE ~ "4+ year")) %>%
count(tenure_grp) %>%
mutate(pct = round(n/sum(n), 4)) |>
arrange(n) %>%
e_charts(tenure_grp) |>
e_bar(pct, legend = FALSE) |>
e_title("Tenure") |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_dims(height = 200) |>
e_grid(left = "25%", top = "12.5%", bottom = "25%", right = "10%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
),
wellPanel(style="background-color:transparent;text-align:center;margin:0.5em 0 0 0.5em;padding:1em;height:200px;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
telco_customer %>%
count(contract) %>%
mutate(pct = round(n/sum(n), 4)) |>
arrange(n) %>%
e_charts(contract) |>
e_bar(pct, legend = FALSE) |>
e_title("Contract Type") |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_dims(height = 200) |>
e_grid(left = "45%", top = "12.5%", bottom = "25%", right = "10%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
)
)
),
column(4,
h3("Services Signed", style="font-weight:bold;text-align:center;color:#fff;"),
column(12,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:1em;height:285px;border-width:medium;box-shadow: 2px 2px #888888;",
telco_customer |>
count(internet_type) |>
mutate(pct = round(n/sum(n), 4)) |>
arrange(n) %>%
e_charts(internet_type) |>
e_bar(pct, legend = FALSE) |>
e_title("Internet Service Type") |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_dims(width = 600, height = 285) |>
e_grid(left = "15%", top = "12.5%", bottom = "20%", right = "15%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
),
div(style="display:flex;",
wellPanel(style="background-color:transparent;text-align:center;margin:1em 0.5em 1em 0;padding:1em;height:320px;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
# br(),
progressBar(id = "pb1", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pb2", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pb3", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pb4", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pb5", value = 0, display_pct = TRUE, striped = TRUE)
),
wellPanel(style="background-color:transparent;text-align:center;margin:1em 0 1em 0.5em;padding:1em;height:320px;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
# br(),
progressBar(id = "pb6", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pb7", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pb8", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pb9", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pb10", value = 0, display_pct = TRUE, striped = TRUE)
)
)
)
)
)
),
tabPanel(
h5("Customer Churn Prediction", style="font-weight:bold;margin-top:5px;margin-bottom:5px;"),
fluidRow(
column(12,
# h1("Customer Churn Prediction", style="font-weight:bold;text-align:center;color:#000;margin-bottom:0;"),
div(style="display:flex;flex-wrap:nowrap;margin-left:1.5rem;margin-bottom:-30px !important;margin-top:1.5em;",
fileInput("file_data", "Upload File", width = "20%",),
div(style="height:30px;margin-top:1.75em;margin-bottom:0;",
actionButton("process", "Process", icon = icon("cogs"))
),
div(style="margin-left:0.5em;",
selectInput("customer", "Select Customer", choices = c("---All Customers---"))
)
)
)
),
fluidRow(
column(12,
column(2,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:0.5em;border-width:medium;box-shadow: 2px 2px #888888;",
uiOutput("pred_total_cust")
)
),
column(2,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:0.5em;border-width:medium;box-shadow: 2px 2px #888888;",
uiOutput("pred_potential_churn")
)
),
column(2,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:0.5em;border-width:medium;box-shadow: 2px 2px #888888;",
uiOutput("pred_monthly_charge")
)
),
column(2,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:0.5em;border-width:medium;box-shadow: 2px 2px #888888;",
uiOutput("pred_total_charge")
)
),
column(2,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:0.5em;border-width:medium;box-shadow: 2px 2px #888888;",
uiOutput("pred_avg_long_dist")
)
),
column(2,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:0.5em;border-width:medium;box-shadow: 2px 2px #888888;",
uiOutput("pred_avg_cltv")
)
)
)
),
fluidRow(
column(4,
h3("Customer Demographics", style="font-weight:bold;text-align:center;color:#fff;"),
column(6,
wellPanel(style="background-color:transparent;text-align:center;margin:0 0 0.5em 0;padding:1em;height:200px;border-width:medium;box-shadow: 2px 2px #888888;",
echarts4rOutput("pred_pie_gender")
)
),
column(6,
div(style="display:flex;",
wellPanel(style="background-color:transparent;text-align:center;margin:0 0.5em 0.5em 0;padding:1em;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
uiOutput("pred_sr_citizen")
),
wellPanel(style="background-color:transparent;text-align:center;margin:0 0 0.5em 0.5em;padding:1em;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
uiOutput("pred_married")
)
),
div(style="display:flex;",
wellPanel(style="background-color:transparent;text-align:center;margin:0.5em 0.5em 0 0;padding:1em;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
uiOutput("pred_dependents")
),
wellPanel(style="background-color:transparent;text-align:center;margin:0.5em 0 0 0.5em;padding:1em;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
uiOutput("pred_referred")
)
)
),
column(12,
wellPanel(style="background-color:transparent;text-align:center;margin:0.5em 0 0 0;padding:0;border-width:medium;box-shadow: 2px 2px #888888;",
uiOutput("pred_map")
)
)
),
column(4,
h3("Customer Account Information", style="font-weight:bold;text-align:center;color:#fff;"),
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:1em;height:200px;border-width:medium;box-shadow: 2px 2px #888888;",
echarts4rOutput("pred_payment")
),
div(style="display: flex;",
wellPanel(style="background-color:transparent;text-align:center;margin:1em 0.5em 0.5em 0;padding:1em;height:190px;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
echarts4rOutput("pred_paperless")
),
wellPanel(style="background-color:transparent;text-align:center;margin:1em 0 0.5em 0.5em;padding:1em;height:190px;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
echarts4rOutput("pred_offer")
)
),
div(style="display: flex;",
wellPanel(style="background-color:transparent;text-align:center;margin:0.5em 0.5em 0 0;padding:1em;height:200px;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
echarts4rOutput("pred_tenure")
),
wellPanel(style="background-color:transparent;text-align:center;margin:0.5em 0 0 0.5em;padding:1em;height:200px;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
echarts4rOutput("pred_contract")
)
)
),
column(4,
h3("Services Signed", style="font-weight:bold;text-align:center;color:#fff;"),
column(12,
wellPanel(style="background-color:transparent;text-align:center;margin:0;padding:1em;height:285px;border-width:medium;box-shadow: 2px 2px #888888;",
echarts4rOutput("pred_internet_type")
),
div(style="display:flex;",
wellPanel(style="background-color:transparent;text-align:center;margin:1em 0.5em 1em 0;padding:1em;height:320px;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
# br(),
progressBar(id = "pred_pb1", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pred_pb2", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pred_pb3", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pred_pb4", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pred_pb5", value = 0, display_pct = TRUE, striped = TRUE)
),
wellPanel(style="background-color:transparent;text-align:center;margin:1em 0 1em 0.5em;padding:1em;height:320px;width:50%;border-width:medium;box-shadow: 2px 2px #888888;",
# br(),
progressBar(id = "pred_pb6", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pred_pb7", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pred_pb8", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pred_pb9", value = 0, display_pct = TRUE, striped = TRUE),
progressBar(id = "pred_pb10", value = 0, display_pct = TRUE, striped = TRUE)
)
)
)
)
)
)
)
)
server <- function(input, output, session){
output$location <- renderLeaflet({
tag.map.title <- tags$style(HTML("
.leaflet-control.map-title {
transform: translate(-50%,20%);
position: float !important;
left: 80%;
margin-top: -50%;
text-align: left;
padding-left: 10px;
padding-right: 10px;
background: transparent;
font-weight: bold;
font-size: 20px;
}"))
title <- tags$div(
tag.map.title, HTML("Location")
)
telco_customer %>%
count(city, longitude, latitude) %>%
leaflet() %>%
addTiles() %>%
# addMarkers(lng = ~longitude, lat = ~latitude,
# clusterOptions = markerClusterOptions()
# ) %>%
addCircles(lng = ~longitude, lat = ~latitude) %>%
addControl(title, position = "topleft", className="map-title")
})
output$map <- renderUI({
leafletOutput("location")
})
mypb_status <- function(value){
if (value < 33) {
status <- "danger"
} else if (value >= 33 & value < 67) {
status <- "warning"
} else {
status <- "success"
}
return(status)
}
# observe({
# shinyWidgets::updateProgressBar(session = session, id = "pb1", value = 80, title = "Premium Tech Support")
# shinyWidgets::updateProgressBar(session = session, id = "pb2", value = 80, title = "Phone Service")
# shinyWidgets::updateProgressBar(session = session, id = "pb3", value = 50, title = "Multiple Lines")
# shinyWidgets::updateProgressBar(session = session, id = "pb4", value = 50, title = "Online Security")
# shinyWidgets::updateProgressBar(session = session, id = "pb5", value = 50, title = "Online Backup")
# shinyWidgets::updateProgressBar(session = session, id = "pb6", value = 50, title = "Device Protection Plan")
# shinyWidgets::updateProgressBar(session = session, id = "pb7", value = 50, title = "Streaming TV")
# shinyWidgets::updateProgressBar(session = session, id = "pb8", value = 50, title = "Streaming Music")
# shinyWidgets::updateProgressBar(session = session, id = "pb9", value = 50, title = "Streaming Movies")
# shinyWidgets::updateProgressBar(session = session, id = "pb10", value = 50, title = "Unlimited Data")
# })
#
observe({
shinyWidgets::updateProgressBar(session = session, id = "pb1", value = round(sum(telco_customer$premium_tech_support == "Yes")/nrow(telco_customer)*100, 2), title = "Premium Tech Support")
shinyWidgets::updateProgressBar(session = session, id = "pb2", value = round(sum(telco_customer$phone_service == "Yes")/nrow(telco_customer)*100, 2), title = "Phone Service")
shinyWidgets::updateProgressBar(session = session, id = "pb3", value = round(sum(telco_customer$multiple_lines == "Yes")/nrow(telco_customer)*100, 2), title = "Multiple Lines")
shinyWidgets::updateProgressBar(session = session, id = "pb4", value = round(sum(telco_customer$online_security == "Yes")/nrow(telco_customer)*100, 2), title = "Online Security")
shinyWidgets::updateProgressBar(session = session, id = "pb5", value = round(sum(telco_customer$online_backup == "Yes")/nrow(telco_customer)*100, 2), title = "Online Backup")
shinyWidgets::updateProgressBar(session = session, id = "pb6", value = round(sum(telco_customer$device_protection_plan == "Yes")/nrow(telco_customer)*100, 2), title = "Device Protection Plan")
shinyWidgets::updateProgressBar(session = session, id = "pb7", value = round(sum(telco_customer$streaming_tv == "Yes")/nrow(telco_customer)*100, 2), title = "Streaming TV")
shinyWidgets::updateProgressBar(session = session, id = "pb8", value = round(sum(telco_customer$streaming_music == "Yes")/nrow(telco_customer)*100, 2), title = "Streaming Music")
shinyWidgets::updateProgressBar(session = session, id = "pb9", value = round(sum(telco_customer$streaming_movies == "Yes")/nrow(telco_customer)*100, 2), title = "Streaming Movies")
shinyWidgets::updateProgressBar(session = session, id = "pb10", value = round(sum(telco_customer$unlimited_data == "Yes")/nrow(telco_customer)*100, 2), title = "Unlimited Data")
})
# to_pred_df <- eventReactive(input$process, read_csv(input$file_data$datapath))
vep <- vetiver_endpoint("https://aephiday-test.hf.space/predict")
outpred <- eventReactive(input$process, {
ext <- tools::file_ext(input$file_data$datapath)
req(input$file_data)
validate(need(ext == "csv", "Please upload a csv file"))
if(is.null(input$file_data)){
return(NULL)
} else {
to_pred_df <- read_csv(input$file_data$datapath)
vep %>%
augment(new_data = to_pred_df) %>%
mutate(.pred_class = factor(if_else(.pred_Yes > 0.5, "Yes", "No"), levels = c("Yes", "No"))) %>%
arrange(desc(.pred_Yes))
}
})
observeEvent(input$process, {
updateSelectInput(session = session, inputId = "customer", label = "Select Customer", choices = c("---All Customers---", outpred()$customer_id))
})
output$pred_total_cust <- renderUI({
if(input$customer == "---All Customers---"){
tagList(
h5("Total Customer", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
scales::number(nrow(outpred()), big.mark = ",") %>%
h2(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
} else {
tagList(
h5("Customer ID", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
h2(input$customer, style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
}
})
output$pred_potential_churn <- renderUI({
if(input$customer == "---All Customers---"){
tagList(
h5("Potential Churn Customer", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
paste0(scales::number(sum(outpred()$.pred_class == "Yes"), accuracy = 1), " (", scales::percent(sum(outpred()$.pred_class == "Yes")/nrow(outpred()), accuracy = 0.01), ")") %>%
h2(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
} else {
tagList(
h5("Churn Probability", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
scales::percent(outpred() %>%
filter(customer_id == input$customer) %>%
pull(.pred_Yes), accuracy = 0.01) %>%
h2(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
}
})
output$pred_monthly_charge <- renderUI({
if(input$customer == "---All Customers---"){
tagList(
h5("Avg Monthly Charges", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
scales::number(mean(outpred()$monthly_charge), accuracy = 0.01, big.mark = ",", prefix = "$") %>%
h2(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
} else {
tagList(
h5("Avg Monthly Charges", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
scales::number(outpred() %>%
filter(customer_id == input$customer) %>%
pull(monthly_charge), accuracy = 0.01,
big.mark = ",", prefix = "$") %>%
h2(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
}
})
output$pred_total_charge <- renderUI({
if(input$customer == "---All Customers---"){
tagList(
h5("Total Charges", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
scales::number(sum(outpred()$total_charges),
accuracy = 0.01, big.mark = ",", prefix = "$") %>%
h2(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
} else {
tagList(
h5("Total Charges", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
scales::number(outpred() %>%
filter(customer_id == input$customer) %>%
pull(total_charges), accuracy = 0.01,
big.mark = ",", prefix = "$") %>%
h2(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
}
})
output$pred_avg_long_dist <- renderUI({
if(input$customer == "---All Customers---"){
tagList(
h5("Avg Monthly Long Dist. Chrg", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
scales::number(mean(outpred()$avg_monthly_long_distance_charges),
accuracy = 0.01, big.mark = ",", prefix = "$") %>%
h2(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
} else {
tagList(
h5("Avg Monthly Long Dist. Chrg", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
scales::number(outpred() %>%
filter(customer_id == input$customer) %>%
pull(avg_monthly_long_distance_charges), accuracy = 0.01,
big.mark = ",", prefix = "$") %>%
h2(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
}
})
output$pred_avg_cltv <- renderUI({
if(input$customer == "---All Customers---"){
tagList(
h5("Avg CLTV", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
scales::number(mean(outpred()$cltv), accuracy = 0.01, big.mark = ",") %>%
h2(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
} else {
tagList(
h5("CLTV", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
scales::number(outpred() %>%
filter(customer_id == input$customer) %>%
pull(cltv), accuracy = 1, big.mark = ",") %>%
h2(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
}
})
output$pred_pie_gender <- renderEcharts4r({
if(input$customer == "---All Customers---"){
outpred() |>
count(gender) |>
mutate(pct = round(n/sum(n)*100, 2)) |>
e_charts(gender) |>
e_pie(pct,
startAngle = 90) |>
e_labels(show = FALSE) %>%
e_title("% by Gender") |>
e_legend(show = TRUE, type = "plain", orient = "vertical", left = "right") |>
e_dims(height = 200) |>
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + params.value + '%')
}")
)
} else {
fm <- reactive(outpred() |>
filter(customer_id == input$customer) %>%
pull(gender))
outpred() |>
filter(customer_id == input$customer) %>%
count(gender) |>
mutate(pct = round(n/sum(n)*100, 2)) |>
e_charts(gender) |>
e_pie(pct,
startAngle = 90) |>
e_image_g(top = "10%",
left = "30%",
z = 999,
style = list(image = paste0(fm(), ".png"),
width = 150,
height = 150)
) %>%
e_labels(show = FALSE) %>%
e_title("Gender") %>%
e_dims(height = 200)
}
})
output$pred_sr_citizen <- renderUI({
if(input$customer == "---All Customers---"){
tagList(
h5("Sr. Citizen", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
outpred() %>%
mutate(senior_citizen = age > 65) %>%
pull(senior_citizen) %>%
mean() %>%
scales::percent(accuracy = 0.01) %>%
h3(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
} else {
tagList(
h5("Age", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
outpred() %>%
filter(customer_id == input$customer) %>%
pull(age) %>%
h3(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
}
})
output$pred_married <- renderUI({
if(input$customer == "---All Customers---"){
tagList(
h5("Married", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
outpred() %>%
mutate(married = married == "Yes") %>%
pull(married) %>%
mean() %>%
scales::percent(accuracy = 0.01) %>%
h3(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
} else {
tagList(
h5("Married", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
outpred() %>%
filter(customer_id == input$customer) %>%
pull(married) %>%
h3(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
}
})
output$pred_dependents <- renderUI({
if(input$customer == "---All Customers---"){
tagList(
h5("Dependents", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
outpred() %>%
mutate(dependents = number_of_dependents > 0) %>%
pull(dependents) %>%
mean() %>%
scales::percent(accuracy = 0.01) %>%
h3(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
} else {
tagList(
h5("Dependents", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
outpred() %>%
filter(customer_id == input$customer) %>%
pull(number_of_dependents) %>%
mean() %>%
scales::number(big.mark = ",") %>%
h3(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
}
})
output$pred_referred <- renderUI({
if(input$customer == "---All Customers---"){
tagList(
h5("Ref Friend", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
outpred() %>%
mutate(referred_a_friend = referred_a_friend == "Yes") %>%
pull(referred_a_friend) %>%
mean() %>%
scales::percent(accuracy = 0.01) %>%
h3(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
} else {
tagList(
h5("Ref Friend", style="font-weight:bold;margin:0;padding:0;"),
hr(style="margin:0.5em;padding:0;"),
outpred() %>%
filter(customer_id == input$customer) %>%
pull(referred_a_friend) %>%
h3(style="font-weight:bold;margin:0;padding:0;color:#0c5896;")
)
}
})
output$pred_location <- renderLeaflet({
tag.map.title <- tags$style(HTML("
.leaflet-control.map-title {
transform: translate(-50%,20%);
position: float !important;
left: 80%;
margin-top: -50%;
text-align: left;
padding-left: 10px;
padding-right: 10px;
background: transparent;
font-weight: bold;
font-size: 20px;
}"))
title <- tags$div(
tag.map.title, HTML("Location")
)
pal <- colorFactor(palette = c("blue", "firebrick"), domain = outpred()$.pred_class)
if(input$customer == "---All Customers---"){
outpred() %>%
# filter(customer_id == input$customer) %>%
left_join(locations, join_by(customer_id)) %>%
count(city, longitude, latitude) %>%
leaflet() %>%
addTiles() %>%
# addMarkers(lng = ~longitude, lat = ~latitude,
# clusterOptions = markerClusterOptions()
# ) %>%
addCircles(lng = ~longitude, lat = ~latitude,
color = ~pal(outpred()$.pred_class),
popup = ~htmltools::htmlEscape(paste0(city, ": ", n))) %>%
addControl(title, position = "topleft", className="map-title") %>%
addLegend(pal = pal, values = outpred()$.pred_class)
} else {
cust_data <- outpred() %>%
filter(customer_id == input$customer) %>%
left_join(locations, join_by(customer_id))
cust_data %>%
leaflet() %>%
# setView(lng = ~longitude, lat = ~latitude, zoom = 17) %>%
addTiles() %>%
# addMarkers(lng = ~longitude, lat = ~latitude,
# clusterOptions = markerClusterOptions()
# ) %>%
addMarkers(lng = ~longitude, lat = ~latitude,
popup = ~htmltools::htmlEscape(city)) %>%
addControl(title, position = "topleft", className="map-title")
}
})
output$pred_map <- renderUI({
leafletOutput("pred_location")
})
output$pred_payment <- renderEcharts4r({
if(input$customer == "---All Customers---"){
outpred() |>
count(payment_method) |>
mutate(pct = round(n/sum(n), 4)) |>
arrange(pct) %>%
ungroup() %>%
e_charts(payment_method, reorder = TRUE) |>
e_bar(pct, legend = FALSE) |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_title("Payment Method") |>
e_dims(width = 600, height = 200) |>
e_grid(left = "20%", top = "12.5%", bottom = "25%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
} else {
pm <- reactive(outpred() %>%
filter(customer_id == input$customer) %>%
pull(payment_method) %>%
str_replace("\\s", "-"))
#
# outpred() %>%
# filter(customer_id == input$customer) %>%
# e_charts() %>%
# e_image_g(top = "10%",
# left = "40%",
# z = -999,
# style = list(image = paste0(pm(), ".png"),
# width = 150,
# height = 150)
# ) |>
# e_dims(width = 600, height = 200) %>%
# e_title("Payment Method")
outpred() |>
filter(customer_id == input$customer) %>%
count(payment_method) |>
mutate(pct = round(n/sum(n), 4)) |>
arrange(pct) %>%
ungroup() %>%
e_charts(payment_method, reorder = TRUE) |>
e_bar(pct, legend = FALSE) |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_title("Payment Method") |>
e_dims(width = 600, height = 200) |>
e_image_g(top = "10%",
left = "40%",
z = 999,
style = list(image = paste0(pm(), ".png"),
width = 150,
height = 150)
) |>
e_grid(left = "20%", top = "12.5%", bottom = "25%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
}
})
output$pred_paperless <- renderEcharts4r({
if(input$customer == "---All Customers---"){
outpred() |>
count(paperless_billing) |>
mutate(pct = round(n/sum(n)*100, 2)) |>
e_charts(paperless_billing) %>%
e_pie(pct) |>
e_labels(show = FALSE) %>%
e_title("Paperless Billing") |>
e_legend(show = TRUE, type = "plain", orient = "vertical", left = "right") |>
e_dims(height = 190) |>
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + params.value + '%')
}")
)
} else {
pp <- reactive(outpred() %>%
filter(customer_id == input$customer) %>%
pull(paperless_billing) %>%
str_replace("\\s", "-"))
outpred() %>%
filter(customer_id == input$customer) %>%
count(paperless_billing) |>
mutate(pct = round(n/sum(n)*100, 2)) |>
e_charts(paperless_billing) %>%
e_pie(pct) |>
e_labels(show = FALSE) %>%
e_image_g(top = "15%",
left = "40%",
z = 999,
style = list(image = paste0(pp(), ".png"),
width = 120,
height = 120)
) |>
e_dims(width = 200, height = 190) %>%
e_title("Paperless Billing")
}
})
output$pred_offer <- renderEcharts4r({
if(input$customer == "---All Customers---"){
outpred() |>
count(offer) |>
mutate(offer = str_remove(offer, "Offer "),
pct = round(n/sum(n), 4)) |>
arrange(n) %>%
e_charts(offer) |>
e_bar(pct, legend = FALSE) |>
e_title("Offer") |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_dims(height = 200) |>
e_grid(left = "15%", top = "12.5%", bottom = "25%", right = "10%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
} else {
po <- reactive(outpred() %>%
filter(customer_id == input$customer) %>%
mutate(offer = str_remove(offer, "Offer ")) %>%
pull(offer) %>%
str_replace("\\s", "-"))
outpred() %>%
filter(customer_id == input$customer) %>%
mutate(offer = str_remove(offer, "Offer ")) %>%
count(offer) |>
mutate(offer = str_remove(offer, "Offer "),
pct = round(n/sum(n), 4)) |>
arrange(n) %>%
e_charts(offer) |>
e_bar(pct, legend = FALSE) |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_image_g(top = "15%",
left = "40%",
z = 999,
style = list(image = paste0(po(), ".png"),
width = 120,
height = 120)
) |>
e_grid(left = "15%", top = "12.5%", bottom = "25%", right = "10%") %>%
e_dims(width = 200, height = 200) %>%
e_title("Offer")
}
})
output$pred_tenure <- renderEcharts4r({
if(input$customer == "---All Customers---"){
outpred() |>
mutate(tenure_grp = case_when(tenure_in_months < 12 ~ " < 1 year",
tenure_in_months < 24 ~ " < 2 year",
tenure_in_months < 36 ~ " < 3 year",
tenure_in_months < 48 ~ " < 4 year",
TRUE ~ "4+ year")) %>%
count(tenure_grp) %>%
mutate(pct = round(n/sum(n), 4)) |>
arrange(n) %>%
e_charts(tenure_grp) |>
e_bar(pct, legend = FALSE) |>
e_title("Tenure") |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_dims(height = 200) |>
e_grid(left = "25%", top = "12.5%", bottom = "25%", right = "10%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
} else {
outpred() |>
filter(customer_id == input$customer) %>%
mutate(tenure_grp = case_when(tenure_in_months < 12 ~ " < 1 year",
tenure_in_months < 24 ~ " < 2 year",
tenure_in_months < 36 ~ " < 3 year",
tenure_in_months < 48 ~ " < 4 year",
TRUE ~ "4+ year")) %>%
count(tenure_grp) %>%
mutate(pct = round(n/sum(n), 4)) |>
arrange(n) %>%
e_charts(tenure_grp) |>
e_bar(pct, legend = FALSE) |>
e_title("Tenure") |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_dims(height = 200) |>
e_grid(left = "25%", top = "12.5%", bottom = "25%", right = "10%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
}
})
output$pred_contract <- renderEcharts4r({
if(input$customer == "---All Customers---"){
outpred() |>
count(contract) %>%
mutate(pct = round(n/sum(n), 4)) |>
arrange(n) %>%
e_charts(contract) |>
e_bar(pct, legend = FALSE) |>
e_title("Contract Type") |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_dims(height = 200) |>
e_grid(left = "45%", top = "12.5%", bottom = "25%", right = "10%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
} else {
outpred() |>
filter(customer_id == input$customer) %>%
count(contract) %>%
mutate(pct = round(n/sum(n), 4)) |>
arrange(n) %>%
e_charts(contract) |>
e_bar(pct, legend = FALSE) |>
e_title("Contract Type") |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_dims(height = 200) |>
e_grid(left = "45%", top = "12.5%", bottom = "25%", right = "10%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
}
})
output$pred_internet_type <- renderEcharts4r({
if(input$customer == "---All Customers---"){
outpred() |>
count(internet_type) |>
mutate(pct = round(n/sum(n), 4)) |>
arrange(n) %>%
e_charts(internet_type) |>
e_bar(pct, legend = FALSE) |>
e_title("Internet Service Type") |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_dims(width = 600, height = 285) |>
e_grid(left = "15%", top = "12.5%", bottom = "20%", right = "15%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
} else {
outpred() |>
filter(customer_id == input$customer) %>%
count(internet_type) |>
mutate(pct = round(n/sum(n), 4)) |>
arrange(n) %>%
e_charts(internet_type) |>
e_bar(pct, legend = FALSE) |>
e_title("Internet Service Type") |>
e_y_axis(formatter = e_axis_formatter(style = "percent")) %>%
e_flip_coords() %>%
e_dims(width = 600, height = 285) |>
e_grid(left = "15%", top = "12.5%", bottom = "20%", right = "15%") %>%
e_tooltip(
formatter = htmlwidgets::JS("function(params){
return(params.name + ': ' + Math.round(params.value[0]*10000)/100 + '%')
}")
)
}
})
observe({
if(input$customer == "---All Customers---"){
shinyWidgets::updateProgressBar(session = session, id = "pred_pb1", value = round(sum(outpred()$premium_tech_support == "Yes")/nrow(outpred())*100, 2), title = "Premium Tech Support")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb2", value = round(sum(outpred()$phone_service == "Yes")/nrow(outpred())*100, 2), title = "Phone Service")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb3", value = round(sum(outpred()$multiple_lines == "Yes")/nrow(outpred())*100, 2), title = "Multiple Lines")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb4", value = round(sum(outpred()$online_security == "Yes")/nrow(outpred())*100, 2), title = "Online Security")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb5", value = round(sum(outpred()$online_backup == "Yes")/nrow(outpred())*100, 2), title = "Online Backup")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb6", value = round(sum(outpred()$device_protection_plan == "Yes")/nrow(outpred())*100, 2), title = "Device Protection Plan")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb7", value = round(sum(outpred()$streaming_tv == "Yes")/nrow(outpred())*100, 2), title = "Streaming TV")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb8", value = round(sum(outpred()$streaming_music == "Yes")/nrow(outpred())*100, 2), title = "Streaming Music")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb9", value = round(sum(outpred()$streaming_movies == "Yes")/nrow(outpred())*100, 2), title = "Streaming Movies")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb10", value = round(sum(outpred()$unlimited_data == "Yes")/nrow(outpred())*100, 2), title = "Unlimited Data")
} else {
cust_data <- outpred() %>%
filter(customer_id == input$customer)
shinyWidgets::updateProgressBar(session = session, id = "pred_pb1", value = (cust_data$premium_tech_support == "Yes")*100, title = "Premium Tech Support")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb2", value = (cust_data$phone_service == "Yes")*100, title = "Phone Service")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb3", value = (cust_data$multiple_lines == "Yes")*100, title = "Multiple Lines")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb4", value = (cust_data$online_security == "Yes")*100, title = "Online Security")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb5", value = (cust_data$online_backup == "Yes")*100, title = "Online Backup")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb6", value = (cust_data$device_protection_plan == "Yes")*100, title = "Device Protection Plan")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb7", value = (cust_data$streaming_tv == "Yes")*100, title = "Streaming TV")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb8", value = (cust_data$streaming_music == "Yes")*100, title = "Streaming Music")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb9", value = (cust_data$streaming_movies == "Yes")*100, title = "Streaming Movies")
shinyWidgets::updateProgressBar(session = session, id = "pred_pb10", value = (cust_data$unlimited_data == "Yes")*100, title = "Unlimited Data")
}
})
}
shinyApp(ui, server)