Transformando datos en oro con R y Python: Cómo la estandarización y normalización mejoran tus resultados.

Nicolás Urrego
19 min readJul 11, 2023

En el mundo de la ciencia de datos y el análisis estadístico, la estandarización y la normalización de variables desempeñan un papel fundamental en la preparación y transformación de datos. Estas técnicas nos permiten ajustar y escalar nuestros datos para garantizar una comparabilidad precisa, minimizar el impacto de valores atípicos y mejorar la interpretación de los resultados. En este artículo, exploraremos la importancia de la estandarización y la normalización, así como una breve descripción de algunas técnicas comunes utilizadas en este proceso.

Tabla de contenidos:

  1. Introducción
  2. Estandarización Z-score
  3. Escalamiento Robusto (Robust Scaling)
  4. Escalamiento Min-Max
  5. Normalización Logarítmica
  6. Normalización de imágenes
  7. Técnicas de escalamiento: Escalamiento por Unidad de Longitud, Escalamiento de Puntuación y Escalamiento por Decimales Centrados

Introducción

La estandarización y la normalización no son lo mismo, aunque a menudo se utilizan indistintamente y pueden generar cierta confusión. Ambas técnicas buscan ajustar y transformar los datos, pero tienen objetivos y enfoques ligeramente diferentes.

La estandarización se enfoca en la transformación de los datos para que tengan una media de cero y una desviación estándar de uno, mientras que la normalización busca ajustar los datos a un rango específico o a una escala definida. Ambas técnicas son útiles en diferentes situaciones y se seleccionan según los requisitos y objetivos del análisis de datos. Aquí te presento algunas situaciones comunes donde se aplican estas técnicas:

Estandarización:

  1. Análisis multivariante: En el análisis multivariante, es común estandarizar las variables para garantizar una comparabilidad precisa y equilibrada entre ellas. Esto es especialmente importante en técnicas como el análisis de componentes principales (PCA) y el análisis discriminante lineal (LDA).
  2. Algoritmos sensibles a la escala: Algunos algoritmos de aprendizaje automático, como la regresión logística, las máquinas de vectores de soporte (SVM) y el análisis de conglomerados (clustering), son sensibles a la escala de las variables. En estos casos, la estandarización ayuda a equilibrar el impacto de las características y mejora el rendimiento del modelo.
  3. Variables con diferentes unidades de medida: Cuando se trabaja con variables que tienen diferentes unidades de medida, como longitud, peso o tiempo, la estandarización es útil para colocarlas en una escala común. Esto facilita la comparación y el análisis de las variables.

Normalización:

  1. Modelos de aprendizaje automático basados en distancias: En algoritmos que utilizan medidas de distancia, como el vecino más cercano (k-NN) y el clustering basado en la distancia, es importante normalizar las variables para que tengan una escala comparable. Esto evita que las variables con rangos más amplios dominen las distancias calculadas.
  2. Redes neuronales: En el entrenamiento de redes neuronales, es común normalizar los datos de entrada para que tengan una distribución cercana a una distribución normal, con una media cercana a cero y una desviación estándar de uno. Esto ayuda a que el proceso de entrenamiento sea más estable y eficiente.
  3. Análisis de imágenes y procesamiento de señales: En el procesamiento de imágenes y señales, es necesario normalizar los valores de los píxeles o las muestras para que estén dentro de un rango específico, como [0, 1] o [-1, 1]. Esto asegura que los datos estén en un formato adecuado para el análisis y la manipulación.

Estandarización Z-score

La estandarización Z-score es una técnica ampliamente utilizada en el análisis de datos y la estadística. Permite transformar los datos de manera que tengan una media de cero y una desviación estándar de uno.

Es especialmente útil cuando se busca comparar y evaluar variables con diferentes unidades de medida y escalas. Al estandarizar los datos, se elimina la escala original y se transforma la distribución de los datos para que tenga una media de cero y una desviación estándar de uno. Esto permite una comparación más precisa y equilibrada entre las variables.

Font: Rojas-Jimenez, K. 2022. Ciencia de Datos para Ciencias Naturales.

Para aplicar correctamente la estandarización Z-score, los datos deben cumplir con ciertos requisitos:

  1. Distribución aproximadamente normal: La estandarización Z-score asume que los datos siguen una distribución normal o se aproximan a ella. Si los datos tienen una distribución significativamente sesgada o no se asemejan a una distribución normal, los resultados de la estandarización pueden no ser apropiados.
  2. Sin datos categóricos o nominales: La estandarización Z-score se aplica a variables numéricas continuas o discretas, pero no es adecuada para variables categóricas o nominales. Estas variables deben ser tratadas de manera diferente antes de aplicar la estandarización.

