Potlatch Analytics : comment mesurer le temps passé par vos visiteurs sur votre site d’information

Je proposais dans mon précédent billet une solution de suivi du temps de visite sur votre blog plus précise que celle fournie par Google Analytics. Cette deuxième version va plus loin : elle permet d’arrêter la mesure lorsque le visiteur a gardé la page ouverte en arrière-plan ou dans un onglet de navigateur. Explications détaillées.

Il y a trois jours j’ai publié un billet où je constatais que Google Analytics ne sait pas mesurer le temps passé par les visiteurs qui ne consultent qu’une seule page de votre site (c’est à dire 85% des visiteurs sur mon blog). Il les range dans les « rebonds » et indique que leur visite a duré 0 seconde, ce qui n’est pas la vraie durée de la visite. Pour mesurer ce temps j’ai donc proposé une méthode : envoyer régulièrement des notifications Ajax au serveur, qui va se charger d’enregistrer en continu les stats de fréquentation, sans attendre un changement de page. Une première collecte de données sur mon blog m’a permis d’obtenir une information plus intéressante les 0 secondes que me signalait Google Analytics.

Ce billet a eu un succès inattendu grâce à Twitter, et certains commentateurs ont souligné une limite importante à ma solution : les requêtes continuent de s’effectuer tant que la page est ouverte, même si le visiteur la laisse dans un onglet ou une fenêtre de navigateur en arrière-plan. Du coup, en voulant éviter de sous-estimer les temps passés, je risque l’excès inverse : obtenir des temps de consultation excessifs (plusieurs heures) qui faussent les résultats. J’ai donc expérimenté la possibilité de mesurer plus finement le temps où la fenêtre navigateur est effectivement visible.Voici la nouvelle méthode. Les changements étant importants, je reprends donc l’ensemble des étapes dans le tutorial ci-dessous.

Le javascript

