Minimalan broj glasova da bi manjinska lista osvojila jedno mesto – III Deo – Primeri, ograničenja i R kôd

Reading Time: 5 minutes

(Ovo je poslednja od tri objave u kojima se razmatra pitanje izvođenja približne formule za određivanje minimalnog broja glasova potrebnih da bi manjinska lista osvojila jedno mesto i ušla u nacionalnu skupštinu i lokalnu skupštinu u većim i manjim gradovima)

5. Numerički primeri i analiza osetljivosti

Da bismo bolje ilustrovali ponašanje formule, razmotrimo tri stilizovana scenarija: nacionalne izbore sa 250 mandata, veliki grad sa 70 mandata i malu opštinu sa 25 mandata. U svakom slučaju, pretpostavljamo da postoje četiri većinske liste iznad praga, sa udelima donekle inspirisanim skorijim izborima u Srbiji: jedna velika lista, jedna srednja i dve manje.

Narodna skupština (S = 250)

Pretpostavimo da je ukupan broj važećih listića 3,7 miliona, a da većinske liste zajedno osvajaju 95% važećih glasova. Radi ilustracije:

  • Lista A: 40%
  • Lista B: 25%
  • Lista C: 15%
  • Lista D: 15%

Preostalih 5% važećih glasova odlazi malim listama, uključujući posmatranu manjinsku listu i druge grupe ispod praga.

Koristeći pravilo palca sa (\(S = 250\)) i (\(\alpha = 1,35\)), dobijamo (\(p_{\text{min, minority}} \approx 0,30%\)), odnosno oko 11,000 glasova. Ako pokrenemo D’Ontovu raspodelu sa ovim parametrima i povećavamo manjinski udeo od npr. 0,1% na više u malim koracima, obično ćemo naći da manjinska lista prvi mandat osvaja negde između 0,28% i 0,32%, zavisno od toga koliko su „zbijeni“ poslednji dobitni količnici. Jednostavna formula dakle hvata pravi red veličine.

Ako uklonimo bonus od 35% (tj. postavimo (\(\alpha = 1\))), ista formula sugeriše prag od približno

\( p_{\text{min, pre}} \approx \frac{1}{S+1} \approx 0,40\% \),

odnosno oko 15,000 glasova, što odgovara neformalnom pravilu pre 2020. godine. Ovo jasno ilustruje mehanički efekat bonusa: on snižava efektivni prag za manjinske liste za faktor (\(\alpha\)), dakle otprilike 25–30% manje potrebnih glasova.

Veliki grad (S = 70)

Posmatrajmo gradsku skupštinu sa 70 mandata i 200.000 važećih glasova. Primena formule daje

\(p_{\text{min, minority}}^{70} \approx \frac{1}{1,35 \times 71} \approx 1,05\%\).

To je oko 2,100 glasova. U simuliranoj D’Ontovoj raspodeli sa, na primer, jednom listom na 45%, drugom na 30% i dvema na po 10%, plus nekoliko manjih lista, brojčana raspodela često daje poslednji dobitni količnik takav da manjinska lista sa 1–1,3% glasova jedva obezbeđuje jedan mandat. U nekim konfiguracijama (veća fragmentacija, manja dominacija najveće liste) prag može biti nešto viši ili niži, ali pravilo palca daje realan početni okvir.

Bez bonusa, efektivni prag bi bio bliže (\(1/71 \approx 1,4\%\)), tj. oko 2,800 glasova. Dakle, čak i u skupštinama srednje veličine, bonus od 35% primetno smanjuje potreban minimum.

Mala opština (S = 25)

U maloj opštinskoj skupštini sa 25 mandata i, recimo, 20,000 važećih glasova, izlazi

\(p_{\text{min, minority}}^{25} \approx \frac{1}{1,35 \times 26} \approx 2,85\%\).

To je oko 570 glasova. Ovde je uticaj veličine skupštine veoma izražen: tako mala skupština jednostavno ne može da pruži izuzetno nizak prag, čak ni uz bonus. Bez bonusa prag bi porastao na (\(1/26 \approx 3,85\%\)), odnosno približno 770–800 glasova.

Empirijski nalazi i izveštaji iz prakse zaista govore da manjinske liste u malim opštinama obično moraju da osvoje reda veličine 2–4% glasova da bi došle do mandata, u zavisnosti od fragmentacije i izlaznosti. Formula se, dakle, dobro uklapa u uočene obrasce.

Fragmentacija i nevažeći listići

U prethodnim primerima raspodela glasova među većinskim listama bila je fiksirana. U praksi, fragmentacija mnogo znači. Ako postoji jedna izrazito dominantna lista i veći broj minijaturnih, poslednji dobitni količnik često potiče od visokorednih količnika dominantne liste, što može manjinskoj listi donekle olakšati ulaz. Ako više srednjih lista međusobno balansira, poslednji dobitni količnik može biti viši, pa je prag veći.

Nevažeći listići utiču na to koje liste prelaze formalni prag od 3% za „obične“ liste i tako učestvuju u raspodeli. U scenarijima gde veći broj „graničnih“ lista ne uspe da pređe prag, broj konkurenata se smanjuje, a poslednji dobitni količnik „dolazi“ iz manjeg skupa lista. Za ovaj efekat ne postoji jednostavna analitička formula, ali simulacije pokazuju kako skromne promene u udelu nevažećih listića i prelaženju praga mogu pomeriti izračunati (\(p_{\text{min, minority}}\)) za nekoliko desetinki procentnog poena.

6. Ograničenja, napomene i uporedni osvrt

Svaka približna formula za minimalan broj glasova mora se koristiti sa dozom opreza. Pravilo

\(p_{\text{min, minority}} \approx \frac{1}{\alpha (S+1)}\)

