Compare commits
No commits in common. "a5aef361a768082630992b77623f88da5c33270c" and "a9c3619988164c199525f99998f1d565956c4712" have entirely different histories.
a5aef361a7
...
a9c3619988
15
README.md
15
README.md
|
|
@ -1,15 +0,0 @@
|
||||||
<!-- vscode-markdown-toc -->
|
|
||||||
* 1. [TOC](#TOC)
|
|
||||||
* 2. [Introduction](#Introduction)
|
|
||||||
|
|
||||||
<!-- vscode-markdown-toc-config
|
|
||||||
numbering=true
|
|
||||||
autoSave=true
|
|
||||||
/vscode-markdown-toc-config -->
|
|
||||||
<!-- /vscode-markdown-toc --># Analyse Legislatives 2024
|
|
||||||
|
|
||||||
## 1. <a name='TOC'></a>TOC
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 2. <a name='Introduction'></a>Introduction
|
|
||||||
|
|
@ -132,50 +132,6 @@ FROM cleaned_undecided AS cu
|
||||||
JOIN duels AS d
|
JOIN duels AS d
|
||||||
ON d.circo_code = cu.circo_code;
|
ON d.circo_code = cu.circo_code;
|
||||||
|
|
||||||
CREATE OR REPLACE TEMP TABLE projection AS
|
|
||||||
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
|
|
||||||
)
|
|
||||||
SELECT
|
|
||||||
region,
|
|
||||||
circo,
|
|
||||||
orientation,
|
|
||||||
projection / SUM(projection) OVER (PARTITION BY region, circo) AS projection
|
|
||||||
FROM agg_projection
|
|
||||||
|
|
||||||
CREATE OR REPLACE TEMP TABLE projection_voix AS
|
|
||||||
SELECT
|
|
||||||
dc.region,
|
|
||||||
dc.circo,
|
|
||||||
rvd."to" AS orientation,
|
|
||||||
SUM(dc.voix * 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
|
|
||||||
GROUP BY
|
|
||||||
dc.region,
|
|
||||||
dc.circo,
|
|
||||||
rvd."to"
|
|
||||||
|
|
||||||
-----
|
-----
|
||||||
|
|
||||||
-- Circonscriptions dans lesquelles il y a 2 candidats de même orientation
|
-- Circonscriptions dans lesquelles il y a 2 candidats de même orientation
|
||||||
|
|
@ -197,152 +153,28 @@ GROUP BY orientation_candidat_1, orientation_candidat_2
|
||||||
ORDER BY n DESC;
|
ORDER BY n DESC;
|
||||||
|
|
||||||
-- Après report de voix
|
-- Après report de voix
|
||||||
WITH ordered_projection AS (
|
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
|
SELECT
|
||||||
*,
|
*,
|
||||||
ROW_NUMBER() OVER (PARTITION BY region, circo ORDER BY projection DESC) AS pos
|
ROW_NUMBER() OVER (PARTITION BY region, circo ORDER BY projection DESC) AS pos
|
||||||
FROM projection
|
FROM agg_projection
|
||||||
)
|
)
|
||||||
SELECT orientation, count(*) AS n
|
SELECT orientation, count(*) AS n
|
||||||
FROM ordered_projection
|
FROM ordered_projection
|
||||||
WHERE pos = 1
|
WHERE pos = 1
|
||||||
GROUP BY orientation
|
GROUP BY orientation
|
||||||
ORDER BY n DESC;
|
ORDER BY n DESC;
|
||||||
|
|
||||||
|
|
||||||
-- Projection avec faible écart
|
|
||||||
CREATE OR REPLACE TEMP TABLE difference AS
|
|
||||||
WITH diff_null AS (
|
|
||||||
SELECT
|
|
||||||
p.region,
|
|
||||||
p.circo,
|
|
||||||
FIRST(p.orientation) OVER (PARTITION BY p.region, p.circo ORDER BY p.projection DESC) AS elu,
|
|
||||||
ABS(p.projection - lag(p.projection) OVER (PARTITION BY p.region, p.circo)) AS diff,
|
|
||||||
ABS(pv.projection - lag(pv.projection) OVER (PARTITION BY p.region, p.circo)) AS diff_voix
|
|
||||||
FROM projection AS p
|
|
||||||
JOIN projection_voix AS pv
|
|
||||||
ON p.region = pv.region
|
|
||||||
AND p.circo = pv.circo
|
|
||||||
AND p.orientation = pv.orientation
|
|
||||||
ORDER BY p.region, p.circo
|
|
||||||
), duels_circo AS (
|
|
||||||
SELECT DISTINCT circo_code, region, circo, orientation_candidat_1, orientation_candidat_2
|
|
||||||
FROM tour_2
|
|
||||||
)
|
|
||||||
SELECT dc.*, d.elu, d.diff, d.diff_voix
|
|
||||||
FROM duels_circo AS dc
|
|
||||||
JOIN diff_null AS d
|
|
||||||
ON d.region = dc.region
|
|
||||||
AND d.circo = dc.circo
|
|
||||||
WHERE d.diff IS NOT NULL;
|
|
||||||
|
|
||||||
|
|
||||||
-- Nombre de duels avec un écart entre les candidats de 1, 2, 5, 10, 20 et 50 pourcents
|
|
||||||
WITH bucket_diff_orientation AS (
|
|
||||||
SELECT
|
|
||||||
orientation_candidat_1 || ' v ' || orientation_candidat_2 AS duel,
|
|
||||||
elu AS "projection élu",
|
|
||||||
SUM(CASE WHEN diff < 0.01 THEN 1 ELSE 0 END) AS "1%",
|
|
||||||
SUM(CASE WHEN diff < 0.02 THEN 1 ELSE 0 END) AS "2%",
|
|
||||||
SUM(CASE WHEN diff < 0.05 THEN 1 ELSE 0 END) AS "5%",
|
|
||||||
SUM(CASE WHEN diff < 0.10 THEN 1 ELSE 0 END) AS "10%",
|
|
||||||
SUM(CASE WHEN diff < 0.20 THEN 1 ELSE 0 END) AS "20%",
|
|
||||||
SUM(CASE WHEN diff < 0.50 THEN 1 ELSE 0 END) AS "50%",
|
|
||||||
COUNT(*) AS total
|
|
||||||
FROM difference
|
|
||||||
GROUP BY
|
|
||||||
orientation_candidat_1,
|
|
||||||
orientation_candidat_2,
|
|
||||||
elu
|
|
||||||
), ordered_bucket_diff_orientation AS (
|
|
||||||
SELECT
|
|
||||||
*,
|
|
||||||
ROW_NUMBER() OVER (ORDER BY duel DESC, "projection élu" DESC) AS r
|
|
||||||
FROM bucket_diff_orientation
|
|
||||||
), res AS (
|
|
||||||
SELECT *
|
|
||||||
FROM ordered_bucket_diff_orientation
|
|
||||||
UNION ALL
|
|
||||||
SELECT
|
|
||||||
'TOTAL' AS duel,
|
|
||||||
'' AS "projection élu",
|
|
||||||
SUM("1%") AS "1%",
|
|
||||||
SUM("2%") AS "3%",
|
|
||||||
SUM("5%") AS "5%",
|
|
||||||
SUM("10%") AS "10%",
|
|
||||||
SUM("20%") AS "30%",
|
|
||||||
SUM("50%") AS "50%",
|
|
||||||
SUM(total) AS total,
|
|
||||||
0 AS r
|
|
||||||
FROM ordered_bucket_diff_orientation
|
|
||||||
)
|
|
||||||
SELECT * EXCLUDE (r)
|
|
||||||
FROM res
|
|
||||||
ORDER BY r DESC;
|
|
||||||
|
|
||||||
|
|
||||||
-- Pour les ecarts de moins de 5%, à combien de voix cela se joue ?
|
|
||||||
SELECT
|
|
||||||
orientation_candidat_1 || ' v ' || orientation_candidat_2 AS duel,
|
|
||||||
elu AS "projection élu",
|
|
||||||
round(min(diff_voix)) AS "min",
|
|
||||||
round(max(diff_voix)) AS "max",
|
|
||||||
round(mean(diff_voix)) AS "moyenne",
|
|
||||||
round(quantile_disc(diff_voix, 0.25)) AS "1er Quartile",
|
|
||||||
round(median(diff_voix)) AS "médianne",
|
|
||||||
round(quantile_disc(diff_voix, 0.75)) AS "3e Quartile",
|
|
||||||
FROM difference
|
|
||||||
WHERE diff < 0.05
|
|
||||||
GROUP BY
|
|
||||||
orientation_candidat_1,
|
|
||||||
orientation_candidat_2,
|
|
||||||
elu
|
|
||||||
ORDER BY
|
|
||||||
duel,
|
|
||||||
"projection élu"
|
|
||||||
|
|
||||||
|
|
||||||
-- Les "swing" circos où la gauche est présente
|
|
||||||
SELECT *
|
|
||||||
FROM difference
|
|
||||||
WHERE orientation_candidat_1 = 'Gauche'
|
|
||||||
OR orientation_candidat_2 = 'Gauche'
|
|
||||||
ORDER BY diff
|
|
||||||
|
|
||||||
-- Rank des "swing" circos analysés par Averroès
|
|
||||||
SELECT
|
|
||||||
circo_code AS 'Code Circo',
|
|
||||||
region AS 'Région',
|
|
||||||
circo AS 'Circo',
|
|
||||||
CASE WHEN diff < 0.01 THEN TRUE ELSE FALSE END AS '<1%',
|
|
||||||
CASE WHEN diff < 0.02 THEN TRUE ELSE FALSE END AS '<2%',
|
|
||||||
CASE WHEN diff < 0.05 THEN TRUE ELSE FALSE END AS '<5%',
|
|
||||||
CASE WHEN elu = 'Gauche' THEN TRUE ELSE FALSE END AS 'Gauche favorite ?'
|
|
||||||
FROM difference
|
|
||||||
WHERE circo_code IN (
|
|
||||||
'0502',
|
|
||||||
'0703',
|
|
||||||
'1202',
|
|
||||||
'1601',
|
|
||||||
'2103',
|
|
||||||
'2404',
|
|
||||||
'3103',
|
|
||||||
'3704',
|
|
||||||
'3809',
|
|
||||||
'6302',
|
|
||||||
'6303',
|
|
||||||
'6406',
|
|
||||||
'6912',
|
|
||||||
'7701',
|
|
||||||
'7708',
|
|
||||||
'8002',
|
|
||||||
'8401',
|
|
||||||
'8602',
|
|
||||||
'8703',
|
|
||||||
'9404',
|
|
||||||
'9407',
|
|
||||||
'0402'
|
|
||||||
)
|
|
||||||
ORDER BY circo_code
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue