Exploración y preparación de datos
Clase 11 de 18 • Curso de Regresión Lineal con Python y scikit-learn
Contenido del curso
Clase 11 de 18 • Curso de Regresión Lineal con Python y scikit-learn
Contenido del curso
Francisco Javier Pecino Leon
Christian Mauricio Canedo Tellez
Juan R. Vergara M.
Héctor Daniel González Vargas
Rafael Rivera
Joel Orellana
LUIS ANTONIO CALVO QUISPE
Juan R. Vergara M.
Carlos Mazzaroli
Héctor Daniel González Vargas
Juan R. Vergara M.
Alfonso Andres Zapata Guzman
Andry Joneth Becerra Villamizar
Ricardo Félix Díaz López
Julian Ayala
Alfonso Andres Zapata Guzman
Francisco Alberto Cervantes Rodríguez
Juan R Rossano
César Isaac González Naranjo
Jose Manuel Rivas Márquez
MIGUEL ANGEL ASTAIZA CORDOBA
Ignacio Joel Duran Choque
Antonio Demarco Bonino
Jhon Freddy Tavera Blandon
Dick Saide Suárez Blanco
sebastián Giraldo Vargas
Juan R. Vergara M.
Percy Tejada
Abinadi Contreras
Diego Alejandro Gil Rave
María Eugenia Pereira Chévez
Dave Sanchfor
Dave Sanchfor
Juan Riquelme
Edwar Hernandez
Sofia Febres
Para el que tenga problemas a la hora de instalar regressors es posible que sea por la versión de setuptools que tienen.
sugiero lo siguiente
pip install --upgrade pip setuptools==57.5.0
y despues ya instalar regressors
pip install regressors
Genial, gracias por el aporte, justo me salio error con regressors.
Gracias amigo me has ayudado 👍
Función para detectar valores atípicos en el dataset:
def detect_otliers(x): Q3 = Datos[x].quantile(0.75) Q1 = Datos[x].quantile(0.25) IQR = Q3 - Q1 superior = Q3 + (1.5 * IQR) inferior = Q1 - (1.5 * IQR) out_sup = Datos[Datos[x] > superior].index out_inf = Datos[Datos[x] < inferior].index outliers = [] for i in out_sup: outliers.append(i) for j in out_inf: outliers.append(j) size = len(outliers) return (f'Hay {size} valores atípicos en la variable {x}, y corresponden a los índices: {outliers}') detect_otliers('bmi') 'Hay 8 valores atípicos en la variable bmi, y corresponden a los índices: [115, 285, 400, 843, 856, 1043, 1084, 1310]'
Excelente aporte, muchas gracias por compartir
wowowow la guardo! graciass
Una observación interesante es la siguiente :
# Analizando la relación entre la Age(Edad) y Charges(Cargos : Costos Medicos individuales facturados) # Categorizados por Fumadores y No Fumadores p = sns.jointplot(data = data, x = 'age', y = 'charges', hue = 'smoker') p.fig.suptitle('Age vs Charges',y = 1.0) plt.show()```
Excelente amigo.
Buenisima la idea de analizar por fumadores o no, estuve jugando un rato con las variables para ordenar el hue, pero no se porque pase smokers por lo alto, muy buen insight hallaste ahí :)
Análisis de distribución par ala variable 'bmi', la cual, sigue una distribución normal, correr el siguiente código:
# Análisis de distribución variable "bmi" sns.histplot(x= Datos['bmi']) plt.title('Distribución de la variable BMI') plt.show() # QQ plot stats.probplot(Datos['bmi'], dist='norm', plot=plt) plt.title('Gráfico QQ para la variable BMI') plt.show() # Prueba shapiro para normalidad st, p = stats.shapiro(Datos['bmi']) # La variable BMI sigue una distribución normal. print(p)
Gracias 🥇
Z- Score también se denomina puntuación estándar. Este valor / puntuación ayuda a comprender qué tan lejos está el punto de datos de la media. Y después de configurar un valor de umbral, se pueden utilizar los valores de puntuación z de los puntos de datos para definir los valores atípicos.
Zscore = (punto_datos -medio) / std. desviación
# Z score from scipy import stats import numpy as np z = np.abs(stats.zscore(df.bmi)) # print(z) # threshold = 3 # Position of the outlier print(np.where(z > 3))
Ahora, para definir un valor de umbral atípico, se elige, generalmente, 3,0. Dado que el 99,7% de los puntos de datos se encuentran entre +/- 3 desviación estándar (utilizando el enfoque de distribución gaussiana).
df[z > 3]
Otra buena forma de visualizar los valores atípicos es por medio de un diagrama de caja:
import pandas as pd import matplotlib.pyplot as plt # Diagrama de caja df.boxplot(column='charges') plt.show()
Y también podríamos obtener los valores atípicos calculando el Z-score (mide cuántas desviaciones estándar se encuentra cada valor de la columna con respecto a la media., para luego filtrar los valores atípicos seleccionando las filas donde el valor de 'z_score' sea mayor que 3 (Se considera que los valores con un Z-score mayor a 3 están significativamente alejados de la media y se consideran atípicos.). Esto quedaría de la siguiente manera:
import pandas as pd from scipy import stats # Calcular Z-score z_scores = stats.zscore(df['charges']) df['z_score'] = z_scores # Filtrar valores atípicos outliers = df[df['z_score'] > 3] print(outliers)
alguien sabe como instalar regressors, no me funciona la instruccion de profe, me levanta la siguiente advertencia,estoy usando conda y visual studio code
WARNING: Discarding ERROR: Could not find a version that satisfies the requirement regressors (from versions: 0.0.1, 0.0.2, 0.0.3) ERROR: No matching distribution found for regressors
Me pasa exactamente lo mismo :(
Si, actualmente genera error al instalar en conda.
Solucion:
pip install --upgrade pip setuptools==57.5.0 pip install {package}
Utilicé el siguiente comando para ver las variables graficadas con las demás:
sns.pairplot(df)
Me llamó mucho la atención los puntos que hay al graficar 'charges' con 'age' ya que hay 3 concentraciones aparentemente lineales. <br> Así que decidí usar jpinplot para ver la densidad de datos:
sns.jointplot(df.age, df.charges, marginal_kws={'bins':50})
Así me dí cuenta que las dos concentraciones lineales de arriba no son tan significativa como la de abajo. tal como podemos aprecial en el histograma de la derecha.
Veo un error potencial que posiblemente en general no sea importante pero si algo a tener en cuenta. La consulta de valores atipicos es > 50000 y en el filtro se aplica < 50000, o se que se esta obviando los 50000.
df[df.charges>50000] df = df[df.charges<50000]]
Supongo que habitualmente no suele ser importante pero conceptualmente se esta omitiendo informacion, es decir se encontraron 7 lineas mayora a 50000 ¿que pasaria si hubiera 10 lineas con exactamente 50000? ¿Seria importante o no incluirlos? Es decir, creo que a la hora de analizar esos detalles son importantes para tomar decisiones en base a todas las muestras.
fué lo que comentó, que desde un punto de vista didáctico los eliminaría, pero que habría que checar con un experto y el contexto de los datos , 7 de 1331 es. un .5% del dataset, no es mucho para valores atípicos
Si, y ademas de que en % sonmmuy pocos datos, tambien se muestran atipicos, y pueden afectar la media, mediana para calculos posteriores, hay que tener en cuenta que eliminando esos datos probablemente le demos mas fiabilidad al modelo
Para solucionar el error de la instalacion de regressors hice lo siguiente, primero:
pip install "setuptools<58.0.0" wheel
Luego ya pude ejecutar:
pip install regressors
te estoy tremendamente agradecido, estaba luchando para solucionar el problema con regressors, y el tuyo me ayudo a la primera, mil gracias
De las mejores soluciones que vi ¿Cómo la encontraste?
Reto
# Histograma de la variable 'age' plt.hist(df['age'], bins=30) plt.xlabel('Edad') plt.ylabel('Frecuencia') plt.title('Distribución de Edad') plt.show() # Histograma de la variable 'bmi' plt.hist(df['bmi'], bins=30) plt.xlabel('BMI') plt.ylabel('Frecuencia') plt.title('Distribución de BMI') plt.show() # Histograma de la variable 'charges' plt.hist(df['charges'], bins=30) plt.xlabel('Cargos') plt.ylabel('Frecuencia') plt.title('Distribución de Cargos') plt.show()
----->Exploración y preparación de datos<---- Regresión lineal para predecir los gastos médicos de pacientes
σ La mision es hacer una prediccion y analisis con datos medicos. σ Las principales datos (variables) que se poseen son Edad, sexo, IMC, hijos, fumador, region, cargos. σ Luis va a insurance.csv y buscan un Data set que tenga la variables de las que el este interesado. Una vez descargados en archivo .rar , solo los pone en la carpeta en donde el quiera.
----->Exploración y preparación de datos<---- σ Empezaremos a usar los archivos anteriormente recabados. 1. Las dos librerias que utilizaremos son Seaborn y Pandas, es por ello que lo primero en hacer es importarlos. Usando :
" import pandas as pd " " import seaborn as sns " + Como mencionamos anteriormente, basicamente establecer las abreviaturas que se van a usar en el programa. 2.Configurara seaborn, a traves de : " sns.set (style='whitegrid', context='notebook' ) " ---------->Ahora cargamos los archivos medicos descargados en Google Colab. Asi para que la herramienta tenga la informacion para trabajar. 3. df = pd.read_csv('insurance.csv') df.head() +Esto es para empezar a mostrar la informacion plasmada de la info descargada a manera de tabla. 4. El siguiente paso que a Luis le gusta hacer, es conocer el numero de datos con los que se cuenta, para asi poder hacer un analisis. Usamos: " print(df.shape) " 5. Ahora sabremos la distribucion de la variable predictora usand : " df.charges.hist(bins = 40) " +Con esto estamos accesando a la variable charges, usando un histograma. +Con esto se crea una distribucion, la cual es interesante ya que hay muy pocos valores antes de "50k". Y luis se pregunta por que. 6. Debido a lo anterior, ahora analizaremos los puntos de 50k hacia atras. Por ello Luis imprimde los datos usando : df[df.charges>50000] +Con esto se nos muestra las filas que tienen mas de "50k", lo cual significa que hay mucha otra data que no es de nuestro interes (o mas bien, no tiene 50k) por ello Luis decidira eliminarlo. NOTESE: Luis remomienda no eliminar los datos, sin antes haber consultado /confirmado con las demas personas involucradas. 7. Para ello, se usa" df = df[df.charges<50000] " y asi la info mostrada solo sera la que es menor a 50k
Distribuciones de las otras variables:
#figura fig = plt.figure(figsize=(15,10)) gs = fig.add_gridspec(3,2) gs.update(wspace = 0.2,hspace = 0.5) ax0 = fig.add_subplot(gs[0,0]) ax1 = fig.add_subplot(gs[0,1]) ax2 = fig.add_subplot(gs[1,0]) ax3 = fig.add_subplot(gs[1,1]) ax4 = fig.add_subplot(gs[2,0]) ax5 = fig.add_subplot(gs[2,1])
#colores bgcolor = '#fefae0' fig.patch.set_facecolor(bgcolor) ax0.set_facecolor(bgcolor) ax1.set_facecolor(bgcolor) ax2.set_facecolor(bgcolor) ax3.set_facecolor(bgcolor) ax4.set_facecolor(bgcolor) ax5.set_facecolor(bgcolor)
#ax0 ax0.text(38,220,'age',fontsize=20) sns.histplot(ax=ax0,data = df,x='age') ax0.set_xlabel(' ')
#ax1 ax1.text(0.4,750,'sex',fontsize=20) sns.histplot(ax=ax1,data = df,x='sex') ax1.set_xlabel(' ')
#ax2 ax2.text(32,150,'bmi',fontsize=20) sns.histplot(ax=ax2,data = df,x='bmi') ax2.set_xlabel(' ')
#ax3 sns.histplot(ax=ax3,data = df,x='children') ax3.set_xlabel(' ') ax3.text(2,640,'children',fontsize=20)
#ax4 sns.histplot(ax=ax4,data = df,x='smoker') ax4.set_xlabel(' ') ax4.text(0.3,1200,'smoker',fontsize=20)
#ax5 sns.histplot(ax=ax5,data = df,x='region') ax5.set_xlabel(' ') ax5.text(1.15,410,'region',fontsize=20) plt.show()
👍
Para los que están siguiente el curso este 2025!
Pueden reemplazar esto:
!pip install regressors
Por esto:
!pip install git+https://github.com/nsh87/regressors.git@3a39e6aeb09953ccaeabec346f2eef324b7fcab9
Gracias!!!
no pude instalar el paquete regressors
Pasos para poder instalarlo:
pip install --upgrade pip pip install --upgrade setuptools pip install ruamel-yaml pip install git+https://github.com/nsh87/regressors
existe una tendencia positiva entre las edades y el charge.
<import matplotlib.pyplot as plt # Crear el gráfico de dispersión para "edad" y "charges" plt.scatter(df['age'], df['charges']) plt.xlabel('Edad') plt.ylabel('Charges') plt.title('Tendencia de Edad vs Charges') plt.show()>
, (31, 45), (46, 65)] # Crear una nueva columna "interval" para etiquetar los intervalos correspondientes df['interval'] = pd.cut(df['age'], bins=[interval[0]-0.5 for interval in intervals] + [intervals[-1][-1]+0.5], labels=[f"{interval[0]}-{interval[1]}" for interval in intervals]) # Contar los datos por intervalo interval_counts = df['interval'].value_counts() # Obtener los valores de "charges" por intervalo interval_charges = [df.loc[df['interval'] == interval, 'charges'] for interval in interval_counts.index] # Crear el gráfico de cajas para los valores de "charges" por intervalo plt.boxplot(interval_charges, labels=interval_counts.index, showfliers=False) plt.xlabel('Intervalo de Edad') plt.ylabel('Charges') plt.title('Valores de Charges por Intervalo de Edad') plt.show()>
ademas,
tomando las edades y tomando intervalos, [jovenes, adultos, viejos], tambien pude encontrar que los viejitos tienden a tener mayores costos
Pude descubrir los siguientes insights:
Para el tenga problemas a la fecha actual para instalar la libreria de regressors. Intenten instalandola desde git, ya que la version de pip tiene unos issues sin resolver. !pip install git+https://github.com/nsh87/regressors.git@3a39e6aeb09953ccaeabec346f2eef324b7fcab9
buenas noche, tengo una. ¿Por qué no se debe de eliminar los outliers de la data? Y como debemos tratarlos si son demasiados, por ejemplo que se encuentren en casi todos las variables.