počiva na više pojednostavljenja i empirijskih kalibracija. Podrazumeva relativno stabilan obrazac fragmentacije partijskog sistema, uobičajen nivo nesrazmernosti pod D’Ontovom metodom i odsustvo ekstremnih strateških ponašanja (npr. koalicija sklopljenih isključivo radi manipulacije pragom).

U stvarnosti se partijski sistemi menjaju. Nove liste ulaze, stare nestaju ili se spajaju, velike stranke mogu doživeti neočekivane padove, a manjinski birači se mogu drugačije koordinisati iz izbora u izbore. Promene u izlaznosti i udelu nevažećih listića menjaju kontekst u kome prag deluje. Pravni okvir takođe nije statičan; izmene definicije manjinskih lista, bonusa ili praga zahtevale bi novu kalibraciju.

Još jedna važna napomena tiče se tumačenja. Aproksimativna formula ne definiše pravnu granicu, već pre prag u smislu verovatnoće. Ona identifikuje interval manjinskih udela oko koga verovatnoća dobijanja mandata naglo raste. Lista nešto ispod praga može ipak dobiti mandat u povoljnom rasporedu glasova, dok lista nešto iznad njega može izuzetno retko ostati bez mandata. Sofisticiraniji modeli, kao što su agregirane prag-funkcije Ruiza-Rufina (2011) ili noviji stohastički prag-modeli, mogu eksplicitno proceniti verovatnoću reprezentacije kao funkciju udela glasova.

U uporednoj perspektivi, srpska kombinacija izuzeća od praga i bonusa uklapa se u spektar mehanizama zaštite manjina koje preporučuju Venecijanska komisija i OEBS. Hrvatska sa rezervisanim mestima nudi drugačiji model (Republic of Croatia, 2023-2024), u kojem je manjinska zastupljenost formalno garantovana, ali je delimično odvojena od opšte stranačke utakmice. Srpski model prepušta više toga aritmetici D’Ontove metode, ali prag za manjine značajno snižava velikom veličinom izborne jedinice i bonusom.

Za analitičare i manjinske stranke, najprikladnija upotreba formule jeste kao instrument za planiranje: način da se proceni koliko je glasova verovatno potrebno, a ne kao oštra pravna „magijska granica“. Simulacioni pristup, uz pomoć R koda u dodatku, može ovo dopuniti proračunima za konkretne scenarije fragmentacije i izlaznosti.

7. Zaključak – gruba procena

Ovaj tekst je krenuo od konkretnog pitanja: pod važećim izbornim pravilima za parlamentarne i lokalne izbore u Srbiji, kako možemo grubo izračunati minimalan broj i procenat glasova koji je potreban nacionalnoj manjinskoj listi da osvoji jedan mandat?

Polazeći od koncepta efektivnih pragova i mehanike D’Ontove metode, te kalibracijom na srpsko iskustvo, došli smo do jednostavnog, ali prilično moćnog pravila:

U srpskim izborima po proporcionalnom sistemu, sa bonusom od 35% za manjinske liste, približan minimalan manjinski udeo glasova potreban za jedan mandat je
\(p_{\text{min, minority}} \approx \frac{1}{1,35 (S+1)}\).

Za Narodnu skupštinu sa (\(S = 250\)) mandata, ovo znači oko 0,30% važećih glasova, odnosno približno 11,000 glasova pri tipičnoj izlaznosti. Za veći grad sa 70 odbornika, prag je nešto iznad 1%, dok za malu opštinsku skupštinu sa 25 odbornika iznosi približno 2,8–3%.

Ovi pragovi nisu garancije, već realistična očekivanja, usklađena sa literaturom o efektivnim pragovima i sa uočenom praksom u Srbiji i sličnim sistemima. Simulacije zasnovane na R kodu mogu dodatno izoštriti ove procene za konkretne raspodele glasova.

Za manjinske stranke, poruka je pragmatična. Na nacionalnim izborima, udeo reda veličine tri desetine procenta često je dovoljan, zahvaljujući ogromnoj izbornoj jedinici i bonusu. U malim lokalnim skupštinama, međutim, birače je potrebno mobilisati do nekoliko procenata glasova kako bi se obezbedila reprezentacija, čak i uz relativno povoljan institucionalni okvir.

8. Dodatak: R kôd za simulacionu procenu (komentari na engleskom i srpskom)

Kôd u nastavku je sa dvojezičnim komentarima, i može se koristiti kao praktičan alat za procenu minimalnog manjinskog udela za jedan mandat u različitim scenarijima. Uneti su podaci za parlamentarne izbore u Srbiji 2023. godine, lokalne izbore u Beogradu 2024. godine i lokalne izbore u Kosjeriću 2025. godine.

# ====================================================================
# DERIVING AN APPROXIMATE FORMULA FOR THE MINIMUM VOTES NEEDED FOR 
# A MINORITY LIST TO WIN ONE SEAT
# 
# IZVOĐENJE PRIBLIŽNE FORMULE ZA MINIMALAN BROJ GLASOVA POTREBAN DA 
# BI MANJINSKA LISTA OSVOJILA JEDNO MESTO
# ====================================================================

## =======================================================
## CHECK SUM OF VOTE SHARES / PROVERA ZBIRA UDELE GLASOVA
## =======================================================

check_sums <- function(vote_shares, label = "") {
  s <- sum(vote_shares)
  if (s > 1 + 1e-8) {
    warning(sprintf(
      "Sum of vote shares for %s is %.4f (> 1). Please rescale or adjust.",
      label, s
    ))
  } else if (s > 0.99) {
    message(sprintf(
      "Note: sum of vote shares for %s is %.4f (very close to 1, leaving little room for minority share).",
      label, s
    ))
  } else {
    message(sprintf(
      "Sum of vote shares for %s is %.4f (OK).",
      label, s
    ))
  }
}

# =============================================
# EDITABLE PARAMETERS / EDITABILNI PARAMETRI
# =============================================

