Preparar datos de entrada en formato CSV y log de accesos web con R. Funciones y ejemplos para filtrar datos, obtener estadísticas y otros valores útiles para el tratamiento de ficheros de accesos web (habitualmente generados por servidores web Apache, Nginx, Tomcat, IIS). Mostramos ejemplos para filtrar resultados, agrupar, sumar, media, mediana, desarrollamos una función con un bucle para obtener datos geográficos de una IP (región, país, ciudad), utilizamos JSON en R, etc.

Requisitos para tratamiento de ficheros de logs de accesos web con R

El requisito único será disponer de R y RStudio, así como de sus librerías básicas. En el siguiente artículo explicamos cómo instalar R, RStudio y sus librerías básicas:

Dispondremos de uno o varios ficheros de log de accesos web, generados habitualmente por servidores web como Apache, Nginx, Tomcat, IIS, etc. Con el formato:

Descargaremos estos ficheros de log en la carpeta donde crearemos el proyecto R. Desde RStudio, estableceremos esta carpeta como la carpeta de trabajo, para no tener que indicar las rutas en el código R. En nuestro caso trabajaremos con el fichero log_http.csv (disponible en la descarga del código fuente R del ejemplo completo).

Requisitos para tratamiento de ficheros de logs de accesos web con R

Instalar librerías necesarias para el proyecto R y configuración inicial de los datos leídos

Abriremos RStudio, asignaremos el directorio de trabajo (como hemos indicado anteriormente) e instalaremos las siguientes librerías R: readr, jsonlite, tzdb. Con los comandos:

Las usaremos con los comandos:

Realizaremos una primera lectura del fichero de log log_http.csv, que guardaremos en una variable y mostraremos en R, con el código R:

RStudio leerá los valores del fichero de log y los mostrará en forma de tabla. Dará algunos warning que son normales, por el tipo de datos y valores nulos:

Instalar librerías necesarias para el proyecto R y configuración inicial de los datos leídos

A continuación ejecutaremos el siguiente comando para obtener un resumen preliminar de los datos leídos:

Nos mostrará todas las columnas del dataset, el nombre que le ha asignado de forma automática, el tipo de datos y el tamaño:

Instalar librerías necesarias para el proyecto R y configuración inicial de los datos leídos

Comprobamos el número de columnas, número de filas, primeros registros (elementos) y tipo de datos de cada fila con:

Instalar librerías necesarias para el proyecto R y configuración inicial de los datos leídos

Para mostrar solo el nombre de las columnas del dataset:

Podremos cambiar el nombre de las columnas con el siguiente código, dejando las columnas ip, fecha, tipo, url, protocolo, codigo_retorno y tamano_respuesta:

A continuación formatearemos los campos (columnas) si fuera necesario, sobre todo para establecer el tipo de datos correcto para su manipulación. A continuación mostramos el código R para:

  • ip: estableceremos este campo a factor.
  • protocolo: estableceremos este campo a factor.
  • codigo_retorno: estableceremos este campo a factor.
  • tamano_respuesta: estableceremos este campo a numérico. En este caso dará algunos warning: NAs introduced by coercion, debido a que habrá valores nulos, los ignoraremos.

Al volver a hacer un summary, nos mostrará los nuevos nombres de columnas, los nuevos tipos de datos e incluso en la columna numérica (tamano_respuesta) nos calculará el mínimo, el máximo, la media, la mediana (media de las dos posiciones centrales), el primer cuartil (mediana de la primera mitad de los valores) y el número de campos con nulo. Para los campos de tipo factor nos mostrará agrupados los valores y el número de apariciones (de los primeros).

Instalar librerías necesarias para el proyecto R y configuración inicial de los datos leídos

Continuamos formateando y revisando columnas y valores, para optimizar al máximo los resultados de la manipulación posterior. Por ejemplo, reemplazar los valores NA (nulos) de la columna tamano_respuesta por 0. En primer lugar mostraremos todos los valores del campo «tamano_respuesta», con:

Para mostrar sólo un valor concreto de un campo en una posición usaremos:

En los ejemplos anteriores se mostrará el valor del campo «tamano_respuesta» en la posición 1 y en la posición 11, que nos devolverá para nuestro dataset:

1497
NA

Para convertir los valores NA del campo tamano_respuesta a 0, usaremos:

Análisis de la información, filtros, sumatorios, búsquedas, funciones, geolocalización de IP en R

Una vez configurada la información a tratar (nombres de columnas, tipos de datos, nulos, etc.) iniciaremos el tratamiento propiamente dicho. A continuación mostramos el código fuente en R, comentado, indicando las operaciones realizadas para obtener sumatorios, filtros, agrupaciones, etc. Indicaremos la pregunta (el ejercicio de ejemplo) y su solución.

Empezamos con la suma de todos los valores del campo «tamano_respuesta» y de la media, también mostramos cómo evitar los nulos (NA), si los hubiera:

Análisis de la información, filtros, sumatorios, búsquedas, funciones, geolocalización de IP en R

¿Cuál es la IP/Dominio origen con mayor número de peticiones de código de retorno 200?

Análisis de la información, filtros, sumatorios, búsquedas, funciones, geolocalización de IP en R

¿Cuál es el número total de IP/Dominios únicas (no repetidas)?

¿Cuál es la frecuencia de aparición de cada IP/Dominio del dsLog completo?

Ejercicio para filtrar información. Dada una IP/Dominio, mostrar la URL y el código de retorno:

Análisis de la información, filtros, sumatorios, búsquedas, funciones, geolocalización de IP en R

De las IP/Dominios de origen que acceden al servidor ¿cuántas pertenecen a un dominio de tipo .com?

Análisis de la información, filtros, sumatorios, búsquedas, funciones, geolocalización de IP en R

¿Cuántas peticiones ha habido a cada IP .com de las anteriores?

Análisis de la información, filtros, sumatorios, búsquedas, funciones, geolocalización de IP en R

De las anteriores IP .com ¿cuántas peticiones ha habido agrupadas por código de retorno?

Análisis de la información, filtros, sumatorios, búsquedas, funciones, geolocalización de IP en R

De las peticiones con código de retorno 100 ¿cuáles podrían tener un formato IP?

Análisis de la información, filtros, sumatorios, búsquedas, funciones, geolocalización de IP en R

Obtener datos de ubicación geográfica por cada IP de las obtenidas anteriormente en ip100: región, país y ciudad:

Análisis de la información, filtros, sumatorios, búsquedas, funciones, geolocalización de IP en R

Del total de peticiones hechas por dominio .com, ¿Cuántos bytes en total se han transmitido en peticiones de descarga de ficheros de tipo «.gif»?

Análisis de la información, filtros, sumatorios, búsquedas, funciones, geolocalización de IP en R

¿Cuántas peticiones buscan directamente la URL = «/robots.txt» en todo el dataset?

Análisis de la información, filtros, sumatorios, búsquedas, funciones, geolocalización de IP en R

¿Cuántas peticiones NO tienen como protocolo «HTTP/1.0»?

Análisis de la información, filtros, sumatorios, búsquedas, funciones, geolocalización de IP en R

Descarga del código R completo y fichero de log de ejemplo

A continuación mostramos enlace para la descarga del código R completo y funcional (Tratamiento_Log.R) con todos los ejemplos de este artículo, incluyendo el fichero de log de accesos utilizado (log_http.csv):