Περιγραφική Ανάλυση Ελληνικού Κοινοβουλίου

Μία βασική ανάλυση των διατελέσαντων βουλευτών της περιόδου (1981 - 2019)

R
Περιγραφικη αναλυση
Συγγραφέας

stesiam

Δημοσιευμένο

10 Οκτωβρίου 2022

Εισαγωγή

Και ξεκινάμε…

Αυτό είναι το πρώτο άρθρο ανάλυσης στην ιστοσελίδα μου! Προσωπικά, δεν επιθυμούσα να ξεκινήσω με μία έτοιμη βάση δεδομένων και να εφαρμόσω ένα απλό μοντέλο μηχανικής μάθησης (ενδεχομένως να το κάνω σε ένα επόμενο άρθρο). Αποφάσισα να παιδευτώ ελαφρώς προκειμένου να εφαρμόσω όλο τον κύκλο της ανάλυσης δεδομένων ξεκινώντας από την εξόρυξη αυτών, στη τακτοποίηση και να καταλήξω στην ανάλυσή τους. Σε αυτό το άρθρο θα ήθελα να ασχοληθώ με την ιστορία των εκπροσώπων του ελληνικού κοινοβουλίου και να απαντηθούν κάποια ενδιαφέροντα ερωτήματα. Για τη διεξαγωγή της έρευνας θα εξάγω τα δεδομένα που έχει δημοσιεύσει η ιστοσελίδα του Ελληνικού Κοινοβουλίου σχετικά με τους εκλεγμένους βουλευτές.

Το ελληνικό πολιτικό σκηνικό έχει κατακτήσει την συζήτηση της κοινούς γνώμης τα τελευταία χρόνια, για τους λάθος λόγους, λόγω της πρόσφατης οικονομικής κρίσης. Ένα σημαντικό μέρος του διαλόγου είναι τα αίτια της κρίσης, όπου αυτά είναι πολλά και αποτελούν σημείο αντιπαράθεσης μέχρι και σήμερα. Σε αυτό το άρθρο θα ασχοληθώ με μόνο ένα σημείο της κριτικής, ότι <> εκπροσώπους. Βέβαια οι εκπρόσωποι μας στη Βουλή δεν ορίστηκαν από κανένα κόμμα, άλλά αντιθέτως έγιναν εκλογές, οπότε η κριτική ρίχνει μεγάλο μέρος να μην εκλέγει άλλο κόμμα ή εκπροσώπους ενδεχομένως λόγω προσωπικών οφελών. Τελικά, τι συνέβη σε αυτή τη περίπτωση; Είναι ένας ισχυρισμός που έχει νόημα; Αυτό θα μελετήσω σε αυτό το άρθρο, όμως παράλληλα θα μελετήσω την εμμονή σε ίδια πρόσωπα σε οπαδούς του ίδιου κόμματος, ενώ παρουσιάζει ενδιαφέρον η μελέτη του ίδιου χαρακτηριστικού σε επίπεδου νομού.

Προαπαιτούμενα

Εισαγωγή πακέτων

Αρχικά θα εισάγουμε τις απαραίτητες βιβλιοθήκες, αναλόγως των εντολών που χρειάζομαι και της ανάλυσης που θα κάνω. Ενδεικτικά θα χρειαστώ το μετα-πακέτο tidyverse για να εισάγω, τροποποιήσω και οπτικοποιήσω τα δεδομένα. Στη συνέχεια, για τη κατασκευή πινάκων θα χρησιμοποιήσω το πακέτο reactable. Τέλος, για να έχω διαγράμματα που να φαίνονται αξιοπρεπώς σε όλους τους τύπους των οθονών προτείνεται η χρήση του πακέτου highcharter.

Show the code
# General purpose R libraries
library(tidyverse)
library(kableExtra)
library(reactable)
library(keyring)
library(deeplr)

# Graphs
library(ggplot2)
library(ggpol) 
library(ggtext)
library(highcharter)

# Άλλες ρυθμίσεις
options(digits=2) # print only 2 decimals

Εισαγωγή δεδομένων

Για να βρω ποιοι είναι οι περισσότεροι εκλεγμένοι βουλευτές σε εθνικό επίπεδο, κόμματος αλλά και εκλογικής περιφέρειας πρέπει να βρω τα αντίστοιχα δεδομένα. Ευτυχώς, η ιστοσελίδα του Ελληνικού Κοινοβουλίου διατηρεί σχετικό ηλεκτρονικό αρχείο με τους εκλεγμένους βουλευτές από το 1974 μέχρι και το 2019. Τα δεδομένα εξορύχθηκαν με τη βοήθεια του πακέτου RSelenium, ωστόσο δεν θα αναλύσω τον τρόπο αυτού. Σε περίπτωση που κάποιος ενδιαφέρεται για αυτό μπορεί να δει το σχετικό κώδικα στο GitHub. Χρησιμοποιώ έτοιμο το εξορυγμένο σύνολο δεδομένων και το εισάγω με την εντολή read_csv.

Show the code
parliament <- read_csv("data/greek_parliament.csv")

Δομή δεδομένων

Με βάση τον παραπάνω πίνακα τα συλλεγμένα δεδομένα αποτελούνται από 4 μεταβλητές (στήλες), εκ των οποίων καμία δεν είναι ποσοτική και οι υπόλοιπες τέσσερις. Από αυτές τις τέσσερις, οι τρεις είναι κατηγορικές και άλλη μία που είναι μία διατάξιμη μεταβλητή.

Show the code
preview_dataset = head(parliament, 10)
kbl(preview_dataset, 
    align = 'c',
    booktabs = T,
    centering = T,
    valign = T)
Πίνακας 1: Προεπισκόπηση συνόλου δεδομένων (πρώτες 6 σειρές)
FullName Party Constituency Term
Agorastis Vasileios PA.SO.K. (Panhellenic Socialist Movement) Larissa 3
Akrita Sylva - Kaiti PA.SO.K. (Panhellenic Socialist Movement) Athens B 3
Akritidis Nikolaos PA.SO.K. (Panhellenic Socialist Movement) Thessaloniki A 3
Akrivakis Alexandros PA.SO.K. (Panhellenic Socialist Movement) Viotia 3
Alevras Ioannis PA.SO.K. (Panhellenic Socialist Movement) Athens A 3
Alexandris Efstathios (Stathis) PA.SO.K. (Panhellenic Socialist Movement) Athens B 3
Alexiadis Konstantinos PA.SO.K. (Panhellenic Socialist Movement) Trikala 3
Alexiou Thomas NEA DIMOKRATIA Xanthi 3
Allamanis Stylianos NEA DIMOKRATIA Karditsa 3
Amanatidis Konstantinos PA.SO.K. (Panhellenic Socialist Movement) Thessaloniki B 3
Μεταβλητή Τύπος μεταβλητής Περιγραφή
Full Name Ποιοτική
(κατηγορική)
Επώνυμο / Όνομα / Όνομα πατέρα
Party Ποιοτική
(κατηγορική)
Κοινοβουλευτική όμάδα - Κόμμα που εκπροσωπεί
Constituency Ποιοτική
(κατηγορική)
Εκλογική περιφέρεια
Term Ποιοτική
(διατάξιμη)
Περίοδος θητείας

