Do not speak Spanish? Read this post in English.

Miércoles, 04 d diciembre d 2013.

Análisis de Perfiles de Comportamiento con Google Analytics

Cómo veréis los que soléis leer este blog, últimamente me ha dado por el análisis del comportamiento del usuario. Quizás una de las partes que la analítica que más veces se obvia o se resuelve con uno o dos indicadores vagos. Llevamos ya un par de posts sobre el tema: para ver como analizar a nuestra medida los flujos de páginas del usuario y los recursos de navegación que utilizan. Hoy vamos a ir con algo un poco más global y conceptual: El seguimiento de perfiles de Comportamiento.

Cuando analizamos a los usuarios que navegan por nuestro site una buena opción siempre es clasificarlos según las acciones que realizan en el mismo y así acercarnos a la analítica de personas o perfiles todo lo posible (siempre teniendo en cuenta las limitaciones de una herramienta cuantitativa). Aquí podemos llegar a imaginar distintos tipos de usuarios pero por lo general solo resolvemos a los más sencillos: visitas, rebotes, visitas a página de producto, visitas que convierten, etc. Aun a sabiendas de que nuestros usuarios merecen una clasificación mejor (podemos hilar mucho más fino), no solemos llevarla a cabo por lo complejo que puede resultar medir algunos perfiles. Pero ¿quien no quisiera poder sacar de Google Analytics directamente a todos sus usuarios clasificados según su comportamiento?

Hoy vamos a ver una forma de resolver esta clasificación por perfiles de comportamiento de los usuarios que nos permita disponer de ellos como variables o dimensiones personalizadas en Google Analytics...

prefildecomportamiento

El concepto de Perfiles de comportamiento

Antes de ponernos a trabajar tenemos que tener muy claro que queremos sacar de esta implementación y su posterior análisis. Los perfiles de comportamiento (que podíamos haber llamado de cualquier otra forma) deben seguir el objetivo de ayudarnos a segmentar a todo nuestro tráfico según las acciones encaminadas hacia algún objetivo.

La forma más sencilla de verlo sería una especie de Funnel de acciones (y no de pasos) que van definiendo a las personas según sus intereses. Así pues, para poder hacer este "funnel de acciones" tenemos que saber que buscamos en los usuarios: tenemos definir que acciones pueden realizar en la web para que sea importante clasificarlos de otra forma.

Además puesto que quiero englobar al total del tráfico en mi clasificación de usuarios y sobretodo no quiero duplicar usuarios, estas acciones deberán estar jerarquizadas: es decir, que el hecho de que un usuario realice 2 de estas acciones no deberá clasificarle en ambas sino tan sólo en la más importante de ellas: Si una persona convierte, aunque antes se haya interesado por un producto va a ser más interesante clasificarla como "convertidor" que como "interesado en producto".

Veamos un ejemplo sencillo para poner en contexto esta idea:

Tengo una tienda online muy directa al grano y sobre la que no voy a hacer un gran análisis. Defino que los perfiles a medir serán los siguientes (de más importante a menos importante):

  • 1. Compradores: Personas que han comprado algo.
  • 2. Con Pedido: Personas que Llegaron a incorporar algo en el carrito.
  • 3. Interesados en productos: Personas que Vieron Varios productos
  • 4. Vieron Producto: Personas que Vieron un producto
  • 5. Buscadores: Personas que Buscaron algo
  • 6. Visitas: Personas que simplemente visitaron el site

Entendiendo que todas estas acciones representan parte de un proceso y por lo tanto un usaurios cuando incorpora algo a su carrito ya pasa a ser del segundo grupo y no del tercero o cuarto.

Bajo esta idea pueden desarrollarse clasificaciones inequívocas de los usuarios o visitas. El gráfico del principio del post representa justo la respuesta a esta clasificación de perfiles según su comportamiento y de forma excluyente. Por ese motivo el Gráfico no tiene forma de funnel sino de categorías sueltas aunque si que está ordenado según la jerarquía de las acciones (aunque de forma inversa).

Este es el concepto que del que queremos disponer de forma clara y con el no hace falta darle muchas vueltas para ver el tipo de análisis que podemos llegar a realizar: básicamente el cruce con cualquier parámetro o dimensión de nuestra herramienta de analítica con este nuevo valor de perfil puede indicarnos detalles sobre como son estas personas realmente: sus medios y campañas de entrada, cómo cumplen ciertos objetivos, qué páginas visitan, qué dispositivos usan, etc.

A la inversa el análisis se vuelve aún más interesante: Que tipo de perfiles abunda más en el tráfico SEO? Y en el SEM? ¿Por qué son distintos? ¿Qué me acerca más al final del funnel de acciones de los usaurios en los móviles? ¿y en navegadores de escritorio? ¿A qué se deberá la diferencia?

