🎯 SQL para Limpieza y Casting de Datos en MySQL

Objetivo principal: Identificar los factores clave que predicen el incumplimiento de pago mediante el análisis de datos financieros y sociodemográficos.
Acción propuesta: Desarrollar un modelo de machine learning para predecir la probabilidad de que un préstamo caiga en morosidad.
Propósito: Automatizar la evaluación del riesgo crediticio para instituciones financieras, permitiéndoles tomar decisiones más informadas y reducir su cartera vencida.
Se implementó un flujo de limpieza de datos en MySQL utilizando SQL puro. El objetivo fue depurar, transformar y preparar una tabla con datos crudos mediante eliminación de duplicados, tratamiento de nulos, limpieza de texto y conversión de tipos.

1. Estructurar esquema para la tabla

🔹 Objetivo: Preparar el espacio donde se trabajarán y almacenarán los datos.

Esquema de trabajo
Se crea un esquema (autos) para mantener el proyecto organizado.

Tablas (crudas)
Se crean tablas para importar los datos y se importan los datos.

Creación de esquema

CREATE SCHEMA `automoviles` ;

CREATE TABLE `autos`.`dataautos` (
  `unnamed` INT NULL,
  `DataAutoscol` VARCHAR(45) NULL,
  `date_crawled` VARCHAR(45) NULL,
  `car_name` VARCHAR(45) NULL,
  `price_EUR` VARCHAR(45) NULL,
  `ab_test` VARCHAR(45) NULL,
  `vehicle_type` VARCHAR(45) NULL,
  `registration_year` VARCHAR(45) NULL,
  `transmission` VARCHAR(45) NULL,
  `power_ps` VARCHAR(45) NULL,
  `model` VARCHAR(45) NULL,
  `odometer_km` VARCHAR(45) NULL,
  `registration_month` VARCHAR(45) NULL,
  `fuel_type` VARCHAR(45) NULL,
  `brand` VARCHAR(45) NULL,
  `unrepaired_damage` VARCHAR(45) NULL,
  `ad_created` VARCHAR(45) NULL,
  `postal_code` VARCHAR(45) NULL,
  `last_seen` VARCHAR(45) NULL);

-- Se crea el Store Procedure para monitorear continuamente las actualizaciones
DELIMITER //
CREATE PROCEDURE tabComp ()
BEGIN 
	SELECT * FROM dataautos LIMIT 20;
END //
DELIMITER ;

CALL tabComp ();

2. Limpieza de los datos

🔹 Objetivo: Corregir errores, formatos inconsistentes o datos sucios sin afectar aún las tablas finales.

Revisión de tipos y formatos
Asegurar que las fechas sean válidas, los números estén bien escritos, que no haya espacios antes o después de campos, etc.

Corrección de textos
Quitar espacios extra, poner nombres en mayúscula o minúscula, etc.

Valores nulos y registros incompletos
Decidir si rellenar, eliminar o dejar registros con datos faltantes.

Detección y tratamiento de duplicados
Identifica claves duplicadas o filas exactamente iguales y decide si conservar solo una.

Borrar columnas que no sirven

-- Se elimina por ser un ID inconsistente 
ALTER TABLE dataautos
DROP COLUMN unnamed;

-- Esta columna Se mostraba totalmente nula
ALTER TABLE dataautos
DROP COLUMN DataAutoscol;

CALL tabComp ();

-- Desactivar el modo seguro (safe update mode) para ejecutar UPDATE
SET SQL_SAFE_UPDATES = 0;

-- Limpiar los espacios al inicio y al final de cada columna
UPDATE dataautos 
SET 
    date_crawled = TRIM(date_crawled);
UPDATE dataautos 
SET 
    car_name = TRIM(car_name);
UPDATE dataautos 
SET 
    price_EUR = TRIM(price_EUR);
UPDATE dataautos 
SET 
    ab_test = TRIM(ab_test);
UPDATE dataautos 
SET 
    vehicle_type = TRIM(vehicle_type);
UPDATE dataautos 
SET 
    registration_year = TRIM(registration_year);
UPDATE dataautos 
SET 
    transmission = TRIM(transmission);
UPDATE dataautos 
SET 
    power_ps = TRIM(power_ps);
UPDATE dataautos 
SET 
    model = TRIM(model);
UPDATE dataautos 
SET 
    odometer_km = TRIM(odometer_km);
UPDATE dataautos 
SET 
    registration_month = TRIM(registration_month);
UPDATE dataautos 
SET 
    fuel_type = TRIM(fuel_type);
UPDATE dataautos 
SET 
    brand = TRIM(brand);
UPDATE dataautos 
SET 
    unrepaired_damage = TRIM(unrepaired_damage);
UPDATE dataautos 
SET 
    ad_created = TRIM(ad_created);
UPDATE dataautos 
SET 
    postal_code = TRIM(postal_code);
UPDATE dataautos 
SET 
    last_seen = TRIM(last_seen);

-- Verificar
CALL tabCElimar las filas repetidasomp ();
-- Verificar la existencia de filas duplicadas
SELECT 
    COUNT(*) - COUNT(DISTINCT CONCAT_WS('|',
                date_crawled,
                car_name,
                price_EUR,
                ab_test,
                vehicle_type,
                registration_year,
                transmission,
                power_ps,
                model,
                odometer_km,
                registration_month,
                fuel_type,
                brand,
                unrepaired_damage,
                ad_created,
                postal_code,
                last_seen)) AS filas_duplicadas
FROM
    dataautos;

/* Se crea una tabla temporal con solo filas 
unicas. Dedido a que no contamos con una primary key,
Elegimos solo las filas unicas en una tabla temporal 
a la que eliminaremos despues de limpiar.*/

CREATE TEMPORARY TABLE tmp AS
SELECT DISTINCT * FROM dataautos;

TRUNCATE TABLE dataautos;

INSERT INTO dataautos
SELECT * FROM tmp;

DROP TABLE tmp;
-- Verificar la existencia de filas duplicadas
SELECT 
    COUNT(*) - COUNT(DISTINCT CONCAT_WS('|',
                date_crawled,
                car_name,
                price_EUR,
                ab_test,
                vehicle_type,
                registration_year,
                transmission,
                power_ps,
                model,
                odometer_km,
                registration_month,
                fuel_type,
                brand,
                unrepaired_damage,
                ad_created,
                postal_code,
                last_seen)) AS filas_duplicadas
FROM
    dataautos;

/*Elimino los valores nulos de la columna car_name debido 
a que ese dato no lo podemos estimar*/
DELETE FROM dataautos 
WHERE
    car_name IS NULL OR car_name = '';

CALL tabComp() ;

-- Rellenar columnas con valores estimados
UPDATE dataautos 
SET 
    date_crawled = '2016-03-30 12:00'
WHERE
    date_crawled IS NULL
        OR date_crawled = '';

UPDATE dataautos 
SET 
    ab_test = 'unknown'
WHERE
    ab_test IS NULL
        OR ab_test = '';

UPDATE dataautos 
SET 
    vehicle_type = 'unknown'
WHERE
    vehicle_type IS NULL
        OR vehicle_type = '';
        
UPDATE dataautos 
SET 
   transmission  = 'unknown'
WHERE
    transmission IS NULL
        OR transmission = '';

UPDATE dataautos 
SET 
    model = 'unknown'
WHERE
    model IS NULL
        OR model = '';

UPDATE dataautos 
SET 
    fuel_type = 'Unknown'
WHERE
    fuel_type IS NULL
        OR fuel_type = '';

UPDATE dataautos 
SET 
    unrepaired_damage = 'Unknown'
WHERE
    unrepaired_damage IS NULL
        OR unrepaired_damage = '';

UPDATE dataautos 
SET 
    ad_created = '2016-05-30 12:00'
WHERE
    ad_created IS NULL
        OR ad_created = '';
        
UPDATE dataautos 
SET 
    postal_code = '00000'
WHERE
    postal_code IS NULL
        OR postal_code = '';

UPDATE dataautos 
SET 
    last_seen = '2016-06-30 12:00'
WHERE
    last_seen IS NULL
        OR last_seen = '';

-- Verificar
CALL tabComp() ;

-- Quitar caracteres 
UPDATE dataautos
SET price_EUR = TRIM(REPLACE(price_EUR, '€', ''));

-- Verificar
CALL tabComp() ;
🔹 Objetivo: Corregir errores, formatos inconsistentes o datos sucios sin afectar aún las tablas finales.

Revisión de tipos y formatos
Asegurar que las fechas sean válidas, los números estén bien escritos, que no haya espacios antes o después de campos, etc.

Corrección de textos
Quitar espacios extra, poner nombres en mayúscula o minúscula, etc.

Valores nulos y registros incompletos
Decidir si rellenar, eliminar o dejar registros con datos faltantes.

Detección y tratamiento de duplicados
Identifica claves duplicadas o filas exactamente iguales y decide si conservar solo una.

3. Conversión de tipos de datos

Objetivo: Optimizar la estructura de la base de datos definiendo tipos de datos precisos (INT, VARCHAR, DATE, etc.) para cada columna, mejorando el rendimiento, la integridad de los datos y la eficiencia en consultas.

- Conversión de formatos incorrectos (ej: texto → fechas).

- Asignación de longitudes adecuadas (ej: VARCHAR para cadenas).

- Validación de datos existentes.

Columnas tipo fecha (DATE o DATETIME)

-- Se cambia el tipo de dato a tipo fecha 

ALTER TABLE dataautos
MODIFY COLUMN date_crawled DATETIME;

ALTER TABLE dataautos
MODIFY COLUMN ad_created DATETIME;

ALTER TABLE dataautos
MODIFY COLUMN last_seen DATETIME;

-- Mostrar el tipo de columna
SHOW COLUMNS FROM dataautos;

-- Convertir (varchar) a (int)
ALTER TABLE dataautos
MODIFY COLUMN price_EUR INT;

ALTER TABLE dataautos
MODIFY COLUMN registration_year INT;

ALTER TABLE dataautos
MODIFY COLUMN power_ps INT;

ALTER TABLE dataautos
MODIFY COLUMN odometer_km INT;

ALTER TABLE dataautos
MODIFY COLUMN registration_month INT;

ALTER TABLE dataautos
MODIFY COLUMN postal_code INT;

-- Mostrar el tipo de columna
SHOW COLUMNS FROM dataautos;