Ir al contenido principal

Análisis de cadenas de Markov en R

En este tutorial, aprenderás qué es una cadena de Markov y la usarás para analizar datos de velocidad de ventas en R.
Actualizado 17 sept 2026  · 8 min leer

Explorar con IA

ChatGPTClaudePerplexity

¿Qué es una cadena de Markov?

\n

Una cadena de Markov es un sistema matemático que pasa de un estado a otro según un conjunto de reglas probabilísticas. Las cadenas de Markov son procesos estocásticos, pero se diferencian en que no tienen \"memoria\". Es decir, la probabilidad del siguiente estado del sistema solo depende del estado presente y no de estados anteriores. A esto se le llama la propiedad de Markov (ver abajo):

\n
\"Markov
\n

Para construir un modelo funcional de cadena de Markov, es esencial definir una matriz de transición Pt. Una matriz de transición contiene la información sobre la probabilidad de pasar entre los distintos estados del sistema. Para que una matriz de transición sea válida, cada fila debe ser un vector de probabilidades y la suma de todos sus términos debe ser 1.

\n

Las matrices de transición tienen la propiedad de que el producto de matrices sucesivas puede describir las probabilidades de transición a lo largo de un intervalo temporal. Por tanto, se puede modelar la probabilidad de estar en un determinado estado tras k pasos calculando lo siguiente:

\n
\"calculation\"
\n

Este tutorial también cubrirá cadenas de Markov absorbentes. Estas aparecen cuando existe al menos un estado que, una vez alcanzado, la probabilidad de permanecer en él es 1 (no puedes salir de él).

\n

¿Qué son las cadenas de Markov absorbentes?

\n

Una cadena de Markov absorbente es una cadena en la que es imposible salir de ciertos estados una vez que entras en ellos. Sin embargo, este es solo uno de los requisitos para que una cadena de Markov sea absorbente. Para que lo sea, todos los demás estados transitorios deben poder llegar al estado absorbente con probabilidad 1.

\n

Las cadenas de Markov absorbentes tienen propiedades específicas que las diferencian de las cadenas de Markov homogéneas en el tiempo. Una de estas propiedades es la forma en que se puede escribir la matriz de transición. Con una cadena con t estados transitorios y r estados absorbentes, la matriz de transición P puede escribirse en forma canónica así:

\n
\"transition
\n

Donde Q es una matriz t x t, R es una matriz t x r, 0 es una matriz nula r x t, e Ir es una matriz identidad r x r. En particular, la descomposición de la matriz de transición en la matriz fundamental permite ciertos cálculos como el número esperado de pasos hasta la absorción desde cada estado. La matriz fundamental N se calcula así:

\n
\"fundamental
\n

Donde It es una matriz identidad t x t

\n

El número esperado de pasos se basa en el concepto de linealidad de la esperanza y se calcula del modo siguiente:

\n
\"expected
\n

Donde 1 es un vector columna de la misma longitud que el número de estados transitorios con todas sus entradas iguales a 1

\n

Además, podemos calcular la probabilidad de ser absorbidos por un estado absorbente concreto al partir de cualquier estado transitorio. Esta probabilidad se calcula así:

\n
\"probability\"
\n

Análisis de la velocidad de ventas

\n

Las cadenas de Markov se usan ampliamente en muchos ámbitos como finanzas, teoría de juegos y genética. No obstante, la base de este tutorial es cómo utilizarlas para modelar la duración del proceso de ventas de una empresa, ya que podría comportarse como un proceso de Markov. De hecho, esto se validó comprobando si las secuencias que detallan las etapas por las que pasó una oportunidad antes de cerrarse con éxito cumplían la propiedad de Markov.

\n

Este análisis asumió que las probabilidades de que una oportunidad avanzara en nuestro proceso de ventas eran constantes de un mes a otro para un sector dado, con el fin de utilizar cadenas de Markov homogéneas en el tiempo. Es decir, una cadena de Markov en la que las probabilidades de transición entre estados se mantienen constantes a medida que pasa el tiempo (aumenta el número de pasos k).

\n

Las probabilidades calculadas fueron las siguientes:

\n
    \n
  • La probabilidad de que una oportunidad pasara de las etapas del representante de ventas a las del account executive frente a permanecer en ellas durante un mes dado.
  • \n
  • La probabilidad de que una oportunidad pasara de las etapas del account executive a cerrarse con éxito frente a permanecer en ellas durante un mes dado.
  • \n
  • La probabilidad de permanecer en un trato cerrado con éxito, que era 1. Por tanto, \"cerrado\" es un estado absorbente.
  • \n
\n

Este análisis se llevó a cabo con el lenguaje de programación R. R tiene un paquete muy útil llamado Markov Chain que puede manejar una gran variedad de tipos de cadenas de Markov.

\n

Para empezar, lo primero fue comprobar si nuestras secuencias de ventas seguían la propiedad de Markov. Para ello, el paquete Markov Chain incluye una función práctica llamada verifyMarkovProperty() que prueba si una secuencia de eventos cumple la propiedad de Markov realizando tests de ji cuadrado sobre una serie de tablas de contingencia derivadas de la secuencia. Valores p altos indican que no debe rechazarse la hipótesis nula de que la secuencia sigue la propiedad de Markov. A continuación se muestra un ejemplo de secuencia de ventas que indica en qué etapa estuvo una oportunidad cada mes desde la primera reunión hasta su cierre:

\n
library(markovchain)\nlibrary(dplyr)\n# SDR Funnel son nuestras etapas del representante de ventas, AE Funnel las etapas del account executive, y CW un trato cerrado con éxito\nseq <- c('SDR Funnel','SDR Funnel','AE Funnel','AE Funnel','AE Funnel','AE Funnel','AE Funnel','AE Funnel','CW')\nverifyMarkovProperty(seq)
\n
## Testing markovianity property on given data sequence\n## Chi - square statistic is: 0.5733333  degrees of freedom are: 27  and corresponding p-value is: 1
\n

Como el valor p mostrado es superior a 0,05, no rechazamos la hipótesis nula de que la secuencia cumple la propiedad de Markov.

\n

Una vez verificado, representamos la estructura de la cadena de Markov junto con las probabilidades de transición derivadas de nuestros datos. Este código instancia un objeto de cadena de Markov definiendo la matriz de transición y los nombres de los estados. También muestra la cadena de Markov y las probabilidades de transición.

