Наглядное руководство по моделированию серьезности страхового возмещения с использованием обобщенных линейных моделей в Python & R

Цель

Я уверен, что большинство из нас начали свой путь к аналитике с построения линейной регрессии с небольшой выборкой данных, где переменная ответа следует красивому нормальному распределению в форме колокола. В реальном мире мы редко находим такие идеальные наборы данных, особенно в сфере страхования, часто наши наборы данных сильно искажены, и соответствие обычному методу наименьших квадратов не имеет смысла. Я расскажу о нескольких вариантах обобщенных линейных моделей, которые лучше подходят для такого рода данных.

Фон

В предыдущей статье мы обсудили ключевые проблемы и методы моделирования, связанные с частотой претензий, в текущей статье мы обсудим второй компонент ценообразования, то есть серьезность претензии (ожидаемая сумма претензии на претензию). Поскольку мы видели, что частота заявлений сильно искажена, ожидается, что серьезность будет следовать аналогичной тенденции, поскольку оба значения связаны. Первый - это количество убытков, а второй - сумма убытков, вызванных этими происшествиями.

С какими проблемами мы сталкиваемся при моделировании серьезности претензий?

1. Серьезность претензии сильно искажена (наклонена вправо), с острой вершиной и длинным хвостом вправо. Вы можете обратиться к следующим гистограммам.

2. Серьезность часто имеет чрезмерное количество нулевых результатов, что затрудняет моделирование.

Вот снимок распределения затрат по претензиям: синий график включает все данные, включая нулевые значения, а зеленый график имеет только положительные значения.

Вы можете себе представить, почему этот частный случай регрессии важен для нас.

Как смоделировать такие искаженные данные?

Обобщенная линейная модель с гамма-распределением является предпочтительным методом среди актуариев и специалистов-аналитиков при моделировании серьезности претензий. Другой популярный метод - это OLS с преобразованной в журнал переменной ответа.

Давайте обсудим гамма-распределение, прежде чем переходить к этапам моделирования, это даст вам представление о том, как это распределение может помочь нам в решении нашей проблемы.

Гамма-распределение представляет собой двухпараметрическое семейство непрерывных распределений вероятностей и возникает естественным образом в процессах, для которых время ожидания между событиями имеет значение и соответствует пуассоновскому процессу.

Обычно используются три различных параметризации:

1. С параметром формы k и параметром масштаба θ.

2. С параметром формы α = k и параметром обратного масштаба β = 1 / θ называется скоростью параметр.

3. С параметром формы k и параметром среднего μ = = α / β .

В каждой из этих трех форм оба параметра являются положительными действительными числами.

Первый - это параметризация k− θ и, возможно, более естественная, с p.d.f.

Теперь мы можем взглянуть на его функцию плотности вероятности

Функция плотности вероятности: время ожидания до hth пуассоновского события со скоростью изменения λ равно

Для X ~ Gamma (k, θ), где k = h и θ = 1 / λ, функция плотности гамма-вероятности определяется выражением

Where,
e is the natural number (e = 2.71828…)
k is the number of occurrences of an event
if k is a positive integer, then Γ(k) = (k − 1)! is the gamma function
θ = 1 / λ is the mean number of events per time unit, where λ is the mean time between events. For example, if the mean time between phone calls is 2 hours, then you would use a gamma distribution with θ=1/2=0.5. If we want to find the mean number of calls in 5 hours, it would be 5*1/2 = 2.5
x is a random variable

Вот несколько реальных приложений гамма-распределения.

Гамма-распределение можно использовать в различных областях, включая финансовые услуги. Примеры событий, которые можно моделировать с помощью гамма-распределения, включают:

1. Количество осадков, накопленных в водохранилище.

2. Размер невозврата кредита и стоимость страхового возмещения.

3. Поток товаров через процессы производства и распределения.

4. Нагрузка на веб-серверы.

Теперь я покажу вам рабочий пример с использованием набора страховых данных.

Этот набор данных (dataCar) можно загрузить из пакета R под названием «insuranceData».

library(insuranceData)
data(dataCar)

Описание данных

Этот набор данных основан на одногодичных полисах страхования транспортных средств, заключенных в 2004 или 2005 годах. Всего насчитывается 67 856 полисов, из которых 4624 (6,8% заявленных претензий) подали претензии.

Давайте углубимся в данные

Мы должны анализировать все переменные независимо, а также в отношении зависимой переменной, здесь я собираюсь обсудить только избранные переменные, где требуется некоторое преобразование или вмешательство. Хотя вы можете найти полный EDA в кодах Python, опубликованных вместе с этой статьей.

В качестве первого шага я отбросил несколько повторяющихся наблюдений.

Требуемая стоимость

Как мы уже знаем, мы будем работать над сценарием, в котором наша переменная ответа обычно не распределяется. Мы можем наблюдать то же самое на графике ниже. По нашим наблюдениям, только 7% полисов заявили о претензиях, из них около 40% полисов требовали менее 500 долларов.

Глядя на приведенный выше график и основываясь на одном важном свойстве гаммы, то есть все результаты должны быть положительными, мы не можем моделировать наши данные в текущей форме, где у нас есть нулевые результаты для 93% наблюдений.

