Spaces:
Sleeping
Sleeping
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) | |