\n
source('TransProb.R')\nsource('MatDataBase.R')\nsource('GatherTransMat.R')\ntransElec <- GatherTransMat('Manufacturing','Between 100M and 500M', 'Between 500 and 1k')
\n
print(transElec)\n\nmarkov2 <- new('markovchain',\n              transitionMatrix = transElec, # Estas son las probabilidades de transición de un sector aleatorio\n              states = c('SDR','AE','CW'))\n\nlayout <- matrix(c(0,0,0,1,1,0), ncol = 2, byrow = TRUE)\nplot(markov2, node.size = 10, layout = layout)
\n
##           [,1]      [,2]      [,3]\n## [1,] 0.5573215 0.4426785 0.0000000\n## [2,] 0.0000000 0.8678118 0.1321882\n## [3,] 0.0000000 0.0000000 1.0000000
\n
\"markov
\n

Dado que tenemos una cadena de Markov absorbente, calculamos el tiempo esperado hasta la absorción. La primera entrada del vector devuelve el número esperado de pasos hasta el cierre partiendo del embudo SDR y la segunda entrada devuelve el número esperado si empezamos desde el embudo AE.

\n
# Extraer Q de la matriz de transición\nQ <- transElec[1:2,1:2]\n# Generar It\nIt <- diag(2)\n# Calcular la matriz fundamental\nN <- solve(It-Q)\n# Generar vector columna de 1s\none <- t(t(c(1,1)))\n\n# Calcular los pasos esperados por multiplicación de matrices\nexpected <- N%*%one\nprint(expected)
\n
##          [,1]\n## [1,] 9.823945\n## [2,] 7.564969
\n

También podemos visualizar cómo cambian las probabilidades a medida que aumenta el número de pasos para contrastar el número esperado de pasos. Por ello, comprobamos las probabilidades de que una oportunidad estuviera en cualquiera de las tres etapas durante 24 pasos.

\n
library(ggplot2)\n\ninitState <- c(1,0,0) # El estado inicial será el embudo SDR (simulando fijar una primera reunión de descubrimiento)\n\n# Iniciar vectores de probabilidad\nSDRProb <- c()\nAEProb <- c()\nCW <- c()\n\n# Calcular probabilidades para 24 pasos.\nfor(k in 1:24){\n  nsteps <- initState*markov2^k\n  SDRProb[k] <- nsteps[1,1]\n  AEProb[k] <- nsteps[1,2]\n  CW[k] <- nsteps[1,3]\n}\n\n# Crear data frames y combinarlos\nSDRProb <- as.data.frame(SDRProb)\nSDRProb$Group <- 'SDR'\nSDRProb$Iter <- 1:24\nnames(SDRProb)[1] <- 'Value'\n\nAEProb <- as.data.frame(AEProb)\nAEProb$Group <- 'AE'\nAEProb$Iter <- 1:24\nnames(AEProb)[1] <- 'Value'\n\nCW <- as.data.frame(CW)\nCW$Group <- 'CW'\nCW$Iter <- 1:24\nnames(CW)[1] <- 'Value'\n\nsteps <- rbind(SDRProb,AEProb,CW)\n\n# Representar las probabilidades con ggplot\nggplot(steps, aes(x = Iter, y = Value, col = Group))+\n  geom_line() +\n  xlab('Chain Step') +\n  ylab('Probability') +\n  ggtitle('24 Step Chain Probability Prediction')+\n  theme(plot.title = element_text(hjust = 0.5))
\n
\"graph\"
\n

Si combinamos ambos resultados, parece evidente que el estado CW se convierte en el más probable tras 6–9 pasos. Dado que las probabilidades de transición son mensuales, puedes defender que la velocidad de ventas típica desde la cita inicial hasta el cierre con éxito para ese sector puede estar entre 6 y 9 meses. Es un proceso de ventas bastante largo.

\n

Conclusión

\n

El objetivo de este análisis era mostrar cómo los principios básicos de las cadenas de Markov y las cadenas de Markov absorbentes pueden usarse para responder a una pregunta relevante para el negocio. En este caso, los resultados fueron bastante precisos a pesar de las suposiciones de homogeneidad temporal, ya que análisis empíricos posteriores revelaron que la velocidad media de ventas para el sector utilizado fue de 208 días, casi 7 meses. Ojalá este ejemplo te anime a seguir explorando las cadenas de Markov por tu cuenta y a aplicarlas a tus preguntas de negocio.

\n

Si te interesa aprender más sobre R, haz el curso Intermediate R de DataCamp.

\n

Echa un vistazo a nuestro Markov chains in Python: beginner tutorial.

Temas
R
Ciencia de datos

Cursos de R

Curso

Introducción a R

4 h
3.1M
Domina los fundamentos del análisis de datos en R, como vectores, listas y marcos de datos, y practica R con conjuntos de datos reales.
Ver detallesRight Arrow
Iniciar Curso
Ver másRight Arrow
Relacionado

Tutorial

Tutorial de regresión lineal en R

En este tutorial aprenderás los fundamentos de un modelo estadístico muy popular: la regresión lineal.

Eladio Montero Porras

15 min

multiple linear regression

Tutorial

Regresión lineal múltiple en R: tutorial con ejemplos

Una visión completa para entender las regresiones lineales múltiples en R a través de ejemplos.
Zoumana Keita 's photo

Zoumana Keita

12 min

Tutorial

Tutorial de K-Means Clustering en R

Aprenda qué es k-means y descubra por qué es uno de los algoritmos de agrupación más utilizados en la ciencia de datos.
Eugenia Anello's photo

Eugenia Anello

8 min

Tutorial

Tutorial de tablas de contingencia en R

En este tutorial, aprenderás a crear tablas de contingencia y a probar y cuantificar las relaciones visibles en ellas.
Łukasz Deryło's photo

Łukasz Deryło

10 min

Tutorial

Creación de modelos de redes neuronales (NN) en R

En este tutorial, aprenderá a crear un modelo de Red Neuronal en R.
Abid Ali Awan's photo

Abid Ali Awan

10 min

Tutorial

Tutorial de Markdown en Jupyter Notebook

En este tutorial, aprenderás a utilizar y escribir con diferentes etiquetas de marcado utilizando Jupyter Notebook.

Olivia Smith

9 min

Ver MásVer Más