La estandarización Z-score es una técnica versátil que se utiliza en diversos casos prácticos, algunos ejemplos de situaciones en las que se puede aplicar son:

  1. Análisis multivariante: Garantiza una comparabilidad precisa y equilibrada entre las variables. Es especialmente útil en técnicas como el análisis de componentes principales (PCA) y el análisis discriminante lineal (LDA), donde se busca encontrar patrones y relaciones entre múltiples variables.
  2. Detección de valores atípicos: Se utiliza para identificar y detectar valores atípicos en los datos.
  3. Comparación y evaluación de variables: Permite comparar y evaluar variables con diferentes unidades de medida y escalas. Por ejemplo, al comparar el rendimiento de estudiantes en diferentes asignaturas o al evaluar el desempeño de variables financieras en diferentes períodos de tiempo.
  4. Modelos de aprendizaje automático: Se utiliza para preparar los datos antes de entrenar los modelos. Al estandarizar las características, se evita que algunas características con valores numéricos más grandes dominen el proceso de entrenamiento en comparación con otras características.
  5. Análisis de series temporales: Se puede aplicar a las observaciones en cada punto de tiempo para comparar cómo se desvían de la media a lo largo del tiempo. Esto ayuda a identificar patrones y anomalías en las series temporales.

Supongamos que estamos analizando los datos de un estudio clínico para determinar la relación entre el índice de masa corporal (IMC), la edad, el género y el diagnóstico de enfermedad cardíaca. Consideraremos el IMC (variable numérica), la edad (variable numérica), el género (variable categórica: ‘M’ para masculino y ‘F’ para femenino) y el diagnóstico (variable categórica: ‘Sano’ o ‘Enfermo’).

Código en R:

# Crear dataset ficticio
datos <- data.frame(
IMC = c(23.5, 26.8, 21.2, 28.1, 24.6),
Edad = c(35, 42, 28, 56, 49),
Genero = c('M', 'F', 'M', 'F', 'M'),
Diagnostico = c('Sano', 'Enfermo', 'Sano', 'Enfermo', 'Enfermo')
)

# Estandarización Z-score en variables numéricas (IMC y Edad)
datos$IMC_estandarizado <- scale(datos$IMC)
datos$Edad_estandarizada <- scale(datos$Edad)

# Mostrar el dataset con variables estandarizadas
print(datos)
 IMC Edad Genero Diagnostico IMC_estandarizado Edad_estandarizada
1 23.5 35 M Sano -0.5391637 -0.9712701
2 26.8 42 F Enfermo 0.3182446 -0.2518869
3 21.2 28 M Sano -1.2760835 -1.6878320
4 28.1 56 F Enfermo 1.0376280 1.3420049
5 24.6 49 M Enfermo 0.4593747 1.5699840

Código en Python:

import pandas as pd
from scipy.stats import zscore

# Crear dataset ficticio
datos = pd.DataFrame({
'IMC': [23.5, 26.8, 21.2, 28.1, 24.6],
'Edad': [35, 42, 28, 56, 49],
'Genero': ['M', 'F', 'M', 'F', 'M'],
'Diagnostico': ['Sano', 'Enfermo', 'Sano', 'Enfermo', 'Enfermo']
})

# Estandarización Z-score en variables numéricas (IMC y Edad)
datos['IMC_estandarizado'] = zscore(datos['IMC'])
datos['Edad_estandarizada'] = zscore(datos['Edad'])

# Mostrar el dataset con variables estandarizadas
print(datos)
  IMC  Edad Genero Diagnostico  IMC_estandarizado  Edad_estandarizada
0 23.5 35 M Sano -0.539164 -0.971270
1 26.8 42 F Enfermo 0.318245 -0.251887
2 21.2 28 M Sano -1.276083 -1.687832
3 28.1 56 F Enfermo 1.037628 1.342005
4 24.6 49 M Enfermo 0.459375 1.569984

En este caso práctico, aplicamos la estandarización Z-score a las variables numéricas (IMC y Edad) utilizando tanto R como Python. La estandarización Z-score se aplica para garantizar una comparabilidad precisa y equilibrada entre las variables numéricas, independientemente de sus escalas y unidades de medida originales. Esto permite una comparación más justa entre el IMC y la Edad, teniendo en cuenta cualquier diferencia en la escala y la variabilidad de los datos.

Las variables categóricas (Género y Diagnóstico) no se estandarizan, ya que la estandarización Z-score se aplica a variables numéricas continuas o discretas.

Escalamiento Robusto (Robust Scaling)

El Escalamiento Robusto, también conocido como Robust Scaling, es una técnica de transformación de datos utilizada en el análisis estadístico y el aprendizaje automático. Esta técnica permite ajustar los datos de manera que sean menos sensibles a los valores atípicos o extremos en comparación con otras técnicas de escalamiento.

