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
Introducción al curso
Tu primera regresión lineal con scikit-learn
Análisis de datos para tu primera regresión lineal
Entrenando un modelo de regresión lineal con scikit-learn
Cómo funciona la regresión lineal
¿Qué es la regresión lineal?
Cuándo utilizar un modelo de regresión lineal
Función de pérdida y optimización: mínimos cuadrados
Evaluando el modelo: R^2 y MSE
Quiz: Cómo funciona la regresión lineal
Regresión lineal multivariable
Regresión lineal multivariable
Análisis de regresión multivariable
Proyecto práctico
Regresión lineal para predecir los gastos médicos de pacientes
Exploración y preparación de datos
Análisis de correlación de los datos
Entrenamiento del modelo
Evaluando el modelo
Mejorando el modelo
Quiz: Proyecto práctico
Pasos siguientes
¿Qué hay más allá de la linealidad?
Siguientes pasos en modelos de inteligencia artificial
Comparte tu proyecto de regresión lineal y certifícate
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Luis Fernando Laris
Aportes 24
Preguntas 2
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
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]'
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)
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()```
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]
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.
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)
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.
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
# 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()
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()>
![](
ademas,
tomando las edades y colocandolos en intervalos, [jovenes, adultos, viejos], tambien pude encontrar que los viejitos tienden a tener mayores costos
<import matplotlib.pyplot as plt
# Definir los intervalos
intervals = [(15, 30), (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
Otra idea interesante
no pude instalar el paquete regressors
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?