# Seats in assemblies / Broj mandata u skupštinama
S_national      <- 250   # Number of seats in the National Assembly / Broj mandata u Narodnoj skupštini
S_large_city    <- 110   # Seats in a large city assembly / Broj mandata u velikom gradskom veću
S_small_municip <- 27    # Seats in a small municipal council / Broj mandata u maloj opštini

# Minority bonus / Manjinski bonus
alpha_bonus_default <- 1.35  # Default minority bonus factor / Podrazumevani faktor bonusa za manjinske liste

# Analytical constant in threshold formula / Analitička konstanta u formuli praga
# In classic Lijphart–Gallagher literature c ≈ 0.75 (effective threshold).
# Ovde, zbog bolje kalibracije na Srbiju (pre i posle 2020), default stavljamo c_const = 1,
# što daje "bezbedniji" prag blizak 1/(S+1) bez i 1/(alpha(S+1)) sa bonusom.
c_const <- 1  

# --- INVALID BALLOTS (lambda) / NEVAŽEĆI LISTIĆI (lambda) ---

# Share of invalid ballots (of all ballots cast) for each level
# Udeo nevažećih listića (od svih ubačenih listića) za svaki nivo
# Nacionalni parlament 2023: 104029 nevažećih (~2.73%)
invalid_share_national      <- 0.0273  # približno 2.73% nevažećih

# Beograd 2024: 13950 nevažećih (~1.90%)
invalid_share_large_city    <- 0.0190  # približno 1.90% nevažećih

# Kosjerić 2025: 119 nevažećih (~1.59%)
invalid_share_small_municip <- 0.0159  # približno 1.59% nevažećih

# Legal 3% census is defined as 3% of ALL ballots cast (valid + invalid).
# When we work in shares of VALID votes, the corresponding census share is:
#   threshold_census_valid = 0.03 / (1 - lambda)
#
# Pravni cenzus 3% je definisan kao 3% od SVIH ubačenih listića (važećih + nevažećih).
# Kada radimo sa udelima u VAŽEĆIM glasovima, odgovarajući prag je:
#   threshold_census_valid = 0.03 / (1 - lambda)

threshold_census_national   <- 0.03 / (1 - invalid_share_national)
threshold_census_large_city <- 0.03 / (1 - invalid_share_large_city)
threshold_census_small_mun  <- 0.03 / (1 - invalid_share_small_municip)

# Non-minority lists: NATIONAL level / Većinske liste: NACIONALNI nivo
n_nonminority_national  <- 12
vote_shares_nm_national <- c(
  0.481, 0.243, 0.067, 0.052, 0.048, 0.028,
  0.015, 0.012, 0.009, 0.0025, 0.0018, 0.0015
)

check_sums(vote_shares_nm_national, "NATIONAL – non-minority lists (valid shares)")

# Example shares (valid votes) inspired by 2023 parliamentary election /
# Primer udele glasova (od važećih) inspirisan rezultatima izbora 2023.

# Non-minority lists: LARGE CITY (e.g. Belgrade) / Većinske liste: VELIKI GRAD (npr. Beograd)
n_nonminority_large  <- 11
vote_shares_nm_large <- c(
  0.538, 0.18, 0.124, 0.083, 0.012, 0.012,
  0.0096, 0.0096, 0.0091, 0.0076, 0.0059
)

check_sums(vote_shares_nm_large, "LARGE CITY – non-minority lists (valid shares)")

# Example shares (valid votes) inspired by Belgrade 2024 /
# Primer udele glasova (važećih) inspirisan izborima u Beogradu 2024.

# Non-minority lists: SMALL MUNICIPALITY (e.g. Kosjerić) / Većinske liste: MALA OPŠTINA (npr. Kosjerić)
n_nonminority_small  <- 2
vote_shares_nm_small <- c(
  0.5096, 0.4839
)

check_sums(vote_shares_nm_small, "SMALL MUNICIPALITY – non-minority lists (valid shares)")

# Example shares (valid votes) for a small municipality /
# Primer udele glasova (važećih) u maloj opštini.

# Grid of candidate minority vote shares / Mreža kandidovanih udele manjinske liste
# (in shares of valid votes) / (kao udeo u važećim glasovima)
grid_minority <- seq(0.002, 0.05, by = 0.0005)

# Number of valid votes / Broj važećih glasova
valid_national      <- 3710978  # Parliamentary elections 2023 / Parlamentarni izbori 2023
valid_large_city    <- 1605877  # Belgrade elections 2024 / Beogradski izbori 2024
valid_small_municip <- 7522     # Kosjerić elections 2025 / Kosjerić izbori 2025

# =====================================
#  HELPER FUNCTIONS / POMOĆNE FUNKCIJE
# =====================================

# Safe percentage formatting (x is share, e.g. 0.0123 -> "1.23%")
# Sigurno formatiranje procenta (x je udeo, npr. 0.0123 -> "1.23%")
percent_if_not_na <- function(x, digits = 2) {
  if (length(x) == 0L) return(NA_character_)
  out   <- rep(NA_character_, length(x))
  na_id <- is.na(x)
  if (any(!na_id)) {
    out[!na_id] <- paste0(round(100 * x[!na_id], digits = digits), "%")
  }
  out
}

# Safe integer rounding for counts (e.g. minimal number of votes)
# Sigurno zaokruživanje za broj glasova (celobrojna vrednost)
int_if_not_na <- function(x) {
  if (length(x) == 0L) return(NA_integer_)
  out   <- rep(NA_integer_, length(x))
  na_id <- is.na(x)
  if (any(!na_id)) {
    out[!na_id] <- round(x[!na_id])
  }
  out
}

# =====================================
#  CORE FUNCTIONS / OSNOVNE FUNKCIJE
# =====================================