Font: Proclus Academy

El Escalamiento Robusto es útil en situaciones donde los datos contienen valores atípicos o extremos que pueden afectar negativamente el análisis o el modelado. A diferencia de otras técnicas de escalamiento, como el escalamiento Min-Max o la estandarización Z-score, el Escalamiento Robusto utiliza medidas de posición resistentes, lo que le permite manejar de manera más efectiva los valores atípicos en los datos. Esto preserva la estructura relativa de los datos y evita que los valores atípicos tengan un impacto excesivo en la transformación.

Para aplicar correctamente el Escalamiento Robusto, los datos deben cumplir con los siguientes requisitos:

  1. Variables numéricas: El Escalamiento Robusto se aplica a variables numéricas continuas o discretas. No es adecuado para variables categóricas o nominales.
  2. Distribución asimétrica o con valores atípicos: El Escalamiento Robusto es más útil cuando los datos tienen una distribución asimétrica o contienen valores atípicos. Estas características permiten que la técnica aproveche su robustez y logre una transformación más efectiva.

Supongamos que estamos analizando los datos de una cartera de inversión que incluye información sobre el tipo de inversión (categórica: ‘Acciones’, ‘Bonos’, ‘Fondos mutuos’), el rendimiento anual (variable numérica), el riesgo (variable numérica) y el sector de la industria (categórica: ‘Tecnología’, ‘Finanzas’, ‘Salud’).

Código en R:

# Crear dataset ficticio
datos <- data.frame(
TipoInversion = c('Acciones', 'Bonos', 'Fondos mutuos', 'Acciones', 'Bonos'),
Rendimiento = c(10.5, 8.2, 9.7, 11.1, 7.9),
Riesgo = c(2.3, 3.1, 2.9, 2.5, 3.5),
SectorIndustria = c('Tecnología', 'Finanzas', 'Salud', 'Tecnología', 'Finanzas')
)

# Escalamiento Robusto en variables numéricas (Rendimiento y Riesgo)
datos$Rendimiento_escalamiento_robusto <- scale(datos$Rendimiento, center = median, scale = mad)
datos$Riesgo_escalamiento_robusto <- scale(datos$Riesgo, center = median, scale = mad)

# Mostrar el dataset con variables escaladas
print(datos)
TipoInversion Rendimiento Riesgo SectorIndustria Rendimiento_escalamiento_robusto Riesgo_escalamiento_robusto
1 Acciones 10.5 2.3 Tecnología 0.5015768 -0.2182179
2 Bonos 8.2 3.1 Finanzas -0.7752211 1.0910895
3 Fondos mutuos 9.7 2.9 Salud 0.0000000 0.6546537
4 Acciones 11.1 2.5 Tecnología 1.2531548 -0.6546537
5 Bonos 7.9 3.5 Finanzas -1.2531548 1.5275252

Código en Python:

import pandas as pd
from sklearn.preprocessing import RobustScaler

# Crear dataset ficticio
datos = pd.DataFrame({
'TipoInversion': ['Acciones', 'Bonos', 'Fondos mutuos', 'Acciones', 'Bonos'],
'Rendimiento': [10.5, 8.2, 9.7, 11.1, 7.9],
'Riesgo': [2.3, 3.1, 2.9, 2.5, 3.5],
'SectorIndustria': ['Tecnología', 'Finanzas', 'Salud', 'Tecnología', 'Finanzas']
})

# Escalamiento Robusto en variables numéricas (Rendimiento y Riesgo)
escalador_robusto = RobustScaler()
datos[['Rendimiento_escalamiento_robusto', 'Riesgo_escalamiento_robusto']] = escalador_robusto.fit_transform(datos[['Rendimiento', 'Riesgo']])

# Mostrar el dataset con variables escaladas
print(datos)
  TipoInversion  Rendimiento  Riesgo SectorIndustria  Rendimiento_escalamiento_robusto  Riesgo_escalamiento_robusto
0 Acciones 10.5 2.3 Tecnología 0.501577 -0.218218
1 Bonos 8.2 3.1 Finanzas -0.775221 1.091089
2 Fondos mutuos 9.7 2.9 Salud 0.000000 0.654654
3 Acciones 11.1 2.5 Tecnología 1.253155 -0.654654
4 Bonos 7.9 3.5 Finanzas -1.253155 1.527525

Al aplicar el Escalamiento Robusto, utilizamos medidas de posición resistentes, como la mediana y la desviación absoluta mediana (MAD), para centrar y escalar los datos de manera más efectiva, evitando que los valores atípicos tengan un impacto excesivo en la transformación.

