Introducción al análisis exploratorio de datos

1

¿Qué es y para qué sirve el análisis exploratorio de datos?

2

¿Cómo hacer un análisis exploratorio de datos?

3

Tipos de análisis de datos

4

Tipos de datos y análisis de variables

5

Herramientas de software para el análisis exploratorio de datos

6

Conociendo nuestros datos: palmerpenguins

7

Recolección de datos, limpieza y validación

8

Ejercicio de validación de datos

Quiz: Introducción al análisis exploratorio de datos

Análisis univariado

9

Explorando una variable categórica: conteos y proporciones

10

Estadística descriptiva aplicada: medidas de tendencia central

11

Estadística descriptiva aplicada: medidas de dispersión

12

Ejercicio de obtención de medidas de dispersión

13

Estadística descriptiva aplicada: distribuciones

14

Estadística descriptiva aplicada: funciones de densidad de probabilidad

15

Bonus: Teorema del límite central

Quiz: Análisis univariado

Análisis bivariado

16

Estableciendo relaciones: gráficos de puntos

17

Estableciendo relaciones: gráficos de violín y boxplots

18

Estableciendo relaciones: matrices de correlación

19

Limitantes de los coeficientes de correlación lineal

20

Estableciendo relaciones: análisis de regresión simple

21

Limitaciones del análisis de regresión simple

Quiz: Análisis bivariado

Análisis multivariado

22

Análisis de regresión múltiple

23

Visualización del análisis de regresión múltiple

24

Análisis de regresión logística

25

Paradoja de Simpson

26

¿Qué hacer cuando tengo muchas variables?

Quiz: Análisis multivariado

Conclusiones

27

Diversidad de gráficas al explorar datos

28

Continúa aprendiendo sobre EDA

No tienes acceso a esta clase

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

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

11 Días
17 Hrs
7 Min
25 Seg

Explorando una variable categórica: conteos y proporciones

9/28
Recursos

Aportes 65

Preguntas 9

Ordenar por:

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

¡Hola! Aquí mi aporte.

  1. Hice los gráficos de barras iterando las columnas categóricas mediante la variable category_cols, que me guarda los nombres de las columnas.

Del mismo modo, para visualizar la proporción, usé sns.histplot, puesto que displot no dispone del parámetro ‘ax’.

fig,ax = plt.subplots(1,3,figsize=(15,5))

for i in range(len(columns)):
   sns.histplot(
        ax=ax[i],
        data=penguins_df,
        x=columns[i],
        hue='species',
        multiple='stack',
        palette=penguin_color,
        alpha=0.5
    )
columns = penguins_df.select_dtypes('object').columns

fig,ax = plt.subplots(1,3,figsize=(15,5))

for i in range(len(columns)):
   sns.histplot(
        ax=ax[i],
        data=penguins_df.add_column('x','').reset_index(),
        x='x',
        multiple='stack',
        hue=columns[i],
        palette=penguin_color if columns[i] == 'species' else None,
        alpha=0.5
    )

Dejo un interesante aporte para ver las proporciones de las especies que existen por isla y así visualizar cuál especie es más predominante en general y por isla.

(
    process_penguins_df
    .pipe(
        lambda df: (
            sns.displot(
                data=df,
                x='island',
                hue='species',
                multiple='fill',
                palette=penguin_color,
                stat='proportion'
            )
        )
    )
)

Aquí dejo mi gráfica de pastel ^^. Espero les guste

me gusta usar el plt.show() al final de cada visualizacion hace que se vea mas limpio.

Si se les presento error al agregar la columna.

penguins_df_final.add_column(column_name="x", value='')

No sé si sea mi versión de python o pandas pero a mí me aparece cómo que no existe el método pandas.add_column, revisé la documentación y tampoco aparece, solo encontre pandas.assign que es para agregar nuevas columnas a un Data Frame.
RECUERDEN, SIEMPRE LEAN LA DOCUMENTACIÓN

Gráfica de especies por sexo y por isla

Comandos para conteos y proporciones

  • describe. Describe el conjunto de datos mediante estadísticos descriptivos
