Press "Enter" to skip to content

Metoden bag: Politisk polarisering i Folketinget under COVID-19


Dette indlæg omhandler teknikken bag dette indlæg om hvordan den politiske polarisering i Folketinget har udviklet sig under COVID-19.

Når man måler politisk polarisering blandt eliter vha. nye text-as-data metoder på den måde som artiklen her gør, og som en del nyere forskning på området gør, løser man basalt set et klassifikationsproblem vha. machine learning. Idéen er, at den akkuratesse eller præcision hvormed ens algoritmen kan “forudsige” hvilket parti folketingspolitikerne på baggrund af deres taler i Folketinget tilhører, er et mål for hvor polariseret de på et givent tidspunkt er. Hvis det er nemt at “forudsige” partitilhøreskab (dvs. algoritmen har stor præcision), er den politiske polarisering høj, fordi politikernes taler i høj grad skiller sig ud fra hinanden. Gør det modsatte forhold sig gældende, så flyder talerne mere sammen, og det er derfor også svære at se de klare partiskel i talerne; ergo er polariseringen lavere.

Overordnet set løses dette klassifikationsproblem således:

  1. På baggrund af talerne dannes et corpus bestående af de ord, der benyttes i talerne.
  2. Ud fra corpus dannes en document-feature matrix, der indeholder den hyppighed hvert ord bruges for hver enkelt politiker.
  3. Denne document-feature matrix opsplittes tilfældigt i et trænings- og et testsæt, der udgør hhv. 75 % og 25 % af matricen.
  4. Jeg træner en Elastic Net model på træningssættet til at prædiktere hvilken blok (blå blok eller rød blok) Folketingspolitikerne tilhører på baggrund af deres respektive ordfrekvenser.
  5. Jeg anvender den trænede model til at prædiktere blok-tilhørsskab blandt Folketingspolitikerne i testsættet.
  6. Modellens performance i testsættet måles ved dens Accuracy score, som dermed også er polariseringsscoren.

Disse [6] skridt gentages for hver sub-periode man ønsker at estimere niveauet af polarisering for. I dette tilfælde er det for hver måned i perioden Oktober 2019 til Juni 2020. På denne måde kan man illustrerere udviklingen i polariseringen i Folketinget, som vist herunder.

Note: Folketingstalerne er offentligt tilgængelige og kan downloades i .xml format her.

1. Corpus

Corpusset er renset for alt, der ikke er ord dvs. tal, punktum, udråbstegn m.v. Alle bogstaver er gjort til små bogstaver så der ikke er forskel på fx “Integration” og “integration”. Desuden har jeg fjernet danske stopord, dvs. politisk ikke-meningsfulde ord som ‘og’, ‘i’ osv. Jeg fjerner også alle politikeres for-, mellem- og efternavne fra talerne, da de som sådan ikke er indikative for politikernes holdninger, men blot ville fungerer som falske fingerpeg for modellen. Jeg har ‘stemmed’ ordene, dvs. reduceret alle ord til deres stamme således at der fx ikke er forskel på ordene ‘løber’ og ‘løb’, som jo bærer samme mening. Til sidst har jeg fjernet sjældne ord, dvs. ord der er brugt > 5 gange.

2. Document-feature matrix

På baggrund af det konstruerede corpus dannes en document-feature matrix. Det er en matrice, hvor politikerne er i rækkerne og corpussets ord er i kolonnerne. Cellerne indeholder således hyppigheden med hvilken hver enkelt politiker bruger de forskellige ord. Denne frekvensbaserede tilgang til at repræsentere tekst som data kaldes for Bag-of-Words. Her repræsenteres tekst som en samling af ord, som er uafhængige af hinanden. Med andre ord, er det kun ordenes individuelle frekvenser, der betyder noget her. Rækkefølgen hvormed ordene bruges har dermed ingen betydning her. Document-feature matricer er ofte sparse matricer, dvs. matricer hvor 0 udgør en stor andel cellernes værdier. Det skyldes, at corpusset indeholder de ord alle politikerne tilsammen har sagt. Hver enkelt politiker bruger sjældent selv alle de ord, og derfor har en del af kolonnerne værdien 0. Til sidst har jeg vægtet ordfrekvenserne efter Tf-idf princippet (på engelsk “Term frequency – inverse document frequency”), for at repræsentere ordene i forhold til deres relative vigtighed.

3. 75/25-split

Machine learning handler dybest set om at kunne lave forudsigelser på baggrund af data ved at “lære” af gammel data. Når man træner en model til at kunne lave sådanne forudsigelser, simulerer man dette scenarie ved tilfældigt at opdele sit datasæt i et trænings- og et testsæt. Man træner modellen på træningssættet, hvor alt data er tilgængeligt. Herefter tester man modellens reelle performance ved at se hvor god den er til at “forudsige” udfald i ny data den ikke har set før. Jeg opdeler derfor document-feature matricen i et træningssæt (75 %) og et testsæt (25 %).

4. Elastic net modellen

Jeg “træner” en Elastic Net model på træningssættet til at kunne forudsige hvilken blok politikerne tilhører på baggrund af deres respektive, vægtede ordfrekvenser. Elastic Net algoritmen er meget anvendelig til højdimensionel data, dvs. hvor der er ekstremt mange kolonner/ variable, såsom tekst-data. Elastic Net regulariserer en logistisk regressionsmodel ved lineært at kombinere de “straffe” som L1 og L2-regularisering pålægger visse kolonner (som bruges i hhv. LASSO og Ridge regressionsmodeller).

5 og 6. Out-of-sample performance

Jeg anvender den “trænede” Elastic Net model til at forudsige politikernes blok-tilhørsskab i testsættet. I dette sæt fremgår kun politikernes vægtede ordfrekvenser og ikke hviken blok de tilhører. Det skal modellen forudsige! Modellens output er en række sandsynlighedsestimater på at tilhøre den ene blok. Er disse estimater > 0.5 opfattes det som om modellen overvejende tror at politikeren tilhører den ene blok fremfor den anden. Og omvendt. Den trænede models performance vurderes på baggrund af dens accuracy, dvs. andelen af korrekte klassifikationer ud af alle klassifikationer. Denne score angiver det endelige polariseringsniveau i den givne måned.