Las variables categóricas (TipoInversion y SectorIndustria) no se escalan, ya que el Escalamiento Robusto se aplica únicamente a las variables numéricas.

Esta técnica es útil cuando se necesita tener en cuenta valores atípicos en los datos y preservar la estructura relativa de las variables.

Escalamiento Min-Max

El Escalamiento Min-Max, también conocido como Normalización Min-Max, es una técnica de transformación de datos utilizada en el análisis de datos y el aprendizaje automático. Esta técnica permite ajustar los datos a un rango específico, generalmente entre 0 y 1, lo que facilita la comparación y la interpretación de las variables.

Font: Font: Rojas-Jimenez, K. 2022. Ciencia de Datos para Ciencias Naturales.

El Escalamiento Min-Max se puede aplicar en diversas situaciones, como:

  1. Algoritmos basados en distancias: Si se utilizan algoritmos que dependen de la distancia entre puntos de datos, como el algoritmo de vecinos más cercanos (k-NN) o algoritmos de agrupamiento, el Escalamiento Min-Max puede ayudar a garantizar que todas las variables tengan un impacto equilibrado en la distancia y el agrupamiento.
  2. Visualización de datos: Al escalar los datos al rango entre 0 y 1, se facilita la visualización y la interpretación de los datos en gráficos o visualizaciones, ya que todos los valores se encuentran dentro de un rango acotado.

Para aplicar correctamente el Escalamiento Min-Max, los datos deben cumplir con los siguientes requisitos:

  1. Variables numéricas: El Escalamiento Min-Max se aplica a variables numéricas continuas o discretas. No es adecuado para variables categóricas o nominales.
  2. Distribución aproximadamente simétrica: El Escalamiento Min-Max funciona mejor en datos con una distribución aproximadamente simétrica.

Supongamos que estamos analizando los datos de ventas de una tienda minorista. Consideraremos las siguientes variables: el precio de los productos (variable numérica), la cantidad de unidades vendidas (variable numérica), la categoría de producto (variable categórica: ‘Electrónica’, ‘Ropa’, ‘Alimentación’) y el estado del producto (variable categórica: ‘Nuevo’, ‘Usado’).

Código en R:

# Crear dataset ficticio
datos <- data.frame(
Precio = c(99.99, 49.99, 79.99, 129.99, 59.99),
Cantidad = c(50, 20, 30, 10, 40),
Categoria = c('Electrónica', 'Ropa', 'Alimentación', 'Electrónica', 'Ropa'),
Estado = c('Nuevo', 'Usado', 'Nuevo', 'Usado', 'Nuevo')
)

# Escalamiento Min-Max en variables numéricas (Precio y Cantidad)
datos$Precio_escalado <- (datos$Precio - min(datos$Precio)) / (max(datos$Precio) - min(datos$Precio))
datos$Cantidad_escalada <- (datos$Cantidad - min(datos$Cantidad)) / (max(datos$Cantidad) - min(datos$Cantidad))

# Mostrar el dataset con variables escaladas
print(datos)
  Precio Cantidad    Categoria Estado Precio_escalado Cantidad_escalada
1 99.99 50 Electrónica Nuevo 0.625 1.00
2 49.99 20 Ropa Usado 0.000 0.25
3 79.99 30 Alimentación Nuevo 0.375 0.50
4 129.99 10 Electrónica Usado 1.000 0.00
5 59.99 40 Ropa Nuevo 0.125 0.75

Código en Python:

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

# Crear dataset ficticio
datos = pd.DataFrame({
'Precio': [99.99, 49.99, 79.99, 129.99, 59.99],
'Cantidad': [50, 20, 30, 10, 40],
'Categoria': ['Electrónica', 'Ropa', 'Alimentación', 'Electrónica', 'Ropa'],
'Estado': ['Nuevo', 'Usado', 'Nuevo', 'Usado', 'Nuevo']
})

# Escalamiento Min-Max en variables numéricas (Precio y Cantidad)
escalador_minmax = MinMaxScaler()
datos[['Precio_escalado', 'Cantidad_escalada']] = escalador_minmax.fit_transform(datos[['Precio', 'Cantidad']])

# Mostrar el dataset con variables escaladas
print(datos)
   Precio  Cantidad     Categoria Estado  Precio_escalado  Cantidad_escalada
0 99.99 50 Electrónica Nuevo 0.625 1.00
1 49.99 20 Ropa Usado 0.000 0.25
2 79.99 30 Alimentación Nuevo 0.375 0.50
3 129.99 10 Electrónica Usado 1.000 0.00
4 59.99 40 Ropa Nuevo 0.125 0.75

Al aplicar el Escalamiento Min-Max, normalizamos los valores de Precio y Cantidad al rango entre 0 y 1, utilizando la fórmula correspondiente. Esto permite que todas las variables tengan la misma influencia en el análisis y evita que las diferencias en las unidades de medida y las escalas de los datos afecten los resultados.

Las variables categóricas (Categoría y Estado) no se escalan, ya que el Escalamiento Min-Max se aplica únicamente a las variables numéricas.ç

Normalización Logarítmica

La Normalización Logarítmica, también conocida como Transformación Logarítmica, es una técnica utilizada en el análisis de datos y el modelado estadístico para mejorar la distribución de variables asimétricas o sesgadas hacia una distribución más normal o aproximadamente normal.

Al aplicar la Transformación Logarítmica, se comprimen los valores más grandes y se expanden los valores más pequeños, lo que puede ayudar a mejorar la simetría de la distribución.

La Normalización Logarítmica se puede aplicar en diversas situaciones, como:

  1. Variables con distribuciones asimétricas: Si una variable tiene una distribución asimétrica o sesgada hacia la derecha, donde la mayoría de los valores se encuentran en el extremo inferior y hay algunos valores atípicos en el extremo superior, la Normalización Logarítmica puede ayudar a mejorar la simetría y acercar la distribución a una distribución normal.
  2. Análisis estadístico y modelado: Cuando se planea realizar análisis estadístico o modelado que asume una distribución normal de los datos, la Normalización Logarítmica puede ser útil para cumplir con esta suposición. Esto es común en técnicas como la regresión lineal, el análisis de varianza (ANOVA) y algunos modelos de aprendizaje automático.

Para aplicar correctamente la Normalización Logarítmica, los datos deben cumplir con los siguientes requisitos:

  1. Valores positivos: La Transformación Logarítmica se aplica a variables con valores estrictamente positivos. No es adecuada para variables que incluyen valores negativos o cero.
  2. Variables con sesgo positivo: La Normalización Logarítmica es más efectiva en variables con distribuciones asimétricas o sesgadas hacia la derecha, donde la mayoría de los valores se encuentran en el extremo inferior y hay algunos valores atípicos en el extremo superior.

Supongamos que estamos analizando los datos de producción de una fábrica que incluye las siguientes variables: la cantidad producida por día (variable numérica), el costo de producción por unidad (variable numérica), el tipo de producto (variable categórica: ‘Electrónica’, ‘Textiles’, ‘Automóviles’) y la ubicación de la fábrica (variable categórica: ‘Asia’, ‘Europa’, ‘América’).

# Crear dataset ficticio
datos <- data.frame(
Produccion = c(100, 200, 150, 300, 250),
Costo = c(10.5, 8.2, 9.7, 11.1, 7.9),
TipoProducto = c('Electrónica', 'Textiles', 'Automóviles', 'Electrónica', 'Textiles'),
Ubicacion = c('Asia', 'Europa', 'América', 'Europa', 'Asia')
)

# Transformación Logarítmica en variables numéricas (Produccion y Costo)
datos$Produccion_transformada <- log(datos$Produccion)
datos$Costo_transformado <- log(datos$Costo)

# Mostrar el dataset con variables transformadas
print(datos)
  Produccion Costo  TipoProducto Ubicacion Produccion_transformada Costo_transformado
1 100 10.5 Electrónica Asia 4.605170 2.351375
2 200 8.2 Textiles Europa 5.298317 2.104134
3 150 9.7 Automóviles América 5.010635 2.272126
4 300 11.1 Electrónica Europa 5.703782 2.406945
5 250 7.9 Textiles Asia 5.521461 2.066863

Código en Python:

import pandas as pd
import numpy as np

# Crear dataset ficticio
datos = pd.DataFrame({
'Produccion': [100, 200, 150, 300, 250],
'Costo': [10.5, 8.2, 9.7, 11.1, 7.9],
'TipoProducto': ['Electrónica', 'Textiles', 'Automóviles', 'Electrónica', 'Textiles'],
'Ubicacion': ['Asia', 'Europa', 'América', 'Europa', 'Asia']
})

# Transformación Logarítmica en variables numéricas (Produccion y Costo)
datos['Produccion_transformada'] = np.log(datos['Produccion'])
datos['Costo_transformado'] = np.log(datos['Costo'])

# Mostrar el dataset con variables transformadas
print(datos)
   Produccion  Costo  TipoProducto Ubicacion  Produccion_transformada  Costo_transformado
0 100 10.5 Electrónica Asia 4.605170 2.351375
1 200 8.2 Textiles Europa 5.298317 2.104134
2 150 9.7 Automóviles América 5.010635 2.272126
3 300 11.1 Electrónica Europa 5.703782 2.406945
4 250 7.9 Textiles Asia 5.521461 2.066863

