Skip to content

Introduction to Statistics in Python

Run the hidden code cell below to import the data used in this course.

# Importing numpy and pandas
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Importing the course datasets
deals = pd.read_csv("datasets/amir_deals.csv")
happiness = pd.read_csv("datasets/world_happiness.csv")
food = pd.read_csv("datasets/food_consumption.csv")

¿Que es la estadistica?

Hay dos tipo de estadisticas

  • La estadistica Descriptiva se centra en describir y resumir los datos disponibles.
  • La estadistica Inferencial utiliza lo datos de muestra, para hacer inferencias sobre una poblacion mas grande.

Existe dos tipos de datos, Categoricos(Cualitativos) y Numericos(Cuantitativos)=.

Los datos Numericos se pueden dividir en:

  • Continuos (medibles): suelen ser cantidades que se pueden medir como la velocidad o el tiempo.
  • Discretos (contado): suelene ser datos de conteo, como la cantidad de mascotas o la cantidad de paquetes enviados.

Los datos Categoricos pueden ser:

  • Nominal (desordenado): se compone de categorias sin ordenamiento inherente, como estado civil o el pais de residencia.
  • Ordinal (ordenado): tienen un orden inherente, como una pregunta de una encuesta donde debe indicar el grado en que está de acuerdo con una declaración.

Medidas de centro

  • Media tambien conocida como el promedio.
  • Mediana es el valor en el que el 50% de los datos es inferior y el 50% de los datos es superior.
  • Moda es el valor mas frecuente en los datos, se usa a menudo para variables categoricas, ya que no cuentan con un orden inherente.

Dado que la media es mas sensible a los valores extremos, funciona mejor para datos simetricos como este:

Si los datos estan sesgados, lo que significa que no son simetricos, como este, generalmente es mejor usar la mediana.Cuando los datos estan sesgados, la media se tira en la dirección del sesgo, por lo que es mas baja que la mediana en los datos sesgados a la izquierda y mayor que la mediana en los datos sesgados a la derecha.

Media y mediana

En este capítulo, trabajará con el índice de huella de carbono alimentario 2018 de nu3. El conjunto de datos de consumo de alimentos contiene información sobre los kilogramos de alimentos consumidos por persona por año en cada país en cada categoría de alimentos (consumo), así como información sobre la huella de carbono de esa categoría de alimentos (co2_emissions) medida en kilogramos de dióxido de carbono o CO2. por persona por año en cada país.

En este ejercicio, calculará medidas de centro para comparar el consumo de alimentos en EE. UU. y Bélgica utilizando sus habilidades de pandas y numpy.

food_consumption = food
# Filter for Belgium
be_consumption = food_consumption[food_consumption["country"] == "Belgium"] 

# Filter for USA
usa_consumption = food_consumption[food_consumption["country"] == "USA"] 

# Calculate mean and median consumption in Belgium
print(np.mean(be_consumption["consumption"]))
print(np.median(be_consumption["consumption"]))

# Calculate mean and median consumption in USA
print(np.mean(usa_consumption["consumption"]))
print(np.median(usa_consumption["consumption"]))
# Subset for Belgium and USA only
be_and_usa = food_consumption[(food_consumption["country"] == "Belgium") | (food_consumption["country"] == "USA")]

# Group by country, select consumption column, and compute mean and median
print(be_and_usa.groupby("country")["consumption"].agg(["mean", "median"]))

Media frente a mediana

En el video, aprendió que la media es la suma de todos los puntos de datos dividida por el número total de puntos de datos, y que la mediana es el valor medio del conjunto de datos donde el 50 % de los datos es menor que la mediana y 50 % de los datos es mayor que la mediana. En este ejercicio, comparará estas dos medidas del centro.

# Import matplotlib.pyplot with alias plt
import matplotlib.pyplot as plt

# Subset for food_category equals rice
rice_consumption = food_consumption[food_consumption["food_category"] == "rice"]

# Calculate mean and median of co2_emission with .agg()
print(rice_consumption["co2_emission"].agg(["mean", "median"]))

# Histogram of co2_emission for rice and show plot
plt.hist(x=rice_consumption["co2_emission"])
plt.show()

Medidas de dispersión

