Estadística en Python: análisis de datos multidimensionales y regresión lineal (Parte IV)

Hasta ahora hemos tratado con una única variable por separado. Ahora vamos a ver qué podemos hacer con varias variables en la misma muestra (conjunto de datos). Nos interesará saber si están relacionadas o no (independencia o no). Si existe relación (estan correlacionadas) vamos a construir un modelo de regresión lineal.

Distribución conjunta de frecuencias

En el caso de dos variables, podemos construir una distribución conjunta de frecuencias. Se trata de una tabla de doble entrada donde cada dimensión corresponde a cada variable y el valor de las celdas representa la frecuencia del par. Para ello podemos usar crosstab también (de hecho, su uso original es este).

Ejemplo: En las votaciones a alcalde de la ciudad de Valladolid se presentaban Rafael, Silvia y Olga. Analiza los resultados e informa de quién fue el ganador de las elecciones. ¿Quién fue el candidato favorito en el barrio de La Rondilla?

Como podéis ver, un humando podría haber sacado estas conclusiones observando simplemente la tabla conjunta de frecuencias. ¿Quién tiene más votos en total? Rafael, con 6 en All (la suma de los distritos). ¿Quién ha sacado más votos en La Rondilla? Silvia, con 4 en la columna de La Rondilla. Por último, ¿votó más gente en el Centro o en La Rondilla? Votaron más en La Rondilla (8 votos), que en el Centro (7 votos).

A las frecuencias All se las llama comúnmente distribuciones marginales. Cuando discriminamos las frecuencias a un solo valor de una variable, se habla de distribuciones condicionadas, en este caso hemos usado la distribución de votos condicionada al distrito La Rondilla. Estas distribuciones son univariantes como habréis sospechado.

Gráfico XY o bivariante

Una manera muy útil de observar posibles correlaciones es con el gráfico XY, solamente disponible para distribuciones bivariantes. Cada observación se representa en el plano como un punto. En Matplotlib podemos dibujarlo con scatter.

Ejemplo: Represente el gráfico XY de las variables ingresos y gastos de las familias.

En la imagen podemos ver cada dato representado por un punto. En este ejemplo puede apreciarse como los puntos estan en torno a una línea recta invisible.

Covarianza

Para medir la relación entre dos variables podemos definir la covarianza:

\(
cov_{x,y}=\frac{\sum_{i=1}^{N}(x_{i}-\bar{x})(y_{i}-\bar{y})}{N}
\)

Pandas trae el método cov para calcular la matriz de covarianzas. De esta matriz, obtendremos el valor que nos interesa.

¿Y la covarianza qué nos dice? Por si mismo, bastante poco. Como mucho, si es positivo nos dice que se relacionarían de forma directa y si es negativa de forma inversa. Pero la covarianza está presente en muchas fórmulas.

Coeficiente de correlación lineal de Pearson

\(
r_{x,y}=\frac{cov_{x,y}}{s_{x}s_{y}}
\)

Uno de los métodos que usa la covarianza (aunque Pandas lo va a hacer solo) es el coeficiente de correlación lineal de Pearson. Cuanto más se acerque a 1 o -1 más correlacionadas están las variables. Su uso en Pandas es muy similar a la covarianza.

En este ejemplo concreto, el coeficiente de correlación de Pearson nos da 0.976175. Se trata de un valor lo suficientemente alto como para plantearnos una correlación lineal. Es decir, que pueda ser aproximado por una recta. Si este coeficiente es igual a 1 o -1, se puede decir que una variable es fruto de una transformación lineal de la otra.

Ajuste lineal

Vamos a intentar encontrar un modelo lineal que se ajuste a nuestras observaciones y nos permita hacer predicciones. Esta recta se llamará recta de regresión y se calcula de la siguiente forma:

\(
\hat{y}-\bar{y}=\frac{cov_{x,y}}{s_{x}^2}(x-\bar{x})
\)

Usando las funciones de varianza, media y covarianza Pandas no es muy complicado hacer una recta de regresión:

Que podemos probar visualmente:

Sin embargo SciPy ya nos trae un método que calcula la pendiente, la ordenada en el origen, el coeficiente de correlación lineal de Pearson y mucho más en un solo lugar. Es mucho más eficiente, se trata de linregress.

Además, para calcular los valores del gráfico, he usado vectorize de NumPy, que permite mapear los arrays nativos de NumPy. Más eficiente. Mismo resultado.

La ley de Ohm

¿Quién no ha oído hablar de la Ley de Ohm? Se trata de una ley que relaciona la diferencia de potencial con el amperaje dando lugar a la resistencia. La ley fue enunciada por George Simon Ohm, aunque no exactamente como la conocemos hoy en día. En este ejemplo vamos a deducir de cero la ley de Ohm. Este ejercicio se puede hacer en casa con datos reales si se dispone de un polímetro (dos mejor) y una fuente de alimentación con tensión regulable. Este ejercicio pueden hacerlo niños sin problema.

Olvida todo lo que sepas de la ley de Ohm

Es posible apreciar que en un circuito con una bombilla, si introducimos una pieza cerámica, la intensidad de la bombilla disminuye.

Cuando la corriente no atraviesa la resistencia
Cuando la corriente atraviesa la resistencia

¿Qué ocurre exactamente? ¿Por qué la bombilla tiene menos intensidad en el segundo caso?

Vamos a aislar la resistencia. Ponemos un voltímetro y un amperímetro y vamos cambiando la tensión de entrada. Anotamos la corriente medida en cada caso.

Podemos intentar hacer un ajuste lineal a estos datos. De modo, que una vez sepamos la intensidad, podamos predecir el voltaje.

Como Pearson nos da un número muy próximo a 1, podemos definir un modelo matemático siguiendo la regresión lineal.

Este modelo matemático se define así:

Y es lo que se conoce como la Ley de Ohm. En realidad, la ordenada en el origen tiene un valor muy cercano a cero, podemos quitarlo.

Así nos queda un modelo capaz de predecir lel voltaje en base a la intensidad y la pendiente de la recta. Ahora puedes probar cambiando la resistencia y observando que siempre ocurre lo mismo. Tenemos el voltaje por la pendiente del modelo. Este valor de la pendiente es lo que en física se llama resistencia y se mide en ohmios. Así se nos queda entonces la ley de Ohm que todos conocemos:

\(
V= IR
\)

En este caso la pendiente equivalía a 4.94 Ω, valor muy cercano a los 5 Ω que dice el fabricante.

Crónica de la 62 SEMINCI

Ya acabó la SEMINCI, la Semana Internacional de Cine de Valladolid. Este año he sido uno de los 5 miembros del jurado joven de la sección Punto de Encuentro. La sección reúne los primeros y segundos largometrajes de los directores.

El sábado comenzamos el visionado de las películas en el Teatro Zorrilla con la película Paris la Blanche, que comentaré más tarde y con la gala inaugural en el Teatro Calderón.

Fernando Colomo llega por la alfombra verde mientras hay un grupo que lucha por el pueblo palestino

Ese mismo día, ya por la noche, tocó Haporetzet. Al día siguiente vi 4 películas: The Nile Hilton Incident, La Librería, Adiós Entusiasmo y Aala Kaf Ifrit.

Mi acreditación

Los días prosiguieron viendo todos los días películas por la mañana y por la tarde, algunas eran entretenidas, otras te hacían replantear tu existencia. Me costó bastante conseguir mi acreditación, por un fallo que tuvieron con los códigos QR. Adicionalmente pedí entrada para ver una película islandesa aleatoria que resultó ser Eldjall de Rúnar Rúnarsson (Islandia ha sido el país invitado al festival) y acudí a La Noche del Corto Español y a la exposición de cortometrajes de la ECAM/ESCAC.

Teatro Zorrilla de Valladolid, aquí se proyectaban la mayoría de películas de Punto de Encuentro

El viernes nos reunimos para decidir cuál era la mejor película que habíamos visto. Fue una votación difícil, con triple empate en la primera ronda. Finalmente elegimos Aala Kaf Ifrit de Kaouther Ben Hania.

Ray Loriga leyendo el palmarés de Sección Oficial

El último día acudí por la mañana a la lectura del palmarés. Quedé sorprendido por las decisiones de los otros jurados. Me hizo gracia que nada más acabar la lectura del palmarés, las azafatas empezasen a repartir revistas con todo el palmarés perfectamente explicado. La gala de clausura era por la tarde Originalmente no tenía entrada para la gala de clausura, pero 30 minutos antes de que empezara, me avisaron de que podía ir. A toda prisa me arreglé, para poder llegar a la alfombra verde y tomar asiento en el Teatro Calderón. Al finalizar la gala, se proyectó la película Sage Femme, que fue el broche cinéfilo.

