Skip to content
Showing posts with label Data and measurement projects. Show all posts
Showing posts with label Data and measurement projects. Show all posts

Monday, June 15, 2026

Writing analytics specs that developers can build

In UK government digital teams I wrote the specifications for my own team's analytics work, as user stories with acceptance criteria. The rule I took from it is easy to state: an analytics request is ready for development when someone other than the analyst can test it.

The situation

I worked as an analyst in UK government digital teams, at GDS and the Department for Education, often in several teams at the same time. The teams were multidisciplinary and worked in Agile, with product and delivery managers, developers, designers and user researchers on the same service.

Part of the work was digital identity. In the UK that is harder than in many countries, because there is no national identity card to check people against, so a service has to build confidence in who someone is from several weaker pieces of evidence. Government is still working on it: in February 2026 HMRC started signing up new customers through GOV.UK One Login, which GOV.UK said was then available for over 200 government services.

In a team like that, an analytics request competes with everything else on the board. If it arrives as "can we track the identity check?", the developer has to guess what to send, when and with which values. The guesses come back at user acceptance testing (UAT), when changing them is expensive.

What I did

For my own team, I wrote each analytics task as a user story with acceptance criteria. The story said who needed the data and which decision it supported. The criteria said what the developer had to build and how we would check it in UAT.

The example below is invented for this post and has no detail from a real service, but it has the shape I used.

As a performance analyst, I want an event when a user leaves the identity check step, so that we can report completion by step and see where people drop out.

  • When the user leaves the step, one event named identity_check_step_end is sent.
  • The event has an outcome parameter with one of these values: passed, failed, exited.
  • The event sends no name, date of birth, document number or free text.
  • In UAT, one attempt with each outcome produces exactly one event per attempt in the test property.

The privacy line sat in the criteria on purpose. In an identity service the safest personal data is the data the event never carries, and a written criterion can be tested in UAT like any other.

Writing the check first also moves the questions earlier. Edge cases come up while the story is being refined, when an answer is a comment on the ticket.

The team also automated its recurring reporting with Python and ETL pipelines. That cut the analytics effort on reports by around three quarters, and weekly reports went out on time to more than 30 stakeholders. It was a team achievement, built in Agile with everyone on the team.

What I learned

Acceptance criteria that cannot fail are a wish list. Each line has to describe something a tester can see happen or not happen. The analyst is the best person to write those lines, because the analyst knows what the data will be used for and which mistakes would make it useless.

What I would do today

The GOV.UK Service Manual already asks teams to have a performance analyst from the start of discovery and to work out their measurements while the service is built (Service Manual). I would keep that and add four things.

  1. Link the tracking plan to the stories, so each event points to the story that created it and to the metric it feeds.
  2. Check event names and allowed values automatically in the test environment, so a typo fails before release.
  3. Agree once with the privacy team a list of fields that never go into analytics, and paste it into every story.
  4. Write acceptance criteria for AI features in the same way. A feature built on a large language model also needs written cases it must pass before release, and someone other than its builder should be able to run them.


Monday, April 20, 2026

Agree the metric before you build the dashboard

At JD Sports Group, marketing and ecommerce each had their own figures and neither trusted the other's. The programme that fixed it started with definitions agreed by the managers, and the dashboards came afterwards.

The situation

From 2021 to 2024 I was Senior Digital & Marketing Data Analyst at JD Sports Group and product owner of a programme of 8 projects to improve measurement end to end. When the programme started, each manager had their own objectives and their own KPIs. Marketing did not trust the ecommerce figures, ecommerce did not trust the marketing ones, and meetings that should have ended in a decision ended in a discussion about whose report was right.

The request that usually arrives in that situation is a new dashboard. Built on top of the disagreement, it would have shown both sets of numbers on one screen, and the discussion would have carried on in front of it.

What I did

I started with a measurement plan, before choosing any tool. I ran sessions with the managers to agree the business objectives first, and then the KPIs that would show whether we were meeting them, for internal users and for customers.

To give it a structure I used the GDS Performance Framework, which separates primary and secondary metrics. Each area ended up with a small number of metrics that mattered, each with one shared definition behind it. GOV.UK has since withdrawn that framework page and points readers to its Service Manual guide on measuring success, which asks teams to work out their measurements while they build the service.

I split the roadmap in two. The strategic part was objectives, metric definitions and ownership. The operational part was instrumenting the tracking with developers and building dashboards. We ran it as an agile programme, with a Trello board for the programme and Jira for the delivery work with developers. New requests arrived every week, so the backlog kept moving, and I prioritised by dependency and by how many teams a piece of work would unblock. A metric was defined before it was implemented.

Dashboards were released one implementation at a time. After each one, people could see an operational dashboard, use it and tell us what was missing, and most of the refinement of the metrics happened at that stage. When a new implementation moved into business as usual, a short survey checked whether it met the need it had been built for.

The programme delivered its 8 projects with 90% stakeholder satisfaction, and adoption of analytics grew 70% year on year. Adoption is the figure I value most, because it shows that people started coming to the data to settle questions.

What I learned

Implementing a metric that nobody has agreed on moves the argument downstream. In a meeting the disagreement is visible and cheap to resolve. Inside a dashboard it looks like a data quality problem, and tracing it back to a definition takes much longer.

The second lesson came from releasing early. A definition agreed in a workshop is still a draft until people use it with real data, and the first dashboard was the cheapest place to find out what the draft had missed.

What I would do today

Creating a metric keeps getting easier. With Tag Manager templates and point-and-click tagging, a new event can be live in minutes. When an event takes minutes to create, the definition is the part of the work that needs an owner.

If I ran the same programme now, I would add four habits.

  1. A written definition for every primary metric, with the business question it answers, the formula, the data source, the filters, the owner and the date it was agreed.
  2. A change log that the dashboard shows. When a definition changes, the date appears on the chart, so nobody reads a step in the line as a change in the business.
  3. No new event in the tracking plan unless it feeds a metric that has a definition.
  4. A review of the secondary metrics every quarter, to retire the ones nobody opens.

Before your next dashboard

Take the headline metric of the dashboard you are about to build and ask two managers who use it to write down, separately, how it is calculated. If the answers differ, that conversation comes first, and the dashboard can wait a week.

Monday, February 16, 2026

A hole in the checkout funnel: fix the tracking before you redesign the page

At JD Sports Group the business was ready to redesign the checkout because the funnel looked broken. The first problem I found was a page nobody had tracked, and fixing it changed what the rest of the project could do.

The situation

