es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Probabilidades de transición para toda la tabla.

Tengo un df con la siguiente estructura:

sid step1 step2 step3 . . . . . step30

El “sid” es un id y los pasos son pasos a través de una página web donde:

  1. sids con un mínimo de dos pasos
  2. sids con un máximo de treinta pasos
  3. no hay páginas secuenciales duplicadas (es decir, actualizaciones de página)
  4. los pasos son todos tipos de objetos de cadena

Quiero crear esencialmente una probabilidad de transición total donde para cada página única, obtengo una tabla/matriz que tiene una probabilidad de transición para cada posible página.

Tengo alrededor de ~3k páginas únicas, así que no sé si esto será factible computacionalmente.

Estaría bien también pasar algunas páginas como argumento para la matriz, para que no sea una matriz de 3000×3000 y tal vez una de 1×3000 o 5×3000. De hecho, preferiría empezar así y escalar hasta que se bloquee :).

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Enfoque

    Para lograr el resultado deseado, debemos seguir algunos pasos como se mencionan a continuación:

    1. Subconjunto de datos para satisfacer los criterios mínimos y máximos de pasos
    2. Eliminar páginas duplicadas consecutivas
    3. Crear una lista de páginas únicas
    4. Crear una tabla/matriz de probabilidad de transición para cada página posible individual
    5. Subconjunto de tabla/matriz de probabilidad de transición para páginas elegidas

    Subconjunto de datos para satisfacer los criterios mínimos y máximos de pasos

    df_filtrado <- df %>%
                    group_by(sid) %>%
                    filter(n() >= 2 & n() <= 30) %>%
                    ungroup()
    

    Eliminar páginas duplicadas consecutivas

    df_sin_duplicados <- df_filtrado %>%
                            filter(step1 != lag(step30, default = NA)) %>%
                            drop_na()
    

    Crear una lista de páginas únicas

    paginas_unicas <- sort(unique(unlist(df_sin_duplicados %>% 
                                           select(starts_with("step")))))
    

    Crear una tabla/matriz de probabilidad de transición para cada página posible individual

    library(dplyr)
    library(tidyr)
    
    probabilidad_transicion <- df_sin_duplicados %>%
                          select(starts_with("step")) %>%
                          pivot_longer(cols = everything(), 
                                       names_to = "step", 
                                       values_to = "page") %>%
                          group_by(step) %>%
                          mutate(next_page = lead(page, default = NA)) %>%
                          drop_na() %>%
                          count(page, next_page) %>%
                          ungroup() %>%
                          mutate(transition_probability = n/sum(n))
    

    Subconjunto de tabla/matriz de probabilidad de transición para páginas elegidas

    # Para 5 páginas elegidas
    paginas_elegidas <- c("page1", "page5", "page10", "page20", "page30")
    probabilidad_transicion_subconjunto <- probabilidad_transicion %>%
                                filter(page %in% paginas_elegidas,
                                       next_page %in% paginas_elegidas)
    

    Si la tabla/matriz de probabilidad de transición sigue siendo computacionalmente inviable, podemos considerar la agregación de páginas similares o la eliminación de páginas con probabilidades de transición muy bajas.

Comments are closed.