preprocessed_penguins_df.describe(include='all')
# all implica que tome las variables tanto numericas como categoricas
# [np.number] ó describe() toma en cuenta solo variables numericas
# object considera solo variables categoricas
  • Convertir variables tipo object en category. Esto agrega nuevas funcionalidades en cuanto al manejo de la variable
# definir variables de tipo category
(
    preprocessed_penguins_df
    .astype({
        'species': 'category',
        'island': 'category',
        'sex': 'category'
    })
)
  • Visualizar los conteos con pandas
(
    preprocessed_penguins_df
    .species
    .value_counts()  #cuenta el numero de cada especie
    .plot(
        kind='bar'   #grafica el conteo de cada especie
    )
)
  • Visualizar los conteos con seaborn
sns.catplot(
    data=preprocessed_penguins_df,
    x='species',
    kind='count',
    palette=penguin_color
)
  • Crear visualizacion de manera manual con seaborn
(
    preprocessed_penguins_df
    .value_counts('species', sort=True)
    .reset_index(name='count')
    .pipe(
        lambda df: (
            sns.barplot(
                data=df,
                x='species',
                y='count',
                palette=penguin_color
            )
        )
    )
)
  • Visualizar las proporciones
(
    preprocess_penguins_df
    .add_column('x','')  #añade columnas vacias al df
    .pipe(
        lambda df:(
            sns.displot(
                data=df,
                x='x',
                hue='species',
                multiple='fill', # lo muestre en proporcion
                palette=penguin_color
            )
        )
    )
)

9. Explorando una variable categórica: conteos y proporciones

Tabulación

“Contabiliza la frecuencia de aparición de cada valor único de una variable”

Proporciones

“Relación de correspondencia entre las partes y el todo”

Extendiendo la idea de conteo

  • Tabulación cruzada o tablas de contingencia.

Explorando una variable Categórica: Conteos y Proporciones

Tabulacion. Consiste en contabilizar la frecuencia de aparición de cada valor único de una variable. Los conteos y proporciones se basan en la tabulacion

Estas tres formas son las mas comunes de presentar un conteo: Datos ordenados, Tablas y Grafica de barras

Proporciones. Es la relación de correspondencia entre las partes y el todo

Así la distribución de observaciones por Isla:

Este es mi aporte, un grafico de tortas o pie chart que permite ver la proporción de pingüinos por isla:

Si alguien tuvo problema con el comando add_colums de esta manera losolucione :

df_penguis=df_penguis.assign(x='')
( 
    df_penguis
    .pipe(
        lambda df :(
            sns.displot(
                data =df_penguis,
                x='x',
                hue='species',
                multiple='fill'
            )
        )
    )
)
plt.show()

**NOTA también lo puedes agregar la columna en una celda anterior **