# d'Hondt allocation with minority bonus and "guaranteed seat" rule
# Raspodela mandata po d'Hondtu sa manjinskim bonusom i "garantovanim mandatom"
dHondt_allocation <- function(votes_named,
                              minority_name       = NA,
                              alpha_bonus         = alpha_bonus_default,
                              threshold_census    = 0.03,
                              S,
                              apply_bonus_rule    = TRUE,
                              apply_census_guard  = TRUE) {
  # votes_named: named numeric vector of vote shares or votes
  #             (ratio matters, not absolute scale).
  # votes_named: imenovani numerički vektor udele ili glasova
  #             (bitni su odnosi, ne apsolutna skala).
  
  if (is.null(names(votes_named))) {
    stop("votes_named must be a NAMED numeric vector.")
  }
  
  eff_votes <- votes_named
  
  # Apply minority bonus only if minority is below threshold_census
  # Primeni manjinski bonus samo ako je manjinska lista ispod praga threshold_census
  if (!is.na(minority_name) && apply_bonus_rule) {
    if (!minority_name %in% names(votes_named)) {
      stop("minority_name is not present in names(votes_named).")
    }
    v_m <- votes_named[minority_name]
    if (v_m < threshold_census) {
      eff_votes[minority_name] <- alpha_bonus * v_m
    }
  }
  
  n_lists  <- length(eff_votes)
  divisors <- 1:S
  
  # Quotients matrix: each column = list, each row = division by k
  # Matrica količnika: svaka kolona = lista, svaki red = deljenje sa k
  quotients_mat <- sapply(eff_votes, function(v) v / divisors)
  
  # Flatten and keep track of which list each quotient belongs to
  # "Poravnaj" matricu i pamti kojoj listi pripada svaki količnik
  q_vec      <- as.vector(quotients_mat)
  list_index <- rep(seq_along(eff_votes), each = S)
  
  # Take S largest quotients
  # Uzmemo S najvećih količnika
  ord        <- order(q_vec, decreasing = TRUE)
  top_idx    <- ord[1:S]
  winners_id <- list_index[top_idx]
  
  seats <- tabulate(winners_id, nbins = n_lists)
  names(seats) <- names(eff_votes)
  
  # Apply "guaranteed seat" rule for lists crossing the census
  # Primeni pravilo "garantovanog mandata" za liste koje su prešle cenzus
  if (!is.na(minority_name) && apply_census_guard) {
    v_m <- votes_named[minority_name]
    # threshold_census je u istim jedinicama kao votes_named (udeo u važećim glasovima)
    if (v_m >= threshold_census && seats[minority_name] == 0) {
      # Zakon: lista iznad cenzusa, ali bez mandata po d'Hondtu, dobija 1 mandat.
      seats[minority_name] <- 1L
    }
  }
  
  return(seats)
}

# Check if a minority list with share p_minority wins >= 1 seat
# Provera da li manjinska lista sa udelom p_minority osvaja bar jedan mandat
minority_wins_seat <- function(p_minority,
                               S,
                               vote_shares_nm,
                               alpha_bonus      = alpha_bonus_default,
                               threshold_census = 0.03) {
  # Construct vote vector: non-minority + minority
  votes <- c(vote_shares_nm, minority = p_minority)
  
  seats <- dHondt_allocation(
    votes_named      = votes,
    minority_name    = "minority",
    alpha_bonus      = alpha_bonus,
    threshold_census = threshold_census,
    S                = S,
    apply_bonus_rule   = TRUE,
    apply_census_guard = TRUE
  )
  
  return(seats["minority"] >= 1L)
}

# Find minimal minority share on a grid that yields >= 1 seat
# Pronalaženje minimalnog udela manjinske liste (sa mreže) koji daje bar jedan mandat
find_minority_threshold_for_S <- function(S,
                                          vote_shares_nm,
                                          grid_minority,
                                          alpha_bonus      = alpha_bonus_default,
                                          threshold_census = 0.03) {
  for (p in grid_minority) {
    if (minority_wins_seat(
      p_minority       = p,
      S                = S,
      vote_shares_nm   = vote_shares_nm,
      alpha_bonus      = alpha_bonus,
      threshold_census = threshold_census
    )) {
      return(p)
    }
  }
  # Ako nijedna vrednost sa mreže ne daje mandat, vraća NA
  return(NA_real_)
}

# ======================================
#  EXAMPLE RUNS / PRIMERI POKRETANJA
# ======================================

# NATIONAL ASSEMBLY / NARODNA SKUPŠTINA
min_share_national <- find_minority_threshold_for_S(
  S                = S_national,
  vote_shares_nm   = vote_shares_nm_national,
  grid_minority    = grid_minority,
  alpha_bonus      = alpha_bonus_default,
  threshold_census = threshold_census_national
)
min_votes_national <- if (is.na(min_share_national)) NA_real_ else min_share_national * valid_national

cat("NATIONAL ASSEMBLY / NARODNA SKUPŠTINA\n")
cat("  Minimal minority share for 1 seat (approx.) / Minimalni udeo manjinske liste za 1 mandat (približno): ",
    percent_if_not_na(min_share_national), "\n", sep = "")
cat("  Minimal number of valid votes (approx.) / Minimalan broj važećih glasova (približno): ",
    if (is.na(min_votes_national)) "NA" else int_if_not_na(min_votes_national), "\n\n", sep = "")

# LARGE CITY ASSEMBLY / SKUPŠTINA VELIKOG GRADA
min_share_large <- find_minority_threshold_for_S(
  S                = S_large_city,
  vote_shares_nm   = vote_shares_nm_large,
  grid_minority    = grid_minority,
  alpha_bonus      = alpha_bonus_default,
  threshold_census = threshold_census_large_city
)
min_votes_large <- if (is.na(min_share_large)) NA_real_ else min_share_large * valid_large_city

