0. About

This project was built to answer a question of

If a claim of election collusion rests on the observation that multiple voters wrote identical, ordered ballots, how improbable would that actually be by pure chance, and does it’s not literally impossible claim hold up as a defense?

It does not attempt to adjudicate Thailand’s ongoing “ฮั้ว ส.ว.” (Senate collusion) case, determine anyone’s guilt, or independently verify the underlying vote data. We were not able to access official Election Commission (EC) or DSI raw vote tallies. So, what we do here is:

  1. Independently re-derive, from first principles, the probability figures publicly attributed to mathematician Loy Chunpongtong (ลอย ชุนพงษ์ทอง) regarding the June 2024 national-level Senate selection and confirm whether the arithmetic holds up.
  2. Validate the method empirically via Monte Carlo simulation on a scaled down analogue.
  3. Contextualize the resulting probability against thresholds that are already treated as conclusive evidence elsewhere (science, forensics, law), which is the direct rebuttal to the it’s technically possible, so who’s to say argument.
  4. Illustrate, via simulation (not real data), why the reported step pattern in vote scores (ranks 1–6 elevated, 7–10 not) is a meaningful signature of coordinated bloc voting rather than noise.

Every number sourced from public reporting is cited. Every number we generated ourselves (simulations, benchmark comparisons) is labeled as such. Where we go beyond available public data, that is flagged explicitly, and thus this document does not manufacture certainty where none exists.


1. Background

In June 2024, the multi-round, private-selection procedure for Thailand’s Senate (สมาชิกวุฒิสภา) took place, involving voting within groups of 20 professional-backgrounds. First, members of the group vote among themselves (morning round), reducing the number of ~150 candidates per group to 40, before the cross-group afternoon round chooses the final 10 senators per group.

The reporting since (Elections Commission investigation, DSI AI-powered video analysis, opposition parties’ document dumps, and independent analyses) has focused on accusations of blocs using โพย (cheat-sheets) to collude during the voting, leaving the distinct statistical signature of the ballots containing identical lists of names, marked in identical order submitted by individuals who claim not to know anyone else there.

A senator from the accused side made an open statement, legally arguing that nothing unlawful happened because no money was exchanged, and Thai courts had decided previously that bringing a cheat-sheet to the polling area is not a criminal act. Additionally, a rhetorical defense of the matching pattern (used in public discourse, yet without a verified attribution to the particular senator) is that an accidental match, even unlikely, is not impossible, so intent cannot be proven statistically.

This project aims to test that specific claim.


2. Probability calculation

source("R/00_config.R")

Setup, per publicly reported parameters:

  • 154 candidates competed within a professional group nationally (77 provinces × 2 candidates).
  • Each voter in the morning round marked 10 names, in order, from that pool (excluding themselves).
  • Reporting describes 10 ballots with an identical sequence.

So, if voters filled these out honestly and independently, what’s the probability of an exact match?

source("R/01_exact_probability.R")
## PART A: Probability that TWO independent voters write the
##         same 10 -name sequence, in the same order,
##         by pure chance (n = 154 candidates)
## =============================================================
## 
## P(154, 10) = 1 in 5.567 x 10^21 
##   (Loy Chunpongtong's claimed figure: 1 in ~5,567 quintillion
##    = 1 in 5.567 x 10^21)
## 
## Our computed log10(P(154,10)): 21.746 
## Claimed log10(5.567e21):       21.746 
## Difference:                    0 log10 units
## --> The claimed figure checks out to within rounding.
## 
## PART B: Compounding across 10 ballots
## =============================================================
## 
## If ballot #1 is a fixed reference, the probability that ballots
## #2 through #10 ALL independently
## match it is P(154,10) multiplied by itself (N_IDENTICAL_BALLOTS_CLAIMED - 1) times.
## 
## P(all 10 match) = 1 in 5.134 x 10^195 
## This is a 196 -digit number in the denominator.
## 
## For reference, the estimated number of atoms in the observable
## universe is ~10^82.
## Our compounded odds exceed that by a factor of 10^114.
## 
## PART C: Sensitivity check — smallest group (n = 129)
## =============================================================
## 
## Even using the SMALLEST reported group size (weakest case for the
## collusion hypothesis, most generous to the 'coincidence' theory):
## 
## P( 129 , 10 ) = 1 in 8.924 x 10^20 
## Still astronomically small — the conclusion is not sensitive to
## exactly which group size is used.
## 
## PART D: What would make this 'just coincidence' plausible?
## =============================================================
## 
## For 2 voters matching by chance to become as likely as, say, a
## coin flip (p = 0.5), the field size would need to shrink to:
## 
## n = 10 candidates (vs. the actual 154).
## In other words, for the 'coincidence' explanation to be as
## credible as a coin flip, there would need to be only 10 
## candidates total in the group being ranked — not 154.