Entendida la utilidad de la clasificación de los usuarios por perfiles de comportamiento vayamos al grano: ¿Como conseguirla?

Antes de empezar: Define tus perfiles de comportamiento

El paso más sencillo. Define cuales son tus perfiles y que acciones debería realizar el usuario para entrar en ellos...

  • ¿Debe visitar un tipo de página? ¿Cuantas veces?
  • ¿Debe ver algún tipo de contenido en el HTML? ¿Cuantas veces?
  • ¿Debe realizar alguna acción de click o envío? ¿Cuantas veces?

En el ejemplo anterior nuestra definición sería la siguiente:

  • Compradores: Pasaron por la página de gracias.html
  • Con Pedido: Hicieron click en un botón de "Añadir al carrito"
  • Interesados en productos: Vieron una página del tipo "/producto/xxxx" al menos 3 veces
  • Vieron Producto: Vieron una página del tipo "/producto/..."
  • Buscadores: Vieron una página del tipo "/result..."
  • Visitas: Cualquier usuario/visita

Las definiciones son las mismas que antes pero ahora concretamos las acciones que dejan de ser conceptuales para ser realmente acciones relacionadas con nuestra página.

Por último tenemos que decidir en que ámbito vamos a evaluar a las personas: Visitas o Usuarios ya que no es lo mismo: Como "compradores" ¿querré ver cuantas visitas provienen de usuarios que compraron alguna vez o solo aquellas visitas en las que se compró algo?

Una vez tenemos todo esto claro ya podemos lanzarnos a implementar:

Implementación de perfiles de comportamiento

Para este desarrollo he creado un pequeño script que os facilite la tarea. No voy a engañar a nadie, en esta ocasión la parte técnica va a ser un poco más compleja que otras veces. Aún así creo que cualquiera con un mínimo de habilidad técnica será capaz de llevarla a cabo.

El script nos permitirá básicamente indicar nuestras normas (tal cual lo hemos hecho antes) y ejecutará por si solo las tareas necesarias para saber en todo momento de que tipo de usuario se trata durante la visita o la página vista para permitirnos incorporar ese dato a nuestra herramienta de analítica web preferida.

Paso 1: Incorporar el script.

Para poder hacer realidad todo este sistema (que no es nativo en Google Analytics) nos vemos obligados a añadir un fragmento de código que se ocupe de toda la parte técnica del proceso.

Este es el código a añadir:

<script>
// Seguimiento de perfiles de comportamiento por Iñaki Huerta
var upro = function(p,cn,ud) { if (!cn) cn = 'd'; cn = '_upro_'+cn.split(/[^\d\w]/).join('_'); upro.p = upro.p || {}; upro.cd = upro.cd || null; upro.p[cn] = { list: p, time: ud}; return upro.action(cn);} 
upro.setdomain = function ( cd ) { upro.cd = cd;}
upro.action = function(cn, opEvent) { 
  var re = new RegExp( cn+'=([^;]+)(;.+)?$');	var pd = document.cookie.match( re ); pd = (pd && pd[1]) ? JSON.parse( unescape(pd[1]) ) : { 'last' : -1 }; var p = upro.p[cn].list; var pv = window.upropv;
  for (var i in p) { 
    if ( pd.last == i) { var ret = i; break; } var v = 1;
    if ( v && p[i].page ) 	{ re = new RegExp(p[i].page.split('/').join('\/'),"i");	v = ( document.location.pathname.match( re ) ) ? 1 : -1; if (p[i].inverse) v=v*-1;}
    if ( v && p[i].title  ) 	{ re = new RegExp(p[i].title,"i"); 	v = ( ($('title').html()).match( re ) ) ? 1 : -1; if (p[i].inverse) v=v*-1;}
    if ( v && [i].html ) 	{ v = ( $(p[i].html)[0] ) ? 1 : -1; if (p[i].inverse) v=v*-1;}
    if ( v && p[i].event ) 	{ var pp = p[i].event.split('@'); $(pp[1]).data('upn',cn).data('upe',p[i].event).data('upcb', p[i].eventCallback  ).bind(pp[0], function () { var p = upro.action( $(this).data('upn') , $(this).data('upe') ); var cb = $(this).data('upcb'); if  (typeof(cb) == "function") cb(p); return true; }); v = (opEvent && opEvent == p[i].event) ? 1 : -1; }
    if ( v && !opEvent && pv == 1 ) v = -1;
    if (v>0) { pd[i] = (pd[i]) ? pd[i]+1 : 1; 
    if ( !p[i].times || pd[i] >= p[i].times ) pd.last = i; 
    var ud = upro.p[cn].time; var dt=new Date(); dt.setDate(dt.getDate()+ud); var cv=escape(JSON.stringify(pd)) + ((ud==null) ? '' : '; expires='+dt.toUTCString()) + ((upro.cd==null)? '' : ';domain='+upro.cd) + ';path=/'; document.cookie= cn+"="+cv; if ( pd.last == i) { var ret = i; break; } }
  } 
  window.upropv = 1; 
  return (ret) ? ret : '(not set)';
}
</script>