Al aplicar la Transformación Logarítmica, tomamos el logaritmo natural de los valores de Produccion y Costo. Esto ayuda a comprimir los valores más grandes y expandir los valores más pequeños, mejorando así la simetría y facilitando el análisis estadístico o modelado que asume una distribución normal.

Las variables categóricas (TipoProducto y Ubicacion) no se transforman logarítmicamente, ya que esta técnica se aplica únicamente a las variables numéricas.

Normalización de imágenes

La Normalización de Imágenes es una técnica utilizada en el procesamiento de imágenes para ajustar y estandarizar el rango de valores de los píxeles de una imagen.

Font: AlfaGeomatics

Tiene diversas utilidades en el procesamiento de imágenes y aplicaciones relacionadas. Algunas de las razones por las que se aplica la Normalización de Imágenes son las siguientes:

  1. Mejora de la calidad: La Normalización de Imágenes puede ayudar a mejorar la calidad visual de las imágenes al ajustar y estandarizar el rango de valores de los píxeles. Esto puede incluir la mejora del contraste, la corrección de la iluminación y la eliminación de ruido.
  2. Comparabilidad entre imágenes: Al normalizar las imágenes, se asegura que todas las imágenes tengan un rango de valores similar, lo que facilita la comparación y el análisis cuantitativo de características visuales. Esto es especialmente útil en aplicaciones donde se necesita comparar imágenes, como en el reconocimiento de objetos o la detección de anomalías.
  3. Preparación de datos para algoritmos de visión por computadora: Muchos algoritmos de visión por computadora y aprendizaje automático requieren que las imágenes tengan una escala y rango de valores específicos. La Normalización de Imágenes se aplica para preparar los datos de entrada y asegurar que cumplan con los requisitos del algoritmo en cuestión.

Para aplicar correctamente la Normalización de Imágenes, los datos de imagen deben cumplir con los siguientes requisitos:

  1. Formato de imagen adecuado: Los datos deben estar en un formato de imagen reconocible, como JPEG, PNG, BMP, entre otros, para que se puedan leer y procesar correctamente.
  2. Rango de valores conocido: Los datos de imagen deben tener un rango de valores conocido. Por lo general, las imágenes se representan en una escala de 0 a 255 para imágenes en escala de grises o para cada canal de color en imágenes en color.

Para aplicar la normalización de imágenes en R y Python, puedes utilizar diferentes bibliotecas y enfoques según tus necesidades específicas. A continuación, te proporcionaré ejemplos de cómo realizar la normalización de imágenes utilizando algunas bibliotecas populares en ambos lenguajes.

En R:

Biblioteca ‘imager’:

# Instalar la biblioteca imager si no está instalada
# install.packages("imager")

# Cargar la biblioteca imager
library(imager)

# Cargar la imagen
imagen <- load.image("ruta_de_la_imagen.jpg")

# Normalizar la imagen
imagen_normalizada <- (imagen - min(imagen)) / (max(imagen) - min(imagen))

# Mostrar la imagen normalizada
plot(imagen_normalizada)

Biblioteca ‘EBImage’:

# Instalar la biblioteca EBImage si no está instalada
# install.packages("EBImage")

# Cargar la biblioteca EBImage
library(EBImage)

# Cargar la imagen
imagen <- readImage("ruta_de_la_imagen.jpg")

# Normalizar la imagen
imagen_normalizada <- normalize(imagen)

# Mostrar la imagen normalizada
display(imagen_normalizada)

En Python:

Biblioteca ‘OpenCV’:

import cv2
import numpy as np

# Cargar la imagen en escala de grises
imagen = cv2.imread("ruta_de_la_imagen.jpg", cv2.IMREAD_GRAYSCALE)

# Normalizar la imagen
imagen_normalizada = cv2.normalize(imagen, None, 0, 255, cv2.NORM_MINMAX)

# Mostrar la imagen normalizada
cv2.imshow("Imagen normalizada", imagen_normalizada)
cv2.waitKey(0)
cv2.destroyAllWindows()

Biblioteca ‘scikit-image’:

import skimage.io as io
from skimage import exposure

# Cargar la imagen en escala de grises
imagen = io.imread("ruta_de_la_imagen.jpg", as_gray=True)

# Normalizar la imagen utilizando la ecualización del histograma
imagen_normalizada = exposure.equalize_hist(imagen)

# Mostrar la imagen normalizada
io.imshow(imagen_normalizada)
io.show()

Ten en cuenta que el enfoque específico puede variar según tus requisitos y el tipo de normalización que desees aplicar, como ajuste de contraste, ecualización de histograma u otros métodos avanzados.

Técnicas de escalamiento

Las técnicas de escalamiento son herramientas fundamentales en el preprocesamiento de datos para asegurar que las variables tengan un rango de valores adecuado y comparable.

Estas técnicas de escalamiento son útiles para ajustar el rango de valores de las variables y preparar los datos para análisis estadístico o modelado:

El Escalamiento de Puntuación es útil para comparar y clasificar valores relativos. Los datos deben tener una distribución normal o asumirse que siguen una distribución normal para obtener los mejores resultados con esta técnica.

Código en R:

# Cargar la biblioteca dplyr
library(dplyr)

# Crear el dataset ficticio
datos <- data.frame(
Variable1 = c(10, 20, 15, 25, 30),
Variable2 = c(5, 12, 8, 20, 15),
Variable3 = c("A", "B", "A", "B", "A")
)

# Aplicar el Escalamiento de Puntuación a las variables numéricas
datos_scaled <- datos %>%
mutate(across(where(is.numeric), scale))

# Mostrar los resultados
print(datos_scaled)
Variable1 Variable2 Variable3
1 -1.069045 -1.166667 A
2 -0.267261 -0.471405 B
3 -0.801784 -0.943880 A
4 0.267261 0.942809 B
5 1.870829 0.638144 A

Código en Python:

import pandas as pd
from sklearn.preprocessing import StandardScaler

# Crear el dataset ficticio
datos = pd.DataFrame({
'Variable1': [10, 20, 15, 25, 30],
'Variable2': [5, 12, 8, 20, 15],
'Variable3': ['A', 'B', 'A', 'B', 'A']
})

# Separar las variables categóricas y numéricas
variables_numericas = datos[['Variable1', 'Variable2']]
variable_categorica = datos['Variable3']

# Aplicar el Escalamiento de Puntuación a las variables numéricas
scaler = StandardScaler()
variables_numericas_scaled = scaler.fit_transform(variables_numericas)

# Crear un nuevo DataFrame con los resultados
datos_scaled = pd.DataFrame(variables_numericas_scaled, columns=['Variable1', 'Variable2'])
datos_scaled['Variable3'] = variable_categorica

# Mostrar los resultados
print(datos_scaled)
  Variable1  Variable2 Variable3
0 -1.069045 -1.166667 A
1 -0.267261 -0.471405 B
2 -0.801784 -0.943880 A
3 0.267261 0.942809 B
4 1.870829 0.638144 A

Los valores escalados ahora tienen una media de cero y una desviación estándar de uno. Esto significa que los valores están centrados alrededor de cero y se ajustan según su variabilidad relativa.

El Escalamiento por Unidad de Longitud es adecuado cuando las magnitudes absolutas no son relevantes pero las proporciones sí lo son. Los datos deben representar vectores o puntos en un espacio n-dimensional, y se asume que los valores tienen una representación numérica significativa.

Código en R:

# Cargar la biblioteca dplyr
library(dplyr)

# Crear el dataset ficticio
datos <- data.frame(
Variable1 = c(10, 20, 15, 25, 30),
Variable2 = c(5, 12, 8, 20, 15),
Variable3 = c("A", "B", "A", "B", "A")
)

# Aplicar el Escalamiento por Unidad de Longitud a las variables numéricas
datos_scaled <- datos %>%
mutate(across(where(is.numeric), ~ . / sqrt(sum(.^2))))

# Mostrar los resultados
print(datos_scaled)
  Variable1 Variable2 Variable3
1 0.4258051 0.2175971 A
2 0.8516102 0.5227401 B
3 0.6387076 0.3485482 A
4 1.0645127 0.8713704 B
5 1.2774153 0.6528228 A

Código en Python:

import pandas as pd
import numpy as np

# Crear el dataset ficticio
datos = pd.DataFrame({
'Variable1': [10, 20, 15, 25, 30],
'Variable2': [5, 12, 8, 20, 15],
'Variable3': ['A', 'B', 'A', 'B', 'A']
})

# Separar las variables categóricas y numéricas
variables_numericas = datos[['Variable1', 'Variable2']]
variable_categorica = datos['Variable3']

# Aplicar el Escalamiento por Unidad de Longitud a las variables numéricas
variables_numericas_scaled = variables_numericas.apply(lambda x: x / np.linalg.norm(x), axis=0)

# Crear un nuevo DataFrame con los resultados
datos_scaled = pd.concat([variables_numericas_scaled, variable_categorica], axis=1)

# Mostrar los resultados
print(datos_scaled)
Variable1  Variable2 Variable3
0 0.425805 0.217597 A
1 0.851610 0.522740 B
2 0.638708 0.348548 A
3 1.064513 0.871370 B
4 1.277415 0.652823 A

