Add analyse sql & source

master
Félix Desmaretz 2024-07-03 20:21:19 +02:00
parent 637a55dfe6
commit a9c3619988
4 changed files with 37495 additions and 0 deletions

180
analyse-duckdb.sql Normal file
View File

@ -0,0 +1,180 @@
-------------------------
-- Prep
-------------------------
SET file_search_path = '/home/daifukusan/Documents/analysis/legislatives2024/res/';
CREATE OR REPLACE TEMP TABLE nuances AS
SELECT
*,
CASE
WHEN orientation = 'Extrême Gauche' THEN -2
WHEN orientation = 'Gauche' THEN -1
WHEN orientation = 'Centre' THEN 0
WHEN orientation = 'Droite' THEN 1
WHEN orientation = 'Extrême Droite' THEN 2
END AS 'orientation_num'
FROM read_csv_auto('nuances.csv');
CREATE OR REPLACE TEMP TABLE raw AS
SELECT
regexp_extract(region, '\((.+)\)', 1) AS region_code,
region,
regexp_extract(circo, '\((.+)\)', 1) AS circo_code,
circo,
trim(results->'$[0]', '"') AS nuance,
trim(results->'$[1]', '"') AS candidat,
CAST(results->'$[2]' AS BIGINT) AS voix,
CAST(results->'$[3]' AS DECIMAL) AS inscrits,
CAST(results->'$[4]' AS DECIMAL) AS exprimes,
trim(results->'$[5]', '"') AS qualif,
FROM (
SELECT region, circo, unnest(results) AS results
FROM read_json_auto('legislatives_2024_fr_results.json')
) AS t;
CREATE OR REPLACE TEMP TABLE undecided AS
WITH with_qualif AS (
SELECT DISTINCT region, circo
FROM raw
WHERE qualif = 'QUALIF T2'
)
SELECT r.* FROM raw AS r
JOIN with_qualif AS u
ON u.region = r.region
AND u.circo = r.circo;
-------------------
-- Analyse
-------------------
-- Configurations de second tours par ordre de voix par qualifiés
WITH versus AS (
SELECT region, circo, string_agg(nuance, ', ' ORDER BY exprimes) AS vs
FROM raw
WHERE qualif = 'QUALIF T2'
GROUP BY region, circo
ORDER BY region, circo
)
SELECT
count(*) AS "nombre",
vs AS "configuration" FROM versus
GROUP BY vs
ORDER BY "nombre" DESC;
-- Nombre de 2n tours
SELECT
CASE WHEN qualif = 'OUI' THEN 'NON' ELSE 'OUI' END AS '2nd tour ?',
count(*) as 'nombre'
FROM (SELECT DISTINCT region, circo, qualif FROM raw WHERE qualif in ('QUALIF T2', 'OUI')) AS t
GROUP BY qualif;
-- Nombre de circonscriptions qui auront un 2nd tour dans lesquelles NFP est arrivé à telle ou telle position au premier tour:
WITH ordered AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY region, circo ORDER BY exprimes DESC) AS pos
FROM raw
WHERE qualif = 'QUALIF T2'
)
SELECT pos AS "Position 1er tour", count(*) AS "Nombre de Circonscription" FROM ordered
WHERE nuance = 'UG'
GROUP BY pos
ORDER BY pos;
----------------------
-- Projection
----------------------
CREATE OR REPLACE TEMP TABLE cleaned_undecided AS
SELECT
region_code,
circo_code,
region,
circo,
nuance,
candidat,
voix,
inscrits,
exprimes,
CASE WHEN qualif = 'NON' THEN FALSE ELSE TRUE END AS qualified,
code,
nom,
orientation,
orientation_num,
ROW_NUMBER() OVER (PARTITION BY region, circo ORDER BY exprimes DESC) AS pos
FROM undecided AS r
JOIN nuances AS n
ON r.nuance = n.code;
CREATE OR REPLACE TEMP TABLE report_voix_duel AS
SELECT
*
FROM read_csv_auto('report_voix_duel.csv');
CREATE OR REPLACE TEMP TABLE tour_2 AS
WITH duels AS (
SELECT circo_code, list(orientation ORDER BY orientation) AS orientations
FROM cleaned_undecided
WHERE qualified = TRUE
AND pos <= 2
GROUP BY circo_code
)
SELECT
cu.*,
CASE WHEN orientation = 'Extrême Gauche' THEN 'Gauche' ELSE orientation END AS bucket_orientation,
CASE WHEN orientation_num = -2 THEN -1 ELSE orientation_num END AS bucket_orientation_num,
d.orientations[1] AS orientation_candidat_1,
d.orientations[2] AS orientation_candidat_2
FROM cleaned_undecided AS cu
JOIN duels AS d
ON d.circo_code = cu.circo_code;
-----
-- Circonscriptions dans lesquelles il y a 2 candidats de même orientation
SELECT region, circo, orientation, string_agg(nuance, ', ' ORDER BY exprimes DESC) AS nuances
FROM cleaned_undecided
WHERE qualified = TRUE
GROUP BY region, circo, orientation
HAVING count(*) >= 2
ORDER BY orientation, region, circo
-- Duels en cas de désistement automatique
WITH duels_circo AS (
SELECT DISTINCT circo_code, orientation_candidat_1, orientation_candidat_2
FROM tour_2
)
SELECT orientation_candidat_1, orientation_candidat_2, count(*) AS n
FROM duels_circo
GROUP BY orientation_candidat_1, orientation_candidat_2
ORDER BY n DESC;
-- Après report de voix
WITH report AS (
SELECT dc.region, dc.circo, rvd."to" AS orientation, dc.exprimes * rvd.quantity AS projection
FROM tour_2 AS dc
JOIN report_voix_duel AS rvd
ON (
dc.orientation_candidat_1 = rvd.candidat_1 AND dc.orientation_candidat_2 = rvd.candidat_2
OR dc.orientation_candidat_1 = rvd.candidat_2 AND dc.orientation_candidat_2 = rvd.candidat_1
) AND rvd."from" = dc.orientation
ORDER BY circo_code
), agg_projection AS (
SELECT region, circo, orientation, sum(projection) AS projection
FROM report
GROUP BY region, circo, orientation
ORDER BY region, circo, orientation
), ordered_projection AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY region, circo ORDER BY projection DESC) AS pos
FROM agg_projection
)
SELECT orientation, count(*) AS n
FROM ordered_projection
WHERE pos = 1
GROUP BY orientation
ORDER BY n DESC;

File diff suppressed because it is too large Load Diff

23
res/nuances.csv Normal file
View File

@ -0,0 +1,23 @@
code,nom,orientation
RN,Rassemblement National,Extrême Droite
UG,Union de la gauche,Gauche
ENS,Ensemble !,Centre
LR,Les Républicains,Droite
UXD,Union de l'extrême droite,Extrême Droite
DVD,Divers droite,Droite
DVG,Divers gauche,Gauche
DVC,Divers centre,Centre
EXG,Extrême gauche,Extrême Gauche
REG,Régionaliste,Droite
REC,Reconquête !,Extrême Droite
HOR,Horizons,Centre
ECO,Ecologistes,Gauche
UDI,Union des Démocrates et Indépendants,Centre
DIV,Divers,Centre
DSV,Droite souverainiste,Extrême Droite
EXD,Extrême droite,Extrême Droite
SOC,Parti socialiste,Gauche
RDG,Parti radical de gauche,Gauche
FI,La France insoumise,Gauche
COM,Parti communiste français,Gauche
VEC,Les Ecologistes,Gauche
1 code nom orientation
2 RN Rassemblement National Extrême Droite
3 UG Union de la gauche Gauche
4 ENS Ensemble ! Centre
5 LR Les Républicains Droite
6 UXD Union de l'extrême droite Extrême Droite
7 DVD Divers droite Droite
8 DVG Divers gauche Gauche
9 DVC Divers centre Centre
10 EXG Extrême gauche Extrême Gauche
11 REG Régionaliste Droite
12 REC Reconquête ! Extrême Droite
13 HOR Horizons Centre
14 ECO Ecologistes Gauche
15 UDI Union des Démocrates et Indépendants Centre
16 DIV Divers Centre
17 DSV Droite souverainiste Extrême Droite
18 EXD Extrême droite Extrême Droite
19 SOC Parti socialiste Gauche
20 RDG Parti radical de gauche Gauche
21 FI La France insoumise Gauche
22 COM Parti communiste français Gauche
23 VEC Les Ecologistes Gauche