cat("LARGE CITY ASSEMBLY / SKUPŠTINA VELIKOG GRADA\n")
cat("  Minimal minority share for 1 seat (approx.) / Minimalni udeo manjinske liste za 1 mandat (približno): ",
    percent_if_not_na(min_share_large), "\n", sep = "")
cat("  Minimal number of valid votes (approx.) / Minimalan broj važećih glasova (približno): ",
    if (is.na(min_votes_large)) "NA" else int_if_not_na(min_votes_large), "\n\n", sep = "")

# SMALL MUNICIPAL COUNCIL / MALA OPŠTINA
min_share_small <- find_minority_threshold_for_S(
  S                = S_small_municip,
  vote_shares_nm   = vote_shares_nm_small,
  grid_minority    = grid_minority,
  alpha_bonus      = alpha_bonus_default,
  threshold_census = threshold_census_small_mun
)
min_votes_small <- if (is.na(min_share_small)) NA_real_ else min_share_small * valid_small_municip

cat("SMALL MUNICIPAL COUNCIL / MALA OPŠTINA\n")
cat("  Minimal minority share for 1 seat (approx.) / Minimalni udeo manjinske liste za 1 mandat (približno): ",
    percent_if_not_na(min_share_small), "\n", sep = "")
cat("  Minimal number of valid votes (approx.) / Minimalan broj važećih glasova (približno): ",
    if (is.na(min_votes_small)) "NA" else int_if_not_na(min_votes_small), "\n\n", sep = "")

## =========================================================
## SCENARIO TABLES FOR S = 250, 110, 27 / TABELE SCENARIJA
## =========================================================

# Values of lambda (invalid share) and alpha (bonus) to explore
# Vrednosti lambda (udeo nevažećih) i alpha (bonus) za analizu
lambda_values <- c(0.00, 0.02, 0.05, 0.10)    # 0%, 2%, 5%, 10%
alpha_values  <- c(1.00, 1.20, 1.35, 1.50)    # bez bonusa, slabiji, važeći, jači bonus

# Helper to build scenario table for a given S and vote_shares_nm
# Pomoćna funkcija: pravi tabelu scenarija za dati S i vektor udele većinskih lista
build_scenario_table <- function(S,
                                 vote_shares_nm,
                                 grid_minority,
                                 lambda_values,
                                 alpha_values,
                                 c_const) {
  grid <- expand.grid(
    lambda = lambda_values,
    alpha  = alpha_values,
    KEEP.OUT.ATTRS = FALSE,
    stringsAsFactors = FALSE
  )
  
  # Census in valid votes / Cenzus izražen kao udeo u važećim glasovima
  grid$census_valid <- 0.03 / (1 - grid$lambda)
  
  # Analytical minority threshold (Lijphart-type with c_const and bonus) /
  # Analitički manjinski prag (tip Lijphart) sa konstantom c_const i bonusom
  # t_eff_minor ≈ c_const / (alpha * (S + 1))
  grid$t_eff_minor  <- c_const / (grid$alpha * (S + 1))
  
  # Simulated minimal minority share / Simulacioni minimalni udeo manjinske liste
  grid$min_share_sim <- NA_real_
  
  for (i in seq_len(nrow(grid))) {
    thr_i   <- grid$census_valid[i]
    alpha_i <- grid$alpha[i]
    
    grid$min_share_sim[i] <- find_minority_threshold_for_S(
      S                = S,
      vote_shares_nm   = vote_shares_nm,
      grid_minority    = grid_minority,
      alpha_bonus      = alpha_i,
      threshold_census = thr_i
    )
  }
  
  # Percent versions / Verzije u procentima
  grid$census_valid_pct   <- percent_if_not_na(grid$census_valid,   digits = 2)
  grid$t_eff_minor_pct    <- percent_if_not_na(grid$t_eff_minor,    digits = 2)
  grid$min_share_sim_pct  <- percent_if_not_na(grid$min_share_sim,  digits = 2)
  
  # Add S column for clarity / Kolona S zbog preglednosti
  grid$S <- S
  
  # Reorder columns for nicer printing
  grid <- grid[, c("S", "lambda", "alpha",
                   "census_valid", "census_valid_pct",
                   "t_eff_minor", "t_eff_minor_pct",
                   "min_share_sim", "min_share_sim_pct")]
  
  grid
}

# Build scenario tables for all three assembly sizes
# Kreiraj scenario tabele za sve tri veličine skupština
scenario_national <- build_scenario_table(
  S              = S_national,
  vote_shares_nm = vote_shares_nm_national,
  grid_minority  = grid_minority,
  lambda_values  = lambda_values,
  alpha_values   = alpha_values,
  c_const        = c_const
)

scenario_large_city <- build_scenario_table(
  S              = S_large_city,
  vote_shares_nm = vote_shares_nm_large,
  grid_minority  = grid_minority,
  lambda_values  = lambda_values,
  alpha_values   = alpha_values,
  c_const        = c_const
)

scenario_small_municip <- build_scenario_table(
  S              = S_small_municip,
  vote_shares_nm = vote_shares_nm_small,
  grid_minority  = grid_minority,
  lambda_values  = lambda_values,
  alpha_values   = alpha_values,
  c_const        = c_const
)

## ===============================================
## ABSOLUTE VOTE TABLES / TABELE U BROJU GLASOVA
## ===============================================

# NATIONAL – absolute votes
scenario_national_abs <- scenario_national
scenario_national_abs$census_valid_votes  <- int_if_not_na(scenario_national_abs$census_valid  * valid_national)
scenario_national_abs$t_eff_minor_votes   <- int_if_not_na(scenario_national_abs$t_eff_minor   * valid_national)
scenario_national_abs$min_share_sim_votes <- int_if_not_na(scenario_national_abs$min_share_sim * valid_national)