Τακτοποίηση δεδομένων

Αφότου εισάγω τα δεδομένα καλό θα ήταν να γίνει κάποια βασική τακτοποίηση αυτών ή μία εκτεταμένη μορφή αυτής σε περίπτωση που διαπιστώσω ότι τα δεδομένα μου δεν έχουν οργανωμένη ή μία συνεπή δομή. Θα μελετήσουμε σταδιακά τη κάθε μεταβλητή, ξεκινώντας από τα ονόματα των κομμάτων (μεταβλητή Party). Αρχικά αν συλλέξουμε όλα τις πιθανές τιμές, δηλαδή όλες τις κοινοβουλευτικές ομάδες στην ιστορία του κοινοβουλίου που δεν διαλύθηκαν προτού γίνουν νέες εκλογές. Τα ονόματα των κομμάτων είναι στα αγγλικά και οι εκτάσεις των ονομάτων εξαιρετικά μεγάλες, ενώ αναμιγνύονται τα ονόματα με τις συντμήσεις των ονομάτων τους.

Show the code
data.frame(
  Party = unique(parliament$Party),
  Length = str_length(unique(parliament$Party))
) %>%
  arrange(-Length) %>%
 reactable(.,
  bordered = FALSE,     # No borders (booktabs style)
  striped = FALSE,      # No stripes for a clean look
  highlight = FALSE,    # No hover highlighting
  defaultColDef = colDef(align = "center"),
  defaultPageSize = 7,
  style = list(fontSize = "14px", border = "none"),
  theme = reactableTheme(
    borderColor = "transparent", # Remove border
    cellStyle = list(
      borderBottom = "transparent"  # Subtle line between rows
    ),
    headerStyle = list(
      borderBottom = "2px solid rgb(117, 117, 117)", # Thick top rule
      borderTop = "2px solid rgb(117, 117, 117)",
      fontWeight = "bold"
    )
  )
) 
Πίνακας 2: Προεπισκόπηση ονομάτων κομμάτων Ελληνικού Κοινοβουλίου

Σαν να μην έφτανε αυτό παρατηρώ ότι υπάρχουν πολλαπλές καταχωρήσεις για το ίδιο κόμμα που ενδεχομένως κατά τη πάροδο των ετών έκανε ένα μικρό rebranding (Ανεξάρτητοι Έλληνες) ή ακόμα και πιο μεγάλες αλλαγές που κατά βάση αναφέρονται και είναι πρόγονοι ή απόγονοι ως επί το πλείστον του ίδιου κόμματος (Συνασπισμός -> ΣΥΡΙΖΑ ή ΠΑΣΟΚ -> Ελιά -> Δημοκρατική Συμπαράταξη -> Κίνημα Αλλαγής -> ΠΑΣΟΚ). Μιας και αυτές οι αλλαγές δεν μπορούν εύκολα να κρίνεται απαραίτητη η δημιουργία ενός νέου πίνακα ώστε να ομαδοποιήσω αυτή τη πληροφορία και να την συγνωνεύσω στο βασικό μου σύνολο δεδομένων.

Πίνακας 3: Οργάνωση ονομάτων κομμάτων και συντμήσεών τους
Show the code
parties = data.frame(
  partyNamesEN_source = unique(parliament$Party),
  partyFullNamesEn = c("Panhellenic Socialistic Movement", "New Democracy", "Communist Party of Greece", "Communist Party οf Greece (interior)",
          "Independent", "Coalition of the Radical Left", "Democratic Renewal", "Alternative Ecologists", "Political Spring",
          "Democratic Social Movement","Coalition of the Radical Left", "Popular Orthodox Rally", "Democratic Left", "Independent Greeks", "Golden Dawn", "Independent Democratic MPs", "Popular Unity", "The River", "Independent Greeks", "Panhellenic Socialistic Movement"),
  partyAbbrNamesEn = c("PASOK", "ND", "KKE", "KKE int.", "Independent", "SYRIZA", "DIANA", "EO", "POLAN", "DHKKI", "SYRIZA",
             "LAOS", "DHMAR", "ANEL", "XA", "ADB", "LAE", "RIVER", "ANEL", "PASOK"),
  partyFullNamesGR = c("Πανελλήνιο Σοσιαλιστικό Κίνημα", "Νέα Δημοκρατία", "Κομμουνιστικό Κόμμα Ελλάδας", 
                    "ΚΚΕ (εσωτερικού)","Ανεξάρτητοι", "Συνασπισμός Ριζοσπαστικής Αριστεράς", "Δημοκρατική Ανανέωση", 
                    "Εναλλακτικοί Οικολόγοι", "Πολιτική Άνοιξη", "Δημοκρατικό Κοινωνικό Κίνημα","Συνασπισμός Ριζοσπαστικής Αριστεράς", "Λαϊκός Ορθόδοξος Συναγερμός", "Δημοκρατική Αριστερά", "Ανεξάρτητοι Έλληνες", "Χρυσή Αυγή", "Ανεξ Δημ. Βουλευτές", "Λαϊκή Ενότητα", "Το Ποτάμι", "Ανεξάρτητοι Έλληνες", "Πανελλήνιο Σοσιαλιστικό Κίνημα"),
    partyAbbrNamesGR = c("ΠΑΣΟΚ", "ΝΔ", "ΚΚΕ", "ΚΚΕ (εσωτερικού)", "Ανεξάρτητοι", "ΣΥΡΙΖΑ", "ΔΗΑΝΑ", "ΕΟ", "ΠΟΛΑΝ", "ΔΗΚΚΙ", "ΣΥΡΙΖΑ", "ΛΑΟΣ", "ΔΗΜΑΡ", "ΑΝΕΛ", "ΧΑ", "ΑΔΒ", "ΛΑΕ", "ΠΟΤΑΜΙ", "ΑΝΕΛ", "ΠΑΣΟΚ")) |>
  mutate(Color = case_when(
    partyAbbrNamesEn == "PASOK" ~ "#95bb72",
    partyAbbrNamesEn == "ND" ~ "#0492c2",
    partyAbbrNamesEn == "KKE" ~ "#FF6666",
    partyAbbrNamesEn == "SYRIZA" ~ "#e27bb1",
    partyAbbrNamesEn == "KKE (interior)" ~ "#FF3366",
    partyAbbrNamesEn == "INDEPENDENT" ~ "#ffffff",
    partyAbbrNamesEn == "DIANA" ~ "orange",
    partyAbbrNamesEn == "DHMAR" ~ "#FF4466",
    partyAbbrNamesEn == "RIVER" ~ "#5592aa",
    TRUE ~ "#808080"
  ))

