Está en la página 1de 1

Maestría en Finanzas | MFin UCEMA

Fecha: 12/05/2022

Profesor: Mariano Kruskevich

Estudiante: Emiliano Iparraguirre

Exploratory Data Analysis (EDA) - Cuadernillo


El primer paso siempre es explorar los datos.

Esto se hace organizando los datos,graficándolos y calculando distintas estadísticas descriptivas.

Esta etapa de análisis es fundamental y puede incluso ayudarnos a sacar conclusiones.

In [1]: # Datos a utilizar: 2008 US Swing State Election Results. FUENTE: Datacamp.com basado en www.data.gov del gobie
# de los EE.UU.
# Explicación: resultados de votación en la elección de 2008 a nivel de condado en cada uno de los tres princip
# oscilantes que definen una elección (Ohio, Pensilvania, y Florida)

# Los datos están guardados en CSV en alguna parte de nuestro disco de trabajo.

# Importamos la librería de uso y los datos

import pandas as pd

path = "C:/Users/e.iparraguirre/Desktop/MFin/02 Est Python/220430 Clase 3/28_swing_states.csv"

df_swing = pd.read_csv(path)

df_swing[["state", "county", "dem_share"]] # dem_share es el % que votó a Obama

Out[1]: state county dem_share

0 PA Erie County 60.08

1 PA Bradford County 40.64

2 PA Tioga County 36.07

3 PA McKean County 41.21

4 PA Potter County 31.04

... ... ... ...

217 OH Hamilton County 53.53

218 OH Highland County 36.54

219 OH Hocking County 49.58

220 OH Licking County 41.97

221 OH Madison County 38.11

222 rows × 3 columns

Visualización
In [2]: # Podemos generar un histograma

# Vamos a usar dataframes en todo lo que sigue, pero bien podríamos usar arrays como ya lo hemos visto

import matplotlib.pyplot as plt

_ = plt.hist(df_swing["dem_share"]) # plt.hist devuelve algo en lo que no estoy interesado, yo solo quiero e


# entonces asigno eso a una variable dummy llamada "guión bajo", práctica c
# luego procedo a nombrar los ejes

_ = plt.xlabel("% que votó por Obama")


_ = plt.ylabel("cantidad de condados")

plt.show()

In [3]: # El histograma anterior viene con 10 bins o cajoncitos, lo cual es estándar.

# Yo puedo cambiar eso...

bins_límites = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

_ = plt.hist(df_swing["dem_share"], bins = bins_límites)


plt.show()

In [13]: # Notá que ahora es más claro que la masa de la distribución está a la izquierda del 50, indicando que hubo más
# McCain que por Obama en estos estados oscilantes.

In [4]: # También podría especificar el número de bins

_ = plt.hist(df_swing["dem_share"], bins = 20)


plt.show()

In [5]: # También podemos usar una librería alternativa para gráficos: seaborn, creada por Michael Waskom

import seaborn as sns

sns.set() # con esta función estamos definiendo que el estilo sea el que tiene seaborn como default

_ = plt.hist(df_swing["dem_share"])
_ = plt.xlabel("% que votó por B. Obama")
_ = plt.ylabel("cantidad de condados")
plt.show()

In [6]: # A esta altura queda claro que cada histograma puede contar una historia visualmente diferente
# dependiendo de cómo definamos los bins

# Esto se puede remediar en parte usando gráficos de enjambre de Seaborn

# Se requiere para ello trabajar con estructuras de dataframes: características de interés en los títulos de co
# valores de las observaciones en las entradas de las filas.

# En este caso, la observación en cada fila es para un condado y las características son el % de voto demócrata

_ = sns.swarmplot(x = "state", y = "dem_share", data = df_swing)


_ = plt.xlabel("Estado")
_ = plt.ylabel("% que votó por B. Obama")

plt.show()

In [17]: # Notá que Obama tuvo menos del 50% en cada uno de los estados.
# Aquí también superamos el sesgo del "bin" y vemos los punto indicando lecturas reales de los datos.
# Es más detallado que el histograma, y no agrega mucha complejidad.

