รายงานผลเลือกตั้งด้วย Mathematica

พอดีผมเห็นในทีวีหลายช่องมีการรายงานผลเลือกตั้งด้วยกราฟสวยๆเยอะมากก็คิดว่าน่าจะมาลองทำให้ดูครับว่า Mathematica ก็ทำได้ 🙂

เร็วด้วยสิ ข้อมูลที่จะเอามาเขียนกราฟผมก็ไปดูดเอามาจากเวบของคณะกรรมการการเลือกตั้งครับ

Mathematica สามารถแสดงแผนภาพหรือกราฟได้หลายแบบครับ ลองดูเพิ่มเติมได้ที่ http://reference.wolfram.com/mathematica/guide/ChartingAndInformationVisualization.html

ผมเลือกแผนภาพวงกลมครับ ซึ่งผลที่ได้ก็ตามที่แสดงด้านล่างนี้ครับ

วิธีการที่ผมทำก็คืออ่านข้อมูลจากเวบกกต http://ect.thaigov.net/election2554/report_partylist.html ด้วยคำสั่ง Import ซึ่งข้อมูลที่อ่านเข้ามาจะเป็น list ของแต่ล่ะบรรทัด ซึ่งผมดูไว้แล้วว่าข้อมูลที่จะเอามาใช้จะเริ่มที่บรรทัด 14 ถึง 53 ของข้อมูลในหน้าเวบนั้น

data=Import[“http://ect.thaigov.net/election2554/report_partylist.html”,”Data”][[14;; 53]];

ถ้าเราดูห้าบันทัดแรกของข้อมูลที่อ่านเข้ามาก็จะได้ว่า
data[[1;; 5]]
{{“หมายเลข 1″, ” พรรค เพื่อไทย”, “11,655,382 คะแนน”}, {“หมายเลข 2″,
” พรรค ชาติพัฒนาเพื่อแผ่นดิน”, “353,362 คะแนน”}, {“หมายเลข 3″,
” พรรค ประชาธิปไตยใหม่”, “103,176 คะแนน”}, {“หมายเลข 4″,
” พรรค ประชากรไทย”, “28,730 คะแนน”}, {“หมายเลข 5″,
” พรรค รักประเทศไทย”, “792,989 คะแนน”}}

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

ber[dat_]≔Module[{tmp},tmp=Characters@dat;ToExpression@StringJoin@tmp[[9;;Length@tmp]]];
เป็นคำสั่งที่กะเอาไว้สำหรับดึงตัวแลขของหมายเลขแต่ล่ะพรรคออกมา

party[dat_] := Module[{tmp},
tmp = Characters@dat;
tmp[[6 ;; Length@tmp]] // StringJoin
];
ก็เป็นคำสั่งสำหรับดึงเอาชื่อพรรคออกมา

score[dat_] := Module[{tmp}, tmp = Characters[dat];
ToExpression@StringJoin@Select[#, # != “,” &] &@
Drop[tmp, {Length@tmp – 5, Length@tmp}]
];

ส่วนอันนี้ก็เป็นคำสั่งสำหรับดึงเอาคะแนนออกมา

เวลาจะเอาข้อมูลไปใช้ ผมก็ต้องสร้างข้อมูลขึ้นหรือจัดให้อยู่ในรูปแบบที่เราต้องการ ซึ่งในตัวอย่างผมก็จัดข้อมูลเป็นคู่ของชื่อพรรคกับคะแนนที่ได้
alldat = {party@#[[2]], score@#[[3]]} & /@ data;
อันนี้ตัวอย่างของ alldat ห้าอันแรก
alldat[[1 ;; 5]]
{{” เพื่อไทย”, 11655382}, {” ชาติพัฒนาเพื่อแผ่นดิน”,
353362}, {” ประชาธิปไตยใหม่”, 103176}, {” ประชากรไทย”,
28730}, {” รักประเทศไทย”, 792989}}

แต่ก่อนจะเอาไปใช้ผมก็ให้มันมีการเรียงลำดับจากมากไปน้อยก่อนด้วยคำสั่ง Sort

dat4plot = Sort[alldat, #1[[2]] > #2[[2]] &];

ซึ่งในรูปแผนภูมิวงกลมนั้นผมให้มันแสดงข้อมูลเป็นเปอร์เซ็นต์โดยแสดงเฉพาะพรรคที่ได้คะแนนมากกว่า 0.5%

PieChart3D[
Select[100. dat4plot[[All, 2]]/N@Total@(dat4plot[[All, 2]]), # >
0.5 &], SectorOrigin -> {Automatic, 1},
ChartLegends -> {dat4plot[[All, 1]]}]