El código está un poco comprimido pero sin duda es demasiado grande para ser un tag de analítica. Lo incluyo desglosado solo por si algun lector con conocimientos de javascript prefiere poder leer el proceso y hacer las modificaciones que vea pertinentes.

Para el resto de los mortales dejo el codigo comprimido, que es un simple corta y pega que como decía puede hacerse en cualquier parte de la web.

<!-- Seguimiento de perfiles de comportamiento por Iñaki Huerta -->
<script>var upro=function(e,t,n){if(!t)t="d";t="_upro_"+t.split(/[^\d\w]/).join("_");upro.p=upro.p||{};upro.cd=upro.cd||null;upro.p[t]={list:e,time:n};return upro.action(t)};upro.setdomain=function(e){upro.cd=e};upro.action=function(e,t){var n=new RegExp(e+"=([^;]+)(;.+)?$");var r=document.cookie.match(n);r=r&&r[1]?JSON.parse(unescape(r[1])):{last:-1};var i=upro.p[e].list;var s=window.upropv;for(var o in i){if(r.last==o){var u=o;break}var a=1;if(a&&i[o].page){n=new RegExp(i[o].page.split("/").join("/"),"i");a=document.location.pathname.match(n)?1:-1;if(i[o].inverse)a=a*-1}if(a&&i[o].title){n=new RegExp(i[o].title,"i");a=$("title").html().match(n)?1:-1;if(i[o].inverse)a=a*-1}if(a&&[o].html){a=$(i[o].html)[0]?1:-1;if(i[o].inverse)a=a*-1}if(a&&i[o].event){var f=i[o].event.split("@");$(f[1]).data("upn",e).data("upe",i[o].event).data("upcb",i[o].eventCallback).bind(f[0],function(){var e=upro.action($(this).data("upn"),$(this).data("upe"));var t=$(this).data("upcb");if(typeof t=="function")t(e);return true});a=t&&t==i[o].event?1:-1}if(a&&!t&&s==1)a=-1;if(a>0){r[o]=r[o]?r[o]+1:1;if(!i[o].times||r[o]>=i[o].times)r.last=o;var l=upro.p[e].time;var c=new Date;c.setDate(c.getDate()+l);var h=escape(JSON.stringify(r))+(l==null?"":"; expires="+c.toUTCString())+(upro.cd==null?"":";domain="+upro.cd)+";path=/";document.cookie=e+"="+h;if(r.last==o){var u=o;break}}}window.upropv=1;return u?u:"(not set)"}</script>

Nota: Este código se basa (como casi todos mis códigos) en jQuery por lo que deberás estar usando esta librería javascript o incorporarla a tu proyecto para poder usarlo.

Paso 2. La definición del listado de perfiles de comportamiento

Deben definirse (también en javascript) todos los perfiles que vamos a querer seguir en orden jerárquico (de más importante a menos). Para ello deberemos crear un objeto con la forma siguiente:

var profileList = {
  'Comprador' : {
    [Definición]
  },
  'Con pedido' : {
    [Definición]
  },
  'Interesado en Productos' : {
    [Definición]
  },
  [...etc...]
}

Donde la definición se forma por una serie de condiciones que debe alcanzar esa visita o usuario para ser considerada dentro de ese grupo.

Estas definiciones pueden tener los siguientes elementos:

page

Norma para la URL de la página que ve el usuario. Esta URL se compara por una experión regular con la real de la página para cada página vista y se evalúa si entra dentro del criterio o no.

Ejemplos:

'Comprador' : {
    page : '/gracias\.html'
  },
'Vio la Home' : {
    page : '^/$'
  },
'Entró en la sección productos' : {
    page : '/productos/'
  },
'Vió cualquier página' : {
    page : '.*'
  },

title

Funciona exactamente igual que "page" pero en lugar de observar la URL de la página observa su titulo.

Ejemplo:

'Página 404' : {
    title : 'la pagina no existe'
  },

html

Busca la existencia de algún elemento HTML. No su contenido, sino su mera existencia. Para ello usa como valor los selectores de jquery. Si no los conoces entiende que se definen igual que los elementos del CSS.

Ejemplos:

'Ha visto elemento con id abcde' : {
    html : '#abcde'
  },
'Ha visto elemento con clase abcde' : {
    html : '.abcde'
  },
'Ha visto formulario' : {
    html : 'form'
  },
'Ha visto formulario con clase pedido' : {
    html : 'form.pedido'
  },

event

Por último event es la norma más compleja (luego veremos por qué) y nos permite saber si el usaurio lanzó algún evento en la página: Click, envío de formulario, pasó el ratón por encima, hizo scroll.

