Thanks for your help @Xuanqi_Liu, I share the code of the sample dataset I'm using. The input table for KMeans is the encoded table:
CREATE COLUMN TABLE DATA_INPUT_CLIENTI_ENERGIA (
"ID" INTEGER,
"NOME" NVARCHAR (50),
"RANGE_ETA" NVARCHAR (10),
"REGIONE" NVARCHAR (30),
"AREA_GEOGRAFICA" NVARCHAR (20),
"CONSUMO_KWH_TOTALE" DECIMAL (6,2),
"CONSUMO_KWH_F1" DECIMAL (6,2),
"CONSUMO_KWH_F2" DECIMAL (6,2),
"CONSUMO_KWH_F3" DECIMAL (6,2),
"COSTO_KWH" DECIMAL (4,3),
"TIPO_USO" NVARCHAR (20)
);
DO BEGIN
DECLARE i INT = 1;
DECLARE totale DECIMAL(6,2);
DECLARE f1 DECIMAL(6,2);
DECLARE f2 DECIMAL(6,2);
DECLARE f3 DECIMAL(6,2);
DECLARE max_f2_perc DECIMAL(5,4);
DECLARE f1_perc DECIMAL(5,4);
DECLARE f2_perc DECIMAL(5,4);
DECLARE regione VARCHAR(50);
DECLARE area_geografica VARCHAR(20);
WHILE :i <= 10000 DO
totale := ROUND(500 + RAND() * 4500, 2); -- Totale tra 500 e 5000
f1_perc := 0.30 + RAND() * 0.20;
f1 := ROUND(totale * f1_perc, 2);
max_f2_perc := LEAST(0.50, 1.00 - f1_perc); -- max 50%, ma non oltre 100%-F1
f2_perc := 0.30 + RAND() * (max_f2_perc - 0.30);
f2 := ROUND(totale * f2_perc, 2);
f3 := ROUND(totale - f1 - f2, 2);
regione := CASE MOD(:i, 20)
WHEN 0 THEN 'Lombardia'
WHEN 1 THEN 'Lazio'
WHEN 2 THEN 'Campania'
WHEN 3 THEN 'Sicilia'
WHEN 4 THEN 'Veneto'
WHEN 5 THEN 'Emilia-Romagna'
WHEN 6 THEN 'Piemonte'
WHEN 7 THEN 'Puglia'
WHEN 8 THEN 'Toscana'
WHEN 9 THEN 'Calabria'
WHEN 10 THEN 'Sardegna'
WHEN 11 THEN 'Liguria'
WHEN 12 THEN 'Marche'
WHEN 13 THEN 'Abruzzo'
WHEN 14 THEN 'Friuli-Venezia Giulia'
WHEN 15 THEN 'Trentino-Alto Adige'
WHEN 16 THEN 'Umbria'
WHEN 17 THEN 'Basilicata'
WHEN 18 THEN 'Molise'
ELSE 'Valle d Aosta'
END;
area_geografica := CASE
WHEN regione IN ('Piemonte', 'Lombardia', 'Veneto', 'Emilia-Romagna', 'Liguria', 'Friuli-Venezia Giulia',
'Trentino-Alto Adige', 'Valle d Aosta') THEN 'Nord'
WHEN regione IN ('Toscana', 'Marche', 'Lazio', 'Umbria', 'Abruzzo') THEN 'Centro'
WHEN regione IN ('Campania', 'Puglia', 'Molise', 'Basilicata', 'Calabria') THEN 'Sud'
WHEN regione IN ('Sicilia', 'Sardegna') THEN 'Isole'
ELSE 'Altro'
END;
INSERT INTO DATA_INPUT_CLIENTI_ENERGIA (
ID,
NOME,
RANGE_ETA,
REGIONE,
AREA_GEOGRAFICA,
CONSUMO_KWH_TOTALE,
CONSUMO_KWH_F1,
CONSUMO_KWH_F2,
CONSUMO_KWH_F3,
COSTO_KWH,
TIPO_USO
)
VALUES (
:i,
'cliente_' || :i,
CASE MOD(:i, 5)
WHEN 0 THEN '18-25'
WHEN 1 THEN '26-35'
WHEN 2 THEN '36-45'
WHEN 3 THEN '46-60'
ELSE '60+'
END,
:regione,
:area_geografica,
:totale,
:f1,
:f2,
:f3,
ROUND(0.150 + RAND() * 0.150, 3),
CASE MOD(:i, 4)
WHEN 0 THEN 'Residenziale'
WHEN 1 THEN 'Industriale'
WHEN 2 THEN 'Commerciale'
ELSE 'Agricolo'
END
);
i := :i + 1;
END WHILE;
END;
CREATE COLUMN TABLE DATA_INPUT_ENCODED_CLIENTI_ENERGIA (
"ID" INTEGER,
"NOME" NVARCHAR (50),
"RANGE_ETA_ENCODED" INTEGER,
"REGIONE_ENCODED" INTEGER,
"AREA_GEOGRAFICA_ENCODED" INTEGER,
"CONSUMO_KWH_TOTALE" DECIMAL (6,2),
"CONSUMO_KWH_F1" DECIMAL (6,2),
"CONSUMO_KWH_F2" DECIMAL (6,2),
"CONSUMO_KWH_F3" DECIMAL (6,2),
"COSTO_KWH" DECIMAL (4,3),
"TIPO_USO_ENCODED" INTEGER
);
INSERT INTO DATA_INPUT_ENCODED_CLIENTI_ENERGIA
SELECT
ID,
nome,
CASE
WHEN range_eta = '18-25' THEN 0
WHEN range_eta = '26-35' THEN 1
WHEN range_eta = '36-45' THEN 2
WHEN range_eta = '46-60' THEN 3
WHEN range_eta = '60+' THEN 4
ELSE 5
END AS range_eta_encoded,
CASE
WHEN regione = 'Lombardia' THEN 0
WHEN regione = 'Lazio' THEN 1
WHEN regione = 'Campania' THEN 2
WHEN regione = 'Sicilia' THEN 3
WHEN regione = 'Veneto' THEN 4
WHEN regione = 'Emilia-Romagna' THEN 5
WHEN regione = 'Piemonte' THEN 6
WHEN regione = 'Puglia' THEN 7
WHEN regione = 'Toscana' THEN 8
WHEN regione = 'Calabria' THEN 9
WHEN regione = 'Sardegna' THEN 10
WHEN regione = 'Liguria' THEN 11
WHEN regione = 'Marche' THEN 12
WHEN regione = 'Abruzzo' THEN 13
WHEN regione = 'Friuli-Venezia Giulia' THEN 14
WHEN regione = 'Trentino-Alto Adige' THEN 15
WHEN regione = 'Umbria' THEN 16
WHEN regione = 'Basilicata' THEN 17
WHEN regione = 'Molise' THEN 18
ELSE 19
END AS regione_encoded,
CASE
WHEN area_geografica = 'Nord' THEN 0
WHEN area_geografica = 'Centro' THEN 1
WHEN area_geografica = 'Sud' THEN 2
WHEN area_geografica = 'Isole' THEN 4
ELSE 5
END AS area_geografica_encoded,
CONSUMO_KWH_TOTALE,
CONSUMO_KWH_F1,
CONSUMO_KWH_F2,
CONSUMO_KWH_F3,
COSTO_KWH,
CASE
WHEN tipo_uso = 'Residenziale' THEN 0
WHEN tipo_uso = 'Industriale' THEN 1
WHEN tipo_uso = 'Agricolo' THEN 2
WHEN tipo_uso = 'Commerciale' THEN 3
ELSE 4
END AS tipo_uso_encoded
FROM DATA_INPUT_CLIENTI_ENERGIA;
I look forward for your reply, thank you
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.