# LARGE CITY – absolute votes
scenario_large_city_abs <- scenario_large_city
scenario_large_city_abs$census_valid_votes  <- int_if_not_na(scenario_large_city_abs$census_valid  * valid_large_city)
scenario_large_city_abs$t_eff_minor_votes   <- int_if_not_na(scenario_large_city_abs$t_eff_minor   * valid_large_city)
scenario_large_city_abs$min_share_sim_votes <- int_if_not_na(scenario_large_city_abs$min_share_sim * valid_large_city)

# SMALL MUNICIPALITY – absolute votes
scenario_small_municip_abs <- scenario_small_municip
scenario_small_municip_abs$census_valid_votes  <- int_if_not_na(scenario_small_municip_abs$census_valid  * valid_small_municip)
scenario_small_municip_abs$t_eff_minor_votes   <- int_if_not_na(scenario_small_municip_abs$t_eff_minor   * valid_small_municip)
scenario_small_municip_abs$min_share_sim_votes <- int_if_not_na(scenario_small_municip_abs$min_share_sim * valid_small_municip)

## =====================================
## PRINT NICE TABLES WITH knitr::kable
## LEP ŠTAMPA SA knitr::kable
## =====================================

if (requireNamespace("knitr", quietly = TRUE)) {
  # PROPORTION TABLES / TABELE SA UDELIMA
  cat("\nSCENARIO TABLE – NATIONAL ASSEMBLY (S = ", S_national, ", shares)\n", sep = "")
  print(
    knitr::kable(
      scenario_national,
      digits  = 4,
      caption = "Scenario table – National Assembly (S = 250), shares"
    )
  )
  
  cat("\nSCENARIO TABLE – LARGE CITY (S = ", S_large_city, ", shares)\n", sep = "")
  print(
    knitr::kable(
      scenario_large_city,
      digits  = 4,
      caption = "Scenario table – Large city assembly (S = 110), shares"
    )
  )
  
  cat("\nSCENARIO TABLE – SMALL MUNICIPALITY (S = ", S_small_municip, ", shares)\n", sep = "")
  print(
    knitr::kable(
      scenario_small_municip,
      digits  = 4,
      caption = "Scenario table – Small municipal council (S = 27), shares"
    )
  )
  
  # ABSOLUTE VOTES TABLES / TABELE U APSOLUTNIM BROJEVIMA GLASOVA
  cat("\nSCENARIO TABLE – NATIONAL ASSEMBLY (S = ", S_national, ", votes)\n", sep = "")
  print(
    knitr::kable(
      scenario_national_abs,
      digits  = 4,
      caption = "Scenario table – National Assembly (S = 250), absolute number of votes"
    )
  )
  
  cat("\nSCENARIO TABLE – LARGE CITY (S = ", S_large_city, ", votes)\n", sep = "")
  print(
    knitr::kable(
      scenario_large_city_abs,
      digits  = 4,
      caption = "Scenario table – Large city assembly (S = 110), absolute number of votes"
    )
  )
  
  cat("\nSCENARIO TABLE – SMALL MUNICIPALITY (S = ", S_small_municip, ", votes)\n", sep = "")
  print(
    knitr::kable(
      scenario_small_municip_abs,
      digits  = 4,
      caption = "Scenario table – Small municipal council (S = 27), absolute number of votes"
    )
  )
  
} else {
  message("Package 'knitr' not available; printing raw data frames instead.")
  
  cat("\nSCENARIO TABLE – NATIONAL ASSEMBLY (shares)\n")
  print(scenario_national)
  cat("\nSCENARIO TABLE – LARGE CITY (shares)\n")
  print(scenario_large_city)
  cat("\nSCENARIO TABLE – SMALL MUNICIPALITY (shares)\n")
  print(scenario_small_municip)
  
  cat("\nSCENARIO TABLE – NATIONAL ASSEMBLY (votes)\n")
  print(scenario_national_abs)
  cat("\nSCENARIO TABLE – LARGE CITY (votes)\n")
  print(scenario_large_city_abs)
  cat("\nSCENARIO TABLE – SMALL MUNICIPALITY (votes)\n")
  print(scenario_small_municip_abs)
}


## ==============================
## SAVE SCENARIOS TO CSV FILES 
## ČUVANJE TABELA U CSV FAJLOVE 
## ==============================

# Shares tables / Tabele udelа
write.CSV(
  scenario_national,
  file         = "scenario_national_shares.CSV",
  row.names    = FALSE,
  fileEncoding = "UTF-8"
)

write.CSV(
  scenario_large_city,
  file         = "scenario_large_city_shares.CSV",
  row.names    = FALSE,
  fileEncoding = "UTF-8"
)

write.CSV(
  scenario_small_municip,
  file         = "scenario_small_municip_shares.CSV",
  row.names    = FALSE,
  fileEncoding = "UTF-8"
)

# Absolute votes tables / Tabele u apsolutnim brojevima glasova
write.CSV(
  scenario_national_abs,
  file         = "scenario_national_votes.CSV",
  row.names    = FALSE,
  fileEncoding = "UTF-8"
)

write.CSV(
  scenario_large_city_abs,
  file         = "scenario_large_city_votes.CSV",
  row.names    = FALSE,
  fileEncoding = "UTF-8"
)

write.CSV(
  scenario_small_municip_abs,
  file         = "scenario_small_municip_votes.CSV",
  row.names    = FALSE,
  fileEncoding = "UTF-8"
)

Dobija se sledeći rezultat (detaljni rezultati različitih scenarija sačuvani su u CSV fajlovima).

> cat("NATIONAL ASSEMBLY / NARODNA SKUPŠTINA\n")
NATIONAL ASSEMBLY / NARODNA SKUPŠTINA
> cat("  Minimal minority share for 1 seat (approx.) / Minimalni udeo manjinske liste za 1 mandat (približno): ",
+     percent_if_not_na(min_share_national), "\n", sep = "")
  Minimal minority share for 1 seat (approx.) / Minimalni udeo manjinske liste za 1 mandat (približno): 0.3%
