Podemos hacer algunos supuestos simplificadores? Me gustaría tener el número máximo de llamadas simultáneas que ocurrir en el medio de los 5 minutos de intervalo de tiempo. Por ahora, también me gustaría suponer que todas las llamadas comenzó exactamente en el medio también. A continuación, vamos a suponer que la duración de la llamada es exponencialmente distribuidos. Una búsqueda rápida encuentra mejor distribuciones y este enfoque debería funcionar con cualquier distribución.
Con estos supuestos, se puede estimar el número de llamadas activas en el siguiente período de tiempo mediante el uso de la distribución acumulativa para estimar el porcentaje de llamadas de más de 5 minutos y multiplicando por el número de partida de llamadas. Por ejemplo, si 100 llamadas de inicio entre las 9:25 y 9:30, entonces podemos calcular los $100 e^{-\lambda 5}$ llamadas activas durante la 9:30-9:35 período de tiempo. A continuación, agregamos el estimado de llamadas activo de cada período de tiempo anterior y encontrar una $\lambda$ que da el estimado de llamadas iguales a los reales de llamadas simultáneas. A continuación,$1/\lambda$, la media de la distribución exponencial, es el promedio de duración de la llamada.
Vamos período de tiempo $i=0$ ser la actual de 5 minutos, y $i=1$ ser los 5 minutos de período de tiempo antes de que. Deje $s_i$ igualdad de las llamadas comenzaron en ese período de tiempo, por ejemplo,$s_0=125$. Deje $c_i$ igualdad de las llamadas simultáneas en la mitad del período de tiempo, por ejemplo,$c_0=575$. Deje $t_i$ a cuántos minutos el período de tiempo fue, por ejemplo, $t_0=0, t_1=5, ...$
$$
c_0 = \sum_{i=1}^{\infty} s_i * e^{-\lambda * t_i}
$$
I don't know if there is a closed form solution for $\lambda$. It can probably be solved using Newton's method. Below, I've solved for $\lambda$ using trial and error. I estimated the numbers from your plot and, since I don't have the historical data, repeated the started calls hourly for 5 hours of historical data. Using 9:30-9:35 as the current time period and estimating $c_0=575$, I got an average call duration of 40.8 minutes.
started_calls <- c(100, 5, 25, 50, 75, 200, 175, 50, 75, 50, 25, 125)
started_calls <- c(started_calls, started_calls, started_calls, started_calls, started_calls)
time_ago <- (1:length(started_calls) * 5)
lambda <- 0.0245
sum(started_calls * exp(-lambda * time_ago))
1/lambda
We can slightly relax the call started assumption by spreading out the calls over the start of each minute in the 5 minute period. The max concurrent calls still happens at the middle of the period. I got an average call duration of 37.2 minutes
started_calls <- c(125, 100, 5, 25, 50, 75, 200, 175, 50, 75, 50, 25)
started_calls <- rep(started_calls/5, each=5)
started_calls <- c(started_calls[4:length(started_calls)], started_calls[1:3])
started_calls <- c(started_calls, started_calls, started_calls, started_calls, started_calls)
time_ago <- (1:length(started_calls)) - 0.5
lambda <- 0.0269
sum(started_calls * exp(-lambda * time_ago))
1/lambda
Finally, I would think you're interested in a $\lambda$ for a longer period of time. Consider repeating this process over each 5-minute interval for the same $\lambda$. And for each 5-minute interval, compute an error that is the difference in estimated concurrent calls and observed calls. Finally, select $\lambda$ que minimiza el error cuadrático medio. Traté de estimación de llamadas simultáneas para la hora en la que se muestra arriba, y se repite el inició de las llamadas de datos históricos. Recibí una llamada, la duración de 38.0 minutos
concurrent_calls <- c(575, 525, 500, 575, 600, 625, 650, 600, 575, 625, 700, 725)
started_calls <- c(125, 100, 5, 25, 50, 75, 200, 175, 50, 75, 50, 25)
estimate_error <- function(lambda, index) {
rotated_started_calls <- c(started_calls[index:length(started_calls)], started_calls[1:(index-1)])
rotated_started_calls <- rep(rotated_started_calls/5, each=5)
rotated_started_calls <- c(rotated_started_calls[4:length(rotated_started_calls)], rotated_started_calls[1:3])
rotated_started_calls <- c(rotated_started_calls, rotated_started_calls, rotated_started_calls, rotated_started_calls, rotated_started_calls)
time_ago <- (1:length(rotated_started_calls)) - 0.5
est_calls <- sum(rotated_started_calls * exp(-lambda * time_ago))
concurrent_calls[index] - est_calls
}
lambda <- 0.0263
sum(sapply(1:12, function(i) {
err <- estimate_error(lambda, i)
err * err
}))
1/lambda