Programmer with anxiety

Life is always under maintenance

Thai Election 2019 Calculation Software

Feb 2019

การเลือกตั้งในวันที่ 24 มีนาคม 2562 ใกล้เข้ามาแล้ว สื่อหลายๆสำนักเริ่มมีการอธิบายวิธีการคิดคะแนนแบบใหม่ออกมาให้ประชาชนเข้าใจ

ไหนๆก็ไหนๆ เลยลองทำเว็บคำนวณคะแนนซะเลยจะได้รู้ว่าตัวเองเข้าใจถูกไหม ซึ่งการทำงานทั้งหมดทำบนเครื่องผู้ใช้เองด้วย javascript ไม่มีการส่งข้อมูลไปไหน

วิธีคำนวณอ้างอิงจากราชกิจจาฯฉบับนี้ ซึ่งเนื่องจากตัวเองไม่ใช่นักกฎหมาย บอกได้เลยว่าอ่านยากมาก แล้วถ้าใครเจอข้อผิดพลาดหรือบั๊กใดๆก็ตาม ไปแจ้งที่ github issue ได้เลยครับ

วิธีการคำนวณคะแนน

  • เริ่มจากดูคะแนนจากทุกๆเขต
    • เขตไหนมีสูงสุดเป็น “ไม่ออกเสียง” ให้ตัดคะแนนทิ้งทั้งเขต แล้วจัดเลือกตั้งใหม่เพื่อหา สส.เขตคนใหม่ (คะแนนที่จะนำมาคิดแบบบัญชีรายชื่อก็โยนทิ้ง)
    • ถ้าคะแนนสูงสุดเป็นของผู้สมัครคนไหน ให้คนนั้นได้เป็น สส.เขตนั้น และเอาคะแนนของทุกพรรคไปบวกเป็นคะแนนรวมของพรรค
  • เอาคะแนนรวมของแต่ละพรรคมารวมกันเป็นคะแนนรวมของประเทศ (ไม่นับ”ไม่ออกเสียง”)
    • ตัวเลขสมมติ 10ล้าน เสียง
  • เอาคะแนนรวมของประเทศหารห้าร้อย (แบ่งเขต 350 + บัญชีรายชื่อ 150) ได้คะแนนเก้าอี้
    • เก้าอี้ละ 20,000 คะแนน
  • เอาคะแนนรวมของแต่ละพรรคมาหารคะแนนเก้าอี้ ได้จำนวนเก้าอี้ที่แต่ละพรรคควรจะได้ (มีสิทธิ์เป็นทศนิยม)
    • พรรคผ่อน ได้ 104,000 คะแนน ควรได้รวม 5.2 เก้าอี้
    • พรรคจ่ายสด ได้ 446,000 คะแนน ควรได้รวม 22.3 เก้าอี้
    • พรรคเบิ้ม ได้ 9,450,000 คะแนน ควรได้รวม 472.5 เก้าอี้
  • เอาจำนวนเก้าอี้ของแต่ละพรรคลบจำนวนเขตที่ชนะ ได้จำนวนเก้าอี้บัญชีรายชื่อ (ไม่มีติดลบ)
    • พรรคผ่อนไม่ชนะเขตไหนเลย ควรได้ 5.2 เก้าอี้บัญชีรายชื่อ
    • พรรคจ่ายสดชนะไป 30 เขต ควรได้ 0 เก้าอี้บัญชีรายชื่อ
    • พรรคเบิ้มชนะเขตที่เหลือ(320) ควรได้ 152.5 เก้าอี้บัญชีรายชื่อ
  • ถึงขั้นนี้จะแยกออกเป็นสองกรณี นั่นคือจำนวนเก้าอี้บัญชีรายชื่อรวมกันทุกพรรคเกิน 150 ไหม (ถ้าไม่เกินให้ข้ามข้อนี้ไป)
    • ในกรณีตัวอย่างจะเห็นว่าเกินให้ทำการปรับอัตราส่วนลงให้เหลือไม่เกิน 150
    • พรรคผ่อนเหลือ 5.2 * 150 / (152.5 + 5.2) = 4.9461 เก้าอี้บัญชีรายชื่อ
    • พรรคจ่ายสดยังคงเหลือ 0 เก้าอี้บัญชีรายชื่อ
    • พรรคเบิ้มเหลือ 145.2380 เก้าอี้บัญชีรายชื่อ
  • จัดสส.บัญชีรายชื่อให้ตามจำนวนเต็ม
    • พรรคผ่อนได้ 4 เหลือ 0.9461
    • พรรคจ่ายสดได้ 0 เหลือ 0
    • พรรคเบิ้มได้ 145 เหลือ 0.2380
  • ถ้าสส.บัญชีรายชื่อยังจัดสรรไม่ครบ (ซึ่งอาจจะเกิดจากบางพรรคมีสส.บัญชีรายชื่อที่ลงสมัครน้อยเกินไปก็ได้ เช่นถ้าพรรคผ่อนได้ 4 แต่มีลงสมัครแค่ 2 ก็เอาเก้าอี้ที่เหลือมานับขั้นนี้ด้วย)
    • เท่ากับว่าเหลืออีก 3 เก้าอี้
    • ให้วนแจกให้คนที่เหลือเศษสูงสุดทีละ 1 คน (พรรคไหนที่คนสมัครไม่พอก็อดไป) (ดูหมายเหตุ)
      • เบิ้ม -> จ่ายสด -> เบิ้ม
  • รวมที่นั่งได้ว่า
    • พรรคผ่อน 0 แบ่งเขต 2 บัญชีรายชื่อ
    • พรรคจ่ายสด 30 แบ่งเขต 1 บัญชีรายชื่อ
    • พรรคเบิ้ม 320 แบ่งเขต 147 บัญชีรายชื่อ

หมายเหตุ

ถ้าเศษเหลือเท่ากันแล้วเก้าอี้เหลือไม่พอ เช่นเศษเท่ากัน 3 พรรค แต่เหลือเก้าอี้บัญชีรายชื่อแค่ 2 เก้าอี้

ให้เอาคะแนนรวมของพรรคหารจำนวนเก้าอี้รวมที่ได้ไปแล้ว พรรคไหนเยอะกว่าให้พรรคนั้นก่อน

ถ้ายังเท่ากันอีก ให้จับสลากครับ

หมายเหตุ 2

ตัวคำนวณคะแนนสามารถรับไฟล์ csv โดยมีหน้าตาตัวอย่างดังนี้

ทั้งหมดห้ามมีเคาะ space และ separate charactor ต้องเป็น , สำหรับ column และ : สำหรับตรงชื่อพรรค

# ชื่อพรรค1:จำนวนผู้สมัครบัญชีรายชื่อ1 ชื่อพรรค2:จำนวนผู้สมัครบัญชีรายชื่อ2
ชื่อเขต 1 คะแนนของพรรค 1 ใน เขต 1 คะแนนของพรรค 2 ใน เขต 1
ชื่อเขต 2 คะแนนของพรรค 1 ใน เขต 2 คะแนนของพรรค 2 ใน เขต 2
ชื่อเขต 3 คะแนนของพรรค 1 ใน เขต 3 คะแนนของพรรค 2 ใน เขต 3

จากไฟล์ตัวอย่างจะได้คำอธิบายประมาณนี้

# ก:150 ข:150 ค:150 ง:150 จ:150
1 10 10 10 10 15
2 10 10 10 15 10
3 10 10 15 10 10
4 10 15 10 10 10
5 15 10 10 10 10