Queremos encontrar si nuestros datos (churn) se distribuyen como alguna función paramétrica conocida. Para hacer esto hacemos una prueba Cuantil Cuantil. Si alguna de las gráficas nos da una línea recta entonces sabemos que la distribución es similar, si no, decimos que nuestros datos no se distribuyen como la función paramétrica en cuestión.

Vamos a usar los mismos datos de siempre, los de churn.

datos <- read.csv("C:/Users/danil/OneDrive/Documents/churn.csv")
require(ggplot2)
## Loading required package: ggplot2
require(survival)
## Loading required package: survival
require(survminer)
## Loading required package: survminer
## Loading required package: ggpubr
## Loading required package: magrittr
require(plotly)
## Loading required package: plotly
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
require(flexsurv)
## Loading required package: flexsurv
knitr::kable(summary(datos))
churn accountlength internationalplan voicemailplan numbervmailmessages totaldayminutes totaldaycalls totaldaycharge totaleveminutes totalevecalls totalevecharge totalnightminutes totalnightcalls totalnightcharge totalintlminutes totalintlcalls totalintlcharge numbercustomerservicecalls
No :4293 Min. : 1.0 no :4527 no :3677 Min. : 0.000 Min. : 0.0 Min. : 0 Min. : 0.00 Min. : 0.0 Min. : 0.0 Min. : 0.00 Min. : 0.0 Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 0.000 Min. :0.000 Min. :0.00
Yes: 707 1st Qu.: 73.0 yes: 473 yes:1323 1st Qu.: 0.000 1st Qu.:143.7 1st Qu.: 87 1st Qu.:24.43 1st Qu.:166.4 1st Qu.: 87.0 1st Qu.:14.14 1st Qu.:166.9 1st Qu.: 87.00 1st Qu.: 7.510 1st Qu.: 8.50 1st Qu.: 3.000 1st Qu.:2.300 1st Qu.:1.00
NA Median :100.0 NA NA Median : 0.000 Median :180.1 Median :100 Median :30.62 Median :201.0 Median :100.0 Median :17.09 Median :200.4 Median :100.00 Median : 9.020 Median :10.30 Median : 4.000 Median :2.780 Median :1.00
NA Mean :100.3 NA NA Mean : 7.755 Mean :180.3 Mean :100 Mean :30.65 Mean :200.6 Mean :100.2 Mean :17.05 Mean :200.4 Mean : 99.92 Mean : 9.018 Mean :10.26 Mean : 4.435 Mean :2.771 Mean :1.57
NA 3rd Qu.:127.0 NA NA 3rd Qu.:17.000 3rd Qu.:216.2 3rd Qu.:113 3rd Qu.:36.75 3rd Qu.:234.1 3rd Qu.:114.0 3rd Qu.:19.90 3rd Qu.:234.7 3rd Qu.:113.00 3rd Qu.:10.560 3rd Qu.:12.00 3rd Qu.: 6.000 3rd Qu.:3.240 3rd Qu.:2.00
NA Max. :243.0 NA NA Max. :52.000 Max. :351.5 Max. :165 Max. :59.76 Max. :363.7 Max. :170.0 Max. :30.91 Max. :395.0 Max. :175.00 Max. :17.770 Max. :20.00 Max. :20.000 Max. :5.400 Max. :9.00
datos$churn <- ifelse(datos$churn == "Yes", 1, 0)

Definimos nuestra función de supervivencia como:

f1<-surv_fit(Surv(accountlength, churn) ~ 1, data = datos)

Queremos ver si esta función se distribuye como alguna de las funciones paramétricas que conocemos. Para poder compararlas usando el método de Cuantil Cuantil queremos que nuestras funciones tengan los mismos parámetros, así que definimos a:

x<- seq(0, 1, by = (1/length(f1$time)))
y <- quantile(f1$time, probs = x)

Entonces aquí ya tenemos a nuestro cuantil de la función de supervivencia con los parámetros correctos, hagamos lo mismo con nuestra primera función, Gompertz-Makeham, y graficamos.

q1 <-qgompertz(x, 3)

qqplot(q1,y,xlab = "Cuantil Gompertz-Makeham", ylab = "Cuantile de supervivencia", main = "Simulación de Gompertz")

Vemos aqui que no se parece a una línea recta, entonces no podemos decir que nuestros datos se distribuyen como una Gompertz. Intentémos con otra función paramétrica, la Gamma y grafiquemos.

q2 <-qgamma(x,1)
qqplot(q2, y, xlab = "Cuantil Gamma", ylab = "Cuantil de supervivencia", main = "Simulación Gamma")

Esta función se parece menos a una recta que la anterior, intentemos con una Log-Logística y grafiquemos.

q3<-qllogis(x,3)
qqplot(q3, y ,xlab = "Cuantil Log-Logistico", ylab = "Cuantil de supervivencia", main = "Simulación Log-Logistica")

Tampoco nos sirve esta función, tratemos con otra, la Gamma Generalizada, para esta vamos a definir un vector de soporte ya que necesitamos un vector de forma. Este vector tendra los mismos parámetros para que lo podamos usar.

z <- seq(1,5, by = (1/length(f1$time)))

q4 <- qgengamma(x, 3, Q = z)

qqplot(q4, y, xlab = "Cuantil Gamma Generalizado", ylab = "Cuantil de supervivencia", main = "Simulación Gamma Generalizado")

Otra función que no se parece a una recta, intentémos con una función más para verificar que nuestros datos no tienen ninguna de estas distribuciones paremétricas. La función F Generalizada también usará el mismo vector de apoyo.

q5 <- qgenf(x, 3, Q = z, P = z)
qqplot(q5, y, xlab = "Cuantil F Generalizado", ylab = "Cuantil de supervivencia", main = "Simulación F Generalizada")

La función paramétrica F Generalizada no nos sirvio como modelo para nuestros datos. De hecho el más cercano es la Gompertz pero no es convincente. Por lo tanto debemos concluir que ninguna de las funciones paramétricas revisadas nos sirve como modelo para nuestros datos.