df_penguis=df_penguis.assign(x='')
( 
    df_penguis
    .pipe(
        lambda df :(
            sns.displot(
                data =df_penguis,
                x='x',
                hue='species',
                multiple='fill'
            )
        )
    )
)
plt.show()```

Proporcion de la variable island

Conteo de la variable island

Ojo, en inglés “Especie” se escribiría “species” con s al final. Hay un typo en esas slides.

Use .assign(x=’ ')
Instead of add_column for new python versions

Hay un error en el notebook del curso dejado en deepnote, en la variable de colores de los pinguinos:

penguin_color = {
    'Adelie': '#ff6602ff',
    'Gentoo': '#0f7175ff',
    'Chinstrap': '#c65dc9ff'
}

Tienen ‘ff’ al final todos los colores, lo cual no genera ningun color, se debe eliminar estos dos caracteres para que funcione.

px.histogram(processed_penguins_df, x='species', color='species', opacity=0.8, color_discrete_map= penguin_color)

Proporción de pingüinos por isla

Comparto gráficos de barras para las tres variables categóricas

Me parecio interesante decifrar el codigo de Camilo Granada Gomez y aqui esta mi aporte haciendo los graficos de proporcion y personalizando colores.

y este es el diccionario para los colores jeje creo que hay una mejor forma pero esta fue la que se me ocurrio

general_colors = {
    0:{
        'Adelie': '#ff6602ff',
        'Gentoo': '#0f7175ff',
        'Chinstrap': '#c65dc9ff'
    },
    1:{
        "Biscoe": "#a9a9a9",
        "Dream": "#deb887",
        "Torgersen": "#6495ed" 
    },
    2:{
        "male":"#a2bbfb",
        "female":"#fba2e2"
    }
}

Buenas aqui mi aporte, usando plotly.

df=penguin_df.value_counts(["species", "sex", "island"], sort=True).reset_index(name="count")
px.density_heatmap(df, x="species", y='island' ,z="count", facet_col="sex", text_auto=True)

También podemos visualizar nuestras proporciones con un diagrama de pastel, usando los valores que me entrega unique

labels,counts=np.unique(preprocess_penguins_df.species,return_counts=True)

plt.pie(counts,autopct='%1.1f%%',labels=labels);
A mi a la hora de visualizar las proporciones me daba fallor a la hora de añadir una columna x vacia, en vez de .add\_column('x','') use .assign(x='') y soluccionado.
Otra manera de tratar de cambiar el tipo de dato de las variables objetos es de esta forma: ```python columns_cat = ( processed_penguins_df .select_dtypes(include=object) .columns .to_list() ) type_columns = ['category'] * len(columns_cat) change_dtype = dict(zip(columns_cat, type_columns)) ( processed_penguins_df .astype(change_dtype) .describe(include='category') ) ``` Esta manera es mejor, porque en caso de tener múltiples columnas ya no hace falta tener que escribir para cada una su nuevo tipo de dato. Incluso en caso de querer quitar una variable o columna de la lista podemos hacerlo usando conjuntos. ```python columns_cat = list( set( processed_penguins_df .select_dtypes(include=object) .columns .to_list() ) - set( ['Nombre de la columna que no quieres cambiar su tipo de dato'] ) ) ```
```js # Asegurarse de que las columnas son de tipo 'category' processed_penguins_df = ( processed_penguins_df .astype( { 'species': 'category', 'island': 'category', 'sex': 'category' } ) ) # Calcular las proporciones # Asegurarse de que las columnas son de tipo 'category' processed_penguins_df = ( processed_penguins_df .astype( { 'species': 'category', 'island': 'category', 'sex': 'category' } ) ) # Calcular las proporciones proportions = ( processed_penguins_df .groupby(['island', 'species']) .size() .groupby(level=0) .apply(lambda x: x / x.sum()) .reset_index(name='proportion') ) # Crear el gráfico de barras plt.figure(figsize=(12, 8)) sns.barplot(data=proportions, x='proportion', y='island', hue='species', palette='viridis') # Ajustar las etiquetas de los ejes plt.xlabel('Proporción') plt.ylabel('Isla') plt.title('Proporción de Pingüinos por Isla y Especie') # Mostrar la leyenda plt.legend(title='Especie') # Mostrar la gráfica plt.show() ``` ![](https://static.platzi.com/media/user_upload/image-2f190998-7abd-43b3-8cf5-865ee1d9cf69.jpg)```js ```![](https://static.platzi.com/media/user_upload/image-cc6e0ebe-2145-499f-9293-593d3415d5b6.jpg)
Me gustó la idea de los pie charts. Los agrupé en una sola figura: ```python peguins_cat_df = ( processed_penguins_df[processed_penguins_df.select_dtypes(include='category').columns] .value_counts() .reset_index() .rename(columns={0: 'counts'}) ) peguins_cat_df fig, ax = plt.subplots(ncols=3, nrows=1, figsize=(15, 5)) for i, column_name in enumerate(peguins_cat_df.columns): if column_name == 'counts': continue temp_df = peguins_cat_df.groupby(column_name).sum(numeric_only=True).reset_index() ax[i].pie(x=temp_df['counts'], labels=temp_df[column_name], autopct='%1.1f%%', colors=penguin_color.values()) ```![](https://static.platzi.com/media/user_upload/image-c8569c36-8366-433d-90c2-747619beb5e2.jpg)
Algunas gráficas: ![](https://static.platzi.com/media/user_upload/image-14c00bc8-bf64-4834-8597-69a4dcfab9a1.jpg) ![](https://static.platzi.com/media/user_upload/image-ff2bb89b-d210-473e-839c-3bca48d49348.jpg) ![](https://static.platzi.com/media/user_upload/image-2258fb57-6504-4b1f-a97e-cb2ef2474fc6.jpg) ![](https://static.platzi.com/media/user_upload/image-57ef3851-9f33-4961-8403-85cac1e88946.jpg) ![](https://static.platzi.com/media/user_upload/image-e97c3152-f851-460f-a8d9-5e7a1f46eda8.jpg) ![](https://static.platzi.com/media/user_upload/image-568a9938-34ff-4ce8-a019-c43fe4016370.jpg) ![](https://static.platzi.com/media/user_upload/image-2cd9411b-b1e9-40b5-8f44-6499454ab364.jpg) ![](https://static.platzi.com/media/user_upload/image-3e3cc61a-2310-4b4c-af05-97a38c7635c2.jpg)
Hola! Les comparto mis gráficas del conteo de la cantidad por isla y sexo: ![](https://static.platzi.com/media/user_upload/Sin%20t%C3%ADtulo-7ba6949d-12ca-40f8-82d1-60eb46687903.jpg) ![](https://static.platzi.com/media/user_upload/Sin%20t%C3%ADtulo-65b4c625-c387-4255-908c-a33c5f3caa15.jpg)

Es interesante como se trabaja el conteo de los datos de manera profesional y detallada usando mas seaborn y pandas.

Para ver la proporción entre categorías, la forma más simple de visualización es el gráfico de pastel ![](https://static.platzi.com/media/user_upload/image-15ee755d-aecb-44a8-bfee-d5c3b06d2d3d.jpg) ```js ( penguins_df .value_counts('species') .pipe( lambda sp: ( plt.pie( sp.values, labels=sp.index, colors=penguin_color.values(), autopct='%1.1f%%', startangle=90 ) ) ) ); ```(    penguins\_df    .value\_counts('species')    .pipe(        lambda sp: (            plt.pie(                sp.values,                labels=sp.index,                colors=penguin\_color.values(),                autopct='%1.1f%%',                startangle=90            )        )    ));

Gráfico de una tabla de contingencia

Tabla de contingencia

Conteo por “island”

Conteo por “sex”

Convertir columnas a tipo categórico

df_cat = dfnn.copy()

columnas_a_convertir = ['species', 'island', 'sex']
df_cat[columnas_a_convertir] = dfnn[columnas_a_convertir].astype('category')

Para explorar variables categóricas es chévere hacer un boxplot para cada una, o un gráfico de barras.

Después eliges si hacer one hot encoding y añadir cada variable categórica como una columna nueva a tu dataframe con datos booleanos (true o false). Esto es muy útil para Machine Learning.

Proporciones Islas y Especies

(
    processed_penguins_df
    .add_column('variable', '')
    .pipe(
        lambda df: (
            sns.displot(
                data=df,
                x='island',
                hue='species',
                multiple='fill',
                palette=penguin_color
            )
        )
    )
)

Hola aquí mi aporte.
Teniendo como base el video del curso, me base en este codigo proporcionado por Camilo Granda

f, ax= plt.subplots(1,3, figsize=(15,5))

for i in range(len(cols)):
    (
        df_fin
        .value_counts(cols[i], sort=True)
        .reset_index(name='count')
        .pipe(
            lambda df:(
                sns.barplot(
                    ax=ax[i],
                    data=df,
                    x=cols[i],
                    y='count'
                )
            )
        )
    )

Adicional a esto, me resulta relevante poder conocer cuales son los valores que tienen nuestros datos, por lo que genere este código adicional con el cual podrán ver como etiqueta dichos valores

    for p in ax[i].patches:
        height = p.get_height()
        ax[i].annotate(f'{height:.2f}', (p.get_x() + p.get_width() / 2, height),
                       ha='center', va='bottom', xytext=(0, 20),
                       textcoords='offset points')

0
Si a alguien no le funciona add_column como a mi, intenten hacerlo con assign(x=’ ')

Solución al ejercicio:

fig, axs = plt.subplots(ncols=3, figsize=(15,5))

# Lista con los nombres de las columnas para crear los gráficos
columns = ['island', 'sex', 'species']

# Loop for para crear los gráficos de cada columna
for i, col in enumerate(columns):
    sns.countplot(x=col, data=process_penguins_df, order=process_penguins_df[col].value_counts().index, ax=axs[i])

plt.show()

otro resultado utilizando sns.histplot:

fig, axs = plt.subplots(ncols=3, figsize=(15,5))

# Lista con los nombres de las columnas para crear los gráficos
columns = ['island', 'sex', 'species']

# Loop for para crear los gráficos de cada columna
for i, col in enumerate(columns):
    sns.histplot(x=col, data=process_penguins_df, hue=columns[i], ax=axs[i])

plt.show()

Y el último ejercicio

fig, axs = plt.subplots(ncols=3, figsize=(15,5))
columns = ['island', 'sex']

for i, col in enumerate(columns):
    hist = sns.histplot(x=col, data=process_penguins_df, hue='species', multiple='fill', palette=penguin_color, ax=axs[i], bins=3)
    hist.set(xlabel=col.capitalize(), ylabel='Count')

species_hist = sns.histplot(data=process_penguins_df.assign(x=0), x='x', hue='species', multiple='fill', palette=penguin_color, ax=axs[2], bins=3)
species_hist.set(xlabel='X', ylabel='Count')

plt.show()

Trate de trabajar deepnote pero me parece muy lento, me devolví a trabajar en Colab, los df no se ven tan bonitos, pero prefiero velocidad.

¿A quien mas le paso ?

En mi caso no me funcionó la función add_column (13:49), la solución en mi caso sería la siguiente:

df_penguins.insert(0, ‘x’, ’ ')

df_penguins.pipe(lambda df: sns.displot(data=df, x=‘x’, hue=‘species’, multiple=‘fill’))

Una alternativa a usar funciones lambda en conteos

cat_cols = df.select_dtypes('category').columns
n_cols = len(cat_cols)

fig, ax = plt.subplots(1, n_cols, figsize=(15,4))
for i in range(n_cols):
    plot = df.value_counts(cat_cols[i]).reset_index(name='count')
    sns.barplot(
        ax=ax[i],
        x=plot[cat_cols[i]],
        y=plot['count'])

Otra forma de sacar la proporción sin usar la función lambda y .pipe

penguins = sns.load_dataset(“penguins”)
penguins = penguins.add_column(“x”,"")
penguins = penguins.dropna()
sns.displot(data=penguins, x=“x”, hue=“species”, multiple=“fill”, palette = penguin_color)

sns.catplot(
    data=preprossed_penguins_df,
    x='species',
    kind='count',
        #categorizamos por isla
    hue='island'
    

    )
  • El análisis exploratorio de datos incluye la exploración de variables categóricas, que son aquellas que pueden tomar un número finito de valores o categorías. Una forma de explorar una variable categórica es mediante conteos y proporciones.


  • - Para contar el número de ocurrencias de cada categoría, se puede utilizar el método value_counts() en una columna de un DataFrame de Pandas. Este método devuelve una serie que contiene los conteos de cada categoría.

  • Para calcular las proporciones, se puede utilizar el método value_counts(normalize=True), que devuelve una serie que contiene las proporciones de cada categoría.


  • Luego, se pueden visualizar estos conteos y proporciones utilizando gráficos de barras o gráficos de sectores. Estos gráficos permiten identificar la distribución de las categorías y comparar la frecuencia relativa de las mismas.

  • En el caso de los conteos, un gráfico de barras es una buena opción para visualizar la frecuencia absoluta de las categorías. Mientras que en el caso de las proporciones, un gráfico de sectores es una buena opción para visualizar la frecuencia relativa de las categorías.

(
  processed_penguins_df
  .add_column('x','')
  .pipe(
      lambda df:(
          sns.displot(
              data = df,
              x='x',
              hue='species',
              multiple='fill',
              palette=penguin_color
          )
      )
  )

)

Estas fueron mis soluciones

fig, ax = plt.subplots(1, 3, figsize=(11,4), sharey=True)
fig.suptitle('Counts of category variables')
for i, category in enumerate(clean_penguins.select_dtypes(include=[object]).keys()):
    ax[i].set_title(category)
    sns.barplot(
        ax= ax[i],
        data= clean_penguins.value_counts(category).reset_index(name= 'counts'),
        x= category,
        y= 'counts'
    )
    ax[i].set_ylabel('')
fig, ax = plt.subplots(1, 3, figsize=(11,4), sharey=True)
fig.suptitle('Relative counts of category variables')
for i, category in enumerate(clean_penguins.select_dtypes(include=[object]).keys()):
    ax[i].set_title(category)
    sns.histplot(
        ax= ax[i],
        data= clean_penguins.assign(x=''),
        x= 'x',
        hue= category,
        multiple= 'fill'
    )
    ax[i].set_ylabel('')
(
    pred_penguin_df
    .assign(x='')
    .pipe(
        lambda df: (
            sns.displot(
                data=df,
                x='x',
                hue='sex',
                multiple='fill'
            )
        )
    )
)

![](

sns.catplot (
data=processed_penguins_df,
x =‘Species’,
kind =‘count’,
height=8.27, aspect=11.7/8.27
)
plt.title(‘Species’, fontsize=24);

  • mi aporte de hacer graficos
categoria=['island','sex','species']
fig , ax=plt.subplots(1,3,figsize=(15,3))
for idx,value in enumerate(categoria):
    (
        df_penguis
        .value_counts(value,sort=True)
        .reset_index(name='count')
        .pipe(
            lambda df:(
                sns.barplot(
                    ax=ax[idx],
                    data=df,
                    x=value,
                    y='count'
                )
            )
            
        )
    )
plt.show()
  • otra forma del conpañero
categoria=df_penguis.select_dtypes('category').columns
fig , ax=plt.subplots(1,3,figsize=(15,3))
for idx,value in enumerate(categoria):
    (
        df_penguis
        .value_counts(value,sort=True)
        .reset_index(name='count')
        .pipe(
            lambda df:(
                sns.barplot(
                    ax=ax[idx],
                    data=df,
                    x=value,
                    y='count'
                )
            )
            
        )
    )
plt.show()

Explorando la variable categórica: ISLAND

Hi! , por aqui les dejo mi ejercicio.

Hermoso Reto! Listo

Convertir las variables de string a category nos sirve para ahorrar memoria, podemos darle una jerarquía a la hora de ordenarlos a diferencia de los strings que se organizan alfabéticamente y ayudar a otras funciones a identificar que variables deben ser tratadas como categorías

sns.catplot(
    data=df_c,
    x='island',
    hue='sex',
    kind='count'
)
plt.title('Sex of penguins by island', fontsize=14);
sns.catplot(
    data=df_c,
    x='species',
    kind='count',
    hue='island'
    )
plt.title('Penguin species by Island', fontsize=14); 
sns.catplot(
    data=df_c,
    x='species',
    kind='count',
    hue='sex'
    )
plt.title('Sex of penguins by species', fontsize=14);

Este es mi aporte respecto a la proporción de pingüinos por cada isla.

# Ahora vamos hacer la exploracion por las especien en cada isla 
fig, ax = plt.subplots(1,1, figsize=(6,6))
(
    preproced_penguins_df
    .add_column('x', '')
    .pipe(
        lambda df: (
            sns.histplot(
                ax=ax,
                data=df,
                x='island',
                hue='species',
                multiple='fill',
                palette=penguin_color
            )
        )
    )
)
plt.show()

Muy buena clase para lo que es la exploración 🔥🚀🥇

Otra forma de hacer la última gráfica a que a mi no agrada usar la función pipe

Aca mi aporte, me toco cambiar a un counplot ya q elcatplot no acepta ax dentro de si misma

Una alternativa

sns.catplot(
    data=processed_penguins_df,
    x='species',
    kind='count',
        #categorizamos por isla
    hue='island'
    

    )


Otra forma un poco mas visual de como graficar la distribución es haciendo un gráfico de pastel, yo lo hice de esta manera

processed_penguins_df.groupby('species').size().plot(kind='pie', autopct='%.2f', figsize=(5,5))

Distribución por isla y sexo con seaborn:

Descubrí como cambiar las paletas de colores a ciertas predeterminadas por seaborn, como: deep, muted, bright, pastel, dark, colorblind, entre otras. Se podría modificar de la siguiente manera:

<palette= sns.color_palette("pastel")> 

Toda la documentación la pueden ver aquí:
https://seaborn.pydata.org/generated/seaborn.color_palette.html#seaborn.color_palette