J’ai donc testé l’utilisation des évenement $(window).focus() et $(window).blur() de jQuery, qui se déclenchent respectivement lorsqu’une fenêtre passe au premier plan et lorsqu’elle est reléguée au second (par ex. si l’utilisateur clique sur un bouton de la barre des tâches. J’ai également affiné la périodicité de déclenchement de la mesure pour avoir des données plus denses en cas de changement de contexte (chargement, blur, focus) suivies d’une mesure de plus en plus retardée jusqu’à 30 secondes (0, 50ms, 1s, 3s, 7s, 15s, 30s). Le code est un peu plus compliqué que la dernière fois :

>> On crée un nouveau fichier /js/pa.js

// Potlatch Analytics
var pa = {
url: '/dossier/stats.php',
delaiInitial : 50,
focus : 1,
t : null, // objet timeOut
blurTime:0, focusTime: 0, dureeBlur:0,
// On initialise les variables et gestionnaires d'événements
init: function() {
pa.reset();
pa.lancer();
$(window).focus(pa.over).blur(pa.out);
},
over : function() {
pa.focus = 1;
pa.reset();
// On calcule le temps écoulé depuis que l'utilisateur a changé de fenêtre
if (pa.blurTime > 0) {
var Now = new Date();
pa.focusTime = Now.getTime();
pa.dureeBlur = pa.focusTime - pa.blurTime;
}
pa.lancer();
pa.dureeBlur = 0;
pa.blurTime = 0;
},
out : function() {
pa.focus = 0;
var Now = new Date();
// On récupère le moment où l'utilisateur change de fenêtre
pa.blurTime = Now.getTime();
pa.reset();
pa.lancer();
},
reset: function() {
pa.delai = pa.delaiInitial;
},
lancer : function() {
if (pa.t) {
window.clearTimeout(pa.t);
}
// Si la fenêtre a le focus, on lance une requête intégrant le nombre de secondes de blur
if (pa.focus) {
$.get(pa.url + '?duree-blur=' + pa.dureeBlur, function() {
pa.t = window.setTimeout(pa.lancer,pa.delai);
pa.delai = Math.min(pa.delai + pa.delai + 1000,30000);
});
}
}
};

$(document).ready(function() {
pa.init();
});

Lorsque la fenêtre a perdu le focus, on va donc appeler notre script /dossier/stats.php avec l’argument ?duree-blur=123, où 123 est le nombre de millisecondes d’inattention du visiteur. On pourra ainsi stocker cette information dans la base de données. Ce code semble fonctionner à la fois avec Firefox 3.6 et IE6. Je pense que JQuery compense proprement les déficiences du premier avec ses événements focus() et blur().

Le HTML

On inclura le fichier pa.js en bas des pages de notre site après la librairie jQuery :

<script src="/js/jquery.js" type="text/javascript"></script><script src="/js/pa.js" type="text/javascript"></script>

La base de données

On ajoute une colonne blur numérique dans la base de données pour stocker cette information :

CREATE TABLE `visiteurs_log` (
`date` datetime NOT NULL,
`ip` varchar(15) NOT NULL,
`user_agent` varchar(64) NOT NULL,
`blur` smallint(5) NOT NULL,
`page` varchar(127) NOT NULL,
`referer` varchar(127) NOT NULL,
KEY `ip` (`ip`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Le PHP

On ajoute simplement les instructions pour stocker la durée de blur passée par le javascript :

>> Contenu du fichier /dossier/stats.php
// On se connecte à la BDD
$link = mysql_connect("localhost", "username", "password") ;
mysql_select_db('base');

// On récupère l'url de la page qui a lancé la requête Ajax
$page = $_SERVER['HTTP_REFERER'];
// On supprime les caractères récurrents dans l'url pour ne garder que le chemin relatif
$page = str_replace('http://www.mondomaine.com','',$page);
// On récupère l'ip et le type de navigateur du visiteur (pour éliminer les robots indexeurs, ou identifier un problème de rebond spécifique à un navigateur par ex.)
$ip = $_SERVER['REMOTE_ADDR'];
$user_agent = $_SERVER['HTTP_USER_AGENT'];

// On arrondit la valeur en secondes : inutile d'espérer avoir une précision plus grande
$blur = round($_GET['duree-blur'] / 1000);

$requete = "INSERT INTO visiteurs_log SET
page='" . mysql_real_escape_string($page) . "',
ip='$ip',
blur=$blur
date=NOW(),
user_agent='" . mysql_real_escape_string($user_agent) . "'";
$result = mysql_query($requete) OR DIE($Requete);

La requête

Notre requête pour sortir le temps effectif va maintenant comporter une soustraction : on va calculer l’étendue du temps passé total, moins le nombre de secondes où la fenêtre était inactive.

SELECT COUNT( *  ) nb_pages,    ip,    page,    user_agent,    date,    UNIX_TIMESTAMP( MAX( date ) ) - UNIX_TIMESTAMP( MIN( date ) ) duree_totale,    SUM(blur) duree_inactivite,    (UNIX_TIMESTAMP( MAX( date ) ) - UNIX_TIMESTAMP( MIN( date )) - SUM(blur)) duree_consultation,    COUNT(DISTINCT (page)) pages_vues    FROM `visiteurs_log`    GROUP BY ip    ORDER BY date DESC

On obtient ainsi un tableau avec une ligne par visiteur, qui donne la durée totale d’ouverture de vos pages, mais également la durée d’inactivité cumulée, et enfin la durée de consultation réelle, c’est à dire la différence entre les deux. Il reste à compiler et analyser ces valeurs pour avoir une information plus précise sur le temps de parcours.

Conclusion

Cette donnée est encore imparfaite, et il faudrait s’assurer que le comportement des événements blur() et focus() est homogène selon les navigateurs. En outre il faudrait des requêtes plus précises sur la table pour dissocier les visites successives et les cas où l’utilisateur ouvre plusieurs fenêtres de votre site à la fois. Une fois ces précautions prises, je pense qu’on peut obtenir une idée beaucoup plus précise de la mesure.

Qu’est-ce qui en sort sur mes mesures ? Trop tôt pour le dire. Les chiffres ont l’air de coller, avec des temps d’inactivité moyens oscillant entre 8 et 15%, mais mon échantillon de données est trop limité pour en tirer des enseignements à ce stade. A suivre donc…

Besoin d’aide ?

Vous avez besoin d’aide pour votre référencement mais manquez d’outils ou de compétences techniques ? Essayez mon outil de référencement automatisé ou contactez-moi pour des services personnalisés d’audit et de référencement de sites.

Outil de référencement professionnel - essai gratuit Ce contenu a été publié dans Blog, avec comme mot(s)-clé(s) , , , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *