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.

🔹 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` ;

Creación de tabla
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);

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

Borrar columnas que no sirven
Eliminar espacios antes y después de cada valor
-- 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 ();

Eliminar las filas repetidas
-- 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;

Eliminar o rellenar nulos
/*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() ;

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)
Columnas tipo entero (INT)
-- 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;