Мы разделим этот набор данных на две части: наблюдения без потерь и наблюдения, которые привели к потере даже одного доллара.

В этой статье мы сосредоточимся на моделировании только положительных убытков, мы уже обсуждали другой сценарий, в котором мы хотим знать, сообщал ли полис о каких-либо претензиях или нет (так же, как политика вызвала какие-либо убытки или нет) в моей последней статье. с использованием моделей с нулевым давлением и моделей с препятствиями. Одна часть модели предсказывала вероятность нулевых претензий, а другая часть предсказывала различное количество претензий.

Заявка на стоимость положительного подмножества данных

После анализа положительного подмножества данных можно наблюдать множество значений за пределами 95-го процентиля, я удалил только крайние выбросы, выходящие за пределы 99-го процентиля. Ниже мы видим две гистограммы, одну для полных данных, а вторую после удаления экстремальных выбросов.

Стоимость транспортного средства

Мы можем наблюдать много странных значений этой переменной, есть некоторые автомобили с нулевыми значениями, а некоторые - с экстремальными значениями, которые для меня не имеют смысла. Во время живых проектов мы можем прояснить этот вид подозрительного значения и, соответственно, принять решение. В этом случае я удалил наблюдения, в которых стоимость транспортного средства была равна нулю.

Тем не менее, я вижу слишком много выбросов, мы можем преобразовать непрерывные значения в категориальные, чтобы минимизировать влияние выбросов. Я создал 5 различных категорий стоимости автомобиля.

Кузов автомобиля

Есть много категорий с очень низкой частотой, которые могут быть недостатком при обучении функции из-за отсутствия достаточного количества точек данных, давайте объединим четыре нижних категории как «другие».

Теперь мы закончили необходимую проверку и преобразование данных. Мы можем перейти к этапам моделирования.

Пришло время изучить подходящую модель GLM для такого набора данных

Как мы уже обсуждали в начале, основываясь на отраслевом опыте, GLM с гамма-распределением и OLS с лог-преобразованным откликом могут лучше подходить для этого сценария.

Вот сравнение исходного распределения с его логарифмически преобразованным значением.

Первая (синяя) гистограмма дает интуицию, что данные очень близки к гамма-распределению, а вторая (зеленая) подсказывает, что мы можем попробовать логнормальную модель, хотя она далека от идеальной, имеет два пика в начале.

У нас есть еще одна проблема: мы должны найти метод, который математически заменяет сумму претензии серьезностью претензии. Мы хотели повлиять на результаты модели, фактически не включая эту переменную (количество претензий) в моделирование. Этого можно добиться, используя в модели член смещения, и метод OLS не подходит для этого требования.

Мы увидим, почему GLM предпочтительнее использовать смещение

Модель GLM обычно настраивается следующим образом:

Окончательное уравнение указывает, что смещение должно быть в том же масштабе, что и линейный предсказатель f (x). Следовательно, журнал (количество претензий) можно использовать как смещение.

Теперь давайте возьмем пример OLS, модель настроена, как показано ниже.

Таким образом, мы видим, что использование смещения здесь не имеет смысла.

Альтернатива OLS - обобщенная линейная модель с распределением Гаусса

В качестве альтернативы OLS мы можем использовать GLM с распределением Гаусса, что эквивалентно модели OLS, когда используется функция связи «идентичность». Но есть небольшая разница, когда мы используем функцию ссылки «журнал». Первый журнал подхода преобразует наблюдаемые значения, а второй журнал преобразует ожидаемое значение.

Теперь у нас есть два варианта GLM на выбор: Гауссовский со связью журнала и еще один - Гамма со ссылкой журнала, мы можем подогнать модели к обоим вариантам и после оценки и сравнения доработать лучший вариант.

Моделирование с использованием пакета Statsmodels в Python и пакета MASS в R

Целевая переменная - мы будем использовать стоимость претензии в качестве целевой переменной.

Независимые переменные - все эти переменные используются как категориальные: кузов, возраст транспортного средства, пол, площадь и возрастная категория, а также значение транспортного средства. Индикаторы претензий и подверженности опускаются, поскольку они не требуются.

Смещение - количество претензий будет использоваться в качестве смещения.

Давайте модель

В качестве первого шага давайте разделим окончательный набор данных на два подмножества: обучение и тестирование.

mask = np.random.rand(len(df_excl_0_99)) < 0.8
df_train = df_excl_0_99[mask]
df_test = df_excl_0_99[~mask]
print('Training data set length='+str(len(df_train)))
print('Testing data set length='+str(len(df_test)))

Настроить выражение модели в statsmodels довольно просто, просто мы можем написать R как формулы.

expr = """claimcst0 ~ veh_value_cat+veh_body+veh_age+gender+area+agecat"""

Преобразуйте обучающие и тестовые наборы данных в формат dmatrices, который является обязательным входом для этого пакета.

y_train, X_train = dmatrices(expr, df_train,return_type='dataframe')
y_test, X_test = dmatrices(expr, df_test, return_type='dataframe')

Давайте посмотрим на выражение модели, поскольку терминология смещения варьируется от одного пакета к другому. В R это называется смещением, и разработчик модели должен указать зарегистрированное значение, здесь, в statsmodels, сама модель заботится о журнале.

GLM с гауссовым распределением и функцией связи журнала

Python---
gauss_log_model= sm.GLM(y_train,X_train,exposure=df_train.numclaims, family=sm.families.Gaussian(sm.families.links.log))
model1 = gauss_log_model.fit()
R---
model_gauss <- glm(claimcst0 ~ veh_value+veh_body+veh_age+gender+area+agecat,data = train,offset = log(numclaims),family=gaussian(link="log"))

GLM с гамма-распределением и функцией привязки журнала

Python---
gamma_model = sm.GLM(y_train, X_train, exposure=df_train.numclaims, family=sm.families.Gamma(link=sm.families.links.log))
model2 = gamma_model.fit()
R---
model_gamma <- glm(claimcst0 ~ veh_value+veh_body+veh_age+gender +area +agecat,    data = train,offset = log(numclaims), amily=Gamma(link="log"))

Оценка и сравнение моделей

После моделирования мы можем извлечь результаты, используя итоговую функцию, и оценить степень соответствия для обоих случаев. Мы можем проверить среднеквадратичную ошибку на тестовом наборе данных.

Мы ясно видим, что ни одна из моделей не идеальна, но, тем не менее, гамма со связью журнала немного лучше, чем гауссовский. Картина разброса остатков по сравнению с соответствием лучше для гаммы, и согласно графику QQ остатки очень близки к нормальному распределению. Это GLM, а не линейная регрессия, где нормальность остатков и однородность дисперсии является строгим условием, ожидается некоторое отклонение, но существенное отклонение от нормальности указывает на проблему с предполагаемым распределением.

Наконец, AIC и среднеквадратичная ошибка являются еще одним показателем сравнения моделей, оба значения ниже в случае гаммы, что предполагает лучшее соответствие.

Полные коды R можно найти ниже

library(ggplot2)
library(dplyr)
library(class)
library(MASS)
library(caret)
library(devtools)
library(countreg)
library(forcats)
library(insuranceData)
library(Hmisc)
install.packages("countreg", repos="http://R-Forge.R-project.org")
#Attaching data for modeling
data(dataCar)
data1 <- dataCar
#Data Cleaning & Pre-processing
data1$veh_value_cat <- as.numeric(cut2(data1$veh_value, g=5))
data2 <- unique(data1)
data3 <- data2[data2$veh_value > quantile(data2$veh_value, 0.0001), ] 
#data4 <- data3[data3$veh_value < quantile(data3$veh_value, 0.999), ]
#Regrouping vehicle categories
top9 <-c('SEDAN','HBACK','STNWG','UTE','TRUCK','HDTOP','COUPE','PANVN','MIBUS')
data3$veh_body <- fct_other(data3$veh_body, keep = top9, other_level = 'other')
#Converting catagorical variables into factors
names <- c('veh_body' ,'veh_age','gender','area','agecat','veh_value_cat')
data3[,names] <- lapply(data3[,names] , factor)
str(data3)
# based on variable values
newdata <- subset(data3, clm ==1)
df <- newdata[newdata$claimcst0 < quantile(newdata$claimcst0, 0.99), ]
##data partition - original data
data_partition <- createDataPartition(df$claimcst0, times = 1,p = 0.8,list = FALSE)
str(data_partition)
train <- df[data_partition,]
test  <- df[-data_partition,]
#models - Gaussian
model_gauss <- glm(claimcst0 ~ veh_value+veh_body+veh_age+gender+area+agecat,
                  data = train,offset = log(numclaims),family=gaussian(link="log"))
summary(model_gauss)
plot(model_gauss)
test$pred <- predict(model_gauss, newdata=test, type="response")
sqrt(mean((test$pred - test$claimcst0)^2))
write.csv(test,"test_gauss.csv")
# Models - Gamma
model_gamma <- glm(claimcst0 ~ veh_value+veh_body+veh_age+gender+area+agecat,
                  data = train,offset = log(numclaims),family=Gamma(link="log"))
summary(model_gamma)
plot(model_gamma)
test$pred <- predict(model_gamma, newdata=test, type="response")
sqrt(mean((test$pred - test$claimcst0)^2))
write.csv(test,"test_gamma.csv")

Коды Python доступны по следующему пути

Резюме и дальнейшие действия

Мы обсудили, как подогнать регрессионную модель к сильно искаженному набору страховых данных с использованием методов GLM, важность смещения и то, как гамма-распределение полезно при моделировании таких данных.

Это не единственные пакеты, доступные для моделирования данных, относящихся к страхованию, в настоящее время xgboost, как и пакеты машинного обучения, также представил целевые функции, такие как Пуассон, Гамма, Твиди и т. Д., Которые ранее были ограничены только обобщенными линейными моделями.

Теперь у нас есть частотная модель и модель серьезности, и в моей следующей статье мы обсудим, как мы можем оценить чистую премию, используя эти разные модели.

Спасибо за чтение, не стесняйтесь делиться своими вопросами или предложениями.

Ссылки