Posteriormente no me dejaron entrar al cóctel pero sí pude acceder a la fiesta privada. Allí, entre algún famoso, bailé un poco. Y así acabó la SEMINCI.

Películas de Punto de Encuentro

Ahora viene lo divertido, hablar de las películas. ¡Empezamos!

Aala Kaf Ifrit, ganadora del premio joven, se trata de una película muy dura sobre un caso real de una violación sita en Túnez. La historia, contada en 9 planos secuencia, genera una sensación de impotencia que jamás había experimentado. Son los propios policías los que han violado a la joven. La historia tiene mucha fuerza, contada sin morbo y donde se ve una evolución. El espectador va descubriendo poco a poco qué ha ocurrido exactamente. La actriz principal, Mariam Al Ferjani es impresionante. Como puntos negativos: el personaje que acompaña a la protagonista se ve demasiado plano. Los violadores tienen un aspecto ligeramente cómico al final de la cinta, lo que a algunas personas les provocó cierta confusión. Se trata de una película muy recomendable, pero hace falta estómago para verla.

Adiós Entusiasmo me hizo perder el entusiasmo por la vida. La película trata sobre una madre que está encerrada en su habitación, mientras sus 3 hijas y su hijo viven con ella. Se trata de una película inconexa, ideal para buscarle los 3 pies al gato. Los planos, unos son claustrofóbicos y otros sin sentido. Hay personajes de los que no sabemos absolutamente nada, solo aparecen de repente en casa de la protagonista. La conclusión final de la película sorprendentemente no esclarece nada. Vladimir Durán, no me ha gustado tú película. Mencionar que fue la única película de la SEMINCI en la que estuve que no se llevó aplausos al final, sino patadas al suelo. Con esta película empecé a desarrollar cierto temor ante el cine argentino. Como veremos más adelante, este temor no estaba infundado.

Angels Wear White trata sobre una violación de unas menores. Se narran dos historias de forma paralela, por un lado las niñas, inconscientes de lo que ha ocurrido y que solo quieren volver a jugar y la limpiadora del hotel, testigo de lo sucedido pero que lucha por sobrevivir en China. En mi opinión es una película bastante normalita, los personajes se sienten bien y la historia atrapa. No obstante, las dos historias se alternan cada tanto tiempo que muchas veces perdemos el hilo de la otra historia.

Arpón es otra película argentina. ¡Vaya! Lo cierto es que de las tres películas argentinas que se presentaron esta es la más aceptable. Trata sobre un director de colegio aficionado a las prostitutas que descubre que tiene que hacerse cargo de Cata, una joven del instituto. La película tiene demasiados fallos: la relación entre Cata y el director no se aclara nunca, hay cosas importantes que se quedan sin resolver (¿cómo pueder ser que después de casi matar a un proxeneta, para el tío esto no sea una preocupación?) y la película en general te deja con ganas de más. ¿Es esto solo lo que querías contar? La película podía tener más recorrido con el escenario de partida. ¿Por qué parece que todas las cosas interesantes que podían ocurrir no pasan?

As Duas Irenes, premio del público, es una película brasileña, muy bien hecha, entretenida de ver, que te deja con buen sabor de boca. Se trata de dos hermanastras que no sabían que compartían padre y de como se hacen amigas. La protagonista es Irene, de clase alta, la hermana mediana, que además descubre gracias a su hermanastra que hay otro mundo fuera de lo que su familia considera normal. El argumento no es demasiado original, pero la película en general cumple. El final es un gran punto también para esta cinta.

Ayúdame a pasar la noche fue una de mis favoritas. He de ser sincero, cuando leí sobre la película tenía toda la pinta de ser una tragedia pura y dura. Nada más lejos de la realidad, se trata de un drama disfrazado de comedia. Divertida de ver, trata el tema de una familia al borde de la bancarrota por culpa de la madre, que ha desarrollado ludopatía. Los personajes masculinos, cada uno de diferente edad, afrontan de forma paralela la misma situación de forma diferente. El propio director vino a Valladolid, José Ramón Chávez Delgado, donde pudimos mantener una conversación. Película muy recomendable, con un final con un toque cómico muy logrado.

