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)

Load dataset

library(tidyverse) data <- read.csv("insurance_pricing.csv")

Explore dataset

str(data)

summary(data)

ggplot(data, aes(x = Annual_Premium)) + geom_histogram(bins = 30, fill = "skyblue", color = "black") + labs(title = "Distribution of Annual Premiums")

Create risk score

data_original<-data data <- data %>% mutate(Risk_Score = Claim_Frequency * Claim_Severity / Annual_Premium)

Categorize customers by age group

data <- data %>% mutate(Age_Group = case_when( Customer_Age < 30 ~ "Young", Customer_Age >= 30 & Customer_Age < 60 ~ "Middle-aged", TRUE ~ "Senior" ))

Explore engineered features

summary(data$Risk_Score)

Fit a linear regression model

model <- lm(Annual_Premium ~ Claim_Frequency + Claim_Severity + Age_Group, data = data) summary(model)

Predict premiums

data$Predicted_Premium <- predict(model, data)

Calculate RMSE

library(Metrics) rmse(data\(Annual_Premium, data\)Predicted_Premium)

Install optimization package

if (!require("nloptr")) install.packages("nloptr") library(nloptr)

Define objective function

objective <- function(price) { revenue <- sum(price * (1 - data\(Churn)) cost <- sum(data\)Claim_Frequency * data$Claim_Severity) return(-1 * (revenue - cost)) }

Optimization

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

Building a Pricing Dashboard

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)