Para llamarlo deberemos indicar el tipo de evento que observamos y el elemento html sobre el que queremos observarlo con la formula: "[evento]@[elemento]".

Ejemplos:

'Hizo Clic en el banner' : {
    event : 'click@img#banner'
  },
'Envió un formulario cualquiera' : {
    event : 'submit@form'
  },

Modificadores

Aparte de las propias normas existen dos modificadores sobre las mismas:

  • "invert" permitirá crear normas invertidas: es decir, solo se validará si no se cumple.
  • "times" permitirá añadir que la norma se cumpla más de una vez

Ejemplos:

'Entró en cualquier página menos productos' : {
    page : '/productos/',
    invert : true
  },
'Realizó 3 o más compras' : {
    page : '/gracias\.html',
    times : 3
  },

Con esta configuración ya podremos crear nuestra definición de perfiles. Os muestro el ejemplo anterior ya resuelto:

var userProfileList = {
  'Comprador' : {
    page : '/gracias\.html'
  },
  'Con pedido' : {
    event : 'click@button.anadir-al-carrito'
  },
  'Interesado en Productos' : {
    'page' : '/producto-.*\.html',
    'times' : 3
  },
  [...etc...]
}

Puede parecer complicado, pero se trata solo de ir paso a paso con cuidado y si no eres muy ducho en javascript vigilar mucho el cierre de comillas y las comas.

Con esta definición ya solo nos queda lanzar la validación del perfil de usuario y guardarlo en analytics.

Paso 3: La función para extraer el perfil: "upro()"

Aquí usaremos una función que crea el script incluido en el paso 1 llamada "uProfile" y que recibe 3 posibles parámentros:

  • El listado: Tal cual se ha definido antes
  • (opcional) El nombre del tipo de perfil usado: Por si quieres usar varios listados distintos para evaluar al usuario según distintos focos (conversión, branding, navegación)
  • (opcional) El tiempo en días que dura la cookie de usuario: Si no se indica los perfiles solo durarán durante la visita, si se indica se mantendrá el perfil más alto que alcanzó el usuario durante los días indicados

Algunos ejemplos:

upro( profileList );

Devolverá el perfil de comportamiento de la visita actual.

upro( profileList , 'conversion' );

Devolverá el perfil de comportamiento de la visita actual y guardará el perfil actual con el nombre "conversion" para que no se choque con otras definiciones de perfiles.

upro( profileList , 'conversion' , 30);

Devolverá el perfil de comportamiento del usuario (manteniendo este 30 días guardado) y lo almacenará con el nombre 'conversion' para que no se choque con otras definiciones.

upro( profileList , 'nivelVisita' );
upro( profileList , 'nivelUsuario' , 30);

El primero devolverá el perfil alcanzado durante la visita y el segundo durante 30 días de vida del usuario. Ambos no se sobreescribirán pues tienen nombres distintos y por lo tanto podrán dar valores distintos.

Paso 4: Almacenar en Analytics

Ahora que sabemos cómo definir los perfiles de comportamiento de los usuarios y como extraerlos de "uProfile" solo nos queda guardaros en Google Analytics.

Aquí lo suyo será utilizar una variable o dimensión personalizada. Sin embargo, dado que tenemos que mirar valores del html de página tendremos que lanzar la llamada de una forma un poco distinta a como estamos acostumbrados (para que se mire el perfil en el momento de guardar el dato y no antes).

Para Google Analytics Classic

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-1234567-89' ]);

_gaq.push(function() { 	var tracker = _gat._getTrackerByName();	tracker._setCustomVar( 1, 'user profile', upro( profileList ) , 2 );  });

_gaq.push(['_trackPageview']);

Para Universal Analytics

ga('create', 'UA-1234567-89' , 'midominio.com');

ga(function(tracker) { tracker.set('dimension1', upro( profileList ) );  });

ga('send', 'pageview');

Aquí tenemos que tener muy en cuenta el ámbito en el que incluiremos acada posible variable:

- Si no vamos a indicar días de duración para la cookie: marquemoslos como a nivel de visita.
- Si vamos a indicarlos: maquemoslos como a nivel de usuario.

¿Por qué esta llamada tan rara para simplemente indicar una variable o dimensión personalizada

Pues por que si lo llamasemos de la forma tradicional, dependiendo de donde hayamos puesto nuestro código de Analytics (cabecera o footer) la extracción del perfil no podría saber si hay algún elemento HTML por debajo. De esta forma nos aseguramos de que se lance con todo el HTML ya cargado (carga asíncrona).

Con esto ya (por fín!) empezaremos a tener disponibles en Google Analytics nuestros perfiles de comportamiento del usuario.

Paso 5: Almacenar en Analytics con Eventos