Haporetzet es sin duda una de las películas con un argumento más original de esta SEMINCI. Esta película alemana-israelí trata sobre la vida de Alex, cuya madre de repente desaparece. Para más inri, su casa sufre un robo, pero de ahí saca ideas para avanzar en el mundo. Muy buen trabajo de la actriz principal, Lihi Kornowski. Quizá el ritmo no es el más adecuado, pero personalmente fue una película muy interesante. Fue otra de mis favoritas.

Hoy partido a las 3 es un despropósito. Se trata de una película en la que cuentas los minutos que quedan para irte. El argumento no tiene ningún sentido, no es más que un pretexto para que decenas de personajes interactúen entre ellos. No hay un personaje principal que hile la película. A ratos da la impresión de que estamos ante un documental grabado con un móvil. La película es soporífera y no aporta nada interesante al espectador. El peor cine argentino.

Napadid Shodan es una película iraní que trata sobre una chica y su pareja y los problemas de acudir al servicio médico para asuntos sexuales sin estar casados. Se ve reflejada una Irán conservadora. La película es interesante pero no pasa de ahí. Los personajes no aportan mucho y el final me dejó un poco frío.

Never Steady, Never Still nos cuenta la historia de una mujer enferma de párkinson. Su marido, apoyo incondicional, sufre un infarto y muere. Su hijo está en ese momento de la vida en el que quiere volverse adulto, independizándose. Es una película dura, con excesivo énfasis en el sufrimiento de Judy, la protagonista. Además, la historia paralela del hijo no termina de encajarme del todo en esta historia. Se trata de una película demasiado larga para lo que es.

Paris La Blanche es una película que parte de una muy buena historia, pero no termina de encajar. Rekia, argelina, lleva sin ver a su marido 40 años. Este fue buscando trabajo y nunca volvió. Rekia, sigue los pasos de su marido y va a Francia, tratando de encontrarle. La película es demasiado lenta, los personajes secundarios no encajan muy bien (¿de dónde han sacado a esa gente?) y te hacen preguntarte qué propósito tiene que sean así. El personaje de Rekia es muy entrañable, pero el final me dejó frío.

Špína, premio Punto de Encuentro, es una película eslovaca que trata también sobre una violación. En este caso, la joven es violada por su propio profesor de matemáticas y entra en un estado de shock que hace que la internen en un psiquiátrico. Al contrario que Aala Kaf Ifrit, esta película es mucho más fría, menos pasional que la tunecina. El espectador espera que la joven cuente lo sucedido, en una sociedad que la va a apoyar, y el hecho de que no lo haga genera impotencia. Fue una sorpresa que está película ganase el premio del jurado no-joven, pues sobre el mismo tema de la violación creemos que Aala Kaf Ifrit es mucho mejor, aunque sí que es cierto que son dos maneras de manejar la situación totalmente distintas. Por otro lado en Spina el espectador sabe desde el principio todos los detalles, mientras que en la tunecina, el espectador descubre poco a poco qué ha ocurrido exactamente.

Stebuklas es una película lituana que nos narra la llegada de un americano al pueblo de sus ancestros. Allí, la protagonista regenta una granja de cerdos que ha visto días mejores. El pueblo en general está deprimido por la caída del comunismo y la crisis económica que ello ha provocado. Se trata de una película divertida a momentos, que explora los tópicos americanos (el americano tiene cierto parecido a Donald Trump) y amena. Con la mejor banda sonora de esta sección Punto de Encuentro. Su único y gran fallo es el final. Al principio la película promete mucho y es muy interesante, pero se desinfla al llegar al final. Demasiado. Un final decepcionante. Además, la película cuenta con unas referencias religiosas un tanto turbias, que podían sobrar. Fue una de mis favoritas.

Šventasis, es una película lituana que nos cuenta la historia de un mecánico que pierde su trabajo por la crisis y como intenta mejorar su vida. Sin embargo, la mala suerte hace que vaya perdiendo la esperanza. La película parte de algo interesante, comienza correctamente pero en un determinado punto vemos que la película no va a avanzar más. Es bastante predecible y no es muy interesante. Además, la trama del chico de YouTube, que podía aportar algo, se resuelve de la manera más estúpida posible, hasta tal punto de que no hubiese afectado nada al desarrollo de la película esa subtrama.

