#009 Test AB con Python (I) - Introducción a Python
Python es uno de los lenguajes más populares para el tratamiento de datos. En esta trilogía sobre test AB, vamos a introducirnos en algunas técnicas básicas con Python
Programación y marketing: la lamentable dualidad.
Durante los últimos años en el mundo del marketing (especialmente desde que llegaron los desarrolladores) se ha debatido mucho sobre si es necesario conocer un lenguaje de programación para hacer marketing digital. Están los que dicen que sí y están los amantes del nocode —a los que algún día dedicaré una edición o un hilo— que claman sobre la falta de necesidad mientras te animan a comprar un curso de Notion.
En esta 9ª edición empieza una trilogía sobre Python y su relación con AB testing. En esta primera parte empezaremos con una introducción a Python para que aquellos poco familiarizados con el código puedan entender la parte II y III.
Ahora sí, empieza:
Test AB con Python (I): Introducción básica a Python
Antes de comenzar con aspectos de experimentación con Python, muchos de los que siguen Leanalytics son marketers, CROs, designers y managers (gracias por estar ahí ❤️) y no tienen por qué conocer ningún lenguaje de programación, sin embargo, quiero que esta trilogía sea disfrutable y enriquecedora para todo el mundo.
Por ello, esta edición se va a centrar en aspectos básicos de Python que te servirán para interpretar el código. De esta manera podrás disfrutar mucho más la parte II y III y, quién sabe, quizá es un primer paso para una nueva aventura formativa. Si ya conoces otro lenguaje de programación como JavaScript o C, esta edición no te servirá de mucho, pero te animo a continuar si tienes curiosidad.
Introducción a Python
Esto son los temas que se cubrirán en la edición 009. Por supuesto, es una pequeñísima porción de todo lo que este lenguaje de programación puede ofrecer y que te servirá para que puedas seguir mínimamente el código de la parte II y III de esta trilogía. Es una selección de elementos concretos que te servirán como guía, no para picar código.
A continuación, el índice:
Anaconda y Jupyter Notebook
Integer, Float, String & Boolean
Lista, Tupla y Diccionario
Funciones
Librerías e importación
1. Anaconda y Jupyter Notebook
Python es un lenguaje de programación que se puede ejecutar en diferentes plataformas, tales como Jupyter Notebook, Google Colab, editores de texto como Sublime o IDEs (integrated development environment) como PyCharm o Visual Studio —este último, en la fecha en la que escribo este post, es uno de los IDE más usados según GitHub.—
Más allá de definiciones, debemos entender que Python es un lenguaje de programación que se puede ejecutar en diferentes plataformas. Una de las más típicas formas de empezar en Python es instalando Anaconda.
Anaconda is a distribution (a bundle) of Python, R, and other languages and tools tailored for data science.
El primer paso es acceder a Anaconda e instalar la plataforma en tu ordenador. Antes de hacerlo asegúrate de tener suficiente espacio en el ordenador (“Minimum 5 GB disk space to download and install.” según la documentación oficial).
Aquí los links con la guía de instalación en función del sistema operativo:
La instalación es sencilla y funciona como la de cualquier otro programa que descargues de Internet. Como puedes ver en esta captura de pantalla (de la versión de MacOs) no tiene un gran misterio:
Si sigues los pasos que marca la documentación aparecerá una aplicación en tu ordenador. Si haces click, verás algo similar a esto. Como puedes ver, está RStudio, Spyder o Jupyter Notebook.
Si haces click en Jupyter Notebook se abrirá un programa en una pestaña de tu navegador y verás una interfaz con un listado de carpetas y archivos similar al de la siguiente imagen. Si haces click en “New” y después haces click en “Python 3” se abrirá un archivo que tiene la capacidad de ejecutar Python.
Otra manera habitual de manipular archivos en Jupyer Notebook es usar archivos con el formato .ipynb, que es el formato de archivo de Jupyter Notebook. Una vez los tienes disponibles en tu ordenador (en local), puedes abrirlos desde Jupyter Notebook.
¿Por qué Jupyter Notebook?
La razón para usar Jupyter Notebook es —sobre todo para aquellos que comienzan—la sencillez. Es bastante intuitivo para aquellos profesionales no tan orientados a la informática y, además, dispone de la capacidad de importar librerías fundamentales de forma muy sencilla. Así luciría un archivo .ypynb cuando lo abres en Jupyter Notebook.
Aún así, Python también se puede usar en Google Colab y otras plataformas. Lo habitual es que en un entorno de ciencia de datos profesional se use Visual Studio o PyCharm, aunque en entornos académicos es común Jupyter Notebook por su capacidad de mezclar texto y ejecución de código.
2. Integer, float, string & boolean
Dentro de Python existen varios tipos de datos. Entender con qué tipo de dato estás trabajando es fundamental ya que, como también sucede en Excel, hay ciertas funciones que puedes aplicar o no en función —en el caso de Excel— del formato. Ese formato del dato es lo que determina que podremos hacer o no en Python.
2.1 Integer
Int, or integer, is a whole number, positive or negative, without decimals, of unlimited length.
Como puedes ver, Jupyter Notebook es capaz de entender solamente escribiendo el número “2” que es un número y cómo operar con él para convertirlo en un “4”. Una nota importante es que un integer es también un número negativo y como puedes ver, se ve de color verde en Jupyter Notebook.
2.2 Float
Float, or "floating point number," is a number, positive or negative, containing one or more decimals.
Como puedes ver, un float es un número decimal positivo o negativo que tiene un comportamiento similar a los integers y que, por ejemplo, en el precio de los ecommerce son muy típicos.
Sin embargo, fíjate que el valor que devuelve —independientemente de ser también 4— es decimal. Esto, aparentemente, significa que el valor que devuelve la suma de dos floats es también un float. Podemos confirmarlo así:
Esta es una buena oportunidad para enseñar un concepto clave en Python y otros lenguajes de programación: las variables. Podemos convertir una variable “a” en un valor determinado (2.2) y, como puedes ver en la celda de respuesta “Out [3]” devuelve el mismo valor que en el caso anterior, solo que como si fuera un float.
En la celda “In [4]” usamos una función llamada type() que permite entender de qué tipo de dato se trata, en este caso, la variable “c” —que contiene el valor 4.0— y como es visible en la celda de respuesta “Out [4]” nos devuelve el tipo de dato: float.
2.3 String
The string is a collection of alphabets, words, or other characters.
¿Por qué devuelve 24? La razón es que no puedes sumar dos strings ya que una string es una cadena de texto, por lo tanto, cuando aplicas el símbolo “+” lo que estás haciendo es “unir” ambos valores. ¿Por qué puede ser útil sumar dos cadenas de texto? Pues, por ejemplo, para unir el número del DNI —que puede interesarnos que sea una cadena de texto, pues rara vez haremos cálculos con él— con su respectiva letra si, en un archivo, están separados.
2.4 Boolean
It's used to represent the truth value of an expression.
¿Por qué da error? ¿No hemos usado el símbolo “=”? El motivo es que estamos usando un símbolo erróneo: “=”. Cuando queremos asignar igualidad sobre dos objetos, debemos usar este símbolo: “==” y para asignar desigualdad debemos usar este símbolo “!=”, como puedes ver en el siguiente ejemplo:
Em ambos casos devuelve “True” debido a que en el primer caso se aplica “==” y en el segundo “!=”. Como puedes ver en la siguiente captura de pantalla la palabra “True” y “False” se marcan en verde, lo cual determina que son palabras reservadas.
Como resumen, estos serían los tipos de datos más básicos:
3. Lista, Tupla y Diccionario
Data structures are “containers” that organize and group data according to type. The data structures differ based on mutability and order.
3.1 Listas
Como puedes ver, las listas son una estructura que contienen datos que pueden ser de distinta índole: floats, integers, strings e incluso otras listas. Una manera de declarar una lista es usar el símbolo “[ ]” y añadir dentro los distintos valores.
Si aplicamos type() a la lista que hemos creado, nos devuelve el tipo de dato que es. Esto indica que existen normas, funciones y métodos que podemos y no podemos aplicar cuando estamos trabajando con una lista.
3.2 Tuplas
Tuples are used to store multiple items in a single variable. A tuple is a collection that is ordered and unchangeable.
Aparentemente, la tupla es similar a la lista solo que se usa el símbolo “( )”. Entonces, ¿por qué utilizar tuplas? ¿cuál es la diferencia entre tuplas y listas? Como puedes ver, si usamos el método append(), podemos añadir valores nuevos a las listas:
Sin embargo, con las tuplas —como dice la propia definición— son “inmutables” y, por lo tanto, una vez se crean no se pueden añadir nuevos valores ni eliminar los existentes.
¿Qué se puede hacer ante la necesidad de modificar una tupla? Crear otra nueva o declarar una variable como lista y convertirla en lista—con la función list()—, puesto que estas sí son mutables.
Entonces, ¿porqué crear tuplas? Parecería que son menos útiles que las listas si no podemos modificarlas. Existen múltiples razones, como, por ejemplo, por razones de rendimiento y, también, al ser inmutables, pueden llegarse a convertir en útiles claves de un diccionario.
3.3 Diccionario
Dictionaries are used to store data values in key:value pairs. It’s a collection which is ordered (in Python 3.7, nor python 3.6), changeable and do not allow duplicates.
Un diccionario, a diferencia de una lista o una tupla, se estructura a través de una clave (en este caso, Spain, Portugal y United Kindom) y un valor (Madrid, Lisboa y London). La utilidad de los diccionarios es que son prácticos cuando necesitamos estructurar información a través de una clave y un valor.
Con los diccionarios se pueden hacer muchísimas cosas, pero para el fin de esta edición de Leanalytics no se profundizará más. Solamente, ten presente de que en este tipo de datos se usa “{ }” y están basados en clave-valor.
4. Funciones
¿Recuerdas que en la seccción anterior se enseñó “type()”? Esta era una función que devuelve el tipo de dato de esa variable que añadíamos (boolean, list, string, dict, entre otros). Más específicamente, una función es:
A block of code which only runs when it is called. You can pass data, known as parameters, into a function. A function can return data as a result.
En Python, se crean funciones usando el término “def” y la estructura que ves en la siguiente imagen. Si ves “def” es que se está declarando la creación de una función. Esta función lo único que hace es decir “hola”.
Sin embargo, podemos complicarlo añadiendo el nombre. En la siguiente imagen estamos creando una función que espera que el programador inserte un parámetro cuyo valor es “juan”, pero podría ser cualquier otro elemento (fíjate en “Out[32]”, en este caso, devuelve una tupla):
Por supuesto, se pueden realizar funciones con números. En este caso creamos una función que espera dos parámetros (a y b) y que, por sí solo, los divide y devuelve un valor (c) que es el resultado de la división:
¿Qué sucede si solo ponemos un parámetro en una función que requiere dos parámetros? Python te avisa en “TypeError” de que todavía falta el argumento b:
Crear tus propias funciones es básico porque permite automatizar tareas repetitivas o que sabemos que serán comunes en todos los proyectos, por ello la creación de funciones adhoc para proyectos es elemental.
En esta gráfica de DataCamp, se muestran funciones en relación al tipo de dato (ya que no todas las funciones funcionan con todos los tipos de dato) y se añaden algunos elementos que no están dentro del ámbito de esta edición y que pueden ser útiles: DataFrames, operadores lógicos, arrays, entre otros.
Sin embargo, ¿es necesario que hagamos todas las funciones? ¿es posible que podamos beber de alguna fuente con muchísimas funciones y solamente crear aquellas que sean muy específicas para problemas concretos? Sí, eso ya existe y reside en el siguiente bloque:
5. Librerías e importación
Imagina que necesitas hacer una predicción del tráfico orgánico del próximo trimestre o aplicar una desviación típica para averiguar lo dispersos que están los datos con respecto a la media. ¿Necesitarías hacer una función a mano y reflejar el cálculo con Python? Posiblemente puedas hacerlo, pero no deberías ya que tardarás mucho tiempo.
Para ahorrar tiempo, se usan librerías que, en esencia, contienen esas funciones y métodos que pueden ayudarnos a agilizar el trabajo. Por ejemplo, imagina que deseas averiguar si existe una correlación entre el precio de la vivienda en Barcelona con otra serie de dimensiones que tienes en un CSV, ¿Cómo se podría hacer?
Si usas el método corr() —que pertenece a la librería Pandas— en un DataFrame (en este caso, llamado “bcn”) se aplica por defecto el coeficiente de correlación de Pearson, aunque se podría modificar y usar el de Kendall o el de Spearman en función de la naturaleza del DataFrame. Aquí un ejemplo de los valores que devuelve este método en este DataFrame:
Nota para los developers: En aras de la sencillez de la comprensión, no es necesario que el lector novel en programación entienda la diferencia entre métodos y funciones y, en este caso, se tratan como si fueran lo mismo, aunque realmente no lo son. Profundizar en esto sería algo que obligaría ahondar en otros campos como, por ejemplo, las clases y no es ese el objetivo de esta edición.
¿Cómo se importan librerías en Jupyter Notebook?
Así de sencillo. Se usa la abreviación “pd” para pandas y “np” para numpy por pura convención. Así, cuando se utilizan métodos que requieren usar el nombre de la librería no es necesario poner el nombre completo, como es el caso de pd.to_datetime.
La lamentable dualidad
El auge de nocode e incluso de IAs como ChatGpt han puesto en duda la idea de si es necesario saber programar. Considero que no todas las profesiones lo necesitan, sin embargo, aquellos que quieran dedicarse a un marketing digital de cierto nivel están, a medio plazo, obligados a entender con profundidad un lenguaje de programación.
La autonomía que te da dominar un lenguaje de programación no tiene parangón. Dedicándole tiempo y esfuerzo puedes convertirte en un profesional mucho más válido y capaz de desarrollar ideas y ejecutarlas por ti mismo en lugar de depender de otros. En mí, marcó un antes y un antes.
La misión de Leanalytics no es enseñar Python, sin embargo, es un lenguaje de programación que, al ser idóneo para la manipulación del dato, permite navegar en la vorágine de datos que a veces representa la experimentación online y, sobre todo, la inferencia.
En la siguiente edición entraremos de lleno en los test AB y Python. Si este post te ha animado a aprender Python, dejo al final de todo unos recursos que creo que pueden ser útiles.
Que la fuerza te acompañe.
Fuentes:
Recursos adicionales
Sobre Python: www.datacamp.com
Sobre Experimentación: Mucho de lo que voy a enseñar lo aprendí de Ronny Kohavi, VP de Experimentación de Airbnb, Amazon y Bing (casi nada). Ahora mismo está ofreciendo un curso sobre Test AB en Maven que está francamente bien. Como fui alumno suyo en Sphere en un programa sobre experimentación online tengo un código de descuento SPHERE8REC500 con el que puedes ahorrar 500$ en el curso.