Describe que tan separados o cerca están los puntos de datos.

  • Varianza: mide la distancia promedio de cada punto de datos a la media de los datos. Cuanto mayor es la varianza, mas dispersos estan los datos. Es importan tener en cuenta que las unidades de varianza están elevadas al cuadrado.

  • Desviación estandard: es la raiz cuadrada de la varianza. Las unidades suelen ser mas faciles de entender ya que no estan elevadas al cuadrado.

  • Desviación media absoluta: toma el valor absoluto de las distancias a la media, y luego toma la media de esas diferencias. Si bien esto es similar a la desviación estándard, no es exactamente lo mismo. La desviación estándard eleva al cuadrado las distancias, por lo que las distancias más largas se penalizan mas que las mas cortas, mientras que la desviación media absoluta penaliza cada distancia por igual. Uno no es mejor que el otro, pero SD es más común que MAD.

Cuantiles

Tambien llamados percentiles, dividen los datos en un cierto numero de partes iguales. Aqui llamamos np.quantile, pasandole la columna de interes, seguida por el 0.5, esto nos da 10.1 horas, por lo que el 50% de los mamiferos del conjunto de datos duermen menos de 10 punto 1 horas y el otro 50% duerme mas de 10.1 horas, por lo que es exactamente lo mismo que la mediana. Tambien podemos pasar una lista de números para obtener varios cuantiles a la vez. Aqui, dividimos los datos en 4 partes iguales, a estos los llamamos cuartiles. Esto significa que el 25% de los datos esnta entre 1.9 y 7.85, otro 25% esta entre 7.85 y 10.1, y asi sucesivamente

Las cajas en los diagramas de caja representan cuartiles. La parte inferior de la caja es el primer cuartil y la parte superior de la caja es el tercer cuartil. La linea media es el segundo cuartil o la mediana

Aqui dividimos los datos en cinco partes iguales, pero tambien podemos usar -np.linspace()- como atajo, que incluye el numero inicial, el numero final y los intervalos numéricos. Podemos calcular los mismos cuantiles usando -np.linspace()-.

Rango Intercuartilico (IQR)

Es otra medida de dispersión, es la distancia entre los percentiles 25 y 75, que tambien es la altura de la caja en un diagrama de caja, podemos calcularlo usando la funcion -np.quantile()- o usando la funcion -iqr- de -scipy.stats-.

Valores atipicos (Outliers)

Son puntos de datos que son sustancialmente diferentes de los demas.Una regla que se usa a menudo es que cualquier punto de datos menor que el primer cuartil menos 1.5 veces el IQR es un valora atipico, asi como cualquier punto mayor que el tercer cuartil mas 1.5 veces IQR.

Varianza y desviación estándar

La varianza y la desviación estándar son dos de las formas más comunes de medir la dispersión de una variable, y practicará su cálculo en este ejercicio. La difusión es importante ya que puede ayudar a informar las expectativas. Por ejemplo, si un vendedor vende una media de 20 productos al día, pero tiene una desviación estándar de 10 productos, probablemente habrá días en los que venda 40 productos, pero también habrá días en los que solo venderá uno o dos. Información como esta es importante, especialmente cuando se hacen predicciones.

# Print variance and sd of co2_emission for each food_category
print(food_consumption.groupby("food_category")["co2_emission"].agg(["var", "std"]))

# Import matplotlib.pyplot with alias plt
import matplotlib.pyplot as plt

# Create histogram of co2_emission for food_category 'beef'
plt.hist(x=food_consumption[food_consumption["food_category"]=="beef"]["co2_emission"])
# Show plot
plt.show()

# Create histogram of co2_emission for food_category 'eggs'
plt.hist(x=food_consumption[food_consumption["food_category"]=="eggs"]["co2_emission"])
# Show plot
plt.show()

Encontrar valores atípicos usando IQR

Los valores atípicos pueden tener grandes efectos en las estadísticas como la media, así como en las estadísticas que se basan en la media, como la varianza y la desviación estándar. El rango intercuartílico, o IQR, es otra forma de medir la dispersión que está menos influenciada por los valores atípicos. IQR también se usa a menudo para encontrar valores atípicos. Si un valor es inferior a Q1 - 1,5 x IQR o superior a Q3 + 1,5 x IQR, se considera un valor atípico. De hecho, así es como se calculan las longitudes de los bigotes en un diagrama de caja matplotlib.

# Calculate total co2_emission per country: emissions_by_country
emissions_by_country = food_consumption.groupby('country')['co2_emission'].sum()

# Compute the first and third quantiles and IQR of emissions_by_country
q1 = np.quantile(emissions_by_country, 0.25)
q3 = np.quantile(emissions_by_country, 0.75)
iqr = q3 - q1

# Calculate the lower and upper cutoffs for outliers
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr

# Subset emissions_by_country to find outliers
outliers = emissions_by_country[(emissions_by_country < lower) | (emissions_by_country > upper)]
print(outliers)