Bottom line: the odds of even two people independently coming up with an identical ranking order of 10 names from among 154 people is about 1 in 5.6 x 10²¹ which is a value that matches independently against Loy Chunpongtong’s own claim to the effect. Going on to consider all 10 ballot papers that allegedly match results in a value of about 1 in 5 x 10¹⁹⁵ which is a value which is bigger than the total number of atoms in the known universe by 114 orders of magnitude.

Even considering the most conservative value found in the public literature, the smaller group size (129 people not 154), the odds of a match between the two ballot papers are on the order of 10⁻²¹.


3. Method Validation

Since these exponentials are way too large to verify by hand, we checked the underlying combinatorics via a Monte Carlo simulation on an analogous but easily solved problem (8 people, choose 3), verifying that the match rate from the simulation approaches the theoretical probability.

source("R/02_monte_carlo_validation.R")
## Empirical validation on a small analogue problem (n=8, k=3)
## =============================================================
## Theoretical P(match) for n = 8 , k = 3 : 0.002976 
## Empirical P(match) from 300,000 simulated trials: 0.002787 
## Relative error: 6.37 %
## --> Simulation confirms the formula. Same formula, same logic, is used
##     for n=154, k=10 just at a scale too small to brute force directly
##     (a computer simulating 10^21+ trials to observe even one match by
##     chance would need far longer than the age of the universe to run).
## 
## How probability of a chance match collapses as field size grows
## (k = 10 fixed, matching the real ballot size)
## =============================================================
## 
##     n log10_prob_of_match
## 1  10           -6.559763
## 2  15          -10.037318
## 3  20          -11.826362
## 4  30          -14.037535
## 5  50          -16.571430
## 6  75          -18.478281
## 7 100          -19.798068
## 8 129          -20.950537
## 9 154          -21.745610
## 
## Saved plot: output/fig1_probability_collapse.png

That very same reasoning, only this time applied to the true size of the field at 154 people with 10 selections, yields the incredible numbers in Section 2. Of course we can’t calculate that brute force method directly (it would take a computer much, much longer than the age of the universe just to see one random coincidence), but the formula is precisely the same thing.


4. Rebuttal

One reaction to statistical arguments such as this is to say that this is not literally impossible; however, it could be a coincidence.

The flaw in this reasoning is that nothing about probability theory is ever literally impossible except for a logical contradiction. If not literally zero can be an excuse to disregard evidence, then no probabilistic evidence counts for anything:

source("R/03_benchmark_comparisons.R")
## Where does the Senate ballot-matching evidence sit on a scale
## of probability thresholds that ARE treated as conclusive
## elsewhere in science, forensics, and law?
##                                                           scenario
##                      Statistical significance threshold (p < 0.05)
##                  'Highly significant' in most sciences (p < 0.001)
##              Six Sigma quality control standard (~3.4 per million)
##                  Winning a typical 6/49 lottery jackpot (1 ticket)
##         Being struck by lightning in your lifetime (US, ~1/15,300)
##           Random DNA profile match (unrelated person, common est.)
##  Winning a 6/49 lottery jackpot on 3 CONSECUTIVE independent draws
##              THIS CASE: 2 ballots matching by chance (n=154, k=10)
##          THIS CASE: 10 ballots all matching by chance (compounded)
##  Estimated atoms in the observable universe (as a scale reference)
##  log10_probability
##          -1.301030
##          -3.000000
##          -5.468521
##          -7.145626
##          -4.184691
##          -9.000000
##         -21.436877
##         -21.745610
##        -195.710491
##         -82.000000
## 
## Note: the DNA-match and six-sigma figures are standard
## order-of-magnitude reference values, not case-specific numbers;
## they are included only to show what magnitude of improbability
## courts and industry ALREADY treat as effectively conclusive.
## 
## THE ARGUMENT IT REBUTS:
## =============================================================
## Claim: It's not literally impossible, so it could be a
##         coincidence.
## 
## Response: By that standard, NONE of the thresholds above would
## count as evidence of anything, ever because none of them are
## literally zero either. A p<0.05 result in a clinical drug trial
## is not impossible under the null hypothesis; it's just so
## unlikely that treating it as chance would be unreasonable. DNA
## evidence at ~1 in a billion is not impossible either a
## coincidental match COULD occur. Courts convict on it anyway,
## because 1 in a billion is far past the point where 'chance' is
## a credible explanation.
## 
## The Senate ballot-matching odds (2 ballots: 1 in 10^22; 10 ballots: 1 in 10^196) are not just past that
## threshold — the 2 ballot figure alone is already 13 orders of magnitude beyond a
## forensic DNA match (1 in a billion, ~10^-9), and the 10 ballot
## compounded figure is 278 orders of magnitude beyond the number of atoms in the
## observable universe (~10^82). Technically possible is not a
## meaningful defense at this scale; it is a standard that would
## clear literally nothing as evidence, ever.
## Saved plot: output/fig2_benchmark_comparison.png

