No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Exploración y preparación de datos

11/18
Recursos

Aportes 24

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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

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()

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

Esto fue lo que encontré al realizar un pairplot del conjunto de datos. Hay dos correlaciones en las que su patrón sugiere que hay un estratificador, en este caso fue si la persona fuma o no. En el caso de la primera correlación (Edad vs Cargos) encontramos una segmentación bastante notoria que es esclarecida al usar el indicador de fumador en el parámetro 'hue'. En el caso de la segunda gráfica podemos observar un patrón en el que, al ser fumador, el tener un índice de masa corporal mayor, aumenta proporcionalmente la tendencia a un monto mayor en gastos médicos. Todo, gracias a la segmentación con el indicador de fumador. ```js fig, ax = plt.subplots(2, 2, figsize= (10, 10)) sns.scatterplot( ax = ax[0, 0], data= ins, x= 'charges', y= 'age', alpha= 0.43 ) sns.scatterplot( ax = ax[0, 1], data= ins, x= 'charges', y= 'age', hue= 'smoker', alpha= 0.43 ) sns.scatterplot( ax = ax[1, 0], data= ins, x= 'charges', y= 'bmi', alpha= 0.43 ) sns.scatterplot( ax = ax[1, 1], data= ins, x= 'charges', y= 'bmi', hue= 'smoker', alpha= 0.43 ) ``` ![](https://static.platzi.com/media/user_upload/image-ed6554fc-e500-4cf1-8c2e-4209baea13fa.jpg)

Otra idea interesante

Para saber las nuevas dimensiones pueden utilizar este código: ```python df[df.charges>50000] df = df[df.charges<50000] print(df.shape) ```
Maybe you just have to do is # Firstly install pip upgraded pip install --upgrade pip
Ya lo solucioné con las recomendaciones que escribieron antes. Gracias.
Buenos días, est instrucción !pip install regressors, genera el siguiente ERROR. Collecting regressors error: subprocess-exited-with-error × python setup.py egg\_info did not run successfully. │ exit code: 1 ╰─> \[1 lines of output] error in regressors setup command: use\_2to3 is invalid. \[end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed × Encountered error while generating package metadata. ╰─> See above for output. note: This is an issue with the package mentioned above, not pip. hint: See above for details. Using cached regressors-0.0.3.tar.gz (24 kB) Preparing metadata (setup.py): started Preparing metadata (setup.py): finished with status 'error' ¿Quién por favor me ayuda a corregirlo? Gracias
Para los que aun tienen problema instalando `regressors` pueden hacer lo siguiente: 1. Clonar el repo <https://github.com/nsh87/regressors> (Encontrado como Homepage en pypi) 2. Ejecutar el comando para instalar desde local `pip3 install -e <repo_local_path>` 3. Hope it helps, Enjoy!
Hola Equipo! me sale el siguiente error cuando corro el !pip install regressors Collecting regressors Using cached regressors-0.0.3.tar.gz (24 kB) error: subprocess-exited-with-error × python setup.py egg\_info did not run successfully. │ exit code: 1 ╰─> See above for output. note: This error originates from a subprocess, and is likely not a problem with pip. Preparing metadata (setup.py) ... error error: metadata-generation-failed × Encountered error while generating package metadata. ╰─> See above for output. note: This is an issue with the package mentioned above, not pip. hint: See above for details. qué debo hacer para corregir este tema?
yo decidí no eliminar los datos en lugar de eso los trunqué que en mi opinión es el mejor tratamiento para este caso sin tener demasiado contexto, lo hice con esta función: `def truncate_variable(df, column_name, lower_percentile=0.01, upper_percentile=0.99):` ` """` ` Trunca los valores de una columna en un dataframe según los percentiles especificados.` ` Parámetros:` ` - df (pd.DataFrame): el dataframe original.` ` - column_name (str): el nombre de la columna a truncar.` ` - lower_percentile (float, opcional): el percentil inferior para truncar. Por defecto es 0.01 (1%).` ` - upper_percentile (float, opcional): el percentil superior para truncar. Por defecto es 0.99 (99%).` ` Retorna:` ` - pd.DataFrame: un dataframe con la columna especificada truncada.` ` """` ` ` ` lower_value = df[column_name].quantile(lower_percentile)` ` upper_value = df[column_name].quantile(upper_percentile)` ` df[column_name] = df[column_name].clip(lower=lower_value, upper=upper_value)` ` ` ` return df` `df = truncate_variable(df=df, column_name='charges', lower_percentile=0.01, upper_percentile=0.99)` `df`

no pude instalar el paquete regressors