In [12]: # Hay otro gráfico de interés: ECDF (Empirical cumulative distribution function)

# El valor x es ahora la cantidad que estamos midiendon(% de votos Obama)


# El valor y es la fracción de datos que tienen un valor menor al valor correspondiente en el eje x.

import numpy as np

x = np.sort(df_swing["dem_share"]) # esto genera nuestros datos ordenados para el eje x


print(len(x))

y = np.arange(1, len(x)+1)/len(x) # 222 datos igualmente espaciados con un máximo de 1

_ = plt.plot(x, y, marker = ".", linestyle = "none")

_ = plt.xlabel("% de voto a favor de Obama")


_ = plt.ylabel("Empirical Cumulative Distribution Function")

plt.margins(0.02) # para que el gráfico no choque contra los bordes

plt.show()

222

In [19]: # Interpretación:

# Por ejemplo, 20% de todos los condados de los Estados Oscilantes tuvieron 36% o menos de su gente votando por
# Por ejemplo, 3 de cada 4 condados de los Estados de interés tuvieron 50% o menos de su gente votando por Obam

# También se podría hacer en este gráfico una curva ECDF para cada Estado y ello nos daría mucha más informació

In [35]: x = np.sort(df_swing.loc[(df_swing.state == "FL"), "dem_share"])


t = np.sort(df_swing.loc[(df_swing.state == "OH"), "dem_share"])
m = np.sort(df_swing.loc[(df_swing.state == "PA"), "dem_share"])
print(f"FL= {len(x)} condados")
print(f"OH= {len(t)} condados")
print(f"PA= {len(m)} condados")

y = np.arange(1, len(x)+1)/len(x)
u = np.arange(1, len(t)+1)/len(t)
n = np.arange(1, len(m)+1)/len(m)

_ = plt.plot(x, y, marker = ".", linestyle = "none",color='r',label='FL')


_ = plt.plot(t, u, marker = ".", linestyle = "none",color='g',label='OH')
_ = plt.plot(m, n, marker = ".", linestyle = "none",color='y',label='PA')

_ = plt.xlabel("% de voto a favor de Obama")


_ = plt.ylabel("Empirical Cumulative Distribution Function")

_ = plt.title(label="Curva de ECDF por Estado",fontsize=14,color="green")


_ = plt.legend()

plt.margins(0.02) # para que el gráfico no choque contra los bordes

plt.show()

print("\n")
print("Interpretación:")
print("El Estado de Florida se comporto diferente a los\
otros dos estados para el primer 40% de sus condados. En \
el primer 20% de los condados de Florida tuvieron un 20% o \
menos de su gente que votó por Obama.")
print("Los estados de Ohio y Pensilvania se comportan\
de manera similar en toda la curv.")

FL= 67 condados
OH= 88 condados
PA= 67 condados

Interpretación:
El Estado de Florida se comporto diferente a losotros dos estados para el primer 40% de sus condados. En el pri
mer 20% de los condados de Florida tuvieron un 20% o menos de su gente que votó por Obama.
Los estados de Ohio y Pensilvania se comportande manera similar en toda la curv.

Estadísticas resumidas
In [38]: # Media de los votos en PA

import numpy as np

dem_share_PA = df_swing.loc[(df_swing.state == "PA"), "dem_share"]

np.mean(dem_share_PA)

Out[38]: 45.476417910447765

In [39]: # Mediana (que es inmune a los outliers que arrastran la media)

# Es el valor justo en el medio de los datos, luego de haberlos ordenado.


# Porque está en el medio de los datos ordenados y no depende del valor de los datos, no es arrastrada por outl

np.median(dem_share_PA)

Out[39]: 44.03

In [40]: type(dem_share_PA)

Out[40]: pandas.core.series.Series

In [41]: dem_share_PA_array=np.array(df_swing.loc[(df_swing.state == "PA"), "dem_share"])


