MAT281 - Laboratorio N°08¶
Objetivo: Aplicar técnicas de machine learning no supervisado para explorar, procesar y analizar conjuntos de datos con variables numéricas y categóricas.
Nota: Puede ayudarse de algún asistente virtual como ChatGPT, Gemini u otros, así como del autocompletado de Google Colab, para avanzar en este laboratorio debido a su extensión.
Clustering¶
El conjunto de datos vehiculos_procesado_con_grupos.csv
recopila información sobre diversas características relevantes de distintos vehículos. El propósito de este ejercicio es clasificar los vehículos en diferentes categorías, utilizando como base las variables descritas en la tabla de atributos.
El análisis presenta un desafío adicional debido a la naturaleza mixta de los datos: se incluyen tanto variables numéricas (ej. dimensiones, consumo, emisiones) como categóricas (ej. tipo de tracción, tipo de combustible), lo que requiere aplicar técnicas de preprocesamiento adecuadas antes de entrenar los modelos.
Como primer paso, procederemos a cargar y explorar el conjunto de datos, con el fin de familiarizarnos con su estructura y las características que servirán como base para la posterior clasificación.
Descripción de los Datos:
Nombre de la Columna | Descripción |
---|---|
year | El año en que el vehículo fue fabricado. |
desplazamiento | La capacidad volumétrica del motor en litros. Indica la cantidad de aire y combustible que puede desplazar el motor durante una revolución. |
cilindros | El número de cilindros que tiene el motor. Los cilindros son las cámaras donde ocurre la combustión interna en los motores de los vehículos. |
co2 | Emisiones de dióxido de carbono del vehículo, medido en gramos por kilómetro. Es una medida de las emisiones de gases de efecto invernadero. |
clase_tipo | La clase o tipo de vehículo, como vehículos especiales, deportivos, etc. |
traccion_tipo | Tipo de tracción del vehículo, ya sea tracción en dos ruedas, en cuatro ruedas o en todas las ruedas. |
transmision_tipo | Tipo de transmisión del vehículo, como automática, manual, entre otros. |
combustible_tipo | Tipo de combustible que utiliza el vehículo, como gasolina, diésel, eléctrico, híbrido, etc. |
tamano_motor_tipo | Clasificación del tamaño del motor (por ejemplo, pequeño, mediano o grande), que generalmente se basa en la capacidad de desplazamiento. |
consumo_tipo | Clasificación del nivel de consumo de combustible del vehículo, indicando si es alto, bajo, o muy alto. |
co2_tipo | Clasificación de las emisiones de CO2 del vehículo, indicando si es alto, bajo, o muy alto. |
consumo_litros_milla | El consumo de combustible del vehículo, medido en litros por milla. Indica la eficiencia del vehículo en términos de consumo de combustible. |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler
from sklearn.dummy import DummyClassifier
from sklearn.cluster import KMeans
%matplotlib inline
sns.set_palette("deep", desat=.6)
sns.set(rc={'figure.figsize':(11.7,8.27)})
# cargar datos
df = pd.read_csv("https://raw.githubusercontent.com/fralfaro/MAT281/main/docs/labs/data/vehiculos_procesado_con_grupos.csv", sep=",")\
.drop(
["fabricante",
"modelo",
"transmision",
"traccion",
"clase",
"combustible",
"consumo"],
axis=1)
df.head()
year | desplazamiento | cilindros | co2 | clase_tipo | traccion_tipo | transmision_tipo | combustible_tipo | tamano_motor_tipo | consumo_tipo | co2_tipo | consumo_litros_milla | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1984 | 2.5 | 4.0 | 522.764706 | Vehículos Especiales | dos | Automatica | Normal | pequeño | alto | alto | 0.222671 |
1 | 1984 | 4.2 | 6.0 | 683.615385 | Vehículos Especiales | dos | Automatica | Normal | grande | muy alto | muy alto | 0.291185 |
2 | 1985 | 2.5 | 4.0 | 555.437500 | Vehículos Especiales | dos | Automatica | Normal | pequeño | alto | alto | 0.236588 |
3 | 1985 | 4.2 | 6.0 | 683.615385 | Vehículos Especiales | dos | Automatica | Normal | grande | muy alto | muy alto | 0.291185 |
4 | 1987 | 3.8 | 6.0 | 555.437500 | Coches Medianos | dos | Automatica | Premium | grande | alto | alto | 0.236588 |
En este caso, no solo se tienen datos numéricos, sino que también categóricos. Además, tenemos problemas de datos vacíos (Nan). Así que para resolver este problema, seguiremos varios pasos:
1.- Normalizar datos¶
Cree un conjunto de datos con las variables numéricas, además, para cada dato vacía, rellene con el promedio asociado a esa columna. Finalmente, normalize los datos mediante el procesamiento MinMaxScaler de sklearn.
Cree un conjunto de datos con las variables categóricas , además, transforme de variables categoricas a numericas ocupando el comando get_dummies de pandas (referencia). Explique a grande rasgo como se realiza la codificación de variables numéricas a categóricas.
Junte ambos dataset en uno, llamado df_procesado.
# FIXME
2.- Realizar ajuste mediante kmeans¶
Una vez depurado el conjunto de datos, es momento de aplicar el algoritmo de kmeans.
- Ajuste el modelo de kmeans sobre el conjunto de datos, con un total de 8 clusters.
- Asociar a cada individuo el correspondiente cluster y calcular valor de los centroides de cada cluster.
- Realizar un resumen de las principales cualidades de cada cluster. Para esto debe calcular (para cluster) las siguientes medidas de resumen:
- Valor promedio de las variables numérica
- Moda para las variables numericas
# FIXME
3.- Elegir Número de cluster¶
Estime mediante la regla del codo, el número de cluster apropiados para el caso. Para efectos prácticos, eliga la siguiente secuencia como número de clusters a comparar:
$$[5, 10, 20, 30, 50, 75, 100, 200, 300]$$
Una vez realizado el gráfico, saque sus propias conclusiones del caso.
# FIXME
Al observar el gráfico resultante, se pueden obtener conclusiones sobre el número apropiado de clusters. La regla del codo sugiere elegir el número de clusters donde la reducción en la inercia se estabiliza significativamente. En otras palabras, se busca el punto en el gráfico donde la curva de inercia comienza a aplanarse o forma un codo.
Reducción de Dimensionalidad¶
Para este ejercicio utilizaremos el Wine Dataset, un conjunto de datos clásico disponible en la librería scikit-learn y en el repositorio de la UCI Machine Learning. Este dataset contiene información de 178 muestras de vino provenientes de la región italiana de Piamonte. Cada vino pertenece a una de tres variedades de uva (clases), que actúan como etiquetas para el análisis supervisado, pero aquí se usarán solo como referencia en la visualización.
Cada muestra está descrita por 13 variables químicas obtenidas de un análisis de laboratorio, entre ellas:
- Alcohol: porcentaje de alcohol en el vino.
- Malic acid: concentración de ácido málico.
- Ash: contenido de ceniza.
- Alcalinity of ash: alcalinidad de la ceniza.
- Magnesium: cantidad de magnesio (mg/L).
- Total phenols: concentración total de fenoles.
- Flavanoids: tipo de fenoles con propiedades antioxidantes.
- Nonflavanoid phenols: fenoles que no son flavonoides.
- Proanthocyanins: compuestos relacionados con el color y el sabor.
- Color intensity: intensidad del color del vino.
- Hue: matiz del color.
- OD280/OD315 of diluted wines: relación de absorbancia que mide la calidad del vino.
- Proline: concentración de prolina (un aminoácido).
Estas características permiten representar cada vino como un punto en un espacio de 13 dimensiones.
El objetivo del análisis con este dataset es reducir la dimensionalidad para visualizar y explorar patrones en los datos. Para ello aplicaremos:
- PCA (Principal Component Analysis): identificar las combinaciones lineales de variables que explican la mayor varianza en el conjunto.
- t-SNE (t-distributed Stochastic Neighbor Embedding): mapear las muestras a 2D o 3D, preservando relaciones de vecindad y estructuras no lineales.
La comparación entre ambas técnicas permitirá observar cómo las tres clases de vinos se diferencian en el espacio reducido y discutir la utilidad de la reducción de dimensionalidad en datos con mayor número de variables que en el caso del dataset Iris.
import pandas as pd
from sklearn.datasets import load_wine
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
# cargar dataset
dataset = load_wine()
# nombres de las variables
features = dataset.feature_names
target = 'wine_class'
# construir DataFrame
wine = pd.DataFrame(dataset.data, columns=features)
wine[target] = dataset.target
# ver primeras filas
wine.head()
alcohol | malic_acid | ash | alcalinity_of_ash | magnesium | total_phenols | flavanoids | nonflavanoid_phenols | proanthocyanins | color_intensity | hue | od280/od315_of_diluted_wines | proline | wine_class | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 14.23 | 1.71 | 2.43 | 15.6 | 127.0 | 2.80 | 3.06 | 0.28 | 2.29 | 5.64 | 1.04 | 3.92 | 1065.0 | 0 |
1 | 13.20 | 1.78 | 2.14 | 11.2 | 100.0 | 2.65 | 2.76 | 0.26 | 1.28 | 4.38 | 1.05 | 3.40 | 1050.0 | 0 |
2 | 13.16 | 2.36 | 2.67 | 18.6 | 101.0 | 2.80 | 3.24 | 0.30 | 2.81 | 5.68 | 1.03 | 3.17 | 1185.0 | 0 |
3 | 14.37 | 1.95 | 2.50 | 16.8 | 113.0 | 3.85 | 3.49 | 0.24 | 2.18 | 7.80 | 0.86 | 3.45 | 1480.0 | 0 |
4 | 13.24 | 2.59 | 2.87 | 21.0 | 118.0 | 2.80 | 2.69 | 0.39 | 1.82 | 4.32 | 1.04 | 2.93 | 735.0 | 0 |
1. Análisis detallado con PCA¶
- Calcular la varianza explicada por cada componente principal y representar el gráfico de varianza acumulada, identificando cuántos componentes son necesarios para capturar al menos el 90–95% de la información.
- Construir tablas y gráficos que muestren cómo las observaciones (vinos) se proyectan en las primeras componentes principales.
- Analizar los loadings (coeficientes de cada variable en los componentes) e interpretar qué características químicas del vino (alcohol, fenoles, color, etc.) tienen mayor influencia en las nuevas dimensiones.
- Visualizar los datos reducidos a 2D o 3D e interpretar si las tres variedades de vino se separan de forma clara en el espacio proyectado.
# FIXME
2. Análisis detallado con t-SNE¶
- Aplicar t-SNE para reducir los datos a 2 dimensiones, probando diferentes configuraciones de hiperparámetros como perplexity y learning rate.
- Comparar las distintas visualizaciones obtenidas y discutir cómo los hiperparámetros afectan la estructura de los clústeres.
- Analizar si las tres clases de vinos forman agrupaciones definidas y si t-SNE logra capturar relaciones no lineales que PCA no refleja.
# FIXME
3. Comparación entre PCA y t-SNE¶
Contrastar las visualizaciones y discutir las ventajas y limitaciones de cada técnica:
- PCA como método lineal para interpretar varianza y relaciones globales.
- t-SNE como método no lineal que preserva relaciones locales y vecindades.
Evaluar en qué escenarios prácticos sería más recomendable usar PCA (interpretabilidad, reducción previa para modelos) o t-SNE (exploración y visualización de clústeres).
Reflexionar sobre la importancia de la reducción de dimensionalidad en datasets de alta dimensión como Wine, destacando su utilidad para:
- Visualizar patrones ocultos en los datos.
- Reducir complejidad y ruido antes de aplicar algoritmos de aprendizaje automático.
- Facilitar la interpretación y comunicación de resultados.
# FIXME