> cat("  Minimal number of valid votes (approx.) / Minimalan broj važećih glasova (približno): ",
+     if (is.na(min_votes_national)) "NA" else int_if_not_na(min_votes_national), "\n\n", sep = "")
  Minimal number of valid votes (approx.) / Minimalan broj važećih glasova (približno): 11133

> 
> # LARGE CITY ASSEMBLY / SKUPŠTINA VELIKOG GRADA
> min_share_large <- find_minority_threshold_for_S(
+     S                = S_large_city,
+     vote_shares_nm   = vote_shares_nm_large,
+     grid_minority    = grid_minority,
+     alpha_bonus      = alpha_bonus_default,
+     threshold_census = threshold_census_large_city
+ )
> min_votes_large <- if (is.na(min_share_large)) NA_real_ else min_share_large * valid_large_city
> 
> cat("LARGE CITY ASSEMBLY / SKUPŠTINA VELIKOG GRADA\n")
LARGE CITY ASSEMBLY / SKUPŠTINA VELIKOG GRADA
> cat("  Minimal minority share for 1 seat (approx.) / Minimalni udeo manjinske liste za 1 mandat (približno): ",
+     percent_if_not_na(min_share_large), "\n", sep = "")
  Minimal minority share for 1 seat (approx.) / Minimalni udeo manjinske liste za 1 mandat (približno): 0.65%
> cat("  Minimal number of valid votes (approx.) / Minimalan broj važećih glasova (približno): ",
+     if (is.na(min_votes_large)) "NA" else int_if_not_na(min_votes_large), "\n\n", sep = "")
  Minimal number of valid votes (approx.) / Minimalan broj važećih glasova (približno): 10438

> 
> # SMALL MUNICIPAL COUNCIL / MALA OPŠTINA
> min_share_small <- find_minority_threshold_for_S(
+     S                = S_small_municip,
+     vote_shares_nm   = vote_shares_nm_small,
+     grid_minority    = grid_minority,
+     alpha_bonus      = alpha_bonus_default,
+     threshold_census = threshold_census_small_mun
+ )
> min_votes_small <- if (is.na(min_share_small)) NA_real_ else min_share_small * valid_small_municip
> 
> cat("SMALL MUNICIPAL COUNCIL / MALA OPŠTINA\n")
SMALL MUNICIPAL COUNCIL / MALA OPŠTINA
> cat("  Minimal minority share for 1 seat (approx.) / Minimalni udeo manjinske liste za 1 mandat (približno): ",
+     percent_if_not_na(min_share_small), "\n", sep = "")
  Minimal minority share for 1 seat (approx.) / Minimalni udeo manjinske liste za 1 mandat (približno): 2.7%
> cat("  Minimal number of valid votes (approx.) / Minimalan broj važećih glasova (približno): ",
+     if (is.na(min_votes_small)) "NA" else int_if_not_na(min_votes_small), "\n\n", sep = "")
  Minimal number of valid votes (approx.) / Minimalan broj važećih glasova (približno): 203

U slučaju parlametarnih izbora 2023. godine procenat minimalnog broja glasova da bi manjinska lista osvojila barem jedno sedište u skupštini iznosio je 0.3%. Kako je na tim izborima bilo važećih 3,710,978 glasova, to znači da je minimalan broj glasova iznosio oko 11,133.

U slučaju lokalnih izbora u Beogradu 2024. godine procenat minimalnog broja glasova da bi manjinska lista osvojila barem jedno sedište u skupštini iznosio je 0.65%. Kako je na tim izborima bilo važećih 720,096 glasova, to znači da je minimalan broj glasova iznosio oko 10,438.

Naposletku, na lokalnim izborima u Kosjeriću 2025. godine procenat minimalnog broja glasova da bi manjinska lista osvojila barem jedno sedište u skupštini iznosio je 2.7%. Kako je na tim izborima bilo važećih 7,369 glasova, to znači da je minimalan broj glasova iznosio oko 203.

Scenario: Uticaj broja mandata i bonusa za manjinske liste

R program daje rezultate analize uticaja promene broja mandata i veličine bonusa za manjinske liste. Tabela 1 daje nazive svake kolone u tabelama sa detaljnim opisom svake od njih.

Tabela 1. Opis indikatora

Naziv koloneOpis indikatora
SVeličina skupštine – ukupan broj mandata u datom scenariju (npr. 250 za Narodnu skupštinu, 110, 27 itd.).
lambdaUdeo nevažećih listića u svim ubačenim listićima (važeći + nevažeći), izražen kao proporcija (npr. 0.05 = 5%).
alphaFaktor manjinskog bonusa za izborne liste nacionalnih manjina (α); 1.00 znači bez bonusa, 1.35 znači +35% bonusa.
census validPravni cenzus izražen u procentima (npr. 3.06%).
t_eff minorAnalitički prag izražen u procentima (npr. 0.22%).
min share simSimulacioni prag izražen u procentima (npr. 0.24%).
census valid votesPravni cenzus izražen u apsolutnom broju važećih glasova (census_valid × broj važećih glasova u tom telu).
t_eff minor votesAnalitički efektivni prag za manjinsku listu izražen u apsolutnom broju važećih glasova (t_eff minor × N valid / 100).
min share sim votesSimulaciono minimalan broj važećih glasova potreban manjinskoj listi za bar 1 mandat (min share sim × N valid / 100).

Tabela 2. Scenario – Republička skupština