type(dem_share_PA_array)
print(np.mean(dem_share_PA))
print(np.mean(dem_share_PA_array))
print(np.median(dem_share_PA_array))

45.476417910447765
45.476417910447765
44.03

In [ ]: # En el caso anterior vemos que no hay mucho impacto de outliers ya que mediana y media coinciden.

In [42]: # Percentiles

# La mediana es el 50% percentile. En otras palabras, 50% de los datos son menores a la mediana. Mirar el ECDF.

# Así también tenemos el 25% percentile y otros similares. El 25% percentile es el valor de los datos que es ma
# de los datos

per=np.percentile(df_swing["dem_share"],[25,50,75]) # Esto devuelve los datos que corresponden a los percentile


print(per)
# Muchos datos hasta aquí.
# Los boxplots ayudan a visualizar la dimensión de percentiles
# Medio del box= mediana
# Techo y piso = 75 y 25 percentiles
# Altura del box (IQR o Interquantile Range)= grafica el 50% de los datos del medio
# Bigotes superior e inferior = a una distancia de 1,5x el IQR, o hasta la extensión de los datos (si no ll
# Puntos fuera de los bigotes = se grafican como puntos individuales y son los outliers

# Cuando el número de datos es muy grande y los gráficos de enjambre son complicados, boxplots son los más conv

# El boxplot se construye como un gráfico de enjambre.

_ = sns.boxplot(x = "state", y = "dem_share", data = df_swing)


_ = plt.xlabel("Estado")
_ = plt.ylabel("% que votó por B. Obama")

plt.show()

[37.3025 43.185 49.925 ]

In [43]: # Variabilidad de los datos

np.var(dem_share_PA) # pero esto no tiene las mismas unidades de lo que estamos midiendo: los % de votos para

Out[43]: 94.66503492982848

In [44]: # Calculamos el desvío estándar

np.std(dem_share_PA)

Out[44]: 9.729595825615187

In [86]: # Generemos un scatter plot o gráfico de dispersión

# Primero, vamos a importar todos los datos que tenemos en la base, y no solo 3 columnas como hasta ahora.

path = "C:/Users/e.iparraguirre/Desktop/MFin/02 Est Python/220430 Clase 3/2008_swing_states.csv"


df_swing = pd.read_csv(path)
df_swing[["state", "county", "total_votes", "dem_votes", "rep_votes", "dem_share"]]

total_votes = np.array(df_swing.total_votes)
dem_share = np.array(df_swing.dem_share)

# groups = df_swing.groupby("state")

# Ahora graficamos

_ = plt.title(label="Relación entre votos para Obama y votos totales",fontsize=14,color="green")


_ = plt.plot(total_votes/1000, dem_share, color='green',marker=".", linestyle = "none")
_ = plt.xlabel("votos totales (en miles)")
_ = plt.ylabel("% de voto por Obama")

In [87]: # Notá que los condados más grandes en población,votaron por Obama (ángulo superior derecho)
# Los condados más chicos, votaron por el republicano.

# En este gráfico, entonces, se pueden leer correlaciones y covarianzas


# Las correlaciones son independientes de las unidades (correlación Pearson o Rho)

cov_matrix = np.cov(total_votes/1000, dem_share)


print(cov_matrix)
print("--------------------")

votos_tot_vs_dem_cov = cov_matrix[0,1]
print("La covarianza entre los votos totales y democrátas es: ", votos_tot_vs_dem_cov)
print("--------------------")

correl = np.corrcoef(total_votes/1000, dem_share)


print(correl)
print("--------------------")
print("La correlación entre los votos totales y democrátas es: ", correl[0,1])

[[20245.10393632 817.30936184]
[ 817.30936184 114.76344739]]
--------------------
La covarianza entre los votos totales y democrátas es: 817.3093618405286
--------------------
[[1. 0.53619736]
[0.53619736 1. ]]
--------------------
La correlación entre los votos totales y democrátas es: 0.5361973649586781

FIN Exploratory Data Analysis (EDA)

También podría gustarte