¡Excelente detección de valores atípicos! Parece que Argentina tiene una cantidad sustancialmente mayor de emisiones de CO2 por persona que otros países del mundo.

Números aleatorios y probabilidad

Posibilidad de medir

Podemos medir las posibilidades de un evento usando la probabilidad. Podemos calcular la probabilidad de algún evento tomando el número de formas en que el evento puede suceder y dividiéndolo por el número total de resultados posibles. Por ejemplo, si lanzamos una moneda, puede caer en cara o cruz. Para obtener la probabilidad de que la moneda caiga en cara, dividimos la forma de obtener cara entre los dos resultados posibles, cara y cruz. Esto nos da la mitad o el cincuenta por ciento de posibilidades de obtener cara. La probabilidad siempre está entre cero y 100 por ciento. Si la probabilidad de algo es cero, es imposible, y si la probabilidad de algo es del 100%, ciertamente sucederá.

Asignación de vendedores

Veamos un escenario más complejo. Se acerca una reunión con un cliente potencial y queremos enviar a alguien del equipo de ventas a la reunión. Pondremos el nombre de cada persona en un boleto en una caja y sacaremos uno al azar para decidir quién va a la reunión.

El nombre de Brian se saca. La probabilidad de que Brian sea seleccionado es una de cuatro, o 25%.

Muestreo desde un DataFrame

Podemos recrear este escenario en Python usando el método sample(). De forma predeterminada, muestra aleatoriamente una fila del DataFrame. Sin embargo, si ejecutamos lo mismo nuevamente, es posible que obtengamos una fila diferente ya que el método de muestra elige aleatoriamente. Si queremos mostrarle al equipo cómo elegimos a Brian, esto no funcionará bien.

Establecer una semilla aleatoria

Para asegurarnos de obtener los mismos resultados cuando ejecutamos el script frente al equipo, configuraremos la semilla aleatoria usando np-dot-random-dot-seed. La semilla es un número que el generador de números aleatorios de Python usa como punto de partida, por lo que si lo orientamos con un número semilla, generará el mismo valor aleatorio cada vez. El número en sí no importa. Podríamos usar 5, 139 o 3 millones. Lo único que importa es que usemos la misma semilla la próxima vez que ejecutemos el script. Ahora, nosotros, o uno de los miembros del equipo de ventas, podemos ejecutar este código una y otra vez y obtener a Brian cada vez.

Un segundo encuentro

Ahora hay otro cliente potencial que quiere reunirse al mismo tiempo, por lo que debemos elegir a otro vendedor. Brian ya ha sido elegido y no puede estar en dos reuniones a la vez, así que elegiremos entre las tres restantes. Esto se llama muestreo sin reemplazo, ya que no estamos reemplazando el nombre que ya sacamos.

Esta vez, se elige a Claire, y la probabilidad de que esto suceda es una de cada tres, o alrededor del 33 %.

Muestreo dos veces en Python

Para recrear esto en Python, podemos pasar 2 al método de muestra, lo que nos dará 2 filas del DataFrame.

Muestreo con reemplazo

Ahora digamos que las dos reuniones se realizan en días diferentes, por lo que la misma persona podría asistir a ambas. En este escenario, debemos devolver el nombre de Brian a la caja después de elegirla. Esto se llama muestreo con reemplazo.

Claire es elegida para la segunda reunión, pero esta vez, la probabilidad de elegirla es del 25 %.

Muestreo con/sin reemplazo en Python

Para muestrear con reemplazo, establezca el argumento de reemplazo en Verdadero, de modo que los nombres puedan aparecer más de una vez. Si hubo 5 reuniones, todas en momentos diferentes, es posible elegir algunas filas varias veces, ya que las estamos reemplazando cada vez.

Eventos independientes

Hablemos rápidamente de la independencia. Dos eventos son independientes si la probabilidad del segundo evento no se ve afectada por el resultado del primero. Por ejemplo, si estamos muestreando con reemplazo, la probabilidad de que Claire sea elegida en segundo lugar es del 25%, sin importar quién sea elegido primero. En general, al muestrear con reemplazo, cada selección es independiente.

Eventos dependientes

De manera similar, los eventos se consideran dependientes cuando el resultado del primero cambia la probabilidad del segundo. Si muestreamos sin reemplazo, la probabilidad de que Claire sea elegida en segundo lugar depende de quién sea elegido primero.

Si Claire es elegida primero, hay 0% de probabilidad de que Claire sea elegida en segundo lugar.

Si alguien más es elegido primero, hay un 33% de probabilidad de que Claire sea elegida en segundo lugar. En general, cuando se muestrea sin reemplazo, cada selección es dependiente.