Slambdaalphacensus validt_eff minormin share simcensus valid votest_eff minor votesmin share sim votes
250013.00%0.40%0.40%1113291478514844
2500.0213.06%0.40%0.40%1136011478514844
2500.0513.16%0.40%0.40%1171891478514844
2500.113.33%0.40%0.40%1236991478514844
25001.23.00%0.33%0.35%1113291232112988
2500.021.23.06%0.33%0.35%1136011232112988
2500.051.23.16%0.33%0.35%1171891232112988
2500.11.23.33%0.33%0.35%1236991232112988
25001.353.00%0.30%0.30%1113291095211133
2500.021.353.06%0.30%0.30%1136011095211133
2500.051.353.16%0.30%0.30%1171891095211133
2500.11.353.33%0.30%0.30%1236991095211133
25001.53.00%0.27%0.30%111329985711133
2500.021.53.06%0.27%0.30%113601985711133
2500.051.53.16%0.27%0.30%117189985711133
2500.11.53.33%0.27%0.30%123699985711133

Tabela 3. Scenario – Skupština Grada Beograda

Slambdaalphacensus validt_eff minormin share simcensus valid votest_eff minor votesmin share sim votes
110013.00%0.90%0.90%481761446714453
1100.0213.06%0.90%0.90%491601446714453
1100.0513.16%0.90%0.90%507121446714453
1100.113.33%0.90%0.90%535291446714453
11001.23.00%0.75%0.75%481761205612044
1100.021.23.06%0.75%0.75%491601205612044
1100.051.23.16%0.75%0.75%507121205612044
1100.11.23.33%0.75%0.75%535291205612044
11001.353.00%0.67%0.65%481761071710438
1100.021.353.06%0.67%0.65%491601071710438
1100.051.353.16%0.67%0.65%507121071710438
1100.11.353.33%0.67%0.65%535291071710438
11001.53.00%0.60%0.60%4817696459635
1100.021.53.06%0.60%0.60%4916096459635
1100.051.53.16%0.60%0.60%5071296459635
1100.11.53.33%0.60%0.60%5352996459635

Tabela 4. Scenario – Skupština Kosjerića

Slambdaalphacensus validt_eff minormin share simcensus valid votest_eff minor votesmin share sim votes
27013.00%3.57%3.00%226269226
270.0213.06%3.57%3.10%230269233
270.0513.16%3.57%3.20%238269241
270.113.33%3.57%3.35%251269252
2701.23.00%2.98%3.00%226224226
270.021.23.06%2.98%3.05%230224229
270.051.23.16%2.98%3.05%238224229
270.11.23.33%2.98%3.05%251224229
2701.353.00%2.65%2.70%226199203
270.021.353.06%2.65%2.70%230199203
270.051.353.16%2.65%2.70%238199203
270.11.353.33%2.65%2.70%251199203
2701.53.00%2.38%2.45%226179184
270.021.53.06%2.38%2.45%230179184
270.051.53.16%2.38%2.45%238179184
270.11.53.33%2.38%2.45%251179184

Reference

Bischoff, C. S. (2004). Measuring the electoral barrier: Problems and solutions to threshold measurement. Roskilde University Working Paper. https://rucforsk.ruc.dk/ws/portalfiles/portal/54209956/Thresholds_WP_EUI.pdf

Burazer, N. (2020, April 13). Serbian electoral reform: Improved national minority representation or tactical  https://europeanwesternbalkans.com/2020/04/13/serbian-electoral-reform-improved-national-minority-representation-or-tactical-move-against-boycott/

Gallagher, M. (1991). Proportionality, disproportionality and electoral systems. Electoral Studies, 10(1), 33–51. DOI: https://doi.org/10.1016/0261-3794(91)90004-C

Gallagher, M. (n.d.). Election indices and d’Hondt/Sainte-Laguë calculator. Trinity College Dublin. (Excel | PDF)

Lijphart, A. (1994). Electoral systems and party systems: A study of twenty-seven democracies, 1945–1990. Oxford University Press.

Republic of Croatia. (2003–2024). OSCE/ODIHR election assessment and observation mission reports on parliamentary elections. OSCE/ODIHR. https://www.osce.org/ODIHR/elections/croatia/581797 | Final report: https://www.osce.org/ODIHR/elections/croatia/581524

Republic of Serbia. (2022a). Law on the election of members of parliament (CDL-REF(2022)051). Venice Commission. https://www.venice.coe.int/webforms/documents/default.aspx?pdffile=CDL-REF(2022)051-e

Republic of Serbia. (2022b). Law on local elections (CDL-REF(2022)054). Venice Commission. https://www.venice.coe.int/webforms/documents/?pdf=CDL-REF(2022)054-e

Ruiz-Rufino, R. (2011). An empirical application of aggregated threshold functions. West European Politics, 34(4), 816–837. DOI: https://doi.org/10.1080/01402382.2011.546570

Shugart, M. S., & Taagepera, R. (2017). Votes from seats: Logical models of electoral systems. Cambridge: Cambridge University Press. DOI: https://doi.org/10.1017/9781108261128

Taagepera, R. (1998). Nationwide inclusion and exclusion thresholds of representation. Electoral Studies, 17(4), 405–417. DOI: https://doi.org/10.1016/S0261-3794(97)00054-1

Taagepera, R. (2002). Nationwide threshold of representation. Electoral Studies, 21(3), 383–401. DOI: https://doi.org/10.1016/S0261-3794(00)00045-7

Taagepera, R., & Shugart, M. S. (1989). Seats and votes: The effects and determinants of electoral systems. Yale University Press.

Venice Commission. (2008a). The protection of national minorities and elections (CDL-EL(2008)002rev). Council of Europe. https://www.venice.coe.int/webforms/documents/default.aspx?pdffile=CDL-EL(2008)002rev-e

Venice Commission. (2008b). Comparative report on thresholds and other features of electoral systems which bar parties from access to Parliament (CDL-AD(2008)037). Council of Europe. https://www.venice.coe.int/webforms/documents/default.aspx?pdffile=CDL-AD(2008)037-e  

Komentariši

Vaša email adresa neće biti objavljivana. Neophodna polja su označena sa *