25
res/report_voix_duel.csv Normal file
View File

@ -0,0 +1,25 @@
candidat_1,candidat_2,from,to,quantity
Extrême Droite,Gauche,Centre,Gauche,0.34
Extrême Droite,Gauche,Centre,Extrême Droite,0.18
Extrême Droite,Gauche,Droite,Gauche,0.36
Extrême Droite,Gauche,Droite,Extrême Droite,0.27
Extrême Droite,Gauche,Extrême Droite,Extrême Droite,1.0
Extrême Droite,Gauche,Gauche,Gauche,1.0
Centre,Gauche,Extrême Droite,Gauche,0.18
Centre,Gauche,Extrême Droite,Centre,0.25
Centre,Gauche,Droite,Gauche,0.20
Centre,Gauche,Droite,Centre,0.40
Centre,Gauche,Centre,Centre,1.0
Centre,Gauche,Gauche,Gauche,1.0
Centre,Extrême Droite,Gauche,Centre,0.31
Centre,Extrême Droite,Gauche,Extrême Droite,0.24
Centre,Extrême Droite,Droite,Centre,0.30
Centre,Extrême Droite,Droite,Extrême Droite,0.20
Centre,Extrême Droite,Centre,Centre,1.0
Centre,Extrême Droite,Extrême Droite,Extrême Droite,1.0
Droite,Extrême Droite,Gauche,Droite,0.31
Droite,Extrême Droite,Gauche,Extrême Droite,0.24
Droite,Extrême Droite,Centre,Droite,0.36
Droite,Extrême Droite,Centre,Extrême Droite,0.27
Droite,Extrême Droite,Droite,Droite,1.0
Droite,Extrême Droite,Extrême Droite,Extrême Droite,1.0
1 candidat_1 candidat_2 from to quantity
2 Extrême Droite Gauche Centre Gauche 0.34
3 Extrême Droite Gauche Centre Extrême Droite 0.18
4 Extrême Droite Gauche Droite Gauche 0.36
5 Extrême Droite Gauche Droite Extrême Droite 0.27
6 Extrême Droite Gauche Extrême Droite Extrême Droite 1.0
7 Extrême Droite Gauche Gauche Gauche 1.0
8 Centre Gauche Extrême Droite Gauche 0.18
9 Centre Gauche Extrême Droite Centre 0.25
10 Centre Gauche Droite Gauche 0.20
11 Centre Gauche Droite Centre 0.40
12 Centre Gauche Centre Centre 1.0
13 Centre Gauche Gauche Gauche 1.0
14 Centre Extrême Droite Gauche Centre 0.31
15 Centre Extrême Droite Gauche Extrême Droite 0.24
16 Centre Extrême Droite Droite Centre 0.30
17 Centre Extrême Droite Droite Extrême Droite 0.20
18 Centre Extrême Droite Centre Centre 1.0
19 Centre Extrême Droite Extrême Droite Extrême Droite 1.0
20 Droite Extrême Droite Gauche Droite 0.31
21 Droite Extrême Droite Gauche Extrême Droite 0.24
22 Droite Extrême Droite Centre Droite 0.36
23 Droite Extrême Droite Centre Extrême Droite 0.27
24 Droite Extrême Droite Droite Droite 1.0
25 Droite Extrême Droite Extrême Droite Extrême Droite 1.0