Cada valor se divide por la longitud (norma) del vector formado por los valores de la variable. Esto garantiza que los valores escalados tengan una longitud unitaria, lo que facilita la comparación y el análisis de las direcciones o proporciones entre los valores.

El Escalamiento por Decimales Centrados permite ajustar el rango de valores sin cambiar la forma de la distribución de los datos.

Código en R:

# Cargar la biblioteca dplyr
library(dplyr)

# Crear el dataset ficticio
datos <- data.frame(
Variable1 = c(10, 20, 15, 25, 30),
Variable2 = c(5, 12, 8, 20, 15),
Variable3 = c("A", "B", "A", "B", "A")
)

# Aplicar el Escalamiento por Decimales Centrados a las variables numéricas
datos_scaled <- datos %>%
mutate(across(where(is.numeric), ~ . / (10 ^ (ceiling(log10(max(abs(.))))))))

# Mostrar los resultados
print(datos_scaled)
 Variable1 Variable2 Variable3
1 1.0 0.5 A
2 2.0 1.2 B
3 1.5 0.8 A
4 2.5 2.0 B
5 3.0 1.5 A

Código en Python:

import pandas as pd
import numpy as np

# Crear el dataset ficticio
datos = pd.DataFrame({
'Variable1': [10, 20, 15, 25, 30],
'Variable2': [5, 12, 8, 20, 15],
'Variable3': ['A', 'B', 'A', 'B', 'A']
})

# Separar las variables categóricas y numéricas
variables_numericas = datos[['Variable1', 'Variable2']]
variable_categorica = datos['Variable3']

# Aplicar el Escalamiento por Decimales Centrados a las variables numéricas
datos_scaled = variables_numericas.apply(lambda x: x / (10 ** np.ceil(np.log10(np.max(np.abs(x))))))

# Crear un nuevo DataFrame con los resultados
datos_scaled['Variable3'] = variable_categorica

# Mostrar los resultados
print(datos_scaled)
 Variable1  Variable2 Variable3
0 1.0 0.5 A
1 2.0 1.2 B
2 1.5 0.8 A
3 2.5 2.0 B
4 3.0 1.5 A

Es importante tener en cuenta que el Escalamiento por Decimales Centrados se aplica únicamente a las variables numéricas y no cambia la forma de la distribución de los datos, sino que solo ajusta el rango de valores

Cada valor se divide por un múltiplo de 10, que se determina según el máximo valor absoluto de las variables, se puede observar que los valores están en el rango de [0, 3], lo que indica un ajuste del rango original.

En conclusión, en este artículo hemos explorado diversas técnicas de estandarización y normalización de variables, brindando una visión general de su utilidad, aplicaciones y cómo implementarlas en los lenguajes de programación R y Python.

Hemos cubierto una variedad de técnicas, comenzando con la Estandarización Z-score, que es útil para estandarizar variables numéricas alrededor de su media y desviación estándar. También hemos presentado el Escalamiento Robusto (Robust Scaling), que es adecuado para datos con valores atípicos, y el Escalamiento Min-Max, que ajusta los valores en un rango específico.

También hemos considerado la Transformación Logarítmica, que puede ser útil cuando los datos tienen una distribución sesgada, hemos explorado la Normalización de Imágenes, que es útil para ajustar los valores de píxeles en imágenes a un rango específico, mejorando así la comparabilidad y el rendimiento de algoritmos de visión por computadora.

Asimismo, hemos analizado el Escalamiento por Unidad de Longitud y el Escalamiento de Puntuación, que son técnicas valiosas cuando se busca comparar y clasificar valores relativos.

Además, hemos explorado el Escalamiento por Decimales Centrados, que ajusta el rango de valores sin cambiar la forma de la distribución de los datos.

A lo largo del artículo, hemos proporcionado ejemplos prácticos de aplicación de estas técnicas en diferentes sectores, como el financiero, el retail, el manufacturero y los servicios. Los códigos en R y Python han sido presentados para facilitar su implementación en proyectos reales.

En resumen, estas técnicas de estandarización y normalización son herramientas poderosas para preparar y procesar datos en diversos análisis y aplicaciones. La elección de la técnica adecuada dependerá del contexto, los requisitos específicos de los datos y los objetivos del análisis. Con una comprensión sólida de estas técnicas y la capacidad de implementarlas en R y Python, los profesionales de datos estarán mejor equipados para optimizar el rendimiento de sus modelos y extraer información valiosa de sus conjuntos de datos.

--

--

Nicolás Urrego

Data Scientis | Data Analyst | Data Base | Machine Learning | Communicator | El mundo de datos en español para descubrir, aprender y compartir. 💡👨‍💻📈