PYTHON
1. Buenas Prácticas:
De que se trata el Notebook (nombre del trabajo)
Identificar autor/autora, idealmente con fecha
Comentar todo en el código, lo que hace y los resultados esperados
Código ordenado. Trozos de código CHUNK
Trabajar con copias de Datos
2. Para que sirve Python
Desarrollo WEB
Desarrollo de internet de las cosas
Ciencia de Datos y aprendizaje de máquina
3. Jupyter notebook:
Jupyter Notebook (anteriormente IPython Notebooks) es una aplicación web de código
abierto, la cual te permite crear y compartir documentos que contienen código, ecuaciones,
visualizaciones y texto enriquecido. Sus usos incluyen limpieza y transformación de datos,
simulaciones numéricas, modelamiento estadístico, visualización de datos, aprendizaje
automático y mucho más. Un documento de Jupyter Notebook es un documento JSON, que
sigue un esquema versionado y que contiene una lista ordenada de celdas de entrada/salida,
terminado con la extensión ".ipynb".
El término "notebook" puede hacer referencia coloquialmente a muchas entidades diferentes,
principalmente la aplicación web Jupyter, el servidor web Jupyter Python o el formato de
documento Jupyter según el contexto.
Para obtener más información sobre el proyecto Jupyter, visita [Link].
4. GOOGLE COLAB
Son los Jupyter Notebooks de Google
No requieren instalaciones previas en los computadores
5. GLOSARIO
CHEAT SHEET
COLAB
PANDAS
Es una biblioteca de software escrita como extensión de NumPy para manipulación y análisis
de datos para el lenguaje de programación Python. En particular, ofrece estructuras de datos y
operaciones para manipular tablas numéricas y series temporales.
Manipulación y reestructuración de dataset
Reshaping Data
[Link](df): convierte columnas en filas, reuniendo la información.
[Link](df): convierte filas en columnas, “esparciendo” la información.
[Link]([df1,df2]): apila dos dataset (juntando por filas) y los convierte en uno, para
ello ambos dataset deben tener las mismas columnas.
[Link]([df1,df2],axis=1): junta dos dataset anexando columnas, para ello ambos
dataset deben tener las mismas filas.
df.sort_values(“variable”): Ordena las filas del dataset en base a los valores de la
“variable”, por defecto de menor a mayor.
[Link](columns={“nombreantiguo”:“nombrenuevo”}): renombra las columnas de
un dataset.
df.sort_index(): ordena el índice de un DataFrame.
df.reset_index(): redefine el índice de un DataFrame asignando el número de fila
correspondiente, convirtiendo el índice previo en una columna del DataFrame.
[Link](columns=[”var1”,“var2”]) elimina del DataFrame la lista de columnas
entregadas entre paréntesis cuadrado.
Subconjunto de Filas
df[df.columna2<10]: extrae las filas que cumplen el criterio de la columna
definida. En este caso se extraen las filas en que el valor en la columna2 es menos
10.
df.drop_duplicates(): remueve las filas duplicadas (sólo considera columnas).
[Link](frac=0.5): selecciona la fracción de datos (en este caso 50%) de manera
aleatoria.
[Link](n=10): selecciona n filas de manera aleatoria.
[Link](n): muestra las n primeras filas del DataFrame.
[Link](n): muestra las n últimas filas del DataFrame.
Subconjunto de columnas
df[[“columna1”,“columna2”,“columna4”]]: selecciona múltiples columnas con sus
nombres específicos.
df[“columna2”]: selecciona una columna específica.
[Link](regex=”texto”): selecciona las columnas en las cuales está presente el
“texto” definido.
Tablas de Resumen (Summarize Data)
df.value_counts(): cuenta el número de filas con valores únicos en el DataFrame.
df[“columna3”].value_counts(): cuenta el número de filas con valores únicos de
la“columna3”.
len(df): entrega el número de filas en el DataFrame.
[Link]: entrega una tupla del número de filas y el número de columnas en el
DataFrame.
df[“columna1”].nunique(): número de valores únicos en la columna1.
[Link](): entrega estadísticos descriptivos básicos de cada columna del
DataFrame.
Agrupación
[Link](by=”col): entrega un objeto agrupado según la columna “col”.
[Link](level=“index”): entrega un objeto agrupado por los valores del index
del DataFrame.
Referencias Para más detalles y atajos, visitar:
[Link]
[Link]
master/Cheat_sheet_for_Google_Colab.ipynb
Indicaciones para comenzar el taller
Descarga el archivo “[Link]” en tu computador y descomprímelo, aquí
podrás encontrar el archivo con extensió[Link] que contiene el .csv que se
trabajará en el taller.
Inicia una sesión en google (con tu correo gmail), luego ingresa a
[Link]
SINTAXIS, VARIABLES Y LIBRERIAS
SINTAXIS
Los comentarios en el chunk de código son con # al inicio. Se ejecuta y no muestra
nada, es solo para documentación
# esto es un comentario
Uso de Texto. Al agregar un chunk de texto, se pueden utilizar los siguientes tipos
de textos
o Negrita: entre *. Ejemplo: *amarillo*, el resultado sería amarillo
o Cursiva: entre _. Ejemplo: _cursiva_, el resultado sería cursiva
o Título: se coloca #, y dependiendo de la cantidad de # es el tamaño del
título disminuye hasta 6 # que es el título más pequeño. Ejemplo:
# Título el resultado será Título
## Sub-Título el resultado será Sub-Título
###### Título pequeño el resultado será Título pequeño
o texto de análisis: Es sin ningún carácter especial. Texto normal
o Para hacer punteros con * o – al inicio. Ejemplo:
* punto 1, el resultado será • punto 1
* punto 2, el resultado será • punto 2
o Formulas o línea de texto Va entre los signos pesos, $: Ejemplo, $A_{1}$, el
resultado es Ai
REVISAR EL LENGUAJE MARKDOWN
TIPOS DE DATOS
Entero: int
Flotante: float
Texto: string
Listas: [,]
o Lista_super[2]: es el valor en la posición 2 de la lista (partiendo de 0)
o Lista_super.append[“bebida”]: agrega bebida a la lista
o Lista_super_ext= lista_super + [otro]
o del(lista_super[2])= elimina el tercer registro
o Rango de lista: lista_super[3:5], donde el primer digito es el inicio
INCLUSIVO, y el ultimo sería el último índice EXCLUSIVO. Es decir, se traería
solo los valores de las posiciones 3 y 4 (considerando que parte el conteo
de 0)
o Sublistas: Ejemplo:
x = [["a", "b", "c"],
["d", "e", "f"],
["g", "h", "i"]]
x[2][0]
igual a ["g"]
x[2][:2]
igual a ["g", "h"]
o Creando nuevas listas: Cuando se crea nuevas listas a partir de otras, se
debe tener cuidado de como se hace.
Si se hace Y=X, es como duplicar la misma lista, y cuando se haga
algún cambio en Y, X también se modificará. En memoria serán lo
mismo.
Si se hace Y=X[:], o Y= list(X); Y tendrá los mismo valores, pero serán
distintos objetos, por lo tanto si se modifica Y no se modificara X
Booleanos: Corresponden a un tipo de dato que sólo puede tomar dos posibles
valores: True (verdadero) y False (falso). En Python, cualquier variable puede
considerarse del tipo booleana.
Range: El tipo de variable range es una lista inmutable de números enteros en
sucesión aritmética.
Diccionarios: Es una estructura de datos y un tipo de dato en Python. Los
diccionarios nos permiten almacenar cualquier tipo de valor como enteros,
cadenas de texto, listas e incluso otras funciones.
diccionario_datos = {(a,b,c), (1,2,3), "Hola"}
FUNCIONES:
**: Potencia , por ejemplo para 42 sería 4**2
%: Modulo, devuelve el resto de la división. Ejemplo 18 % 7, es igual a 4.
Print: Imprimir variable o texto
Type: Entrega el tipo de dato
Lower: Es un método para los datos de tipo texto. Lleva el texto a minúscula. Se
usa: [Link]
Upper: Es un método para los datos de tipo texto. Lleva el texto a mayúscula. Se
usa: [Link]
Str: convierte a string el dato
Int(): convierte a entero el dato
float(): convierte a float el dato
bool(): convierte a booleano el dato
MAX(): retorna el valor máximo de un lista
ROUND(), tiene 2 parámetros de entrada, el primero el número que quieres
redondear y el segundo la precisión que necesitas 8cantidad de decimales. En el
caso que solo se entregue el primer digito, se redondeara al entro màs próximo
HELP(function): Entrega mayor detalle del funcionamiento de la función colocada
en el paréntesis
POW(x,y {,z}): calcula la potecia de x a la y. En el caso de que el argumento z esté
se calcula el modulo a esa potencia. Ejemplos:
o Pow(7,2) = 49
o Pow(7,2,5) = 4
o Pow(7,2,7) = 0
Los lenguajes de programación cuentan con una serie de herramientas básicas
incorporadas, como las que acabamos de ver. Sin embargo, existen expansiones de
funcionalidades que han sido desarrolladas previamente de modo de ahorrarnos trabajo y
hacer todo más simple.
Estas "expansiones" se llamas bibliotecas o librerías
#Importemos algunas de las librerías más clásicas para el manejo de da
tos en Python
#Pandas es la librería básica para la manipulación y análisis de datos
import pandas as pd
#Numpy es la biblioteca para crear vectores y matrices, además de un c
onjunto grande de funciones matemáticas
import numpy as np
#Seaborn es una librería que usamos para graficar
import seaborn as sns
#Statsmodels es la biblioteca para realizar modelos
import [Link] as smf
#matplotlib es la biblioteca clásica para graficos
import [Link] as plt
METODOS:
Biblioteca Panda pd
pd.read_csv:
head()
tail()
drop()
dropna()
info()
describe()
mean()
count()
min()
max()
value_counts()
groupby()
Biblioteca numpy np
where()
Biblioteca seaborn sns
displot()
barplot()
boxplot()
scatterplot()
heatmap()
Biblioteca matplotlib plt
Sublibreria pyplot
plot(x,y)
scatter(x,y{,s= list, c=list, alpha= n})
o x = lista de valores para x-axis
o y = lista de valores para y-axis
o s = Size, lista de los tamaños del punto que representa el valor dibujado
o c = Color, lista de color de cada punto
o Alpha = número que indica nivel de opacidad
hist(x, bins= n)
show()
clf()
grid(boolean)
xlabel(´name-x´)
ylabel(‘name-y’)
title(‘tille of plot’)
text(x, y, s) 0 Agrega el texto ‘s’ en la ubicación x,y del plot
yticks( list range for values of y-axis, list range for labels of y-axis)
xticks( list range for values of x-axis, list range for labels of x-axis)
xscale(‘log’)
Biblioteca Gapminder data contains a list continente. DICTIONARY
[ ] numero_pi = [Link]
[ ] numero_pi
3.141592653589793
Dentro de pandas existe una estructura de datos que facilita el trabajo de análisis de
datos, se conocen como "Dataframe". Corresponden a una estructura ordenada por filas y
columnas (como una pestaña de excel).
Pandas tiene múltiples funciones, las que nos permitirán trabajar datos de una manera
muy sencilla y amigable.
Ahora, ¡manos a la obra!
Trabajaremos con el dataset 'nations', el cual contiene información sobre diferentes
atributos de desarrollo humano en 194 países, recolectados por las Naciones Unidas.
Contiene información a nivel mundial sobre demografía:
country: País.
region: Continente del país.
gdp: Producto Interno Bruto per cápita, precios 2005.
school: Promedio años de escolaridad.
adfert: Fertilidad adolescente (Nacimientos 1:1000 en mujeres entre 15 y 19).
chldmort: Probabilidad de muerte antes de los 5 años por cada 1000.
life: Esperanza de vida al nacer.
pop: Población total.
urban: Porcentaje de población urbana.
femlab: Tasa entre hombres y mujeres en el mercado laboral.
literacy: Tasa de alfabetismo.
co2: Toneladas de Co2 emitidas per cápita.
gini: Coeficiente de desigualdad del ingreso.
[4] df_nations =
pd.read_csv("[Link]
main/[Link]", encoding="ISO-8859-1")
[5] df_nations
[ ] # El método 'head()' nos permite ver "la cabecera" del dataset
df_nations.head()
[ ] # Con 'tail()' ¿qué se puede ver?
df_nations.tail(3)
Cuando necesites ver la documentación de un método, si trabajas en Colab de google
basta con poner el cursor sobre el método, pero si usas Jupyter notebook, te debes ubicar
sobre el texto y presionar shift + tab
Si se fijaron en nuestro dataset, se puede ver que la columna "Unnamed: 0" parece no
tener información relevante, por lo que la eliminaremos. Para ello, el método a usar es
drop()
[6] df_nations.drop(columns=["Unnamed: 0"], inplace = True)
[ ] df_nations.head()
[7] df_nations.columns
Index(['country', 'region', 'gdp', 'school', 'adfert', 'chldmort', 'life',
'pop', 'urban', 'femlab', 'literacy', 'co2', 'gini'],
dtype='object')
Si queremos observar solo una columna del dataset, la sintaxis es la siguiente:
df_nations["nombre_columna"]
[8] df_nations["region"]
[ ]# ¿Cómo se debería hacer para observar la columna "country"?
[9] df_nations["country"]
Si se quiere crear una nueva variable (o atributo) en el dataset, no es necesario iniciar la
variable primero, se puede crear directamente:
Por ejemplo, el atributo "gdp" se mide en dólares corrientes del año 2005. Si quisiéramos
saber a cuántos pesos de la actualidad equivalen esos dólares, bastaría con hacer la
conversión en una nueva variable, que llamaremos "gdp_pesos2021" Para simplificar el
tipo de cambio, usaremos 1 USD = 850 pesos chilenos.
[10] df_nations["gdp_pesos2021"] = df_nations["gdp"]*850
[11] df_nations.head()
Para continuar con nuestro análisis de los datos, vamos a plantear una serie de
interrogantes que guiarán el taller:
¿Qué tipos de atributos nos encontramos en el dataset?
¿Cuántos datos tenemos en cada región?
¿Cuántos países tienen índices de CO_2 mayores que el promedio?
¿Qué se puede decir del alfabetismo en áfrica o europa?
Pregunta 1 Para saber los tipo de atributos contenidos en un dataset, podemos usar el
método info() el cuál imprime un resumen conciso, informando el tipo de variables
(categóricas, numéricas, string, etc) y además el número de valores no nulos de cada
atributo y el uso de memoria.
[12] df_nations.info()
Otro método muy útil cuando estamos explorando los datos, es describe(); el cuál calcula
estadísticas básicas de los atributos numéricos (float o int), dejando fuera los atributos
categóricos o cualitativos.
[33] df_nations.describe()
[14] # Si queremos observar sólo 1 atributo
df_nations["gini"].describe()
[15] df_nations["gini"].mean()
40.47777781074429
[16] df_nations["gini"].count()
81
[17] # También se pueden usar métodos específicos como count(), mean(), min() o max()
para saber el valor específico del estadístico en una variable
[18] # ¿cómo calculamos el valor promedio de gdp en el dataset?
df_nations["gdp"].mean()
12118.739193367559
[19] # ¿Y cuánto es la tasa más baja de alfabetistmo en el dataset?
df_nations["literacy"].min()
23.6000003814697
Pregunta 2 ¿Cuántos datos tenemos en cada región?
Si queremos saber cuántos datos tiene cada región, se puede hacer a través de una tabla
de frecuencias
[20] #Para observar un atributo categórico usaremos una tabla de frecuencias
df_nations["region"].value_counts()
[21]
# Otra forma de hacer este conteo, puede ser a través de una agrupación
df_nations.groupby(["region"])[["country"]].count()
Siguiendo con la manipulación de los datos, un método que nos ayuda a recodificar una
variable (o crear una nueva a partir de una condición), es el método where(); el cual
proviene de la librería numpy y nos permite decidir, a través de una condición, qué va en
el lugar de aquellas filas que cumplen la condición, y qué va en el lugar de las filas que no
cumplen la condición. La sintaxis correcta de uso sería:
df_nations["variable"] = [Link](Condición, valor si verdadero, valor si falso)
[22] # Usando where(), crearemos una variable nueva de co2, en dónde identifiquemos
qué países están por debajo de la media, y qué países por sobre la media.
df_nations["co2_recodificada"] = [Link](df_nations["co2"]> df_nations["co2"].mean(),
1, 0)
[23] df_nations.head()
[24] # Para observar los resultados, podemos hacer una tabla de frecuencias
df_nations["co2_recodificada"].value_counts()
Con lo anterior podemos dar respuesta a la Pregunta 3 ¿Cuántos países tienen índices de
co2 mayores a la media?
[25] df_nations['co2_recodificada'].value_counts()[1]
64
[26] print("Existen " + str(df_nations['co2_recodificada'].value_counts()[1]) + " países con
índices de co2 mayores a la media")
Existen 64 países con índices de co2 mayores a la media
[27] # Una variación del método value_counts() es que si pones un carácter dentro del
paréntesis, te mostrará los datos en porcentaje:
[34] df_nations["co2_recodificada"].value_counts("%")
Pregunta 4 ¿Que se puede decir del alfabetismo en áfrica o europa?
Para analizar un grupo específico de la muestra podemos utilizar filtros
[35] # Filtro por variable "Region"
df_nations[df_nations["region"]=="Africa"]
[36] df_africa = df_nations[df_nations["region"]=="Africa"]
[37] df_africa.head()
[40] # ¿Cómo creamos el filtro para los países de Europa?
df_europa = df_nations[df_nations["region"]=="Europe"]
[41] df_europa.head()
[42] # Para analizar el alfabetismo en áfrica, podemos usar el método mean() en la
variable "literacy" para la muestra "África"
df_africa["literacy"].mean()
65.30851067887976
[43] # Del mismo modo para Europa
df_europa["literacy"].mean()
98.17727279663086
De lo anterior se desprende que Europa tiene una tasa de alfabetismo de 98,1% mientras
que en África alcanza sólo al 65,3%.
SECCIÓN DE VISUALIZACIÓN DE DATOS
La visualización gráfica de datos constituye una disciplina en si misma. Existen muchos
tipos de datos y utilizar el gráfico correcto, según la necesidad de información y el objetivo
a comunicar es clave en este proceso.
[ ] # Comenzaremos con crear un histograma que nos muestre la distribución del índice gini
[13] [Link](df_nations["gini"], kind="hist")
Del gráfico anterior, se desprende que la mayor concentración del índice gini está entre
los 30 y 50 puntos, pero sería valioso agregar el valor promedio del gini en nuestra
muestra. ¿Cómo hacemos eso?
[14] import [Link] as plt
[15] [Link](df_nations["gini"], kind="hist")
[Link](df_nations["gini"].mean(), color = "tomato")
[16] # Gráficos de barras
Ahora utilizaremos gráficos de barras para observar comparaciones de comportamiento
de regiones versus el resto del mundo.
Ya habíamos creado los filtros de df_africa y df_europa, con esto vamos a comparar la
mortalidad infantil.
[21] # Guardaremos el valor promedio de mortalidad infantil para Europa y África
media_europa = df_europa["chldmort"].mean()
media_africa = df_africa["chldmort"].mean()
[22] #Graficamos
[Link](["Europa", "Africa"], [media_europa, media_africa])
[23] # Otro gráfico de barras: Alfabetismo promedio entre Américas y el resto del mundo
# Primero guardamos la media de una de las regiones
media_americas = df_nations[df_nations["region"]=="Americas"]["literacy"].mean()
[24] media_americas
89.30124988555909
[26] media_resto_mundo = df_nations[df_nations["region"]!="Americas"]["literacy"].mean()
[27] media_resto_mundo
80.18217380357825
[28] [Link](["Americas", "Resto del mundo"], [media_americas, media_resto_mundo])
[29] # Ahora usando gráfico Boxplot para observar la distribución de la escolaridad por región
[Link](x=df_nations["region"], y=df_nations["school"])
df_africa["school"].describe()
[32] #Otra forma de observar la información es a través de los diagramas de dispersión,
pero para usar estos necesitamos eliminar datos perdidos en el dataset.
df_limpia = df_nations.dropna()
Teniendo data adecuada, procedemos a observar la dispersión de los años de escolaridad
sobre el grado de alfabetismo
[33] df_limpia
[34] [Link](x=df_limpia["school"], y=df_limpia["literacy"])
[36] # ¿Cómo se podría crear un diagrama de dispersión de la tasa de escolaridad
("school") versus el pib ("gdp")?
[Link](x=df_limpia["school"], y=df_limpia["gdp"])
El último tipo de gráfico que revisaremos en este taller, corresponde al mapa de calor o
heatmap. Este tipo de gráfico es una representación visual de los datos en que se muestra
concentración o intensidad.
En este caso lo utilizaremos para buscar correlación entre las distintas variables de
nuestro dataset.
¿Qué es correlación?
Correlación es una medida estadística que expresa hasta qué punto dos variables están
relacionadas linealmente. Es una herramienta común para describir relaciones simples sin
hacer afirmaciones sobre causa y efecto.
La correlación es un valor que va entre -1 y 1. Siendo -1 una correlación perfecta inversa
(es decir, cuando una variable a aumenta, la variable b disminuye) y 1 cuando la
correlación es directa (es decir, cuando una variable a aumenta, la variable b aumenta
también)
EXPLICACION GRÂFICOS Dentro de las principales correlaciones existentes, nos
encontramos con la correlación positiva entre mortalidad infantil y tasa de fertilidad
adolecente, también la correlación positiva entre el promedio de años de escolaridad y
tasa de alfabetización. Correlación entre PIB per capita y porcentaje de población urbana.
[37] corr = df_nations.corr()
[38] [Link](corr)
[38] [Link]["[Link]"] =(8,8)
[Link](corr, cmap="Greens", annot=True)
MODELACION
La regresión lineal es un modelo matemático usado para aproximar la relación de
dependencia entre una variable dependiente $Y$, $m$ variables independientes $X_{i}$ y
un término aleatorio (de error) $e$.
$$
y_i = \beta_{0} + \beta_1 x_{i1} + ... +\beta_{m} x_{im} + \epsilon_i
$$
La principal motivación es mostrar cuánto de la variabilidad de la variable dependiente
$Y$ es explicado por la variabilidad de las variables independientes $X_{i}$.
Para trabajar el modelo de regresión lineal es fundamental usar datos limpios de valores
perdidos, por lo que utilizaremos el dataset que llamamos data_limpia.
Y los pasos a seguir para implementar el modelo de regresión lineal más simple:
1. Plantear el modelo con su formula
2. Ajustar el modelo utilizando el método `.fit()`
3. Mostrar los resultados del modelo
# ¿Cual es la relación CO2 y el GDP?
modelo1 = [Link]("gdp ~ co2", data=df_limpia)
modelo1 = [Link]()
[Link]()
A modo de ejercicio, te dejamos a continuación un modelo 2 para implementar, sigue el
paso a paso y ejecuta el código por tu cuenta:
1. Fórmula: `"gdp ~ chldmort + life + school + co2"` y data utilizada es "df_limpia".
2. Ajustar el modelo con `fit()`
3. Mostrar resultados
modelo2 = [Link]("gdp ~ chldmort + life + school + co2", data=df_limpia)
modelo2 = [Link]()
[Link]()
heart_2020_cleaned.csv
Big_5_European_Leagues_Stats
LIBRERIAS
NUMPY
corrcoef
corrcoef(x, y=None, rowvar=True, bias=<no value>, ddof=<no value>)
Return Pearson product-moment correlation coefficients.
Please refer to the documentation for `cov` for more detail. The
relationship between the correlation coefficient matrix, `R`, and the
covariance matrix, `C`, is
.. math:: R_{ij} = \frac{ C_{ij} } { \sqrt{ C_{ii} * C_{jj} } }
The values of `R` are between -1 and 1, inclusive.
Parameters
x : array_like
A 1-D or 2-D array containing multiple variables and observations.
Each row of `x` represents a variable, and each column a single
observation of all those variables. Also see `rowvar` below.
y : array_like, optional
An additional set of variables and observations. `y` has the same
shape as `x`.
rowvar : bool, optional
If `rowvar` is True (default), then each row represents a
variable, with observations in the columns. Otherwise, the relationship
is transposed: each column represents a variable, while the rows
contain observations.
bias : _NoValue, optional
Has no effect, do not use.
.. deprecated:: 1.10.0
ddof : _NoValue, optional
Has no effect, do not use.
.. deprecated:: 1.10.0
Returns
R : ndarray
The correlation coefficient matrix of the variables.