Hay una pequeña excepción. Si conocéis un poco Google Analytics sabréis que este se ejecuta al principio de la carga de la página y que en ese momento ya debería tener las variables personalizadas indicadas.

Entonces: ¿Que pasa si una de mis reglas de perfiles está basado en un click o envío de formulario?

Pues que hasta vista siguiente no se guardará en analytics este nuevo perfil. En algunas acciones no pasará nada: si se hace clic en un enlace, al cambiar de página se guardará el nuevo estado de todas formas, si se envía un formulario pasará exactamente lo mismo. El problema vendrá con esas acciones que no provocan luego una página vista: Salidas de la web, ventanas modales, envíos por Ajax... En esos casos tendremos que añadir un extra a nuestra configuración.

Para eso hay una opción extra de la configuración de las reglas que antes no he comentado:

eventCallback

Indicándolo podemos definir una función que se lanzará cada vez que se ejecute ese evento. Su uso está destinado a cuando necesitamos crear una página vista virtual o un evento justo tras validar el cambio de perfil por realizar el evento.

Así pues, si yo tuviese una regla en un clic para abrir una ventana modal podría provocar una página vista falsa en Google Analytics, que además actualizase el perfil de ese usuario:

'Hizo Clic en ventana modal' : {
    event : 'click@a.abrir-ventana-modal',
    eventCallback : function( profile ) {
      _gaq.push(['_setCustomVar', 1, 'user profile', profile, 2 ]);
      _gaq.push(['_trackPageview', '/ventana-modal]);
    }
  },

Sí, admito que puede ser un poco complejo de ejecutar. De todas formas hay que recordar que eso solo será necesario si incluimos eventos que pueden cambiar el perfil del usuario pero luego no provocan página vista.

Paso 6 (opcional): Definir el dominio de las cookies

Como este script está basado en cookies debes saber que por defecto no se transmitirán los datos cuando el usuario cambie de un dominio a otro (las cookies son así)

Sin embargo, en el caso de que la navegación quede entre subdominios de un mismo dominio (www., blog., etc.) si que podemos definir la cookie para que funcione entre dominios.

Para ello usaremos la función upro.setdomain() indicando el ambito de nuestro dominio, donde un "." delante del dominio indica que se deben aceptar todos sus subdominios.

Por ejemplo:

Si mi site se compone de "www.midominio.com", "blog.midominio.com" y "tienda.midominio.com". Puedo hacer que los perfiles se traspasen de un subdominio añadiendo la siguiente línea a mi javascript (pero siempre tras la carga del codigo principal):

upro.setdomain('.midominio.com');

Un ejemplo práctico: este blog 😉

Tras explicar todos los pasos os pongo un ejemplo práctico para seguir en un único perfil de usuarios la lectura de artículos que hacen y lo cerca que quedan de la conversión.

Definición de perfiles

He definido los siguientes perfiles de comportamiento:

  • Contacto: Contactan conmigo
  • Posible contacto: Miran la página de contacto
  • Comentarista: Dejan un comentario
  • Lector Interesado: Ven 2 o más artículos
  • Lector: Ven 1 artículo
  • Visita Interesada: Ve 3 o más páginas vistas
  • Visita: Visita que no es página 404
  • Posible visita: Visita que solo ha visto página 404

Para Conseguir esta definición he creado el siguiente listado de acciones concretas:

  • Contacto: Ven la página "/contacto", con el DIV de Gracias por contactar
  • Posible contacto: Ven la página "/contacto"
  • Comentarista: Usan el formulario de contacto "form#commentform"
  • Lector Interesado: Ven alguna página de post (con X elmento html) 2 veces
  • Lector:Ven alguna página de post (con X elmento html)
  • Visita Interesada: Ven cualquier página 3 veces
  • Visita: Ven cualquier página menos la 404, que detecto por el título
  • Posible visita: Ven cualquier página

Esta lista finalmente acaba definiendo mi listado javascript:

var profileList = {
  'Contacto' : {
	page : '/contacto',
	html : 'div.wpcf7-mail-sent-ok'
  },
  'Posible contacto' : {
	page : '/contacto'
  },
  'Comentarista' : {
	event : 'submit@form#commentform',
	eventCallback : function ( profile ) { /* No es necesario porque hay página después*/ }
  },
  'Lector Interesado' : {
	html : 'form#commentform',
	times : 2
  },
  'Lector' : {
	html : 'form#commentform'
  },
  'Interesado' : {
    page : '.*',
	times : 3
  },
  'Visita' : {
	title : 'Sin resultados para',
	inverse : 1
  },  
  'Posible visita' : {},
};

Implementación

Finalmente he incorporado la nueva línea a mi configuración de Google Analytics y así he podido guardar los datos en la variable personalizada 5 de mi cuenta.

Al poco tiempo de la implementación el resultado era el siguiente:

analytics_datosperfiles

Por lo que ya os tengo a todos bien clasificados según vuestro comportamiento en mi página.

Conclusión

La segmentación de los usuarios o visitas por pefiles de comportamiento abre grandes puertas de análisis. Se trata de una implementación compleja, no vamos a negarlo. Ya no solo por la parte técnica que es inevitable que se algo densa, sino porque su utilidad depende totalmetne de las definiciones que hagamos.

El ejemplo de lo que yo he hecho con mi blog no debería ser valido para un análisis en otras empresas: He mezclado cosas. No tiene sentido segmentar a los usuarios por como usan el contenido y por si contactan o no conmigo para pedirme algún tipo de presupuesto, sobretodo cuando medir un dato invalida a otro.

Para hacer un análisis correcto deberíamos usar una clasificación de perfiles distinta para cada foco del análisis que realizamos. Así pues no debería ser raro (siempre y cuando podamos gastar tantas dimensiones personalizadas) que clasificásemos a nuestros usuarios en perfiles de conversión, de comunicación, de branding, de lectura, de uso de recursos internos etc. Datos que nos permitan en cada caso encontrar al usuario que queremos y responder a preguntas tales como: ¿Como convierten los usuarios dependiendo del interés que han demostrado en nuestra marca? ¿Los usuarios que comentan, usan también otras zonas de la web? ¿Lo cerca que ha quedado un usuario de la conversión afecta a otros criterios de uso de la web?

Una clasificación bien realizada puede ahorrarnos muchísimo trabajo en el futuro, trabajo que de otra forma tendríamos que sacar indicador a indicador.

Espero que a pesar de lo complejo del tema algunos os animéis a usarlo.

Temas Relacionados: analitica web

Autor:

19 Comentarios para “Análisis de Perfiles de Comportamiento con Google Analytics”

  1. Iñaki dice:

    No se si te he entendido del todo bien la propuesta, pero esta información no podíamos conocerla a través de una segmentación por visitante?

    Un saludo.

    • ikhuerta dice:

      Algunas cosas si se pueden y así lo hacemos muchas veces. De echo con segmentos hay cosas como obligar a cierto orden en las reglas que son aún más potentes que esto.

      Otras no, al menos no sin meter varios eventos nuevos, variables personalizadas y configurar varios objetivos... y eso para sacar el dato de cada perfil. Para mi es una perdida de tiempo y recursos de analytics (free) para algo que en realidad tienes muy claro como quieres guardar.

      El tema no es si no se puede detectar usuarios que pasan por x página sino lo complejo que se puede volver al meter html, eventos con click y mas si un segmento debe anular a otro.

      Al final acabas no haciendo perfiles complejos porque es un follón sacar cada dato. Cuando los tienes muy claros a veces es más "sencillo" decirle a analytics que quieres que guarde. Esa es la idea.

      Pero bueno, para gustos colores.

  2. jrosell dice:

    ¿Sabes que esto es brutal? ¿Permites obras derivadas? :) ¿cc-by?

  3. Hola Iñaki!

    Con GTM y el event listener, podemos lograr lo mismo sin tener que crear tanto código?

    Gracias

    • ikhuerta dice:

      Hay cosas que podrías sacar a mano con segmentos.

      Otras que con eventos (que lanzar con evento listener si) + segmentos.

      Pero ni la posibilidad de que se cumpla x veces ni el tenerlo como dimensión se puede con implementación simple.

      Lo que si tengo que hacer es una implementación para gtm. Con un macro de javascript personalizado deberia poderse y seguramente algo mas simple si sea. Lo miro y a ver si puedo publicar algo 😉

  4. Por cierto, brutal post!

  5. Miguel López Henche dice:

    Trabajazo Iñaki, mil gracias por compartir estas cosas!!!

  6. @ElectroPunkys dice:

    ¡Gracias por compartir este pedazo post/guía! Y también por el de la implementación para Google Tag Manager, enorme también, que es el que me ha traído hasta aquí.

    Solo tengo una pequeña duda:
    En el ejemplo que has puesto aquí de tu blog, dentro del listado javascript, la acción "Posible visita" no debería contener el mismo title que la acción "Visitas" pero sin el "inverse:1" ?

    Saludos!

    • ikhuerta dice:

      Gracias a todos por los comentarios! A mi me parece apasionante esta posibilidad y llevaba tiempo queriendo publicarla. Me alegro de que gusté!

      ElectroPunkys, sobre tu duda podría ser prefectamente como dices pero hay que tener en cuenta que son definiciones jerarquizadas por lo que cuando una visita se clasifica en un elemento anterior en la lista ese gana a los posteriores y el usuario queda etiquetado como el nivel más alto posible.

      Por ese motivo cuando ya se ha mirado en un paso anterior una parte del tráfico no es necesario contemplar ese tráfico en la parte anterior pues ya no existe. Por eso he puesto la definición de cualquier página (page:.*) pues todas las demás ya están en pasos anteriores.

      Pongamos 3 pasos:

      1- Trafico que pasa por producto.
      2- Trafico No 404
      3- Tráfico 404 (Marcado como Cualquier otro tráfico).

      Cuando llega un usuario a una página normal (no 404) se evalúa que no es producto y luego al llegar al paso 2 se evalúa como positivo y se marca como "Trafico No 404". Ese trafico nunca llega a comprobarse el paso 3 pues ahí queda ya definido.

      Cuando llega un usuario 404 el efecto en cambio es: se evalua que no es producto, luego que no es trafico no404 y llega al paso final que como lo acepta todo si que da positivo marcandose como "Tráfico 404".

      Asi que a pesar de que la definición del ultimo paso es muy amplia como ahi solo llega el tráfico restante funciona igualmente.

  7. @ElectroPunkys dice:

    ¡Muchas gracias por tu aclaración! Veo que soy un poco (bastante) burro, pero al menos ahora creo haberlo entendido correctamente todo.

    Para cualquier ecommerce sería un lujo poder analizar perfiles de comportamiento de esta forma. Ayudaría bastante a resolver posibles problemas y a saber rápidamente cuáles son los productos en los que están más interesados (y que quizás no son los más comprados)... y varias cosas más que se me ocurren cada vez que leo el post. Y el ejemplo práctico que has puesto de tu blog es muy, muy bueno.

    El resultado sería un dashboard comprensible para todo el mundo y que ahorraría bastante tiempo, además de ayudar.

    ¡Saludos, maestro!

  8. Víctor Sánchez dice:

    Hola Iñaki!

    En primer lugar, gracias.

    Estaba intentado ver cómo evaluar el comportamiento de los usuarios en mi web que pasaran por una determinada página y me he encontrado con esta maravilla de post.

    Mi pregunta es, ¿es necesario poner este código en todos los lugares antes de trackear una página?

    Si se hace un push de una página sin definir antes el array y demás, ¿perdemos la estructura jerarquizada?

    La cuestíon es que a mí me funciona bien, hasta que el usuario realiza una transacción, momento en el que abandona el grupo definido más arriba y por lo tanto más importante.

    Perdona por la cuestión larga, entenderé que quizá haya sido demasiado farragoso.

    Sigue con el blog, es de gran ayuda a todo el mundo

    • ikhuerta dice:

      Buenas Victor,

      Gracias por tus comentarios! No se si entiendo bien tu problema. El codigo no importa donde lo añadas. Siempre estará ya cargado cuando realmente lo uses.

      Esto es porque luego recogemos el valor dentro de una función de analytics (la llamada esa rara que comentaba más abajo que hacíamos). Como sabes GA es asíncrono (es decir, primero carga toda la página y luego se lanza analytics) asi que sea como sea al cargar la página se carga este código esté donde esté.

      Sobre que no te recoja las transacciones seguramente se deba a la forma en la que las especificas. Si funcionan todos los pasos menos ese, sera que ese no lo detecta por algun motivo.

      Si quieres pasame la definición de array que haces y lo vemos.

  9. Víctor Sánchez dice:

    Gracias por responder.

    A ver, mi definición es:

    var userProfileList = {
    'Map Page' : {
    page : '/customSearchHome/'
    },
    'Other' : {}
    }

    Básicamente, me interesa saber qué hacen las visitas que pasan por esa página.

    He añadido esto y las funciones cada vez que se hace un _trackview en mi página. Y la cosa es que al ver los datos en Analytics, me sale la visita como "Map Page" hasta que el usuario hace algo que aún no sé (estoy probando en qué punto) y pasa a "Other".

    Conclusión, al final del día sólo tengo "Other"

    • ikhuerta dice:

      Ummm. Habría que ver que hace exactamente cuando se transforma en other. Tiene toda la pinta de ser un problema de cookies: se pierde la cookie de los profiles pero no la de analytics. Es posible que lo hayas puesto sin dias de cookie y hayas configurado la dimensión personalizada como de usuario?

  10. Víctor Sánchez dice:

    He puesto esto.

    var uProfile = function(p,cn,ud) { if (!cn) cn = 'def'; cn = '_gapro_'+cn; uProfile.p = uProfile.p || {}; uProfile.p[cn] = { list: p, time: ud}; return uProfile.action( cn );}
    uProfile.action = function(cn, opEvent) { var re = new RegExp( cn+'=([^;]+)(;.+)?$'); var pd = document.cookie.match( re ); pd = (pd && pd[1]) ? JSON.parse( unescape(pd[1]) ) : { 'last' : -1 }; var p = uProfile.p[cn].list;
    for (var i in p) { if ( pd.last == i) return i; var v = 1;
    if ( v && p[i].page ) { re = new RegExp(p[i].page.split('/').join('\/'),"i"); v = ( document.location.pathname.match( re ) ) ? 1 : -1; if (p[i].inverse) v=v*-1;}
    if ( v && p[i].title ) { re = new RegExp(p[i].title,"i"); v = ( ($('title').html()).match( re ) ) ? 1 : -1; if (p[i].inverse) v=v*-1;}
    if ( v && p[i].html ) { v = ( $(p[i].html)[0] ) ? 1 : -1; if (p[i].inverse) v=v*-1;}
    if ( v && p[i].event ) { var pp = p[i].event.split('@'); $(pp[1]).data('upn',cn).data('upe',p[i].event).data('upcb', p[i].eventCallback ).bind(pp[0], function () { var p = uProfile.action( $(this).data('upn') , $(this).data('upe') ); var cb = $(this).data('upcb'); if (typeof(cb) == "function") cb(p); return true; }); v = (opEvent && opEvent == p[i].event) ? 1 : -1; }
    if (v>0) { pd[i] = (pd[i]) ? pd[i]+1 : 1; if ( !p[i].times || pd[i] >= p[i].times ) pd.last = i; var ud = uProfile.p[cn].time; var dt=new Date(); dt.setDate(dt.getDate()+ud); var cv=escape(JSON.stringify(pd)) + ((ud==null) ? "" : "; expires="+dt.toUTCString()); document.cookie= cn+"="+cv; if ( pd.last == i) return i; }}
    return '(not set)';}
    _gaq.push(function() { var tracker = _gat._getTrackerByName(); tracker._setCustomVar( 1, 'user profile', uProfile(userProfileList) , 2 ); });

    Por cierto, gracias por dedicarle tiempo

    • ikhuerta dice:

      Buenas Victor,

      Por lo que veo te falta añadir el listado de profiles. EN tu codigo solo veo el bloque de corta y pega y la llamada a anlaytics sueltos.

      1) Tienes que definir la variable del listado de perfiles.

      2) Tienes que añadir el trozo de analytics dentro del codigo de tu google analytics ( despues de definir el UA-xxxx y antes de lanzar el pageview )

  11. Víctor Sánchez dice:

    La definición de perfiles es la que estaba en comentario anterior.

    Este es el código completo

    var userProfileList = {
    'Map Page' : {
    page : '/customSearchHome/'
    },
    'Other' : {},
    }
    var uProfile = function(p,cn,ud) { if (!cn) cn = 'def'; cn = '_gapro_'+cn; uProfile.p = uProfile.p || {}; uProfile.p[cn] = { list: p, time: ud}; return uProfile.action( cn );}
    uProfile.action = function(cn, opEvent) { var re = new RegExp( cn+'=([^;]+)(;.+)?$'); var pd = document.cookie.match( re ); pd = (pd && pd[1]) ? JSON.parse( unescape(pd[1]) ) : { 'last' : -1 }; var p = uProfile.p[cn].list;
    for (var i in p) { if ( pd.last == i) return i; var v = 1;
    if ( v && p[i].page ) { re = new RegExp(p[i].page.split('/').join('\/'),"i"); v = ( document.location.pathname.match( re ) ) ? 1 : -1; if (p[i].inverse) v=v*-1;}
    if ( v && p[i].title ) { re = new RegExp(p[i].title,"i"); v = ( ($('title').html()).match( re ) ) ? 1 : -1; if (p[i].inverse) v=v*-1;}
    if ( v && p[i].html ) { v = ( $(p[i].html)[0] ) ? 1 : -1; if (p[i].inverse) v=v*-1;}
    if ( v && p[i].event ) { var pp = p[i].event.split('@'); $(pp[1]).data('upn',cn).data('upe',p[i].event).data('upcb', p[i].eventCallback ).bind(pp[0], function () { var p = uProfile.action( $(this).data('upn') , $(this).data('upe') ); var cb = $(this).data('upcb'); if (typeof(cb) == "function") cb(p); return true; }); v = (opEvent && opEvent == p[i].event) ? 1 : -1; }
    if (v>0) { pd[i] = (pd[i]) ? pd[i]+1 : 1; if ( !p[i].times || pd[i] >= p[i].times ) pd.last = i; var ud = uProfile.p[cn].time; var dt=new Date(); dt.setDate(dt.getDate()+ud); var cv=escape(JSON.stringify(pd)) + ((ud==null) ? "" : "; expires="+dt.toUTCString()); document.cookie= cn+"="+cv; if ( pd.last == i) return i; }}
    return '(not set)';}
    _gaq.push(function() { var tracker = _gat._getTrackerByName(); tracker._setCustomVar( 1, 'user profile', uProfile(userProfileList) , 2 ); });

Anímate y deja tu comentario