Πλέον είμαι σε θέση να χρησιμοποιήσω την ελληνική ή την αγγλική έκδοση των κομμάτων, ενώ σε περίπτωση δημιουργίας ενός γραφήματος. Τέλος, ο διαχωρισμός του πλήρους ονόματος και μιας συντομογραφίας είναι αρκετά σημαντική για τη δημιουργία γραφημάτων μιας και συνήθως ο διαθέσιμος χώρος είναι περιορισμένος και δίνουμε στον αναγνώστη τη πληροφορία που χρειάζεται δίχως να κουράζουμε, βελτιώνοντας την αναγνωσιμότητα και τη κατανόηση του. Όπως είδαμε και παραπάνω υπάρχουν ονόματα - σιδηρόδρομοι, όπως των Ανεξαρτήτων Ελλήνων, όπου αριθμεί 81 χαρακτήρες και της Δημοκρατικής Συμπαράταξης (στην ουσία ΠΑΣΟΚ, σε συνεργασία με μικρά κόμματα όπως η ΔΗΜΑΡ, ΚΙΔΗΣΟ κ.α.) με 70. Σε αντιπαραβολή αυτών των ονομάτων και για λόγους πληρότητας το ΠΟΛ.Α. ήταν το όνομα με τους λιγότερους χαρακτήρες (6) και αναφέρεται στο κόμμα Πολιτική Άνοιξη. Πριν κλείσω τη συγκεκριμένη ενότητα θα ήθελα να κάνω αναφορά στη τελευταία στήλη του πίνακα. Με τόσα κόμματα είναι εμφανές ότι θα χρειαστεί να θέσω χρώματα κατάλληλα για το καθένα, αλλά το πλήθος τους ίσως προκαλέσει σύγχυση σε ποιο αναφέρομαι. Έκρινα λοιπόν απαραίτητη αυτή τη προσθήκη με βάση τα χρώματα στο έμβλημα του κάθε κόμματος να επιλέξω το πιο αντιπροσωπευτικό, τουλάχιστον για τα πιο γνωστά.

Κάπου εδώ έκλεισε η ενότητα των κομμάτων και ανοίγει μία τελευταία πρόκληση. Αυτή των ονομάτων των βουλευτών. Στη προεπισκόπηση των δεδομένων τα ονόματα δίνονται με αρκετά μη συνεπή δομή. Συνήθως αποτελούνται από Επώνυμο Όνομα Πατρώνυμο. Βέβαια πολλές φορές υπάρχουν βουλευτές που έχουν δύο ονόματα ή δύο επίθετα. Σε αυτές τις περιπτώσεις διαχωρίζονται τα διπλά επώνυμα ή ονόματα με μία παύλα.

Θα αναρωτηθεί κάποιος και το πρόβλημα που είναι; Αφού είναι απλά μία μεταβλητή με τα ονόματά τους.

Ναι! Αλλά μπορούμε να κάνουμε καλύτερη δουλειά επειδή σε αυτή τη μεταβλητή εσωκλείεται περισσότερη πληροφορία. Με λίγη προσπάθεια από μέρους μας μπορούμε να χωρίσουμε το όνομα σε άλλες τρεις μεταβλητές, όπου θα δηλώνουν το επίθετο του βουλευτή, το όνομά του και το πατρώνυμό του ξεχωριστά. Αυτό ενδέχεται να μας φανεί χρήσιμο σε τυχόν διαγράμματα όπου θα μπορούμε να αναφερόμαστε αποκλειστικά στο επίθετο και στο αρχικό του ονόματός του, αντί στο πλήρες όνομά του συμπεραλαμβανομένου και του πατρωνύμου.

Show the code
pattern <- "^([^-\\s]+)(?:\\s*-\\s*([^-\\s]+))?\\s+([^-\\s]+)(?:\\s*-\\s*([^-\\s]+))?(?:\\s+([^-\\s]+))?$"


mps_clean_names = parliament %>%
    mutate(FullName = str_trim(str_replace(FullName, "\\(.*", ""))) %>%
    extract(FullName, into = c("surname1", "surname2", "name1", "name2", "father_name"), 
            regex = pattern, remove = FALSE) |>
  rename("partyNamesEN_source" = "Party")

clean_dataset = mps_clean_names %>%
    left_join(parties, by = "partyNamesEN_source") %>%
    select(-c(partyNamesEN_source))

clean_dataset_preview = head(clean_dataset)


clean_dataset_preview |>
 reactable(
  bordered = FALSE,     # No borders (booktabs style)
  striped = FALSE,      # No stripes for a clean look
  highlight = FALSE,    # No hover highlighting
  defaultColDef = colDef(align = "center"),
  style = list(fontSize = "14px", border = "none"),
  theme = reactableTheme(
    borderColor = "transparent", # Remove border
    cellStyle = list(
      borderBottom = "transparent"  # Subtle line between rows
    ),
    headerStyle = list(
      borderBottom = "2px solid rgb(117, 117, 117)", # Thick top rule
      borderTop = "2px solid rgb(117, 117, 117)",
      fontWeight = "bold"
    )
  )
) 

Αριθμός κομμάτων

Έχοντας τακτοποιήσει τα δεδομένα μου, θα ξεκινήσω την ανάλυσή μου με μία ιστορική αναδρομή στον αριθμό των κομμάτων που έχουν εκπροσωπήσει το Ελληνικό κοινοβούλιο και έχουν ολοκληρώσει τη θητεία τους ως κοινοβουλευτική ομάδα. It is important to share that I made it thanks to this post and ggpol package. As I am planning to do this procedure for many electoral terms, I will convert it as a function.

Show the code
r = clean_dataset |> select(Term, partyAbbrNamesGR) |> unique() |> count(Term)


# Prepare data for highcharter with custom tooltip text
series <- lapply(1:nrow(r), function(i) {
    list(
        x = r$Term[i],
        y = r$n[i]
    )
})

# Chart
hc <- highchart() %>%
    hc_chart(type = "spline") %>%
    hc_title(text = "Number of Parties Participating in Parliament") %>%
    hc_subtitle(text = "Hover points to see which parties participated") %>%
    hc_xAxis(title = list(text = "Θητεία"), allowDecimals = FALSE, tickInterval = 1) %>%
    hc_yAxis(title = list(text = "(Αριθμός κοινοβουλευτικών κομμάτων")) %>%
    hc_add_series(
        name = "Parties",
        data = series,
        color = "#556EFF",
        marker = list(radius = 6, symbol = "circle",
                      fillColor = "#fff", lineColor = "#556EFF", lineWidth = 2)
    ) %>%
    hc_tooltip(
        useHTML = TRUE,
        formatter = JS(
            "function() {
         return '<b>Term ' + this.point.x + '</b><br/>' +
                'Total: <b>' + this.point.y + '</b>';
       }"
        )
    ) %>%
    hc_exporting(enabled = TRUE) %>%
    hc_credits(enabled = FALSE) %>%
    hc_legend(enabled = FALSE)