I was Senior Digital & Marketing Data Analyst at JD Sports Group from 2021 to 2024. One project started with a clear request: the checkout funnel is broken and needs redesigning. Several teams had a view on what was wrong and what to change, and the pressure was to start changing things.

What I did

I started with the analysis. Compared with benchmark, the funnel numbers were off in a way that did not fit a checkout that had not changed recently. Following the drop led me to a page that had been added to the checkout at some point and never tracked. Customers were passing through a step the funnel could not see, which left a hole in the report.

We fixed the tracking first. That gave the teams a funnel they could trust, and it gave me the credibility to ask for more advanced tracking, which was approved.

The numbers then showed where people left the checkout, but they could not say why. I added a survey with Hotjar, the tool the team already had, and used the OpenAI API to clean and categorise the open-text answers. Payment problems came out as the main theme, backed by what customers had written.

Session recordings came next, but the volume was too high to turn into a priority list. So I changed approach and worked with Customer Care to put live chat on the checkout during working hours, on one condition: agents logged the reason for each conversation in Salesforce. That gave us the reasons directly from customers, every week.

There were competing requests. Marketing wanted Customer Care to run video calls with customers, and Customer Care wanted the chat on product pages. I argued for the checkout first by walking both teams through the funnel step by step, showing what data we already had at each stage and what each option would tell us that we did not know yet. The reporting stayed simple, with charts and a weekly report, and the teams started reusing it in their own meetings. Once the report was useful to them, the priority was no longer up for debate.

The result, and how it was measured

Checkout conversion improved by 4% (relative) after the changes. That figure comes from a before-and-after comparison against the baseline before launch. There was no A/B test, so the comparison cannot separate the effect of the changes from seasonality or from anything else that moved in the same period. When I present the number, that limit goes next to it.

The weekly report outlived the project, and Customer Care was still using it in their own meetings long after it closed. It also showed me the weak point. As Customer Care hired new people, the logging discipline dropped and the reason data became less reliable, so the reports kept coming out while their value went down. Retraining became a recurring task, built into how the report was maintained.

What I learned

A funnel is a data product, and the cheapest data quality control is checking that every step in it is measured before anyone draws conclusions from it. The epilogue taught me the second lesson: data that depends on people typing a reason into a CRM needs the same upkeep as a pipeline, because adoption work does not end at handover.

What I would do today

I would add four things.

  • Tracking in the definition of done. A new checkout step does not go live until its event is in the tracking plan and a test confirms that the event arrives.
  • An automated completeness check on the funnel. Pages inside the checkout path that receive sessions and send no funnel event should raise an alert.
  • The LLM categorisation treated as a measurement instrument. Personal data comes out of the free text before it goes to an external API, the prompt and model version are recorded, and a sample of answers coded by a person checks that the categories still hold.
  • The comparison agreed before launch: the baseline window, the change being measured and the list of other releases in the same period. If the traffic allows it, a holdout group as well.

Try this on your own funnel

Pick your highest-value funnel and list every page a customer can see between the basket and the confirmation page. Then check that each one sends an event. If the two lists do not match, that is the first finding to take to the redesign meeting.

Tuesday, August 13, 2024

Python Polars mejorando el performance de pandas

Durante el último año cada vez más analista que trabajan con Big Data usan Polars frente a Panda para el análisis de datos.

Entre ambas librerías existe una gran diferencia que hace que sea posible que Polars tenga un performance mejor, frente a Pandas, la librería por excelencia.


Cómo está creado Polards frente a Pandas

Polars está escrita en un lenguaje a bajo nivel llamado Rust y además hace uso de forma más fácil del paralelismo en python. Esto provoca que consuma menos recursos.

Cómo usar esta libreria

Igual que usamos pd para importar la librería de pandas, para usar polars puedes usar lo siguiente:

import polars as pl

Para seleccionar columnas puedes usar select de la siguiente forma:

df.select(pl.all())

Y si quieres filtrar filas:
 
df.filter(pl.col("ref") == "c")


Si comparamos con pandas en cuanto a sintaxis puedes verla aquí que se similar pero necesitamos una chuleta ya que cambia. En comparación con pandas en más cercana al lenguaje natual, lo cual es de agradecer.

Eliminar filas con valores nulos:Pandas:
df.dropna()
Polars:
df.drop_nulls()


Visto todo esto para datasets grandes vale la pena medir el performance por si es tan grande la diferencia entre ambas librerias.


Más información


Y una comparación con pandas en cuanto a sintaxis :

Friday, January 20, 2023

Framework para EDA y como automatizar en Python el análisis exploratorio

 Antes de ponernos a hacer algún modelo o análisis y más allá de las herramientas que vamos a utilizar nos va a tocar familiarizarnos con los datos y ver que tipo de modificiones debemos hacerle antes de tenerlos listos 
Para ello existe un tipo de análisis EDA: Análisis de datos exploratorio. 
Lo que podemos definir que entra dentro de este análisis va a depender de las necesidades del dataset y de las preguntas que tenga el negocio, Lo que si es cierto es que una vez hecho uno, podemos reutiliar formulas para aplicarlo al resto de análisis.Sobre todo la parte de visualización  
Así que podemos definir un framework para transformar esos datos

Framework para realizar el análisis exploratorio

Podemos así ver 5 fases que pueden ser iterativas:

Data Sourcing

De dónde vienen los datos, tenemos que modificar el tipo de variable o la codificación? 

Data Cleaning

Existen valores nulos? Debemos eliminar valores atípicos, valores duplicados.

Univariate analysis

Cómo se distribuye cada una de las variables? Valores máximos y mínimos, ...

Bivariate analysis

Existe correlación entre dos variables. Una variabe ayuda  a predecir a la otra?

Multivariate analysis

Y cómo se comportan estas variables en su conjunto? Podemos añadir nuevas variables a partir de las que ya tenemos?

Automatización del análisis exploratorio en Python

Pues visto así esto nos puedo llevar bastante tiempo, pero se irá una inversión a medio plazo. Como comentaba más arriba gran parte del análisis exploratorio para el análisis de datos se puede automatizar. 

df.describe()

Y sobre todo visualizando las variables usando numpy y pandas con seaborn

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt


Librerias para la automatización del EDA en Python

Hasta la fecha ya tengo en mi bookmark tres librerias que automatizan esta parte. Sobre todo a mi me parece útil para hacer visualización tras transformar datos o creas nuevos. Estas librerias también se puede utulizar para comparar los datos que tenemos en nuestros train dataset de forma muy rápida. 
Las tres librerias que comento aquí hacen uso de tan sólo 2-3 líneas de comando.

Por mi orden de preferencia:
  1. 1. Pandas profiling, que nos da un informe de spoiler como este. Aunque los comandos avanzados no son muy avanzados, aquí tienes como instalar esta librería en Python
  2. 2. Dataprep 
  3. 3. Sweetviz, que es más ligero de pandas profiling

Quiero saber más sobre EDA!!

Monday, September 26, 2022

HOW-TO: SQL When to use USING instead of WHERE - SQL INTERMEDIATE

 Visto en Leetcode:

https://leetcode.com/

Problema: 

Dadas dos tablas con IDs de usuario queremos saber el nombre y el id de usuario con su id único.


Además queremos que aparezcan los nulls

Explicación:

En un primer momento lo más fácil sería pensar en usar un LEFT JOIN o un RIGHT JOIN

Sin embargo tenemos una claúsulas que nos puede ayudar a simplicar el código creada para estos casos concretos y sería USING

SELECT unique_id, name 

FROM Employees e

LEFT JOIN EmployeeUNI u ON e.id = u.id


Por qué usar USING en SQL

Using hace más legible el código y además nos ayuda a prevenir problemas más complejos.

Cómo usar USING en SQL

# Write your MySQL query statement below
SELECT unique_id,name
FROM Employees
LEFT JOIN EmployeeUNI
USING(id)

Tuesday, August 17, 2021

TidyVerse y las condiciones del Tidy data que nos hacen la vida más fácil

ehhhh  (se pronuncia taidivers)
Hace ya varios año se dio un movimiento en la comunidad de R para que se utilizaran una serie de paquetes para unificar estos y que fuera más consistente el análisis de datos.
De aquí se crearon varios paquete cad auno con una funcionalidad diferente.
Para hacerlo más a menos aquí tienes un video directo al grano. 

Datos Tidy 

Ya sea en R, como en Python como en una hoja de cáculo tipo Google Drive o Excel antes de empezar a analizar nuestros datos tenemos que conseguir que los datos cumplan una determinada extructura. en resumen una forma de tabla o tabular. De no ser así algo puede salir mal y darnos unos resultados que los programas no van a comprender.
Condiciones que deben cumplir los datos Tidy
  1. - Cada columna es nua variable
  2. - Cada fila es una observación
  3. - Cada celda es un valor
Cumpliendo estos tres mmmm valores universales, podemos saber que estamos en el buen camino. Aunque muchas veces nos va a tocar transformar los datos para que tengan esta forma.

Paquete que nos ayudan a transformar datos para cumplir con el Data Tidy

Si usamos R, tenemos un paquete que se llama TidyR con su cheetshet
Si usamos Python, pandas cumple nuestro papel. Y para muestra esta cheetshet de pandas para data wrangling
Y para terminar un éxito de ventas de cuando esa joven de Tabular Bells (o algo así)

Monday, August 9, 2021

How-to Pandas. Notas sobre el curso de iniciación a Pandas de Kaggle

Hace unas semanas empecé un curso para repasar pandas y me topé con un curso muy claro y que explica  a muy bajo nivel como funciona así que para principiantes viene al pelo.
Una vez terminado tienes incluso un certificado de realización por Kaggle al que puedes acceder

Pero vamos a empezar por el principio:

Qué vamos a aprender en este curso de Kaggle de Python
  1. Creating, Reading and Writing
  2. Indexing, Selecting & Assigning
  3. Summary Functions and Maps
  4. Grouping and Sorting
  5. Data Types and Missing Values
  6. Renaming and Combining

El curso en cuestión es este y en una semana puedes tenerlo terminado si.

https://www.kaggle.com/learn/pandas

Para ayudar te dejo mi chileta

 Chuleta sobre tipos de datos :

 DataFrame = tabla
Series = lista
Por lo tanto un DataFrame es un conjunto de listas.

Leer un archivo csv:

wine_reviews = pd.read_csv("../input/wine-reviews/wine2020.csv")

Expecificando la columna a indexar

wine_reviews = pd.read_csv("../input/wine-reviews/wine2020.csv", index_col=0)

Cambiando la columna a indexar

reviews.set_index("title")


Tuesday, May 19, 2020

Exploratory Data Analysis- EDA- en Python para vagos con pandas_profiling

A la hora de analizar datos, sobre todo si nos enfrentamos a un dataset nuevo nos podemos tirar varias horas intentando comprender que calidad tienen los datos.Para eso siempre bueno empezar nuestro análisis por EDA para saber que datos debemos transformar o la calidad de los mismos

Qué es EDA

EDA responde al nombre de Exploratory Data Analysis.EDA es especialmente importante para saber si tenemos valores nulos, si puede haber errores en nuestros datos o incluso comprender la distribución de estos por si debemos normalizarla para aplicarle determinados test no paramétricos o paramétricos. Así vamos aprender de nuestro dataset en plan primera cita.


via GIPHY

Echándole un vistazo a nuestro dataset

Primeras impresiones

Qué pinta tiene por delante

df. head()

Y que tal se ve por detrás

df.tail()

Qué tamano tiene

df.shape()
df.columns

Eso es todo por ahora de un primer vistazo. Pasemos a las preguntas
Pasamos a las preguntas

Cómo te describes

df.describe
df.dtypes

Y en fin, nos pdría dar varias horas con esto.

Vale, que es perder un poco la magía, pero que tal si tuvieramos un informe completo de todas estas preguntas y muchas más, así nos hacemos a la idea de que preguntar despues, como una app de esas de ligoteo, donde además vamos a poder ver los gráficos de muchas de estas cosas.

Vale, pues eso ya lo tenemos en Python y lo podemos usar con pandas. Os presento a pandas-profiling

Cómo se usa pandas profiling


Pues lo primero que debemos hacer es instalarlo
Y todo lo que vamos a tener que hacer es 
1. Instalar la libreria
pip install pandas-profiling
2. Importar ambas librerías 
  • import pandas as pd
  • import pandas_profiling
3. Convertir los datos a un dataframe

4.Ponerle un título a nuestro informe

5. Exportar el informe al formato que queramos (por ahora sí o sí en html)

6. Ya tenemos nuestor informe sin tener que programar todo la anterior.

Qué incluye el informe de pandas profiling



  • Inferencia de tipos: detecta los tipos de columnas en un marco de datos.
  • Elementos esenciales: tipo, valores únicos, valores faltantes
  • Estadísticas cuantiles como valor mínimo, Q1, mediana, Q3, máximo, rango, rango intercuartil
  • Estadísticas descriptivas como media, modo, desviación estándar, suma, desviación absoluta media, coeficiente de variación, curtosis, asimetría
  • Valores más frecuentes
  • Histograma
  • Resaltado de correlaciones de variables altamente correlacionadas, matrices de Spearman, Pearson y Kendall
  • Valores perdidos matriz, recuento, mapa de calor y dendrograma de valores perdidos
  • El análisis de texto aprende sobre categorías (mayúsculas, espacio), guiones (latín, cirílico) y bloques (ASCII) de datos de texto.
  • El análisis de archivos e imágenes extrae tamaños de archivos, fechas y dimensiones de creación y escanea en busca de imágenes truncadas o aquellas que contienen información EXIF.

Así que nada, ahora ya nos ha sobrado tiempo para hacer las cosas importante de nuestra vida.

via GIPHY


Este informe nos ahorra mucho tiempo.
Si quieres saber más sobre él , aquí tienes la documentación

Documentación de la librería

https://pypi.org/project/pandas-profiling/


Monday, May 11, 2020

Eligiendo como visualizar el análisis de datos en 🐍 Python para EDA usando pandas

Hace unos días, me di cuenta que necesitaba una forma de visualizar datos para Adhoc análisis y EDA.
Siempre he sido bastante reacia a perder el tiempo haciendo gráficos en matplotlib porque me parece muy complicado el disenno.

Pero, tras haber perdido parte del código que usaba en Python para hacer todo más rápido por no subirlo a Github, me he dado cuenta de que necesito esto.


Primero vamos a ver que tipo de librerias tenemos en Python que podemos usar en Jupyter Notebook

  • matplotlib
  • Seaborn
  • bokeh
  • plotly
  • cufflinks (plotly + pandas)


matplotlib

 Es la libreria por antonomasia para usar con Pandas.

Seaborn

Basada en matplotlib tiene automatizados muchos gráficos para hacerlos de forma más sencilla. La parte negativa es que no es interactiva

bokeh

La sintaxis y el modelo, no tiene nada que ver con las dos anteriores. Así que hay que aprenderla desde cero. Como puntos destacados puedes exportarse para usarse con JS y es interactiva, eso significa que puedes hacer dashboards con los que se pueden seleccionar variables por ejemplo.

plotly

Es una librería propietaria, pero permite hacer muchos gráficos. Tiene buena usabilidad, así que no necesitas aprender mucho código y la documentación es muy buena. Hay una versión de pago, así que no es totalmente libre. Sería como el debian de las librerias de visualización de datos en Python.

Friday, December 6, 2019

MVCC - multiversion concurrency control en base de datos

Hace unas semanas me pasó un marrón considerable. Fui a sacar dinero al cajero y úna vez puestos mis 400 euros, el cajero me dió un error y suspendió la transacción. Así que como yo quería mi dinero volví a repetirlo todo y esta vez si obtuve m dinero.
Cual es mi sorpresa cuando miro en la APP que había sacado dinero dos veces.

Seguido de un sudor frio y un ahora qué

Empecé a imaginarme tener que llamar  a mi banco, al cajero, a mi cuenta de Reino Unido, a ver como explico yo que estaba diciendo la verdad y nada más que la verdad. Joder 400 euros, es una pasta eh. Y no tengo testigo. A ver si le da mi dinero al segundo que llegue... overthinking

Y al llegar a casa y llamar al banco, me dicen que todo esta bien y que ese dinero esta en mi cuenta. 
Pero, sennorita, que yo lo he visto con mis ojos. Y ella, pues vuelve a mirar. Tachán ahí estaba.

Acaso he entrado en un agujero del tiempo del camino del banco. Nota mental - Dark y Rick y Morty me están afectando seriamente.

Pues no, tiene pinta que ha sido tema MVCC.  Y aquí ya hay que ponerse un poco nerd.

Qué es el MVCC

El control de concurrencia mediante versiones múltiples (Multiversion concurrency control o MVCC) es un método para control de acceso generalmente usado por SGBDs para proporcionar acceso concurrente a los datos, y en lenguajes de programación para implementar concurrencia.
En la wikipedia tienes más información  https://es.wikipedia.org/wiki/Multiversion_concurrency_control

Para que sirve el Multiversion concurrency control

Pues para que no pasen errores como el mio. Yo pedí sacar un dinero y seguramente hubo un timeout en medio de la query. Al usar el banco de otra sucursal en mi app salió como que ya había cogido ese dinero. Entonces miré en la app, y mi dinero había desaparecido. Más tarde el cajero del banco mandaría un código de error como que no se había completado la transacción. Así que la base de datos de mi banco volvió al estado anterior, es decir no completó esa transacción.

Mmmmmm todo tiene sentido ahora. Y oye, esto es bastante importe porque estas cosas pueden pasar varias veces al día. 

Cómo funciona el control de concurrencia mediante versiones múltiples

La verdad, es que el tema es un poco complicado de explicar con palabras, así que lo mejor es tirar de diagramas. Dejo aquí un artículo que lo explica muy bien. 

En que bases de datos se puede dar el MVCC


Monday, November 18, 2019

Como calcular la mediana en SQL


La mediana es una médida de tendencia central que nos va a ayudar a abrir los ojos cuando nos encontremos con datos que puedan estar sesgado. Es como una media aritmética mejorada para casos en los que los datos no parezcan una montannita.

Así que antes de ponerte a calcular la media de algo, deberías visualizar que forma tienen estos datos.  Si ya has decidido que la media no te sirve o simplemente quieres comparar la media y la mediana y no sabes como calcular esta última
     
Primero, la parte fácil.

Como calcular la media de una columna en SQL

AVG(columna)

Ejemplo

SELECT AVG(columna) FROM tabla

Como calcular la mediana de una columna usando SQL

Aquí la cosa ya se complica un poco más. Así que tenemos que tirar de definición de mediana.
percentile_disc(0.5) WITHIN GROUP (ORDER BY columna) AS mediana
Vamos a desmenuzar que es lo que estamos haciendo:

La mediana es el igual al percentil 50, es decir lo que queda justo en la mitad de todos nuestros datos. Esto ya explica el percentile_disc y el (0.5)

Otra cosa que tenemos que tener en cuenta es que para calcular la mediana necesitamos tener ordenados nuestros datos por ellos vamos a usar el ORDER BY.

Finalmente, queremos renombrar la columna como mediana. Así que AS mediana

Ejemplo práctico con media y mediana eb una sentencia SQL

SELECT categoria,
      avg(precio) AS media,
       percentile_disc(0.5) WITHIN GROUP (ORDER BY precio) AS mediana
  FROM producto
 GROUP BY categoria
 ORDER BY avg(precio);

Friday, November 1, 2019

📊 👨‍👩‍👧‍👦 DataOps Manifesto - Cuando mezclas Data y Agile en un equipo



En mi último equipo tuvimos que encargarnos de hacer desde cero todo el sistema de reporting de la unidad, desde la investigación de nuevas métricas usando metodologías user experience research como entrevistas y focus group a crear todo el sistema de eventos en AWS, la ETL pipeline y el dashboarding y reporting en Python. Y todo esto usando metodologías Agile. No veas que converaciones teniamos más frikis de vez en cuando sobre métricas, calidad de los datos y performance.

Yo por mi parte además me llevaba muy bien con el depatamento de Devops o Reliability Engineering que eran los que usaban Kubernetes, Dockers y bases de datos, y todo lo que tenía que ver con PaaS (Platform as a Service). Y uno de mis compas le encantaba explicar lo que aprendía sobre analytics y tenía super paciencia al explicarlo. Eso me llevó a aprender sobre la existencia de balanceadores, la posibilidad de tener el backup en dos ´nubes´ diferentes o el reporting en Prometheus

Como firme defensora de trabajar en Agile en equipos multidisciplinares y diversos hay una cosa que no me terminaba de encajar al principio. Explicar a los programadores que había que testear los datos y que la definition of done no era la misma para los analistas que para los programadores nos trajo al equipo muchos dolores de cabeza y conversaciones metafísicas. Y mucho ensayo-error hasta encontrar la mejor metodología, donde tanto analistas como ingenieros tuvieramos nuestros requerimientos requeridos.El mayor problema era que tras meses implementando algo y darlo por finalizado, debíamos mejorarlo, o las necesidades de los usuarios cambiaban o nos mandaban hacer un análisis adhoc. Todo esto significó que tuvimos que aprender a trabajar juntos, y a su vez desaprendimos a trabajar como lo haciamos antes. Eso es lo bonito de Agile.

Y si llevamos todo mi largo comentario a metodología de Big Data e Inteligencia Artificial y la posiblidad de hacer todo esto en la nube podemos encontrarnos que este problema lo van a tener todas las empresas Data-Driven. Son mucho los equipos de desarrollo de software que se encuentran en esta tesitura, y por ello sólo era cuestión de tiempo que apareciera un nuevo manifiesto - DataOps.

DataOps o DevOps

DataOps toma la forma de su primo los DevOps, y lo que pretenden es que se integre esa mejora continua en los datos, mejorando así además la calidad de estos. Así que no, no se dan por finalizadas las tareas tan facilmente como ocurre en otros equipos de software, igualmente que los DevOps tienen que mantener operativa la plataforma 24/7. Como comenta IBM en su artículo en Data y Analytics hay una gran diversidad que operaciones a realizar y aunque todos sean con data, requieren de diferentes procesos y herramientas. (´Big Data Workloads are Diverse.´)

El DataOps manifiesto en castellano

El manifiesto empieza al igual que el Agile Manifiesto con las siguientes afirmaciones

  • Personas e interacciones en lugar de procesos y herramientas
  • Soluciones de analítica eficientes en lugar de documentación comprensiva
  • Colaboración con el consumidor en lugar de negociaciones contractuales
  • Experimentación, interacción y retroalimentación en lugar de un diseño extensivo directo
  • Titularidad multidisciplinar de las operaciones en lugar de responsabilidades aisladas.
La traducción del manifiesto la puedes encontrar en el siguiente enlace, cuenta con 18 puntos que van desde la formación de los equipos, a la calidad de los datos y la necesidad de procesos de retroalimentación para la mejora continua. Están bastante claros, así que no vale la pena que los detalle aquí.
https://www.dataopsmanifesto.org/dataops-manifesto.html?lang=es .

Métricas para medir el Performance de tu equipo de Analítica o Data team

Este video explica alguna de las métricas que se pueden usar para medir el éxito del esfuerzo del equipo
https://www.youtube.com/watch?v=Ch4gJz3n8qw&list=PLVbsAdgZXvtyy6HVKCP0HChjCcq2oW3eK&index=18&t=0s

Más información para ampliar 

https://en.wikipedia.org/wiki/DataOps
https://www.gartner.com/en/newsroom/press-releases/2018-09-11-gartner-hype-cycle-for-data-management-positions-three-technologies-in-the-innovation-trigger-phase-in-2018
https://www.ibmbigdatahub.com/blog/3-reasons-why-dataops-essential-big-data-success
Canal youtube sobre DataOps
https://www.youtube.com/playlist?list=PLVbsAdgZXvtyy6HVKCP0HChjCcq2oW3eK


Sunday, April 14, 2019

Breve resumen Python para análisis de datos - librerías

Tras tres annos usando Python practicamente a diario para análisis de datos creo que ya puedo dar algunos consejos para analistas que quieran aprender el lenguaje para hacer análisis de datos.

Al principio puede parecer un poco overhelming toda la información que pueda aparecer en Internet, sin embargo hay determinadas librerias que vas encontrar en todas partes y que te permitirán hacer el 80% de tu trabajo.

Qué librerías en Python son las más usadas para análisis de datos y Machine Learning

Pandas, los cubiertos del análisis de datos

La primera libreria que deberías aprender a usar para empezar a hacer cosas es Pandas
A la hora de usar pandas debes pensar siempre en una spreadsheet u hoja de calculo con formato tabular.Manipulas datos en  dos dimensiones. tienes filas y columnas. Esta librería tiene diferentes funciones contruidas que te haran todo más facil, al estilo de funciones de excel pero más rápido y fácil de usar y procesar.

Pandas te permite manipular y limpiar los datasets de una forma fácil. La libreria Pandas usa dos tipos de estructuras de datos de tipo objet( es decir, complejos). Dataframes (el más usado) y Series.

Además puedes crear pivot table para presentar tus resultados. En este caso Pandas te permite además, si quieres usar índices (index) para que sea más fácil. El index hace que la curva de aprendizaje sea un poco más larga, así que mi recomendación es ir haciéndote a ellos poco a poco.

Si eres nuevos en Python para análisis de datos deberías empezar entendiendo como funciona Pandas, ya que los usarás prácticamente cada vez que hagas un análisis.

Numpy para estructuras matrices y procesimiento matemático

El padre de Pandas es Numpy. De hecho Pandas está construida usando Numpy. Muchas veces en pandas se tarda mucho en hacer cálculos y entonces es más eficiente (la operación se va a procesar antes) al usar Numpy. Esto sobre todo es debido a un tipo de estructura de datos de tipo objeto que se llama Narray.

Scipy , añade analísis estadístico a tu análisis

Con las dos librerias de arriba ya podrías empezar a trabajar haciendo análisis descriptivos. Sin embargo,  vas a necesitar tirar de análisis estadístico en algún momento- Scipy es un librería. Pongamos que necesitas hacer una regresión o que estás analizando A/B tests. Scipy te ayuda con ello.

Scikit-learn , añade Machine Learning de forma fácil. 

Esta librería ha sido tendencia estos últimos años debido a que es usada por Data Scientifist para hacer su trabajo con un montón de algoritmos contruidos para no tener que preocuparte de nada.
Está escrita sobre Numpy y Scipy. Además tiene funciones para entrenar los datos (train) y crear modelos. Es muy fácil de usar y si sabes lo que estás haciendo (matematicamente hablando) es muy eficiente y limpia para aplicar Machine Learning.

Matplotlib , visualiza tus resultados

Además de esto tienes librerias para visualización de datos, siendo matplotlib la más usada. Yo no soy muy fan de ella y prefiero exportar los datos en csv y llevarme los datos a PowerBi o Tableau, pero me matplotlib ha sacado de algún apuro alguna vez, debo confesar. Aquí puedes ver todos los tipos de gráficos que puedes hacer con ella https://matplotlib.org/3.2.1/gallery/index.html


Como usar las librerías en Python

Una vez que tenems claro las librerias que queremos usar, vamos a pasar a ver como se usan.
Como en todos los lenguajes de programación deberíamos tenerlas instaladas (para no complicar mucho esto )

Python es un lenguaje muy flexible, y por ello y para que todos podemos entendernos, existen una convenciones que todo el mundo suele seguir a la hora de llamar a estas librerías.

Una vez tenemos instaladas nuestras librerías podemos usar llamar a una librería o sólo a la parte que creamos que vamos a necesitar. A esto se le llama importar.

Si queremos llamar llamar a toda la librería de pandas diremos. Si tenemos muchas librerías en memoría va a hacer más pesado el programas. Además tener sólo lo que vamos a necesitar, va a hacer que focalicemos en lo que estamos haciendo y una vez volvamos a leer nuestro código (o el del que leyó el programa va a ser más fácil de entender que está haciendo).

Ya que pandas es la que más usamos la importaremos entera como

import pandas as pd

Ahora imagina que queremos hacer una regresión. Esto sólo va a pasar una vez en nuestro programa. En ese caso es mucho importar sólo lo que vamos a usar. Por ejemplo diremos de sklearn, carpetita modelos lineales usaremos regresión lógística, de métricas solo queremos estas, etc

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score, accuracy_score, f1_score, confusion_matrix, classification_report

Convenciones para usar las diferentes librerías


Como comentaba anteriormente hay convenciones para llamar a estas librerías, aunque si qusieras llamarlas de cualquier otra forma Python seguiría funcionando.

Por el bien de la salud mental de tus compañeros y de la tuya misma sigue estas convenciones guilo-guiño

En caso de pandas (pd), numpy(np) y matplot(plt), puedes importar las librerías enteras. En cambio no deberías importar enteras ni Scipy, ni Scikit learn, sino sólo los módulos que quieras usar. Esto quedaría así en tu código como ejemplo

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

y para las otras dos librerías sería en plan ejemplo

from scipy.stats import norm, binom
from sklearn.linear_model import LogisticRegression

Espero esto sirva de introdución en tu viaje en el aprendizaje de Python para analisis de datos

Thursday, September 27, 2018

Tipos de análisis descriptivo: modelos descriptivos, modelos predictivos y modelos prescriptivos

Recien acabado el curso de Customer Analytics A la hora de hacer un análisis de nuestros clientes nos encontramos que existen tres formas de abordarlos.

  • Análisis descriptivo ( descriptive analysis).

    El objetivo de este es explicar las relaciones que hay entre diferentes variables. Así que estariamos hablando de un análisis del pasado o nuestros cliente actuales. Con estos modelos queremos entender a nuestros clientes para ello se usan análisis como la segmentación de clientes. En términos de análisis estadístico aquí podríamos usar la regresión, análisis de cluster,...

  • Análisis predictivo (predictive analisis)

    Con este tipo de análisis lo que queremos es crear modelos para predecir el futuro. Podemos usar por ejemplo

  • Análisis prescriptivo (prescriptive analysis)

    , cuyo fin es tomar una acción. Este último tipo de análisis es especialmente interesante y complejo ya que tiene en cuenta muchas variables y va más allá de los dos anteriores. Para para poder sacarle un mayor partido hace uso de métodos econométricos y la teoría de juegos.

Sunday, July 15, 2018

Medir el performance de nuestros productos en Tableau con Bullet graphs

Este post ha estado 'on hold' por bastante tiempo y creo que puede ser útil en estos tiempos de crisis que se avecinan.

Uno de los gráficos más útiles que he encontrado para hacer los dashboards más fáciles de leer y que a la hora de hacer informes no tengas que usar varias páginas.

Si los gráficos de barras son tus favoritos, pero se te queden algo cortos a la hora de ponerle información (suelen quedar un poco sosos) y no sabes muy bien como . Tengo el inmenso placer de presentarte los Bullet graphs. Ah qué no lo conoces. Espera que te lo presento....

Lector del post - Bullet graph



Nada de darse la mano o dos besos a estas alturas. Por favor,mantengan las distancias. No es nada personal

Qué es un Bullet graph

Un Bullet graph, que se puede traducir como gráfico de Bala, (pero queda un poco raro...) es un gráfico de barras con contexto.

En performance nos puedes servir para olvidarnos de los gráficos de ´gauge´ que si, serán vistosos, pero no dan mucho contexto.

Estos gráficos son ideales para poner nuestros target en ellos para análisis de ventas o gastos.

Qué pinta tiene un Bullet graph 

Esta


Dónde puedo encontrar este gráfico en Tableau


El Bullet graph forma parte de Tableau desde hace mucho tiempo. Para poder utlizarlo necesitamos al menos dos métricas y por supuesto podemos poner además dimesiones. Ten en cuenta que las métricas tienen que estar en el mismo rango de datos.

En el panel

En qué otro software puedo encontrar este gráfico

Por ahora no podemos encontrar el gráfico en Data Studio, Excel u hojas de cálculo de Google Drive. Sin embargo hay varias librerías en diferentes lenguajes para visualizar este tipo de gráfico entre otras puedes hacer Bullet graphs con D3.js así

No me gusta este gráfico, qué otros puedo encontrar para visualizar el Performance de mi producto

Ok, si no te he convencido este no pasa nada. Existe dos tipos de gráficos que pueden cumplir la misma función . Radial gauge y Linear gauge. Tableau no cuenta con estos gráficos

Saturday, May 5, 2018

