title: "Pricing Optimization Workshop" author: "Elvina" date: "2025-02-23" output: html_document: theme: flatly highlight: tango ---
set.seed(123) data <- data.frame( Policy_ID = 1:1000, Customer_Age = sample(20:70, 1000, replace = TRUE), Annual_Premium = round(runif(1000, 500, 3000), 2), Claim_Frequency = rpois(1000, lambda = 1), Claim_Severity = round(rlnorm(1000, meanlog = 7, sdlog = 0.5), 2), Competitor_Price = round(runif(1000, 400, 3200), 2), Churn = sample(0:1, 1000, replace = TRUE, prob = c(0.8, 0.2)) ) write.csv(data, "insurance_pricing.csv", row.names = FALSE) head(data,5)
library(tidyverse) data <- read.csv("insurance_pricing.csv")
str(data)
summary(data)
ggplot(data, aes(x = Annual_Premium)) + geom_histogram(bins = 30, fill = "skyblue", color = "black") + labs(title = "Distribution of Annual Premiums")
data_original<-data data <- data %>% mutate(Risk_Score = Claim_Frequency * Claim_Severity / Annual_Premium)
data <- data %>% mutate(Age_Group = case_when( Customer_Age < 30 ~ "Young", Customer_Age >= 30 & Customer_Age < 60 ~ "Middle-aged", TRUE ~ "Senior" ))
summary(data$Risk_Score)
model <- lm(Annual_Premium ~ Claim_Frequency + Claim_Severity + Age_Group, data = data) summary(model)
library(Metrics) rmse(data\(Annual_Premium, data\)Predicted_Premium)
if (!require("nloptr")) install.packages("nloptr") library(nloptr)
objective <- function(price) { revenue <- sum(price * (1 - data\(Churn)) cost <- sum(data\)Claim_Frequency * data$Claim_Severity) return(-1 * (revenue - cost)) }
opt_result <- nloptr( x0 = rep(mean(data$Annual_Premium), nrow(data)), eval_f = objective, lb = rep(500, nrow(data)), ub = rep(3000, nrow(data)), opts = list("algorithm" = "NLOPT_LN_COBYLA", "xtol_rel" = 1e-4) ) opt_result
library(shiny) library(ggplot2)
ui <- fluidPage( titlePanel("Pricing Optimization Dashboard"), sidebarLayout( sidebarPanel( sliderInput("age", "Customer Age:", min = 20, max = 70, value = 40), numericInput("claims", "Claim Frequency:", value = 1, min = 0), numericInput("severity", "Claim Severity:", value = 5000, min = 0) ), mainPanel( plotOutput("premiumPlot") ) ) )
server <- function(input, output) { output\(premiumPlot <- renderPlot({ predicted <- predict(model, data.frame( Claim_Frequency = input\)claims, Claim_Severity = input\(severity, Age_Group = ifelse(input\)age < 30, "Young", ifelse(input$age < 60, "Middle-aged", "Senior")) )) ggplot(data, aes(x = Predicted_Premium)) + geom_histogram(fill = "blue", color = "black", bins = 30) + geom_vline(xintercept = predicted, color = "red", linetype = "dashed") + labs(title = "Predicted Premium", x = "Premium", y = "Frequency") }) }
shinyApp(ui, server)