Salta el contingut
 

Anàlisi visual de les dades

Autor: Joan Puigcerver Ibáñez

Correu electrònic: j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Anàlisi visual de les dades

Un anàlisi visual de les dades és una procés que ens pot resultar útil per entendre millor les dades amb les que estem treballant.

Cal tindre en compte que per poder representar les dades en un gràfic, sols podem representar dues dimensions. No existeix cap gràfic que ens permeta representar tota la informació possible, però podem fer combinacions per trobar relacions i patrons en les dades.

Instal·lació de dependències

Aquest material utilitza les següents llibreries de Python per a la visualització de les dades:

requirements.txt
matplotlib
seaborn
import matplotlib.pyplot as plt
import seaborn as sns

Distribució de les columnes respecte a les etiquetes

En els algorismes d'aprenentatge automàtic supervisat, utilitzem les etiquetes per indicar l'eixida esperada del model. Una bona manera de començar a entendre les dades és veure com es distribueixen les dades respecte a les etiquetes.

Advertència

Aquesta visualització sols és vàlida per les columnes numèriques.

df_numerics = df.select_dtypes(include = ['float64', 'int64'])

figure=plt.figure(figsize = (15, 6))

for i, column in enumerate(df_numerics.columns, 1):
        axes = figure.add_subplot(3,2,i)
        sns.kdeplot(x = df_numerics[column], hue = df['income'], fill = True, ax = axes)
        figure.tight_layout()
plt.show()

Figura 1. Distribució de densitat de les columnes respecte a les etiquetes

Distribució de densitat de les columnes respecte a les etiquetes

Histograma de les columnes

Un histograma ens permet veure la distribució de les dades d'una sola columna.

df_objects = df.select_dtypes(include=['object'])
figure=plt.figure(figsize = (15, 20))

for i, column in enumerate(df_objects.columns, 1):
    axes = figure.add_subplot(3,3,i)
    sns.histplot(x = df_objects[column], ax = axes, hue=df['income'], multiple='dodge')
    axes.tick_params(axis='x', rotation=45)
    for label in axes.get_xticklabels():
        label.set_ha('right')  # Align labels to the right
    figure.tight_layout()

plt.show()

Figura 2. Histograma de les columnes

Histograma de les columnes

Relació entre les columnes

Per veure la relació entre les columnes, podem utilitzar un gràfic de dispersió.

n_samples_to_plot = 5000
columns = ['age', 'education-num', 'hours-per-week']
_ = sns.pairplot(data=df[:n_samples_to_plot], vars=columns,
                 hue="income", plot_kws={'alpha': 0.2},
                 height=3, diag_kind='hist', diag_kws={'bins': 30})

Figura 3. Relació entre les columnes

Relació entre les columnes

Fronteres de decisió

Fixem-nos en el gràfic de les columnes age i hours-per-week

Figura 3.1. Relació entre les columnes age i hours-per-week

Relació entre les columnes age i hours-per-week

En aquest cas, podríem començar a establir fronteres de decisió per establir si una persona guanya més de 50K o no.

Important

Aquest procés és el que tractarem de realitzar d'una manera automàtica mitjançant els algorismes d'aprenentatge automàtic.

Figura 3.2. Fronteres de decisió

Fronteres de decisió

Correlació entre les columnes

Podem obtindre i visualitzar la matriu de correlació entre diferents columnes.

corr_df = df.corr(method='pearson')

plt.figure(figsize=(8, 6))
sns.heatmap(corr_df, annot=True)

Figura 4. Matriu de correlació

Matriu de correlació

Diagrama de caixa

Els diagrames de caixa o box plots són una manera de representar gràficament les dades numèriques a través dels seus quartils.

Caixa dels diagrames de caixa

Figura 5. Caixa dels diagrames de caixa

Els limits superior \(L_s\) i inferior \(L_i\) es calculen amb l'amplitud interquartílica (IQR o inter-quartile range).

\[ IQR = Q_3 - Q_1 \]
sns.boxplot(x='income', y ='age', hue='income', data=df)

Figura 6. Diagrama de caixa

Diagrama de caixa

Codi font

analisi_visual_adults.py
#!/usr/bin/env python

from urllib.request import urlopen
import pandas as pd
import os
from sklearn.preprocessing import OrdinalEncoder, OneHotEncoder
from plotnine import *
import matplotlib.pyplot as plt
import seaborn as sns


def download(url, filepath):
    http_response = urlopen(url)
    content = http_response.read()
    with open(filepath, 'wb') as f:
        f.write(content)


files_folder = '../../files/ud3'
if not os.path.exists(files_folder):
    os.makedirs(files_folder)

file_path = os.path.join(files_folder, 'adult.data.csv')
if not os.path.exists(file_path):
    adult_dataset_url = 'https://raw.githubusercontent.com/joapuiib/saa-datasets/refs/heads/main/adult.data.csv'
    print('Downloading dataset...')
    download(adult_dataset_url, file_path)
else:
    print(f'Dataset found at {file_path}')


df = pd.read_csv(file_path)
df_numerics = df.select_dtypes(include = ['float64', 'int64'])

def densitat_etiquetes():

    figure=plt.figure(figsize = (15, 6))

    for i, column in enumerate(df_numerics.columns, 1):
            axes = figure.add_subplot(3,2,i)
            sns.kdeplot(x = df_numerics[column], hue = df['income'], fill = True, ax = axes)
            figure.tight_layout()


def histograma():
    figure=plt.figure(figsize = (15, 20))

    df_objects = df.select_dtypes(include=['object'])

    for i, column in enumerate(df_objects.columns, 1):
        axes = figure.add_subplot(5,3,i)
        sns.histplot(x = df_objects[column], ax = axes, hue=df['income'], multiple='dodge')
        axes.tick_params(axis='x', rotation=45)
        for label in axes.get_xticklabels():
            label.set_ha('right')  # Align labels to the right
        figure.tight_layout()


def relacions_variable():
    n_samples_to_plot = 5000
    columns = ['age', 'education-num', 'hours-per-week']
    _ = sns.pairplot(data=df[:n_samples_to_plot], vars=columns,
                     hue="income", plot_kws={'alpha': 0.2},
                     height=3, diag_kind='hist', diag_kws={'bins': 30})

def scatterplot():
    ax = sns.scatterplot(
        x="age", y="hours-per-week", data=df,
        hue="income", alpha=0.5,
    )


def matriu_correlacio():
    corr_df = df_numerics.corr(method='pearson')

    plt.figure(figsize=(8, 6))
    sns.heatmap(corr_df, annot=True)


def boxplot():
    sns.boxplot(x='income', y ='age', hue='income', data = df)


densitat_etiquetes()
# histograma()
# relacions_variable()
# scatterplot()
# matriu_correlacio()
# boxplot()
plt.show()

Bibliografia

Comentaris