Cómo se ejecuta una query en SQL

Para seguir poniéndome al día y no olvidar el coding, estoy haciendo unos cursos a modo de repaso. Además, siempre se aprende alguna libreria o alguna forma nueva de hacer algo que siempre hacemos de una forma más optimizada.

En este caso estoy repasando SQL para business y he recordado un concepto que me costó pillar al principio. Así que aquí queda por si alguien empieza en SQL y se encuentra con ello.

Una vez que ya sabemos lo básico de SQL con una tabla, y se te pasa por la cabeza que qué fácil y lógico es esto

SELECT  //Dame esto
FROM     // De esta tabla
WHERE // donde ocurre esto (tal es igual, mayor, menor que ...)

llega el momento JOIN. Aquí vamos a tener dos tablas o más.

Como en SQL estamos trabajando en un modo tabular (es decir, trabajamos con formato tablas de filas y columnas) vamos a necesitar una misma columna para juntar (JOIN) las tablas. Esto es muy parecido al VLookUp de toda la vida de Excel (en castellano Buscarv)

Por lo tanto necesitamos saber en que tablas están las columnas que queremos. Así que en el ON vamos a poner el nombre de las columnas como referencia. Si la base de datos está bien hecha (es decir bien disennada, es que no tengo ennes en el teclado) la columna que vamos a usar para unirla se llamará igual en ambas tablas. A esta columna se le llama primary key, pero eso es otra historia...
 Total, que en todos los ejercicios que hagas esto será de cajón. Sin embargo, en el día a día en el trabajo te puedes encontrar cualquier cosa y las columnas no se llamen así. Si te encuentras con el caso siempre pregunta por un data dictionary, sería lo primero que deberías pedir. Sin embargo, parece que nadie los necesita ( en realidad quiero decir usa´)

Así que vamos a tener un

FROM // De esta tabla
JOIN // Juntamos  con esta otra tabla
ON // las columnas que nos sirven para juntar porque son las mismas

Antes de nuestro JOIN
nos vamos a encontrar la segunda tabla. El orden de las tablas es importante porque hay diferentes tipos de JOINs y eso va a influenciar también. Esto también es otra historia... Y justo detrás del ON vamos a poner las columnas que son iguales en ambas tablas. Como estamos juntando dos tablas que pueden tener el mismo nombre de columnas (ideally) o no, debemos poner el nomber de la tabla antes de la columna. Por lo tanto
meals(tabla) . meal.id(columna)

OK; Vamos allá,
SELECT price, quantity-order
  FROM meals
  JOIN orders ON meals.meal_id = orders.meal_id
WHERE user_id = 10;
Ahora tenemos todas las columnas a nuestra disposición.
Pero wait a minute, si yo selecciono precio y order de la primera tabla y esa columna está en la segunda tabla  (la que va después del JOIN). Cómo puede ser que no necesite poner como sintaxis order.quantity-order ?

* En realidad puedes ponerlo pero eso significa dar más complejidad y ensuciar la Query. El tema aquí es que la query va a ser leída como un todo, no de forma secuencial. Así que primero se ejecutará el FROM y el JOIN y de forma recursiva se irá ejecutando las demás partes de la query.

Y esta fue mi cara tras una semana revisando oráculos intentando encontrar la respuesta y acabar leyendola en una cheatsheet


via GIPHY

En qué orden se ejecuta una query en SQL

Yendo por partes, cómo se va a ejecutar esto.


  1. PRIMERO se ejecuta FROM-JOIN
  2. Después WHERE
  3. Más tarde todo lo que hay debajo del WHERE como GROUP BY y HAVING
  4. Finalmente SELECT
  5. En quinto lugar tenemos el disctinct (dónde), order by y limit/offset que en realidad es una forma de formatear la query que queremos una vez que tenemos los datos.
Logicamente todo puede ser más complicado con subqueries pero las subqueries serán ejecutadas en

Dónde se sejecuta una subquery en SQL 


  • SELECT
  • FROM
  • WHERE


Y esta fue la cara con la que el manual me miró. Bueno, de forma figurada claro.


via GIPHY


Saturday, February 3, 2018

Calcular Unique Visitors en eCommerce usando BigQuery

 Como calcular Unique Visitor para Channel Grouping de Google Analytics

Uno de las metricas mas importantes para un analista web son los unique visitors. Hasta ahora para conseguir esta metrica en BigQuery debemos usar el fullVisitorId que es semejante a userID

La siguiente consulta nos muestra como conseguir los unique visitors de cada canal del Channel Grouping de 

- nuestro proyecto llamado misdatos

- donde hemos exportado una tabla con todas las sesiones

Qué hace este código SQL?

Google Analytics nos proporciana el fullVisitorId, y para poder contar los no duplicados necesitamos usar DISTINCT. Con el AS creamos ademas el nombre de la nueva variable que vamos a llamar unique_visitors - visitantes unicos.



Otras  métricas similares se pueden encontrar en la tabla de abajo, actualizado a Agosto 2021. Actualmente ha quedado como deprecated el visitorID y ha aparecido (desde mediados de 2018) otra métrica que si que podemos encontrar como tal aparece en en la interface de Google Analytics, el ClientID. 


Más info sobre BigQuery






Tuesday, July 18, 2017

Cómo poner a punto Google Analytics

La verdad es que una vez que hemos puesto el snipet o código de Google Analytics y empiezan a llegarnos las visitas pensamos que todo está hecho.

Luego, conforme van pasando los días, nos creemos que ese todo está hecho es para siempre y nos ponemos a toquetearlo todo. Por eso antes de empezar a crear filtros o cualquier otra cosa vale la pena pararnos un momento y configurarlo todo.

Google nos avisa en su curso básico sobre Google Analytics que  es recomendable tener siempre tres vistas.
No sabes lo que es una vista o view? Google te lo explica aquí abajo.Si aprendiste inglés con Spuminglish, enciende los subtítulos.


Vistas (views) recomendadas por Google

Las tres vstas recomendadas por Google son

-Un Raw Data o vista sin filtrar. Qué una vista sin ningún tipo de filtro o segmento. Esta la vamos a tener por si nos cargamos la que solemos usar. Así siempre tenemos esta de comodín. Nunca hay qie incluir ningún tipo de filtro. Si no, pues no tiene gracia.

- Una Vista Master o vista para hacer nuestros informes de analítica. Esta será la vista que amoldaremos a nuestras necesidades.

-Una  vista Test o vista para hacer pruebas. Antes de aplicar un nuevo segmento o un filtro o lo que sea, primero lo haremos en esta. Si los resultados son los deseamos y nos conviene para nuestros informes la pasaremos a la master.