hc

Arguments like term and custom_title are vital to create reproducible plots for all the terms. Although a main problem is the colors. On the aforementioned post it was about only one term. We knew how many parties we had, so we knew what colors to set and how many. If we try that on many terms (on which the number of parties can vary from 3 to 8) an error will come up which will say “Hey, you have set 3 colors but I see that you have 8 values (parties)”. This was a real obstacle for me. After some tries and misses I came up with the concept of dynamic arguments.

Show the code
make_parliament_plot <- function(term, custom_title, ...){

custom = parliament %>% filter(Term == term) %>% select(Party) %>% table() %>% t() %>% as.data.frame() %>%  `colnames<-`(c("","Party", "Seats"))

colors<-c(...)

custom$legend <- paste0(custom$Party," (", custom$Seats,")")

#draw a parliament diagram 
p<-ggplot(custom) + 
  geom_parliament(aes(seats =Seats, fill =  Party), color = "white") + 
  scale_fill_manual(values = colors , labels = custom$legend) +
  coord_fixed() + 
  theme_void()+
  labs(title  = custom_title,
       caption = "Source: stesiam | stesiam.github.io, 2022")+
  theme(title = element_text(size = 18),
        plot.title = element_text(hjust = 0.5,size = 14,face = 'bold'),
        plot.subtitle = element_text(hjust = 0.5),
        plot.caption = element_text(vjust = -3,hjust = 0.9, size = 8),    
        legend.position = 'bottom',
        legend.direction = "horizontal",
        legend.spacing.y = unit(0.1,"cm"),
        legend.spacing.x = unit(0.1,"cm"),
        legend.key.size = unit(0.8, 'lines'),
        legend.text = element_text(margin = margin(r = 1, unit = 'cm')),
        legend.text.align = 0)+
        guides(fill=guide_legend(nrow=3,byrow=TRUE,reverse = TRUE,title=NULL))

return(p)
}
Σημείωση

Λάβετε υπόψη σας ότι μέχρι αυτή τη στιγμή δεν έχω καταφέρει να θέσω - αλλάξω τη θέση των κομμάτων στα διαγράμματα του κοινοβουλίου. Αυτό θα ήταν χρήσιμο για να δηλώνεται εκτός από τον αριθμό των βουλευτών και η ευρύτερη πολιτική θέση ενός κόμματος. Συνεπώς, τα παρακάτω διαγράμματα της Βουλής, πρέπει να διαβαστούν μόνο ως προς το αριθμό βουλευτών και όχι ταυτόχρονη πολιτική θέση.

Show the code
plot_parliament_term <- function(term_num, parliament_data = clean_dataset, parties_data = parties) {
  # Filter the parliament data for the selected term and summarize by party
  term_data <- parliament_data |>
    dplyr::filter(Term == term_num) |>
    group_by(partyAbbrNamesGR) |>
    summarise(n = n()) |>
    ungroup() 

  # Perform fuzzy join with parties data based on party name similarity
  term_data_joined <- fuzzyjoin::stringdist_inner_join(term_data, parties_data, by = "partyAbbrNamesGR",
                                                      max_dist = 2, distance_col = "distance") |>
    group_by(partyAbbrNamesGR.x) |>
    slice_min(distance) |>   # Ensure only the closest match is selected
    rename(Party = partyAbbrNamesGR.x) |>
    distinct() %>%
    ungroup() %>%
    select(Party, partyFullNamesGR, n, Color) |>
    distinct()
  
    title_text = "Κατανομή θέσεων"
    subtitle_text = "Τελική μορφή Ελληνικού Κοινοβουλίου"
    caption_text = '<b>Πηγή:</b> Ελληνικό Κοινοβούλιο | <b>Γράφημα:</b> <a href="https://stesiam.com/" target="_blank">stesiam.com</a> '
    hover_text = "Βουλευτές"


  # Conditionally adjust the data based on language
  # if (lang == "en") {
  #   term_data_joined <- select(term_data_joined, names, Party, n, Color)
  #   title_text = "Distribution of seats"
  #   subtitle_text = "Final formation of Hellenic Parliament"
  #   caption_text = '<b>Source:</b> Hellenic Parliament | <b>Graphic:</b> <a href="https://stesiam.com/" target="_blank">stesiam.com</a>'
  #   hover_text = "Representatives"
  # } else {
  #   term_data_joined <- select(term_data_joined, names_el, Party_el, n, Color)
  #   title_text = "Κατανομή θέσεων"
  #   subtitle_text = "Τελική μορφή Ελληνικού Κοινοβουλίου"
  #   caption_text = '<b>Πηγή:</b> Ελληνικό Κοινοβούλιο | <b>Γράφημα:</b> <a href="https://stesiam.com/" target="_blank">stesiam.com</a> '
  #   hover_text = "Βουλευτές"
  # }
    
  # Create the highcharter plot for the specific term
  highchart() %>%
    hc_chart(type = 'item') %>%
    hc_title(text = title_text) %>%
    hc_subtitle(text = subtitle_text) %>%
    hc_caption(
      text = caption_text,
      align = 'center',
      verticalAlign = 'bottom',
      y = 10
    ) %>%
    hc_legend(labelFormat = '{name} <span style="opacity: 0.4">{y}</span>') %>%
    hc_add_series(
      name = hover_text,
      data = purrr::pmap(
          list(term_data_joined$partyFullNamesGR, term_data_joined$n, term_data_joined$Color, term_data_joined$Party),
        list
      ),
      keys = c("name", "y", "color", "label"),
      dataLabels = list(
        enabled = TRUE,
        format = "{point.label}",
        style = list(textOutline = "5px contrast")
      ),
      center = list("50%", "50%"),
      size = "100%",
      startAngle = -150,
      endAngle = 150
    ) %>%
    hc_responsive(
      rules = list(
        list(
          condition = list(maxWidth = 600),
          chartOptions = list(
            series = list(
              list(dataLabels = list(distance = -30))
            )
          )
        )
      )
    )
}
Show the code
plot_parliament_term(3, clean_dataset, parties)
Show the code
plot_parliament_term(4, clean_dataset, parties)
Show the code
plot_parliament_term(5, clean_dataset, parties)
Show the code
plot_parliament_term(6, clean_dataset, parties)
Show the code
plot_parliament_term(7, clean_dataset, parties)
Show the code
plot_parliament_term(8, clean_dataset, parties)
Show the code
plot_parliament_term(9, clean_dataset, parties)
Show the code
plot_parliament_term(10, clean_dataset, parties)
Show the code
plot_parliament_term(11, clean_dataset, parties)
Show the code
plot_parliament_term(12, clean_dataset, parties)
Show the code
plot_parliament_term(13, clean_dataset, parties)
Show the code
plot_parliament_term(14, clean_dataset, parties)
Show the code
plot_parliament_term(15, clean_dataset, parties)
Show the code
plot_parliament_term(16, clean_dataset, parties)
Προειδοποίηση

Στο παρακάτω διάγραμμα υπάρχουν αρκετοί ανεξέρτητοι βουλευτές οι οποίοι ανήκουν στις κατηγορίες των ανεξάρτητων βουλευτών, σύμφωνα με την ιστοσελίδα του Ελληνικού Κοινοβουλίου. Γενικότερα εκείνη η περίοδος χαρακτηρίζεται από έντονη κυβερνητική αστάθεια, αλλά πολλοί από αυτούς προέκυψαν από τα κόμματα των Ανεξαρτήτων Ελλήνων και της Ένωσης Κεντρωών. Ένα μεγάλο κύμα αποχωρήσεων - ανεξαρτητοποιήσεων από τα προαναφερόμενα κόμματα οδήγησε στο να μην πληρούν τα κριτήρια ώστε να αποτελούν κοινοβουλευτικές ομάδες. Αυτός είναι ο λόγος που ακόμα και βουλευτές που δεν αποχώρησαν από αυτά τα κόμματα λόγω της διάλυσης της κοινοβουλευτικής ομάδας χαρακτιρίζονται ως ανεξέρτητοι.

Show the code
plot_parliament_term(17, clean_dataset, parties)

Εκλεξιμότητα

Το πόσοι βγήκαν και τα αποτελέσματα των εκλογών ήταν λίγο-πολύ γνωστά, απλώς έχει πάντα ενδιαφέρον να δοκιμάζεις τις γνώσεις σου και με την R. Όμως θα ήθελα να ξεκινήσω να απαντήσω σε ποιο ουσιαστικά ερωτήματα. Μία βασική κριτική στο πολιτικό σύστημα είναι ότι βγαίνουν συνεχώς οι ίδιοι. Βέβαια αυτή η κριτική δεν μπορεί να έχει ως αποδέκτες μόνο τους πολιτικούς, αλλά και μερίδα πολιτών που αποφασίζει να στηρίξει τους ίδιους. Δεν μπορείς να περιμένεις να δεις μία αλλαγή στο πολιτικό σύστημα αν αποφασίζεις την εξουσία μεταξύ δύο τριών κομμάτων, πόσο δε μάλλον όταν επιμένεις και στους ίδιους εκπροσώπους. Τελικά τι συνέβη στην Ελλάδα; Οι βουλευτές μας αλλάζουν ανά τακτά χρονικά διαστήματα ή εκλέγονται συνεχώς οι ίδιοι; Σε αυτή την ενότητα θα βρω ποιοι είναι οι βουλευτές που έχουν εκλεχτεί περισσότερες φορές.

Show the code
u = clean_dataset |>
  select(surname1, name1, partyFullNamesGR, partyAbbrNamesGR, Color) |>
  count(surname1, name1, partyAbbrNamesGR, partyFullNamesGR, Color) |>
  dplyr::filter(n >=11) |>
  arrange(-n) |>
  mutate(
  #surname1 = deeplr::translate2(surname1, target_lang = "EL", source_lang = "EN",auth_key = #key_get("deepl")),
  #        name1 = deeplr::translate2(name1, target_lang = "EL", source_lang = "EN",auth_key = key_get("deepl")),
         name1 = str_sub(name1,start = 1, end=1),
         surnameAndInitial = paste0(surname1, " ", name1, "."))
Show the code
u1 = u %>% arrange(desc(n))

highchart() %>%
    hc_chart(type = "bar") %>%
    hc_title(text = "Βουλευτές που εκλέχτηκαν πιο πολλές φορές") %>%
    hc_subtitle(text = "Πόσες φορές εκπροσώπησαν το συγκεκριμένο κόμμα στο Ελληνικό Κοινοβούλιο") %>%
    hc_xAxis(categories = u1$surnameAndInitial) %>%
    hc_yAxis(title = list(text = "Value")) %>%
    hc_series(
        list(
            name = "# Αριθμός εκλέχτηκε",
            data = lapply(1:nrow(u1), function(i) {
                list(
                    y = u1$n[i],
                    affiliate = u1$partyAbbrNamesGR[i],
                    color = u1$Color[i]
                )
            }),
            dataLabels = list(
                enabled = TRUE,
                format = "{y}",
                style = list(fontSize = "12px", textOutline = "none", color = "#FFFFFF")
            )
        )
    ) %>%
    hc_plotOptions(
        bar = list(
            borderRadius = 3,
            pointPadding = 0.2,
            groupPadding = 0.1
        )
    ) %>%
    hc_tooltip(
        headerFormat = "",
        pointFormat = "<b>{point.category}</b><br/>
                  Κόμμα: <b>{point.affiliate}</b><br/>
                  Εκλέχτηκε: <b>{point.y}</b> φορές"
    ) %>%
    hc_legend(enabled = FALSE) %>%
    hc_caption(
        text = "Colors represent different affiliations",
        style = list(fontSize = "12px", color = "#666666")
    )
Σχήμα 1: Βουλευτές που έχουν εκλεγεί περισσότερες φορές εκπροσωπόντας συγκεκριμένο κόμμα
Show the code
# #total_times_elected_freqs <- function(input_constituency, min_times_elected){
# total_times_elected_freqs_df = parliament %>%  count(FullName, Party) %>% filter(n >= 9) %>% as.data.frame()
#   
# #df = table(parliament$FullName)%>% sort(decreasing = T) %>% as.data.frame() %>% filter(Freq>=11)
# 
# ggplot(data = total_times_elected_freqs_df, aes(x = reorder(FullName, n), y = n, fill = Party ))+
#   geom_bar(stat = "identity",width = 0.88) +
#   geom_text(aes(label=n), hjust = 1.5, vjust=0.5, color="white", size=4)+
#   theme_minimal() +
#   scale_fill_manual(values = c("KKE" = kke_color,"ND" = nd_color, "PASOK" = pasok_color, "SYRIZA" = syriza_color)) +
#   labs(title = "Most elected MPs on Greek Parliament (1981 - 2019) <br>
#        <span style = 'font-size:10pt'> A list that shows the most elected members of parliament (elected 11 times or more). <br> The following ones are members of <span style = 'color:blue;'>ND</span>,  or <span style = 'color:darkgreen;'>PASOK</span></span>.",
#        caption = "Source: **stesiam** | stesiam.github.io, 2022",
#        x = "Times elected",
#        y = "Members of Parliament") +
#     theme(
#     plot.title.position = "plot",
#     plot.title = element_textbox_simple(
#       size = 14,
#       lineheight = 1,
#       padding = margin(5.5, 5.5, 5.5, 5.5),
#       margin = margin(0, 0, 5.5, 0),
#       fill = "cornsilk"
#     ))+
#   coord_flip()

Εκλεξιμότητα κόμματος

Μέχρι στιγμής είδαμε τα μέλη του κοινοβουλίου, από το 1981 μέχρι και το 2019 που έχουν εκλεχτεί περισσότρες φορές με βάση το κόμμα που εκπροσωπούν. Θα ήταν ιδιαιτέρως χρήσιμο να μελετήσουμε όχι απλώς τη δημοφιλία ως προς τη βουλή, αλλά η μέτρηση του ίδιου χαρακτηριστικού και σε κάθε κόμμα. Βέβαια αυτή η μέτρηση έχει κάποιους περιορισμούς μιας και υπάρχουν κόμματα τα οποία έχουν αρκετά μικρή εκπροσώπηση στη Βουλή είτε δεν μακροημέρευσε και δεν είχε αρκετές θητείες εντός Βουλής. Για αυτό το λόγο θα αναλυθούν μόνο τα πιο ιστορικά κόμματα του κοινοβουλίου, δηλαδή το ΚΚΕ, η ΝΔ, το ΠΑΣΟΚ και ο ΣΥΡΙΖΑ.

Επίσης, όσον αφορά το κομμάτι της υλοποίησης του σχετικού γραφήματος η χρήση συναρτήσεων είναι ενδεδειγμένη. Θα έχω ίδιο τύπο γραφήματος και απλώς θα πρέπει να φιλτράρω τα δεδομένα μου (ανά κόμμα), και στη συνέχεια να στοιχίσω τις τιμές μου σε φθίνουσα σειρά ανά φορές εκλογής για κάθε βουλευτή. Δηλαδή το μόνο που θα αλλάξει θα είναι το κόμμα. Έτσι θα αποφύγω την επανάληψη του κώδικά μου που είναι μία από τις βασικές αρχές του προγραμματισμού. Στην συγκεκριμένη συνάρτηση θα θέσω 3 μεταβλητές:

  • Party : Τα δεδομένα ποιου κόμματος πρέπει να κρατήσω
  • color : Το χρώμα, έτσι ώστε να συμπίπτει το χρώμα των ράβδων με το κόμμα το οποίο εκπροσωπούν
  • times_elected_min : Μία μεταβλητή που έθεσα αργότερα. Το πρόβλημα που προέκυψε με την αρχική συνάρτηση είναι ότι υπήρχαν σημαντικές διαφορές στου ς εκλεγμένους βουλευτές μεταξύ των κομμάτων που εκλέγουν σταθερά μεγάλο αριθμό βουλευτών. Αν θέσω έναν γενικό αριθμό and some others just 10. If I set a universal number of elections to visualize I will have diagrams with many problems. Let’s suppose that I set a big value (e.g., 10). Then I would visualize my data for ND and PASOK, although parties with relatively low number of MPs would have only one or noone to show (KKE & SYRIZA, respectively). On the other hand if I set a low value I create a new problem as there will be many MPs of and it creates the need to edit many more things (like width of bars). An argument like times_elected_min can adapt the specific characteristics of each party.
Show the code
party_plot <- function(party, party_color, times_elected_min){
  party_df = parliament %>% filter(Party == party) %>%
  select(FullName) %>% table() %>% sort(decreasing = TRUE) %>% as.data.frame() %>% filter(Freq >= times_elected_min) %>% `colnames<-`(c("Full_Name", "Freq"))
  
ggplot(data = party_df, aes(x = reorder(Full_Name , Freq), y = Freq))+
  geom_bar(stat = "identity",width = 0.88, fill = party_color) +
  geom_text(aes(label=Freq), hjust = 1.5, vjust=0.5, color="white", size=4)+
  theme_minimal() +
   labs(title = "Most elected MPs",
       subtitle = "",
       caption = "Source: stesiam | stesiam.github.io, 2022",
       x = "Times elected",
       y = "Members of Parliament") +
  coord_flip()
}
Show the code
party_plot <- function(party, party_color, times_elected_min, title_text = NULL, subtitle_text = NULL) {
  
  party_df <- clean_dataset %>%
    dplyr::filter(partyAbbrNamesGR == party) %>%
    count(surname1, name1) %>%
    arrange(-n) %>%
    drop_na() %>%
    as.data.frame() %>%
    dplyr::filter(n >= times_elected_min) %>%
    mutate(fullname = paste0(surname1, " ", name1)) %>%
#    mutate(fullname = deeplr::translate2(fullname, target_lang = "EL", source_lang = "EN", auth_key = 
    # keyring::key_get("deepl"))) %>%
    separate(., col = c(fullname), into = c("lastNameGR", "firstNameGR"), sep = " ") %>%
    mutate(
      fullNameGR = paste0(lastNameGR, " ", firstNameGR),
      lastNameAndInitialGR = paste0(lastNameGR, " ", str_sub(firstNameGR, start = 1, end = 1), ".")
    )
    
    
  

highchart() %>%
    hc_chart(type = "bar", inverted = TRUE) %>%
    hc_title(text = title_text) %>%
    hc_subtitle(text = subtitle_text) %>%
    hc_xAxis(
      categories = party_df$lastNameAndInitialGR,
      title = list(text = NULL),
      labels = list(
        style = list(fontSize = "11px", whiteSpace = "nowrap"),
        useHTML = TRUE
      )
    ) %>%
    hc_yAxis(title = list(text = "(#) Φορές εκλέχτηκε")) %>%
    hc_add_series(
      name = "Times elected",
      data = party_df$n,
      color = party_color
    ) %>%
    hc_plotOptions(bar = list(dataLabels = list(enabled = TRUE))) %>%
    hc_tooltip(
        headerFormat = "",
        pointFormat = "<b>{point.category}</b><br/>
                  Κόμμα: <b>{party}</b><br/>
                  Εκλέχτηκε: <b>{point.y}</b> φορές"
    ) %>%
    hc_legend(enabled = FALSE)  # Hides the legend
}

The visualizations are presented in alphabetical order.

ΚΚΕ

Show the code
party_plot("ΚΚΕ", "#FF6666", times_elected_min = 5, 
           title_text = "Περισσότερο εκλεγμένοι βουλευτές του ΚΚΕ",
           subtitle_text = "Οι κυρίες Παπαρήγα και Κανέλλη είναι οι βουλεύτριες του κόμματος με τις περισσότερες εκπροσωπήσεις του κόμματος και ακολουθεί ο κύριος Σκυλλάκος.")

ΝΔ

Show the code
party_plot("ΝΔ", "#0492c2", times_elected_min = 10,
           title_text = "Περισσότερο εκλεγμένοι βουλετές της ΝΔ",
           subtitle_text = "")

ΠΑΣΟΚ

Show the code
party_plot("ΠΑΣΟΚ", "#95bb72", times_elected_min = 10)

ΣΥΡΙΖΑ

Show the code
party_plot("ΣΥΡΙΖΑ", "#e27bb1", times_elected_min = 5)

Δικομματισμός στην Ελλάδα

Show the code
f = clean_dataset %>% dplyr::group_by(Term, partyAbbrNamesGR) %>% count() %>% ungroup(partyAbbrNamesGR) %>% top_n(., n =2, wt = n) %>% tidyr::pivot_wider(., names_from = partyAbbrNamesGR, values_from = n) %>%
    mutate(seatsTopTwoParties = rowSums(across(c(ΝΔ, ΠΑΣΟΚ, ΣΥΡΙΖΑ)), na.rm = TRUE)) %>%
    mutate(pctSeatsTopTwoParties = round( (seatsTopTwoParties/ 300) * 100, digits = 1) )

highchart() %>%
    hc_chart(type = "spline") %>%
    hc_title(text = "Εκπροσώπηση δικομματισμού", style = list(fontSize = "20px", fontWeight = "bold")) %>%
    hc_subtitle(text = "Ποσοστό (%) εκπροσώπησης δικομματισμού στην Ελληνική Βουλή") %>%
    hc_xAxis(categories = f$Term , title = list(text = "Θητείες"), gridLineWidth = 0) %>%
    hc_yAxis(title = list(text = "Ποσοστό θέσεων δύο πρώτων κομμάτων (%)"), gridLineWidth = 0) %>%
    hc_add_series(
        data = f$pctSeatsTopTwoParties,
        name = "Ποσοστό",
        color = "#6366F1",
        marker = list(enabled = TRUE, radius = 4, symbol = "circle")
    ) %>%
     hc_tooltip(
    useHTML = TRUE,
    headerFormat = '<span style="font-size:14px;">Θητεία<b>: {point.x}</b></span><br/>',
    pointFormat = '<span style="color:{series.color};">●</span> <b>{series.name}</b>: {point.y}<br/>',
    backgroundColor = "#ffffff",
    borderColor = "#e5e7eb",
    style = list(color = "#111827", fontSize = "14px")
  ) %>%
  hc_plotOptions(
    spline = list(
      lineWidth = 4,
      marker = list(symbol = "circle", radius = 5)
    )
  ) %>%
    hc_legend(enabled = FALSE)

Σωρευτικός αριθμός βουλευτών

Show the code
gh = clean_dataset |>
  count(partyAbbrNamesGR) |>
  arrange(-n) |>
  mutate(partyAbbrNamesGR = ifelse(n > 70, partyAbbrNamesGR, "Άλλο")) |>
  group_by(partyAbbrNamesGR) |>
  mutate(n = sum(n)) |>
  distinct() |>
  ungroup() |>
  mutate(pct = round( (n / sum(n))*100 , 1))
  
highchart() %>%
    hc_chart(type = "pie", backgroundColor = NULL) %>%
    hc_title(text = "Σύνολο εκπροσώπησης βουλευτών (1981 - 2019)", align = "center") %>%
    hc_subtitle(text = "Το ΠΑΣΟΚ και η Νέα Δημοκρατία αριθμούν το 76% των βουλευτών της ιστορίας του κοινοβουλίου") %>%
    hc_plotOptions(pie = list(
        # key settings to make it a semicircle donut
        startAngle = -90,      # start at left-bottom
        endAngle   = 90,       # end at right-bottom -> forms a half circle
        center     = c("50%", "75%"), # vertically lower so the semi-circle sits nicely
        size       = "110%",   # overall size of the pie
        innerSize  = "60%",    # makes it a donut (adjust for thicker/thinner ring)
        showInLegend = TRUE,
        dataLabels = list(
            enabled = TRUE,
            distance = -30,      # place labels inside the ring; tweak as needed
            style = list(fontSize = "12px"),
            formatter = JS("function() { return '<b>'+ this.point.name +'</b>: '+ this.percentage.toFixed(1) +'%'; }")
        )
    )) %>%
    hc_add_series(
        name = "Share",
        data = list_parse2(gh)
    ) %>%
    hc_tooltip(pointFormat = '{series.name}: <b>{point.percentage:.1f}%</b>') %>%
    hc_legend(layout = "horizontal", align = "center", verticalAlign = "bottom")  

Εκλεξιμότητα νομού

Αυτή τη στιμγή έχω υπολογ´σει

  • τη σύνθεση των κοινοβουλίων ανά θητεία
  • τους βουευτές με τις περισσότερες θητείες σε εθνικό επίπεδο
  • τους βουλευτές με τις περισσότερες θητείες σε επίπεδο κόμματος

Τώρα, θα υπολογίσω τους πιο δημοφιλείς βουλευτές, ανά νομό. Προφανώς, σε αυτή τη περίπτωση εφαρμόζεται γ ίδια λογική με αυτή της προηγούμενης ενότητας (με μικρές μετατροπές). Εγώ προσωπικά θα χαρακτήριζα τη χρήση συναρτήσεων σε αυτή τη περίπτωση σχεδόν υποεχρεωτική, μιας και όλοι οι νομοί είναι 50! Για την εύρεση των συχνοτήτων θα χρησιμοποιήσω τη εντολή count.