For comparison: A DNA match of one in a billion is generally considered a conclusive identification in court cases. A p < 0.05, a one in 20 probability, is sufficient grounds for rejecting it happened by chance in clinical science. A defect rate of 3.4 defects per million (six sigma quality level) is generally considered an essentially flawless manufacturing process.

The ballot matching evidence from the Senate investigation, even on just the two-ballot basis, is 13 orders of magnitude more impossible than a DNA match considered conclusive in criminal cases. The full 10-ballot compounded probability is 278 orders of magnitude above the number of atoms in the observable universe.

The counterargument would have been legitimate at the one in a billion threshold (DNA evidence). It would be no less so at one in 10²¹” or even less so at one in 10¹⁹⁵. The counterargument becomes even more convincing as the figures become more unlikely. This is precisely the point that shows possibility was never a legitimate threshold to begin with. The matter in question is rather Is chance the best explanation?“, and here it clearly is not.


5. Secondary anomaly

Separate from the issue of ballot matching, the report goes on to point out that there was an abnormal score distribution whereby candidates ranked 1st to 6th were significantly higher in scores compared to candidates ranked 7th to 10th, a step rather than a slope, which would have occurred in independent voting.

Since we don’t have the true scores, what follows is a methodology demonstration based on fake scores:

source("R/04_score_distribution_simulation.R")
## Average score by rank, top 12 positions:
## =============================================================
##    rank  fair  bloc
## 1     1 16.36 23.93
## 2     2 15.02 22.49
## 3     3 14.28 21.56
## 4     4 13.80 20.59
## 5     5 13.39 19.72
## 6     6 13.01 18.52
## 7     7 12.69 11.16
## 8     8 12.36 10.10
## 9     9 12.14  9.51
## 10   10 11.96  9.04
## 11   11 11.73  8.72
## 12   12 11.46  8.46
## 
## Gap between rank 6 and rank 7 (the boundary of the coordinated bloc's slate size,
## matching the described anomaly at ranks 1-6 vs 7-10):
##   Fair voting: 0.32 point gap
##   Bloc voting: 7.36 point gap (22.6x the fair-voting gap)
## 
## Under fair voting the dropoff is smooth and gradual. Under bloc
## voting there is a sharp discontinuity exactly at the edge of the
## bloc's slate size because the bloc's chosen candidates get a
## fixed vote injection that the rest of the field doesn't.
## This is the statistical signature reporting attributes to the
## real vote data (see Loy Chunpongtong's analysis, reported in
## Posttoday, Feb 28 2025).
## 
## NOTE: this does not confirm the real case showed this exact
## pattern to this exact degree.
## It demonstrates why the REPORTED pattern (if accurately
## described) would be diagnostic of coordination, and gives a
## template test to apply if/when the real vote tallies are
## released.
## 
## Saved plot: output/fig3_score_distribution_simulation.png

For our model, in a situation where an aligned bloc (scaled to Loy Chunpongtong’s own conservative estimate) votes as one solid unit for 6 candidates, and the remainder of the contestants vote independently, the difference between the 6th and 7th rank is over 22 times higher than the difference produced by independent, fair voting. This is the sort of discontinuity that demonstrates evidence of bloc alignment which is that a smoothly descending line is the result of independent voting; and a distinct jump at a particular rank threshold is the effect of a fixed-size bloc voting as one for a fixed-size slate.

Important caveat is that this section describes why the described phenomenon is important if accurate, but does not verify whether the actual 2024 figures did indeed demonstrate such a dramatic jump. Anyone with access to the actual numbers (from EC disclosure or iLaw’s published tables) can plug those into the same analysis.


6. Summary

Question Finding
Does the “1 in 5.567 × 10²¹” figure check out? Yes and is independently re-derived, which matches to within rounding.
Is the underlying method sound? Yes and is validated via Monte Carlo simulation on a small-scale analogue.
Is the conclusion sensitive to exact group size? No, even the smallest reported group (129) gives ~10⁻²¹.
Does “it’s technically possible” hold up as a defense? No because the same logic would invalidate DNA evidence, clinical trial significance, and six-sigma manufacturing standards, and none of which are impossible either.
Does the reported score “step” pattern matter? Plausibly yes, based on simulation, but this requires the real vote data to confirm.

But even if this analysis were to, or could, show intent, that is a matter of law, and not of statistics, and it is questions like who collaborated with whom, whether any sort of payment or reward took place that the numbers here cannot answer. But what this does show is that the particular rebuttal “the match is only possible, thus chance cannot be excluded” does not stand up under the rigor of probabilities elsewhere used.


Appendix

git clone <this project>
cd senate_collusion_analysis
Rscript R/run_all.R                                    # run everything, prints + saves figures/output/
Rscript -e "rmarkdown::render('report.Rmd')"            # regenerate this document

All figures are saved to /output. All source parameters (with citations) live in R/00_config.R.