Pues eso es lo que Google nos aconseja a un nivel básico y que tiene mucho sentido. Al fin y al cabo tenemos la vista "buena", la de pruebas, la de "por si acaso".

Ahora bien hay otro tipo de vistas que nos pueden interesar.

Ejemplos de vistas avanzadas

Vistas para subdominios. 

Imagina que tienes varios subdominions. Por ejemplo analitica.rebolicando.es. Si has decidido crear un subdomino porque es lo suficientemente relevante, no vienen mal crearle su propia vista que te separe esta información del resto.

Vista para móvil

Asi puedes tener una vista sólo para el tráfico móvil en vez de estar usando segmentos.

Vista por paises.

Si tienes contenido diferente por países o algunos países tienes determinados goals u objetivos diferenciados es una buena forma de tenerlo todo en forma.

Cómo se crea una vista en Google Analytics

*Mi cuenta esta en inglés, espero qeu eso no lleve a confusion si estás pensando en sacarte el GAIQ, Deberías poner tu cuenta en inglés ya. Sin excusas. He dicho

Antes de nada nos vamos a ir a la parte de Admin de nuestro flamante Google Analytics

Una vez aquí elegimos en el apartado de view o vista hacemos click en la vista. (personalmmente creo que un botón fuera para crear una nueva vista sería bastante útil).


Clickamos en la pestannay le decimos crear una nueva vista  (create a new view)

Ya estamos creando la vista. Lo mejor es que pongas un nombre que te permita reconocerlo facilmente. Después debemos seleccionar la zona horaria.

 Vale pues arriba nos aparecerá un tímido mensaje que digas "Success", así en verde. Y, hale, ya la tienes.
Puedes crear todas las vistas de la misma forma, sólo preocupate por el nombre y por la zona horraria.

Crear filtros en Google Analytics

 Ahora llegamos al meollo de todo esto. Vamos a aplicar los filtros básicos que nuestra  nuestra cuenta.
Para crear informes yo he creado una vista (view) que se llama Reporting view.Como decíá más arriba esta es la vista que dice Google que hay que usar. Asi que una vez que estoy en ella le doy a nuevo filtro.


Filtros básicos para la vista principal

 El filtro que siempre debemos poner en esta vista es la de la ip de nuestra oficiona. Y de cualquier sitio donde accedamos a nuestra web, por ejemplo si trabajamos desde casa necesitaremos filtrar esa ip. Qué significa filtrar ip? Pues que Google Analytics no tomará en cuenta las visitas desde ahí.

Asi que nos vamos a excluir  el trafico de nuestra ip. Para saber cuál es tu IP busca en google por "saber cuál es mi ip" y te saldran miles de web. Para que le vas a dar más vueltas.



Y bueno, hasta aquí lo más básico de lo básico de Google Analytics

Lo siguiente para ponerlo a puto será. Annadir las redes sociales.


Saturday, January 21, 2017

Errores que pueden darse al analizar datos de forma visual

En el curso sobre Data Visualization and Communication with Tableau ya vamos por la semana tres y cada vez se pone más interesante sobre todo en lo que aplicación práctica se refiere. Sin duda, uno de los mejores cursos que me he encontrado últimamente ya que va más allá de Tableau y explica todo un framework a tener en cuenta para explicar los resultados obtenidos.

Esta semana además aparecen en los vídeos personal de AirBnB dando ejemplos reales de los problemas que pueden darse al analizar los datos.

Errores que se pueden dar al analizar datos de forma visual 

La generalizacion y el sesgo muestral (Overgeneralization ands sample bias)


Este error se refiere al problema que genera elegir un dataset que está demasiado lejos de la realizad por ser una muestra demasiada o pequeña y dar por real algo que no lo es. Igualmente podemos tener un dataset enorme pero que no se ajuste a la realidad. Por ejemplo The Guardian intentó analizar donde eran peores las consecuencias de los efectos del Huracán Sandy según el ruido que se formaba en twitter. En realidad como la población no está igualmente distribuida, habia más tweets desde las ciudades más pobladas. Así que si se hubieran quedado con ese dataset no hubiera servido para nada y los resultados no hubieran servido para nada.

Así que deberíamos tener más cuidado con la calidad de los datos.

Mala interpretación debido a la falta de controles


Cada vez que analizamos algo puede ser debido a diversas causas, no sólo a lo que nosotros pensamos que puede ser. Como ejemplo se da un análisis de una acción de email marketing que supuestamente hacer que aumente la compra de una bebida en una determinada fecha. Más allá de ello nos encontramos que en realidad el aumento de la compra de la bebida se dá, no sólo en nuestra empresa sino también en los mayores competidores. ¿Qué ha podido pasar? Justamente por esa fecha un actor sale en las revistas bebiendo ese tipo de bebida y todos los vendedores salen fortalecidos.

Por ello siempre debe hacerse un grupo de control para ver si el resultado de la acción se debe a alho intrínseco.


Correlación no implica causalidad


Esto siempre es debatido en el análisis. Dos variable que parecen que tienen correlación (por ejemplo cuando una aumenta la otra también) en realidad  pueden no tener relación. Por ejemplo google estuvo haciendo un estudio y dando los resultados sobre la gripe. Así podía predecir los brotes que se daban por zona geográfica. Aunque en un principio parecía correcto, llegó un momento en que dejo de serlo. Quizás había alguna variable que no se haya tenido en cuenta o que entra en juego a lo largo del tiempo, por ejemplo un cambio en Google suggest
A ese tipo de relación que gráficamente parece existir pero que no tiene lógica se le llama relación espurea. Y se pueden a modo de friki-chiste relaciones espureas en esta página web.

Recomendación para evitar estos errores en el análisis

¿Y qué podemos hacer para intentar cometer el mínimo de errores posible y que se vaya todo el trabajo al garete?

1. Podemos crear un grupo de control, al modo A/B testing.

2. Si no es posible, podemos estudiar otras variables relacionadas que podrían esta interfiriendo en el análisis.

3. Hay que tener en cuenta que cuanto más grande es un dataset, más probabilidad hay de que aparezca una variable durante un periodo de tiempo  que haga que la nuestra correlación no sea cierta.(por ejemplo para el caso de Google flu, un cambio en su algoritmo con Google suggest donde sugería a los usuarios términos a buscar ) Así que si queremos basarnos en las correlaciones primero debemos saber que estamos haciendo e investir tiempo y esfuerzo en ello.

Más allá de todo esto aquí dejo un artículo de Wired sobre lo que podemos aprender del fallo de Google Flu Trends (muy muy interesante)