Análisis de datos para tu primera regresión lineal
Clase 2 de 18 • Curso de Regresión Lineal con Python y scikit-learn
Contenido del curso
Clase 2 de 18 • Curso de Regresión Lineal con Python y scikit-learn
Contenido del curso
FELIX DAVID CORDOVA GARCIA
Tomas Dale
Abisai Antonio Madera
Agustin Blandin
Oswaldo Jair García Franco
Julián Cárdenas
Hugo Montoya Diaz
Maximiliano Cuesta
Ian Cristian Ariel Yané
Juan Nuñez
Alfonso Andres Zapata Guzman
Joaquín Ugarte
Alfonso Andres Zapata Guzman
Nicolas Cordoba
Mauro Benito Montoya Arenas
Bryan Castano
Marcos Ireneo Barbas
Dick Saide Suárez Blanco
Daniel de Jesús Martínez Vega
Juan R Rossano
Luis Fernando Laris Pardo
Luis Fernando Laris Pardo
Daniel de Jesús Martínez Vega
Ana María Tamayo Ocampo
Julián Cárdenas
Fabian Martinez
Gabriel Obregón
Mario Alexander Vargas Celis
Rodmy Suarez
Mauro Benito Montoya Arenas
Johan Sebastian Muñoz Ossa
También se puede crear la matriz de correlación usando solo pandas, y para que no aparezcan esas letras raras al final ( sobre mi grafico) siempre pongo punto y coma como ven en mi grafico
BUENISIMO APORTE, MIL MIL GRACIAS
Excelente aporte; aquí les dejo las líneas de código:
sns.set(font_scale = 1.5) sns.heatmap(df[cols].corr(), cbar = True, annot=True, yticklabels=cols, xticklabels=cols);
Veo que es demasiado codigo para hacer el mapa de calor yo lo hice asi y me lo mismo
sns.heatmap(df[cols].corr(), cbar= True, annot= True) plt.show()
Excelente!
Al hacerlo así me sale desconfigurado, los elementos de más que pone sí cumplen su función!
Aca dejo imagen con la informacion del Dataset
tanks bro! 👍
se puede hacer PCA como en la clase de estadística explotaría para sacar los datos con más varianza y así ver cuáles contienen más información
import plotly.graph_objects as go import plotly.io as pio pio.templates['new_template'] = go.layout.Template() pio.templates['new_template']['layout']['font'] = {'family': 'verdana', 'size': 16, 'color': 'white'} pio.templates['new_template']['layout']['paper_bgcolor'] = 'black' pio.templates['new_template']['layout']['plot_bgcolor'] = 'black' pio.templates['new_template']['layout']['xaxis'] = {'title_standoff': 10, 'linecolor': 'black', 'mirror': True, 'gridcolor': '#EEEEEE'} pio.templates['new_template']['layout']['yaxis'] = {'title_standoff': 10, 'linecolor': 'black', 'mirror': True, 'gridcolor': '#EEEEEE'} pio.templates['new_template']['layout']['legend_bgcolor'] = 'rgb(117, 112, 179)' pio.templates['new_template']['layout']['height'] = 700 pio.templates['new_template']['layout']['width'] = 1000 pio.templates['new_template']['layout']['autosize'] = False pio.templates.default = 'new_template'
import plotly.express as px fig = px.scatter_matrix( df, dimensions=['DIS','INDUS','CRIM', 'RM', 'MEDV'], title="Scatter matrix of data set", labels={col: col.replace("_", " ") for col in df.columns}, opacity=0.7, ) fig.update_traces(diagonal_visible=False) fig.show()
fig = px.imshow( df[cols].corr(), color_continuous_scale=px.colors.diverging.RdBu[::-1], text_auto='.2f', zmin=-1, zmax=1, ) fig.show()
Banco mucho a la gente que usa plotly. ¡Gracias por el aporte!
5Por cierto, ya conectamos en LinkedIn?4
Conectemos en LinkedIn 👈 o tambien en GitHub 👈
Ampliemos juntos nuestra red de contactos, sigueme y te sigo!
La librería de pandas también permite realizar correlaciones y no solo usando el método de pearson sino también usando kendall y spearman
Genial, Muchas Gracias pro compatri esto . companero Platzi, Yo realmente l oaprecio, me hace mas facil entender todo desde ahora.
Le dejo el codigo para hacer una matriz de correlacion donde pueden ver las correlacion de todas las features y tambien filtrar a partir a partir de que indice quieren en el heatmap:
fig = plt.subplots(figsize=(10,10)) sns.set(style='whitegrid', context='notebook', ) correlation = data.corr() #Establecer el indice abajo acceptable_corr = 0.5 filtered_correlations = correlation[correlation > acceptable_corr] sns.heatmap(filtered_correlations, annot=True) plt.show()
------------->Seaborn<-------- 1er Parte (minutos 0:16 a 5:15 ) Ahora analizaremos los datos obtenidos de la clase anterior, para ello utilizaremos " seaborn ". 1. NOTA: Notese que, en codigo, seaborn se sigue viendo escribiendo como "import seaborn as sns ". 2. Ahora le explicamos a Colab que importe la informacion vista anteriormente, para ello usamos "import matplotlib.pylot as plt" 3. Con estas dos librerias importadas, utilizaremos seaborn para darle estilo a los graficos. Para ello se escribe " sns.set (style='whitegrid', context = 'notebook') " --------> En otras palabras: + "sns" significa seaborn. (por ende "sns.set (continua) ", significa que estas especificando la configuracion de seaborn) +(continua)..." style = 'whitegrid', siguiente formato ", que significa el diseno y color qu va a tener la grafica. +(siguiente formato) " ,context = 'notebook' ) ", que significa que la grafica estara en un formato de "notebook" (o libreta en espanol), y con eso - Segun el profe Luis- se ve mejor. -----------> Hasta este punto, debido al hecho de que son 13 varibles, no resulta facil para que las leamos, por eso seleccionaremos solo las 5 variables mas importantes, y asi hacerlas mas faciles de leer. 4. Es por eso que se usa la variable " cols = [ 'DIS', 'INDUS', 'CRIM', 'RM', 'MEDV' ] " + "DIS" fue dado en el documento de los encabezados, este significa "Distancia desde el punto analizado a los 5 distritos mas importantes de Boston" + "INDUS" (encabezado del mismo documento), significa "Indice de Industrias que hay dentro de " + "CRIM", es "Indice de Criminalidad" + "RM", es el "Promedio de las Casas" (Mas notese que es la abreviacion de "Room") +'MEDV', es la "Mediana de los Precios", esta sera la variable mas importante porque es la que se predicira. 5. Ahora, podemos hacer nuestro primer grafico (asta' aora' facil no? 🙃xd). El cual se invoca con lo siguiente " sns.pairplot ( df [cols] ), height = 2.5) enter " ---------->ok, paso a paso: + " sns.pairplot (continua) ", sabemos ya " sns " significa seaborn, mas este caso ahora usamos " .pairplot ", que segun Google, es una matriz de "scatterplots" que nos permite entender la relation entre diferentes variables en Data Science. Se abre pararentesis para desarrollarlo / especificarlo mas, + (continua) " ( df [ *siguente *], ". Entonces, "df" es la otra manera de decir " def " (recuerdas que eso nos ayudaba a "definir una funcion "?, bueno, al final es lo mismo ). + [siguiente] " [cols] " esto es para referenciarle a la computadora (o decirle de donde sacar los datos), en este caso sera de "cols", el cual es el nombre de la variable que contiene todos los encabezados. Lo cual se vio en la clase pasada. + Por ultimo "height = 2.5", uff... este es solo para aclarar la altura a la que estara parte de la grafica (pienso es la ditancia entre renglon y renglon🤷♂️ lol )
6. Terminados con un "plt.show( )", para mostrar el grafico. +Segun Google, es la funcion que nos ayuda a mostrar todas las graficas que han sido (o no) correctamente programadas.
RM es el promedio de cuartos por casa de cada suburbio, por si a alguno se llega a confundir
Las columns INDUS y DIS tienen mayor correlacion que MEDV y RM ya que es .71 y .70 respectivamente, solo que es correlacion negativa y no positiva. Supongo que ademas tienen mayor importancia para nuestro analisis RM y MEDV por lo que ademas de la correlacion ¿habria una ponderacion de en las columnas que afecten la correlacion a la hora de escoger la mayor?
Respondiendo a la pregunta. Podría haber, siempre es importante recordar que las correlaciones no son causaciones, por tanto una alta correlación no es indicador necesariamente que la variable nos va a ayudar a predecir a futuro un resultado. Por tanto el conocimiento experto es muy importante al momento de hacer análisis y alguien que pueda decir que una variable es mejor a otra por una razón lógica se podría tomar en cuenta para tomar un resultado sobre otro
Ahora respondiendo al comentario, es cierto que la correlación de Indus y DIS es mayor, pero el ejercicio acá es intentar usar regresión lineal para predecir la medianas de los precios (MEDV) por tanto se escogió la variable que más correlacionada a MEDV, en este caso fue RM. Sí hubiéramos, por ejemplo, querido predecir la cantidad de industrias que hay en una zona (INDUS), entonces la variable DIS hubiera sí hubiera sido la variable que se hubiera escogido para realizar dicha predicción. Buena observación! Muchas gracias por ponerla por acá!
Esta es la configuración que hice para graficar la correlación lineal de las variables:
sns.heatmap(df[cols].corr(), annot= True, cmap='coolwarm');
.corr() de pandas nos ayuda a hacer de manera más concisa nuestra matriz de correlaciónCon esto seaborn entrega esto:
Tambien puedes utilizar estas gamas y mirar cual es la mejor para la interpretación: 'crest', 'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'CMRmap', 'CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r', 'PRGn', 'PRGn_r', 'Paired', 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r', 'PuBu_r', 'PuOr', 'PuOr_r', 'PuRd', 'PuRd_r', 'Purples', 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', 'RdGy_r', 'RdPu', 'RdPu_r', 'RdYlBu', 'RdYlBu_r', 'RdYlGn', 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'Spectral', 'Spectral_r', 'Wistia', 'Wistia_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', 'afmhot', 'afmhot_r', 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', 'brg', 'brg_r', 'bwr', 'bwr_r', 'cividis', 'cividis_r', 'cool', 'cool_r', 'coolwarm', 'coolwarm_r', 'copper', 'copper_r', 'crest', 'crest_r', 'cubehelix', 'cubehelix_r', 'flag', 'flag_r', 'flare', 'flare_r', 'gist_earth', 'gist_earth_r', 'gist_gray', 'gist_gray_r', 'gist_heat', 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', 'gist_rainbow', 'gist_rainbow_r', 'gist_stern', 'gist_stern_r', 'gist_yarg', 'gist_yarg_r', 'gnuplot', 'gnuplot2', 'gnuplot2_r', 'gnuplot_r', 'gray', 'gray_r', 'hot', 'hot_r', 'hsv', 'hsv_r', 'icefire', 'icefire_r', 'inferno', 'inferno_r', 'jet', 'jet_r', entre otros.
Código de la clase Entendiendo los datos
import seaborn as sns import matplotlib.pyplot as plt sns.set (style = 'darkgrid', context = 'notebook') cols = ['DIS', 'INDUS','CRIM', 'RM', 'MEDV' ] sns.pairplot (df[cols], height = 3.0) plt.show ()
** **Mapa de Calor con las variables y sus relaciones **
import numpy as np cm = np.corrcoef(df[cols].values.T) sns.set(font_scale=1.5) sns.heatmap(cm, cbar=True, annot=True,yticklabels=cols,xticklabels=cols)
El paso para hacer el mapa de calor se puede evitar simplemente usando sns.heatmap(archivo[cols].corr(),annot=True)
📝Análisis exploratorio con gráficos (Python)
🔧 Librerías
📦 seaborn (sns) → gráficos estadísticos
📦 matplotlib (plt) → visualizaciones generales
📦 numpy (np) → operaciones numéricas
🎨 Estilo de los gráficos
✨ Fondo → cuadrícula blanca
✨ Contexto → notebook (ideal para Jupyter)
sns.set(style='whitegrid', context='notebook')
📊 Variables analizadas
➡️ DIS → distancia media a centros de empleo
➡️ INDUS → proporción de suelo industrial
➡️ CRIM → tasa de criminalidad per cápita
➡️ RM → número medio de habitaciones por vivienda
➡️ MEDV → valor medio de las viviendas
cols = ['DIS', 'INDUS', 'CRIM', 'RM', 'MEDV']
🔍 Gráfico generado
📌 Comando:
sns.pairplot(df[cols], height=2.5)
plt.show()
📈 Qué se obtiene:
✅ Idea principal
Este análisis ayuda a: 🔎 Detectar relaciones y patrones 📉 Ver correlaciones ⚠️ Identificar valores atípicos (outliers)
💡 Tip de repaso
Observa con atención:
vamos a realizar un análisis de datos para nuestra primera regresión lineal utilizando el famoso dataset de Housing de Boston (aunque oficialmente retirado de sklearn por temas éticos, aún puede usarse con cuidado desde UCI).
Este dataset contiene 506 filas y 14 columnas. La variable objetivo (target) es el precio medio de las viviendas en miles de dólares.
🔹 Paso 1: Cargar los datos
import pandas as pd
# Cargar el dataset desde UCI url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data' columnas = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ] data = pd.read_csv(url, header=None, sep=r'\s+', names=columnas)
🔹 Paso 2: Inspeccionar el dataset
# Ver primeras filas print(data.head())
# Resumen estadístico print(data.describe())
# Ver si hay valores nulos print(data.isnull().sum())
🔹 Paso 3: Visualización de correlaciones
Podemos usar seaborn para ver cómo se relacionan las variables con la variable objetivo MEDV.
import seaborn as sns import matplotlib.pyplot as plt
# Mapa de calor de correlaciones plt.figure(figsize=(12, 10)) sns.heatmap(data.corr(), annot=True, fmt=".2f", cmap="coolwarm") plt.title("Matriz de Correlación") plt.show()
🔹 Paso 4: Selección de una variable para regresión simple
Vamos a elegir la variable más correlacionada con MEDV. Por lo general, LSTAT (porcentaje de población con bajos ingresos) tiene una fuerte correlación negativa con el precio.
sns.scatterplot(x='LSTAT', y='MEDV', data=data) plt.title("Relación entre LSTAT y MEDV") plt.xlabel("LSTAT (% población de bajos ingresos)") plt.ylabel("Precio medio (MEDV)") plt.show()
¿Qué sigue?
Con esta base ya podemos:
scikit-learn.Es interesante que existe una relación entre las variables INDUS y DIS, esta relación es negativa, pero entiendo que puede ser utilizada también para los ejemplos que estamos viendo.
Aca esta el link donde pueden encontrar la información de las variables:
Para el análisis exploratorio les recomiendo aprender a usar la librería ydata_profiling, por ejemplo:
from ydata_profiling import ProfileReport
ProfileReport(df)