Inteligencia Artificial

Reglas de asociación de servicios geomáticos

Author

Dr. Jorge Párraga Álava

Maestria en Geomática

Introducción

GeoTech Solutions es una empresa de vanguardia en servicios geomáticos que opera en una amplia gama de entornos geográficos, incluyendo áreas urbanas, rurales, costeras y montañosas. La empresa se caracteriza por un trabajo basado en la recopilación y análisis de datos precisos y detallados, adaptados a la complejidad de cada entorno. Por ejemplo, cuando una municipalidad recurre a GeoTech Solutions para un proyecto de planificación urbana, se genera una base de datos transaccional robusta cuya proceso se puede entender mejor con el detalle siguiente:

  1. Consulta inicial: La municipalidad solicita un mapeo detallado de una zona de 50 km² para planificar nuevas infraestructuras.

  2. Evaluación de necesidades: Los consultores de GeoTech determinan que el proyecto requiere:

    • Imágenes satelitales de alta resolución para una visión general del área.

    • Levantamiento topográfico con GPS para puntos de control precisos.

    • Escaneo LIDAR para crear un modelo de elevación digital detallado.

    • Uso de drones para capturar imágenes de áreas específicas de interés.

    • Procesamiento de datos para integrar toda la información.

    • Análisis espacial para identificar zonas adecuadas para desarrollo.

    • Creación de un SIG para que la municipalidad pueda gestionar los datos.

  3. Propuesta y contratación: GeoTech presenta una propuesta que incluye todos estos servicios, y la municipalidad la acepta.

  4. Ejecución del proyecto: GeoTech lleva a cabo todos los servicios contratados a lo largo de varias semanas.

  5. Registro en la base de datos: Una vez completado el proyecto, se registra en la base de datos de transacciones de GeoTech como una sola entrada que incluye todos los servicios utilizados:

    • Imagen_Satelital, GPS, Lidar, Drone, Procesamiento_Datos, Analisis_Espacial, SIG

GeoTech quiere que, a partir de su base de datos transaccional, se pueda utilizar el análisis de reglas de asociación para:

  • Identificar patrones en la demanda de servicios para mejorar la previsión y la planificación de recursos.

  • Descubrir combinaciones de servicios frecuentemente solicitadas para crear paquetes de servicios atractivos.

En este tutorial implementaremos el algoritmo Apriori para identificar las reglas de asociación entre los diferentes servicios que GeoTech ofrece.

Etapa 1: Dominio del problema

En esta etapa inicial, se define el contexto del negocio de GeoTech Solutions y se identifican los 15 servicios geomáticos que la empresa ofrece. Se establece el objetivo de descubrir reglas de asociación entre estos servicios para mejorar la planificación de recursos y crear paquetes de servicios atractivos.

El dataset proporcionado incluye el siguiente conjunto de ítems:

  1. GPS: Levantamiento preciso de puntos geográficos mediante tecnología GPS para control y referencia topográfica.

  2. Imagen_Satelital: Captura de imágenes de alta resolución desde satélites para análisis y mapeo detallado de áreas extensas.

  3. SIG: Desarrollo de Sistemas de Información Geográfica para la gestión y análisis de datos espaciales integrados.

  4. Lidar: Escaneo láser para generar modelos de elevación digital detallados y mapas tridimensionales del terreno.

  5. Drone: Captura de imágenes y videos aéreos de alta precisión para inspección y mapeo de áreas específicas.

  6. Fotogrametría: Creación de mapas y modelos 3D a partir de fotografías aéreas tomadas desde aviones o drones.

  7. Topografía: Medición y representación detallada de las características físicas del terreno para proyectos de construcción y planificación.

  8. Cartografía: Producción de mapas temáticos y topográficos detallados para diversas aplicaciones geográficas.

  9. Geodesia: Estudio y medición de la forma y dimensiones de la Tierra para aplicaciones precisas de posicionamiento.

  10. Batimetría: Mapeo de la profundidad y características del lecho marino o fluvial mediante sondeos y sensores.

  11. Teledetección: Análisis de datos obtenidos desde sensores remotos para la evaluación y monitoreo de recursos naturales.

  12. Procesamiento_Datos: Integración y análisis de grandes volúmenes de datos geoespaciales para generar información útil.

  13. Análisis_Espacial: Evaluación de relaciones y patrones en datos geográficos para la toma de decisiones estratégicas.

  14. Modelado_3D: Creación de representaciones tridimensionales de paisajes, edificios o infraestructuras para simulación y planificación.

  15. Ortofotografía: Producción de imágenes aéreas corregidas geométricamente para representaciones precisas del terreno.