Con este resumen de las películas me despido.

Estadística en Python: media, mediana, varianza, percentiles (Parte III)

Siguiendo en nuestro camino de la estadística descriptiva, hoy vamos a ver como calcular ciertas medidas relativas a una variable.

Fichero de ejemplo

Medidas de centralización: media, mediana y moda

La media aritmética se define como la suma de N elementos dividida entre N. Se trata una medida bastante conocida entre la gente, aunque tiene el inconveniente de que es muy susceptible a valores extremos.

La mediana es el valor que dentro del conjunto de datos es menor que el 50% de los datos y mayor que el 50% restante.

La moda es el valor más repetido (solo aplicable a variables discretas).

Para calcular estas medidas, simplemente seleccionamos la variable estadística del DataFrame y usamos los métodos mean, median y mode respectivamente.

Ejemplo: Calcula la media, la mediana y la moda de las notas de los alumnos en el examen

Medidas de posición: cuartiles y percentiles

El concepto es igual al de mediana, salvo que aquí la división ya no es en el 50%. El 25% de las observaciones es menor que el primer cuartil. Los cuartiles abarcan el 25%, 50% y 75% de las observaciones. Los percentiles son una generalización con cualquier porcentaje.

Ejemplo: ¿Cuál es la nota que tiene como mínimo el 10% más nota de la clase?

Este enunciado nos pide calcular el percentil 90.

Usamos quantile y el porcentaje.

El resultado es que el 10% con más nota de la clase ha sacado un 8,8 como mínimo. Mencionar que existen distintos tipos de interpolación para este cálculo. En la referencia podemos consultar cual nos conviene más.

Medidas de dispersión: desviación típica, rango, IQR, coeficiente de variación

La desviación típica mide la dispersión de los datos respecto a la media. Se trata de la raíz cuadrada de la varianza, que en sí misma no es una medida de dispersión. Para calcular la desviación típica usamos std y var para la varianza. (ddof=0 es necesario si quieres seguir la definición de desviación típica y varianza de algunas bibliografías, la razón es que hay un parámetro de ajuste que Pandas pone a 1, pero otras librerías ponen a 0). En Excel es la diferencia que hay entre DESVEST.M (ddof=1) y DESVEST.P (ddof=0).

El rango es la diferencia entre el máximo y el mínimo y el rango intercuartílico o IQR es la diferencia entre el tercer y el primer cuartil.

El coeficiente de variación es una medida que sirve para comparar entre dos muestras, cuál varía más y cuál es más estable. Es una simple división, de la desviación típica sobre la media, sin embargo, SciPy nos ofrece una función ya preparada.

Medidas de asimetría

Para saber si los datos estan repartidos de forma simétrica existen varios coeficientes: Pearson, Fisher, Bowley-Yule, etc

Para no liarnos demasiado, podemos usar la función skew de SciPy.

Para valores cercanos a 0, la variable es simétrica. Si es positiva tiene cola a la derecha y si es negativa tiene cola a la izquierda.

Y con esto hemos visto los datos que se pueden extraer de una sola variable.

¿Cómo aumenté las visitas a mi blog?

Cada vez más gente visita mi blog, es algo que me alegra y me llena de orgullo. Saber que algo a lo que le dedicas tu tiempo limitado sirve a otras personas es muy satisfactorio. Este año ha habido muchos más lectores y sobre todo, muchas más interacciones. Observa la gráfica:

El 2016 está en naranja y el 2017 en azul. Como se observa, el crecimiento es estable. ¿Qué pasos seguí para aumentar el número de visitas?

  • Mantén el blog vivo: es importante ir realizando entradas de forma más o menos constante. No te digo que te marques un calendario (yo no lo tengo) pero sí saber cuando llevas demasiado tiempo sin darle amor al blog. Se visual, usa una imagen como mínimo en cada post y dentro de ellos recurre a imágenes si es posible.