Show the code
constituency_freqs <- function(input_constituency, min_times_elected){
  cont_df = clean_dataset %>% dplyr::filter(Constituency == input_constituency) %>% 
    count(surname1, name1, partyFullNamesGR, partyAbbrNamesGR, Color) %>%
    arrange(-n) |>
    dplyr::filter(n >= min_times_elected) %>%
    mutate(FullNameInitial = paste0(surname1, " ", str_sub(name1, 1, 1), "."))
  
highchart() %>%
    hc_chart(type = "bar") %>%
    hc_title(text = "Βουλευτές που εκλέχτηκαν πιο πολλές φορές") %>%
    hc_subtitle(text = "Πόσες φορές εκπροσώπησαν το συγκεκριμένο κόμμα στο Ελληνικό Κοινοβούλιο") %>%
    hc_xAxis(categories = cont_df$FullNameInitial) %>%
    hc_yAxis(title = list(text = "Value")) %>%
    hc_series(
        list(
            name = "# Αριθμός εκλέχτηκε",
            data = lapply(1:nrow(cont_df), function(i) {
                list(
                    y = cont_df$n[i],
                    affiliate = cont_df$partyAbbrNamesGR[i],
                    color = cont_df$Color[i]
                )
            }),
            dataLabels = list(
                enabled = TRUE,
                format = "{y}",
                style = list(fontSize = "12px", textOutline = "none", color = "#FFFFFF")
            )
        )
    ) %>%
    hc_plotOptions(
        bar = list(
            borderRadius = 3,
            pointPadding = 0.2,
            groupPadding = 0.1
        )
    ) %>%
    hc_tooltip(
        headerFormat = "",
        pointFormat = "<b>{point.category}</b><br/>
                  Κόμμα: <b>{point.affiliate}</b><br/>
                  Εκλέχτηκε: <b>{point.y}</b> φορές"
    ) %>%
    hc_legend(enabled = FALSE) %>%
    hc_caption(
        text = "Colors represent different affiliations",
        style = list(fontSize = "12px", color = "#666666")
    )  
  
  # ggplot(data = cont_df, aes(x = reorder(FullName, n), y = n, fill = Party ))+
  # geom_bar(stat = "identity",width = 0.88) +
  # scale_fill_manual(values = c("ANEL" = "#bcd2e8", "INDEPENDENT" = "#cccccc","KKE"=kke_color,"ND" = nd_color, "PASOK" = pasok_color, "SYRIZA" = syriza_color,"XA" = "#000000")) +
  # geom_text(aes(label=n), hjust = 1.5, vjust=0.5, color="white", size=4)+
  # theme_minimal() +
  #  labs(title = "Most elected MPs",
  #      subtitle = "",
  #      caption = "Source: stesiam | stesiam.github.io, 2022") +
  # coord_flip()
}

Now I have frequencies and the party for every MP. That will be useful on my diagrams.

Show the code
#unique(parliament$Constituency) %>% sort()

Επικρατείας

Show the code
constituency_freqs("State", 3)

Αττικής

Show the code
constituency_freqs("Athens A",5)
Show the code
constituency_freqs("Athens B",7)
Show the code
constituency_freqs("Piraeus A",5)
Show the code
constituency_freqs("Piraeus B",5)
Show the code
constituency_freqs("Of Attica (rest)",5)

Central Greece

Show the code
constituency_freqs("Viotia",5)
Show the code
constituency_freqs("Evrytania",2)
Show the code
constituency_freqs("Fokida",2)
Show the code
constituency_freqs("Fthiotida",3)

Central Macedonia

Show the code
constituency_freqs("Thessaloniki A",6)
Show the code
constituency_freqs("Thessaloniki B",6)
Show the code
constituency_freqs("Kilkis",3)
Show the code
constituency_freqs("Pella",3)
Show the code
constituency_freqs("Pieria",3)
Show the code
constituency_freqs("Serres",3)

Acknowledgments

Εικόνα του/της Leonhard Niederwimmer από την ιστοσελίδα Pixabay

Τα δεδομένα παρέχονται από το repo μουστο GitHub. Τα δεδομένα προέρχονται από την ιστοσελίδα του ελληνικού κοινοβουλίου

Αναφορές

Csárdi, G. (2025). keyring: Access the System Credential Store from R. Ανακτήθηκε από https://keyring.r-lib.org/
Grolemund, G., & Wickham, H. (2011). Dates and Times Made Easy with lubridate. Journal of Statistical Software, 40(3), 1–25. Ανακτήθηκε από https://www.jstatsoft.org/v40/i03/
Kunst, J. (2022). highcharter: A Wrapper for the Highcharts Library. Ανακτήθηκε από https://jkunst.com/highcharter/
Lin, G. (2023). reactable: Interactive Data Tables for R. Ανακτήθηκε από https://glin.github.io/reactable/
Müller, K., & Wickham, H. (2023). tibble: Simple Data Frames. Ανακτήθηκε από https://tibble.tidyverse.org/
R Core Team. (2025). R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. Ανακτήθηκε από https://www.R-project.org/
Spinu, V., Grolemund, G., & Wickham, H. (2024). lubridate: Make Dealing with Dates a Little Easier. Ανακτήθηκε από https://lubridate.tidyverse.org
Tiedemann, F. (2020). ggpol: Visualizing Social Science Data with ggplot2. Ανακτήθηκε από https://github.com/erocoar/ggpol
Wickham, H. (2016). ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. Ανακτήθηκε από https://ggplot2.tidyverse.org
Wickham, H. (2023a). forcats: Tools for Working with Categorical Variables (Factors). Ανακτήθηκε από https://forcats.tidyverse.org/
Wickham, H. (2023b). stringr: Simple, Consistent Wrappers for Common String Operations. Ανακτήθηκε από https://stringr.tidyverse.org
Wickham, H. (2023c). tidyverse: Easily Install and Load the Tidyverse. Ανακτήθηκε από https://tidyverse.tidyverse.org
Wickham, H., Averick, M., Bryan, J., Chang, W., McGowan, L. D., François, R., … Yutani, H. (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686. https://doi.org/10.21105/joss.01686
Wickham, H., Chang, W., Henry, L., Pedersen, T. L., Takahashi, K., Wilke, C., … van den Brand, T. (2025). ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. Ανακτήθηκε από https://ggplot2.tidyverse.org
Wickham, H., François, R., Henry, L., Müller, K., & Vaughan, D. (2023). dplyr: A Grammar of Data Manipulation. Ανακτήθηκε από https://dplyr.tidyverse.org
Wickham, H., & Henry, L. (2025). purrr: Functional Programming Tools. Ανακτήθηκε από https://purrr.tidyverse.org/
Wickham, H., Hester, J., & Bryan, J. (2024). readr: Read Rectangular Text Data. Ανακτήθηκε από https://readr.tidyverse.org
Wickham, H., Vaughan, D., & Girlich, M. (2024). tidyr: Tidy Messy Data. Ανακτήθηκε από https://tidyr.tidyverse.org
Wilke, C. O., & Wiernik, B. M. (2022). ggtext: Improved Text Rendering Support for ggplot2. Ανακτήθηκε από https://wilkelab.org/ggtext/
Zhu, H. (2024). kableExtra: Construct Complex Table with kable and Pipe Syntax. Ανακτήθηκε από http://haozhu233.github.io/kableExtra/
Zumbach, D., & Bauer, P. C. (2025). deeplr: Interface to the DeepL Translation API. Ανακτήθηκε από https://www.deepl.com/translator

Αναφορά

Αναφορά BibTeX:
@online{2022,
  author = {, stesiam},
  title = {Περιγραφική Ανάλυση Ελληνικού Κοινοβουλίου},
  date = {2022-10-10},
  url = {https://stesiam.com/el/posts/eda-greek-parliament/},
  langid = {el}
}
Για απόδοση ευγνωμοσύνης, παρακαλούμε αναφερθείτε σε αυτό το έργο ως:
stesiam. (2022, October 10). Περιγραφική Ανάλυση Ελληνικού Κοινοβουλίου. Retrieved from https://stesiam.com/el/posts/eda-greek-parliament/