A partir de la información proporcionada, se responde lo siguiente:

  1. ¿Qué exactamente deseamos hacer?

Descubir reglar de asociación entre los diferentes servicios que GeoTech ofrece.

  1. ¿Es factible alcanzar lo que buscamos con los datos disponibles?

Si, el tener un dataset transaccional y disponer de 15 ítems sobre los servicios, parecen ser suficiente para alcanzar el proceso de análisis de asociación.

  1. ¿Cómo podemos lograrlo?

Aplicar algoritmo A priori para encontrar las reglas de asociación.

  1. ¿Qué tipo de problema se va a resolver?

Problema de asociación.

  1. ¿El objetivo es?

Identificar reglas de asociación.

Configuración Inicial

Code
# Bibliotecas -------------------------------------------------------------
if(!require(arules)) install.packages("arules")
if(!require(arulesViz)) install.packages("arulesViz")
if(!require(tidyverse)) install.packages("tidyverse")
if(!require(gridExtra)) install.packages("gridExtra")

# Config -------------------------------------------------------------
# Para notación no numérica.
options(scipen=999) 
# Para reproducibilidad.
set.seed(2024) 

Etapa 2 y 3: Adquisición y preprocesamiento

En esta etapa se obtiene el conjunto de datos transaccionales que registra los servicios utilizados en cada proyecto de GeoTech Solutions. Estos datos se cargan desde un archivo CSV. Para el procesamiento los datos se preparan para el análisis convirtiendo las columnas a valores lógicos y transformando el dataframe en un objeto de transacciones adecuado para el algoritmo Apriori.

Code
# Leer el archivo CSV
df_transacciones <- read.csv("Datos/datos_transacciones.csv", stringsAsFactors = FALSE)

# Convertir las columnas a lógicas
df_transacciones[] <- lapply(df_transacciones, function(x) as.logical(x == "TRUE"))

# Convertir el dataframe a un objeto de transacciones
transacciones <- as(df_transacciones, "transactions")

# Mostrar un resumen de los datos
summary(transacciones) 
transactions as itemMatrix in sparse format with
 10000 rows (elements/itemsets/transactions) and
 15 columns (items) and a density of 0.3341867 

most frequent items:
              Drone                 GPS          Topografia Procesamiento_Datos 
               6512                5505                4285                4276 
                SIG             (Other) 
               4178               25372 

element (itemset/transaction) length distribution:
sizes
   3    4    5    6    7 
1967 2007 2022 1939 2065 

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  3.000   4.000   5.000   5.013   6.000   7.000 

includes extended item information - examples:
            labels        variables levels
1              GPS              GPS   TRUE
2 Imagen_Satelital Imagen_Satelital   TRUE
3              SIG              SIG   TRUE

includes extended transaction information - examples:
  transactionID
1             1
2             2
3             3

Etapa 4 y 5: Modelado y validación

Aquí, se aplica el algoritmo Apriori para generar reglas de asociación bajo tres escenarios con diferentes umbrales de soporte y confianza. Luego, se podan las reglas redundantes para obtener conjuntos más manejables y relevantes de reglas.

Code
# Función para generar reglas
generar_reglas <- function(soporte, confianza) {
  apriori(transacciones, parameter = list(supp = soporte, 
                                          conf = confianza, 
                                          minlen = 2))
}

# Generar reglas para los tres escenarios
reglas_1 <- generar_reglas(0.05, 0.45)
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen
       0.45    0.1    1 none FALSE            TRUE       5    0.05      2
 maxlen target  ext
     10  rules TRUE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 500 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[15 item(s), 10000 transaction(s)] done [0.01s].
sorting and recoding items ... [15 item(s)] done [0.00s].
creating transaction tree ... done [0.01s].
checking subsets of size 1 2 3 4 done [0.00s].
writing ... [127 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
Code
reglas_2 <- generar_reglas(0.10, 0.50)
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen
        0.5    0.1    1 none FALSE            TRUE       5     0.1      2
 maxlen target  ext
     10  rules TRUE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 1000 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[15 item(s), 10000 transaction(s)] done [0.01s].
sorting and recoding items ... [15 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 done [0.00s].
writing ... [42 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
Code
reglas_3 <- generar_reglas(0.15, 0.65)
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen
       0.65    0.1    1 none FALSE            TRUE       5    0.15      2
 maxlen target  ext
     10  rules TRUE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 1500 

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[15 item(s), 10000 transaction(s)] done [0.01s].
sorting and recoding items ... [15 item(s)] done [0.00s].
creating transaction tree ... done [0.01s].
checking subsets of size 1 2 3 done [0.00s].
writing ... [4 rule(s)] done [0.00s].
creating S4 object  ... done [0.00s].
Code
# Mostrar las reglas generadas
inspect(head(reglas_1))
    lhs                    rhs     support confidence coverage lift      count
[1] {Fotogrametria}     => {GPS}   0.1214  0.5319895  0.2282   0.9663751 1214 
[2] {Fotogrametria}     => {Drone} 0.1428  0.6257669  0.2282   0.9609442 1428 
[3] {Teledeteccion}     => {GPS}   0.1216  0.5307726  0.2291   0.9641646 1216 
[4] {Teledeteccion}     => {Drone} 0.1455  0.6350938  0.2291   0.9752670 1455 
[5] {Analisis_Espacial} => {GPS}   0.1224  0.5284974  0.2316   0.9600316 1224 
[6] {Analisis_Espacial} => {Drone} 0.1502  0.6485320  0.2316   0.9959029 1502 
Code
inspect(head(reglas_2))
    lhs                    rhs     support confidence coverage lift      count
[1] {Fotogrametria}     => {GPS}   0.1214  0.5319895  0.2282   0.9663751 1214 
[2] {Fotogrametria}     => {Drone} 0.1428  0.6257669  0.2282   0.9609442 1428 
[3] {Teledeteccion}     => {GPS}   0.1216  0.5307726  0.2291   0.9641646 1216 
[4] {Teledeteccion}     => {Drone} 0.1455  0.6350938  0.2291   0.9752670 1455 
[5] {Analisis_Espacial} => {GPS}   0.1224  0.5284974  0.2316   0.9600316 1224 
[6] {Analisis_Espacial} => {Drone} 0.1502  0.6485320  0.2316   0.9959029 1502 
Code
inspect(head(reglas_3))
    lhs                           rhs     support confidence coverage lift    
[1] {Procesamiento_Datos}      => {Drone} 0.2782  0.6506080  0.4276   0.999091
[2] {GPS}                      => {Drone} 0.3625  0.6584923  0.5505   1.011198
[3] {GPS, Procesamiento_Datos} => {Drone} 0.1514  0.6574034  0.2303   1.009526
[4] {GPS, Topografia}          => {Drone} 0.1533  0.6576577  0.2331   1.009917
    count
[1] 2782 
[2] 3625 
[3] 1514 
[4] 1533 

El algoritmo A priori encontró 127, 42, y 4 reglas para el primero, segundo y tercer escenario, respectivamente. Ahora podamos las reglas para encontrar las más relevantes.

Code
podar_reglas <- function(reglas) {
  # Si no hay reglas, retornar el conjunto vacío
  if(length(reglas) == 0) return(reglas)
  # Ordenar las reglas por lift en orden descendente
  reglas_ordenadas <- sort(reglas, by = "lift", decreasing = TRUE)
  # Inicializar un vector para marcar reglas a mantener
  reglas_a_mantener <- rep(TRUE, length(reglas_ordenadas))
  # Comparar cada regla con las demás
  for(i in 1:(length(reglas_ordenadas) - 1)) {
    if(reglas_a_mantener[i]) {
      for(j in (i+1):length(reglas_ordenadas)) {
        if(reglas_a_mantener[j]) {
          # Verificar si la regla j es un subconjunto de la regla i
          if(all(is.subset(reglas_ordenadas[j], reglas_ordenadas[i]))) {
            reglas_a_mantener[j] <- FALSE
          }
        }
      }
    }
  }
  
  # Retornar solo las reglas no redundantes
  return(reglas_ordenadas[reglas_a_mantener])
}


# Podar las reglas redundantes
reglas_podadas_1 <- podar_reglas(reglas_1)
reglas_podadas_1
set of 64 rules 
Code
reglas_podadas_2 <- podar_reglas(reglas_2)
reglas_podadas_2
set of 28 rules 
Code
reglas_podadas_3 <- podar_reglas(reglas_3)
reglas_podadas_3
set of 3 rules 

Se evalúan las reglas generadas, comparando los resultados antes y después del podado. Se interpretan las reglas más significativas en términos de soporte, confianza y lift.

Luego del proceso de podado se observa que las reglas no redundantes son 64, 28 y 3, para los escenarios 1, 2, y 3, respectivamente. Denotando que hay una reducción significativa de reglas. Comparamos ahora las reglas antes y después del podado.

Code
# Función para mostrar reglas de manera legible
mostrar_reglas <- function(reglas, titulo, n = 5) {
  cat("\n", titulo, "\n")
  cat("Número total de reglas:", length(reglas), "\n")
  
  if(length(reglas) == 0) {
    cat("No se generaron reglas con los umbrales especificados.\n")
    return()
  }
  
  cat("Mostrando las top", min(n, length(reglas)), "reglas por lift:\n\n")
  
  top_reglas <- head(sort(reglas, by = "lift"), n)
  reglas_df <- as(top_reglas, "data.frame")
  
  for(i in 1:nrow(reglas_df)) {
    cat("Regla", i, ":\n")
    cat("  Regla:", as.character(reglas_df$rules[i]), "\n") 
    cat("  Soporte:", round(reglas_df$support[i], 4), "\n")
    cat("  Confianza:", round(reglas_df$confidence[i], 4), "\n")
    cat("  Lift:", round(reglas_df$lift[i], 4), "\n\n")
  }
}

# Mostrar reglas para cada escenario antes y después del podado
mostrar_reglas(reglas_1, "Escenario 1 - Antes del podado")

 Escenario 1 - Antes del podado 
Número total de reglas: 127 
Mostrando las top 5 reglas por lift:

Regla 1 :
  Regla: {GPS,Analisis_Espacial} => {Drone} 
  Soporte: 0.0825 
  Confianza: 0.674 
  Lift: 1.035 

Regla 2 :
  Regla: {Imagen_Satelital,Drone} => {GPS} 
  Soporte: 0.0826 
  Confianza: 0.5693 
  Lift: 1.0341 

Regla 3 :
  Regla: {GPS,SIG,Topografia} => {Drone} 
  Soporte: 0.0615 
  Confianza: 0.6707 
  Lift: 1.0299 

Regla 4 :
  Regla: {GPS,Topografia,Procesamiento_Datos} => {Drone} 
  Soporte: 0.0627 
  Confianza: 0.667 
  Lift: 1.0243 

Regla 5 :
  Regla: {GPS,SIG} => {Drone} 
  Soporte: 0.1474 
  Confianza: 0.6604 
  Lift: 1.0141 
Code
mostrar_reglas(reglas_podadas_1, "Escenario 1 - Después del podado")

 Escenario 1 - Después del podado 
Número total de reglas: 64 
Mostrando las top 5 reglas por lift:

Regla 1 :
  Regla: {GPS,Analisis_Espacial} => {Drone} 
  Soporte: 0.0825 
  Confianza: 0.674 
  Lift: 1.035 

Regla 2 :
  Regla: {Imagen_Satelital,Drone} => {GPS} 
  Soporte: 0.0826 
  Confianza: 0.5693 
  Lift: 1.0341 

Regla 3 :
  Regla: {GPS,SIG,Topografia} => {Drone} 
  Soporte: 0.0615 
  Confianza: 0.6707 
  Lift: 1.0299 

Regla 4 :
  Regla: {GPS,Topografia,Procesamiento_Datos} => {Drone} 
  Soporte: 0.0627 
  Confianza: 0.667 
  Lift: 1.0243 

Regla 5 :
  Regla: {GPS,SIG,Modelado_3D} => {Drone} 
  Soporte: 0.0578 
  Confianza: 0.6553 
  Lift: 1.0063 
Code
mostrar_reglas(reglas_2, "Escenario 2 - Antes del podado")

 Escenario 2 - Antes del podado 
Número total de reglas: 42 
Mostrando las top 5 reglas por lift:

Regla 1 :
  Regla: {GPS,SIG} => {Drone} 
  Soporte: 0.1474 
  Confianza: 0.6604 
  Lift: 1.0141 

Regla 2 :
  Regla: {Drone} => {GPS} 
  Soporte: 0.3625 
  Confianza: 0.5567 
  Lift: 1.0112 

Regla 3 :
  Regla: {GPS} => {Drone} 
  Soporte: 0.3625 
  Confianza: 0.6585 
  Lift: 1.0112 

Regla 4 :
  Regla: {GPS,Topografia} => {Drone} 
  Soporte: 0.1533 
  Confianza: 0.6577 
  Lift: 1.0099 

Regla 5 :
  Regla: {GPS,Procesamiento_Datos} => {Drone} 
  Soporte: 0.1514 
  Confianza: 0.6574 
  Lift: 1.0095 
Code
mostrar_reglas(reglas_podadas_2, "Escenario 2 - Después del podado")

 Escenario 2 - Después del podado 
Número total de reglas: 28 
Mostrando las top 5 reglas por lift:

Regla 1 :
  Regla: {GPS,SIG} => {Drone} 
  Soporte: 0.1474 
  Confianza: 0.6604 
  Lift: 1.0141 

Regla 2 :
  Regla: {GPS,Topografia} => {Drone} 
  Soporte: 0.1533 
  Confianza: 0.6577 
  Lift: 1.0099 

Regla 3 :
  Regla: {GPS,Procesamiento_Datos} => {Drone} 
  Soporte: 0.1514 
  Confianza: 0.6574 
  Lift: 1.0095 

Regla 4 :
  Regla: {SIG,Topografia} => {Drone} 
  Soporte: 0.112 
  Confianza: 0.6557 
  Lift: 1.007 

Regla 5 :
  Regla: {Topografia,Procesamiento_Datos} => {Drone} 
  Soporte: 0.1152 
  Confianza: 0.6557 
  Lift: 1.0069 
Code
mostrar_reglas(reglas_3, "Escenario 3 - Antes del podado")

 Escenario 3 - Antes del podado 
Número total de reglas: 4 
Mostrando las top 4 reglas por lift:

Regla 1 :
  Regla: {GPS} => {Drone} 
  Soporte: 0.3625 
  Confianza: 0.6585 
  Lift: 1.0112 

Regla 2 :
  Regla: {GPS,Topografia} => {Drone} 
  Soporte: 0.1533 
  Confianza: 0.6577 
  Lift: 1.0099 

Regla 3 :
  Regla: {GPS,Procesamiento_Datos} => {Drone} 
  Soporte: 0.1514 
  Confianza: 0.6574 
  Lift: 1.0095 

Regla 4 :
  Regla: {Procesamiento_Datos} => {Drone} 
  Soporte: 0.2782 
  Confianza: 0.6506 
  Lift: 0.9991 
Code
mostrar_reglas(reglas_podadas_3, "Escenario 3 - Después del podado")

 Escenario 3 - Después del podado 
Número total de reglas: 3 
Mostrando las top 3 reglas por lift:

Regla 1 :
  Regla: {GPS} => {Drone} 
  Soporte: 0.3625 
  Confianza: 0.6585 
  Lift: 1.0112 

Regla 2 :
  Regla: {GPS,Topografia} => {Drone} 
  Soporte: 0.1533 
  Confianza: 0.6577 
  Lift: 1.0099 

Regla 3 :
  Regla: {GPS,Procesamiento_Datos} => {Drone} 
  Soporte: 0.1514 
  Confianza: 0.6574 
  Lift: 1.0095 

De las reglas obtenidas para el escenario 3 podemos mencionar, por ejemplo:

Regla 1:

El soporte del 36.25% indica que en el 36.25% de todos los proyectos registrados en la base de datos de GeoTech, se utilizaron tanto GPS como drones. Este es un soporte relativamente alto, lo que sugiere que la combinación de GPS y drones es bastante común en los proyectos de la empresa.

La confianza del 65.85% indica que, entre todos los proyectos que utilizan GPS, el 65.85% también utilizan drones. Esto demuestra una relación bastante fuerte entre el uso de GPS y drones en los proyectos de GeoTech.

El lift de 1.0112 indica que la probabilidad de utilizar drones en un proyecto aumenta ligeramente si ya se está utilizando GPS. Aunque este lift es apenas superior a 1, lo que indica una leve relación positiva, no sugiere una dependencia fuerte.

Visualización

Ahora se crean visualizaciones de las reglas de asociación utilizando gráficos de red para cada escenario, lo que permite una interpretación visual de las relaciones entre los servicios:

Code
# Función para visualizar reglas en un gráfico de red
visualizar_reglas_red <- function(reglas, titulo) {
  if(length(reglas) == 0) {
    cat("No se pueden visualizar reglas para:", titulo, "\n")
    cat("No se generaron reglas con los umbrales especificados.\n")
    return()
  }
  plot(reglas, method = "graph", 
       control = list(type = "items"), 
       main = titulo)
}

# Visualizar reglas en gráfico de red para cada escenario después del podado
visualizar_reglas_red(head(sort(reglas_podadas_1, by = "lift"), 5), 
                      "Top 5 Reglas - Escenario 1 (Después del podado)")
Available control parameters (with default values):
layout   =  stress
circular     =  FALSE
ggraphdots   =  NULL
edges    =  <environment>
nodes    =  <environment>
nodetext     =  <environment>
colors   =  c("#EE0000FF", "#EEEEEEFF")
engine   =  ggplot2
max  =  100
verbose  =  FALSE

Code
visualizar_reglas_red(head(sort(reglas_podadas_2, by = "lift"), 5), 
                      "Top 5 Reglas - Escenario 2 (Después del podado)")
Available control parameters (with default values):
layout   =  stress
circular     =  FALSE
ggraphdots   =  NULL
edges    =  <environment>
nodes    =  <environment>
nodetext     =  <environment>
colors   =  c("#EE0000FF", "#EEEEEEFF")
engine   =  ggplot2
max  =  100
verbose  =  FALSE

Code
visualizar_reglas_red(head(sort(reglas_podadas_3, by = "lift"), 5), 
                      "Top 5 Reglas - Escenario 3 (Después del podado)")
Available control parameters (with default values):
layout   =  stress
circular     =  FALSE
ggraphdots   =  NULL
edges    =  <environment>
nodes    =  <environment>
nodetext     =  <environment>
colors   =  c("#EE0000FF", "#EEEEEEFF")
engine   =  ggplot2
max  =  100
verbose  =  FALSE

Los gráficos representan las reglas de asociación generadas por el algoritmo Apriori para los servicios geoespaciales. En el caso del escenario 3 tenemos:

Nodos: Cada nodo representa una regla en análisis.

Conexiones: Las líneas que conectan los nodos representan las reglas de asociación entre estos servicios. La dirección de las flechas indica la relación entre los ítems en las reglas (de antecedente a consecuente).

Tamaño de los nodos: El tamaño de los nodos representa el soporte (support) de cada ítem. La leyenda a la derecha muestra que el soporte varía de 0.20 a 0.35. El nodo “Drone” es el más grande, lo que sugiere que es el servicio más frecuente en las transacciones.

Color de las conexiones: El color de las líneas representa el lift de las reglas. La escala de colores a la derecha muestra que el lift varía de aproximadamente 1.0096 a 1.0108. El color rojo más intenso indica un lift más alto, lo que sugiere una asociación más fuerte entre los ítems.

Interpretación de las reglas: La regla más fuerte parece ser la que conecta “Drone” con el nodo central, dado su color rojo intenso. Hay asociaciones entre “Drone” y los otros servicios (GPS, Topografía, Procesamiento_Datos), pero parecen ser menos fuertes (colores más claros).

A partir de este análisis de asociación se puede inferir que:

  1. El servicio de Drones parece ser el más frecuente y central en las asociaciones.

  2. Existen asociaciones entre los servicios de Drones, GPS, Topografía y Procesamiento de Datos.

  3. Las asociaciones son relativamente fuertes, con valores de lift ligeramente superiores a 1, lo que indica que estos servicios tienden a ser contratados juntos más de lo que se esperaría por azar.

  4. El gráfico sugiere que cuando los clientes contratan servicios de Drones, es probable que también contraten otros servicios relacionados, especialmente GPS y Procesamiento de Datos.

Finalmente podemos observar los items mas frecuentes en la base de datos:

Code
# 
itemFrequency(transacciones, type = "absolute")
                GPS    Imagen_Satelital                 SIG               Lidar 
               5505                2344                4178                2407 
              Drone       Fotogrametria          Topografia         Cartografia 
               6512                2282                4285                2365 
           Geodesia          Batimetria       Teledeteccion Procesamiento_Datos 
               2405                2352                2291                4276 
  Analisis_Espacial         Modelado_3D      Ortofotografia 
               2316                4104                2506 
Code
itemFrequencyPlot(transacciones, topN = 10, type = "relative",
                  main = "Top 10 Servicios Geomáticos más Frecuentes")

El gráfico indica que el servicio más requerido es el de drones, mientras que el servicio de cartografía es el menos solicitado. Esta diferencia en la demanda puede reflejar varias tendencias y necesidades en el campo de los servicios geomáticos.