En la constancia está la clave del éxito
  • Configura una lista de correo: el correo electrónico es algo que todo el mundo tiene. Un usuario más avanzado es capaz de configurar RSS, pero todos van a poder suscribirse a la lista de correo. Además, el email es algo que la gente suele revisar con frecuencia.

 

  • Conoce a tu audiencia: revisa los posts más populares y que más interacciones han generado. Para mí esto ha sido un dato muy valioso. Muchas veces para mí ha sido una sorpresa que ciertos posts tuvieran más éxito que otros. Aunque en mi caso es un blog personal y sigo haciendo lo que me da la gana la mayor parte del tiempo, sí que es cierto que muchas veces uso esta información para priorizar ciertos artículos. Para ayudarte en esta tarea existen los Data Management Platform, como Oracle Bluekai y Adobe Audience Manager.
Conoce a los usuarios y sus intereses
  • Promociónate: este año he mejorado la presencia en Facebook, aunque no ha sido muy enriquecedor. Sin embargo, gracias a Telegram y los grupos he conseguido llegar a mucha gente. Para mí Telegram se ha convertido en un sitio ideal para promocionar mi blog. Para mí sorpresa también he recibido unas cuantas visitas desde Instagram, lo cuál es muy interesante, aunque el Instagram que tengo es más personal que otra cosa.
Promociónate, muchas veces parece que nadie te ve pero en realidad estás consolidando y generando audiencia
  • Hazle la vida fácil a tus lectores: la web tiene que ser elegante y bonita, los botones para compartir en redes sociales deben estar bien situados, pero no insistas excesivamente, pues genera mala imagen. Comprueba que la web cargue rápido y que se visualice correctamente en todo tipo de dispositivos. Estas cosas cuentan para el ránking de Google. La publicidad está bien, pero no tiene que ser intrusiva. Esto quiere decir que: nada de popups y tampoco anuncios con sonido.
Que tu blog y un laberinto no tengan nada en común ayuda bastante
  • Suerte: al fin y al cabo también necesitas algo de suerte. En mi caso este año publiqué el post de Novedades en C++17 que fue portada en meneame. Eso genera muchísimas visitas de golpe. Varios conocidos se pusieron en contacto conmigo al reconocer un artículo de mi blog gozando de tal popularidad momentánea. A día de hoy, ese artículo sigue generando visitas todos los días, por encima de otros artículos.

Los cuadros son de los pintores Rob Gonsalves y Stephan Schmitz

 

Estadística en Python: manipulando datos en Pandas (Parte II)

Antes de pasar a otros temas vamos a mencionar como podemos manipular los DataFrame en Pandas. Imaginemos que tenemos una tabla con datos de estatura y peso. Podemos generar una nueva columna con el índice de masa corporal. Veamos como se puede hacer

Fichero de ejemplo

Seleccionado datos

A veces queremos quedarnos con parte de los datos que cumplen una condición. Hay varias maneras de hacerlo.

Ejemplo: Quédate con los datos de Nombre y Altura de los pacientes con peso igual o superior a 70

Cualquiera de estos tres métodos pueden usarse indistintamente.

Apply

Apply es una función de DataFrame muy potente que permite aplicar una función a todos las columnas o a todas las filas.

Ejemplo: Calcule el IMC (Índice de Masa Corporal) con los valores de la tabla

Drop

¿Qué pasa si queremos borrar algún dato o columna?

Si queremos borrar columnas:

Si queremos borrar datos:

Construyendo el DataFrame a mano

Normalmente los datos los leeremos de algún archivo o base de datos (read_csv, read_json, read_html, read_sql, read_hdf, read_msgpack, read_excel, read_pickle, read_gbq, read_parquet, …) pero puede darse el caso de que necesitemos ingresar los datos manualmente. El constructor de DataFrame admite diccionarios, arrays de NumPy y arrays de tuplas.

 

Concatenar DataFrames

Si tenemos varios DataFrames de características similares (columnas iguales) podemos unirlos. Hay que tener cuidado con los índices. Si el tema de los índices te da igual, usa ignore_index.

Join DataFrames

Si vienes del mundo SQL quizá te suene el tema de los JOIN. En Pandas existe un potente sistema de join, similar al usado en las bases de datos SQL más importantes y con excelente rendimiento. Pandas soporta joins de tipo LEFT, RIGHT, OUTER e INNER.

Con esto ya sabemos lo básico para manejarnos con DataFrames de Pandas