You are on page 1of 79

วิโรจ อรุณมานะกุล

Caption

R และสถิตพิ นื้ ฐาน


ภาษาศาสต จุฬาลงกร มาวิทยาลัย
น์
ร์
ณ์
© ๒๕๖๕ โรจ อ ณมานะ ล

ภาค ชาภาษาศาสต
คณะ กษรศาสต
ฬาลงกร มหา ทยา ย
จุ
วิ
อั
ณ์
วิ
น์
วิ
ร์
รุ
ร์
ลั
กุ
คำนำ
หนังสือเ มนี้เขียนขึ้นมาเพื่อใ เ น มือประกอบการใ โปรแกรม R ในการทำงาน านสถิติ โดย ง
เ นที่การใ งานทางภาษาศาสต เ นหลัก แ ก็สามารถนำไปใ กับงาน านอื่นไ หนังสือประกอบ
วยสามบท บทแรกอธิบายหลักแนวคิดพื้นฐานทางสถิติและภาพรวมของสถิติแบบ าง ๆ บทที่สอง
เ นตัวอ างการใ งานโปรแกรม R พ อม script ที่ใ ในทางสถิติ วนบทที่สามเ นเรื่องการใ R ใน
งานท่ี่เ น data mining

3
ด้
น้
ป็
ป็
ล่
ย่
ช้
ช้
ช้
ป็
ร์
ป็
คู่
ร้
ต่
ช้
ช้
ช้
ส่
ด้
ด้
ป็
ด้
ต่
ช้
มุ่
บทที่ ๑
สถิตเิ บือ้ ง น
สถิติแยกประเภทให ไ เ น descriptive statistics กับ inferential statistics
Descriptive statistics เ นสถิติที่ใ เพื่ออธิบาย อมูลทั้งหมดที่รวบรวมมา คือแทนที่จะอธิบาย
หรือแจกแจง อมูลที่รวบรวมมาทีละตัวๆ เราก็ใ วิธีสรุปภาพรวมของ อมูลชุดนั้นออกมาเ นตัวเลข
จำนวนหนึ่ง โดยใ วิธีการอ างการนับความถี่ (frequency) เพื่อดูการกระจายตัวของ อมูลที่พบ
ใ การวัด ากลางออกมาเ นตัวแทน อมูล (central tendency) อ างเ น การหา าเฉลี่ยที่เ น า
mean า mode หรือ า median เ น น าสถิติเห านี้จะ งบอกถึงลักษณะโดยรวมของ อมูล
ที่รวบรวมมาไ วน Inferential statistics เ นการใ สถิติเพื่อหา อสรุปสำหรับ อมูลที่มีจำนวน
มาก เราไ สามารถเก็บ อมูลทั้งหมดไ จึง องเลือก มตัวอ าง อมูล (sample) มาเพื่อใ เ น
ตัวแทน (representative) ของ อมูลทั้งหมด แ วสรุป าทางสถิติที่ไ จากก มตัวอ างนั้นเพื่อใ
อนุมาน (infer) ถึงลักษณะที่คาด าจะเ นของประชากรทั้งหมด (population)

Descriptive Statistics
สถิติเชิงพรรณาเ นการใ สถิติเพื่อหา อสรุปเกี่ยวกับ อมูลทั้งหมดที่รวบรวมมาไ เน
กรณีที่เรา องการเปรียบเทียบผลการเรียนของนักเรียน องหนึ่งเทียบกับอีก องหนึ่ง เราสามารถ
แจกแจงผลการเรียนของนักเรียนแ ละคนใน องไ ามีจำนวนนักเรียนไ คะแนนสอบในแ ละ วง
มาก อยก ากันเพียงใดคือดูจากการ กระจายตัวของ อมูลคะแนน แ วิธีที่ วยใ เห็นภาพเปรียบ
เทียบโดย ายคือการสรุปผลออกมาเ น าตัวเลขกลาง เ น าเฉลี่ยของคะแนนนักเรียนในแ ละ อง
ก็จะทำใ เห็น าคะแนนเฉลี่ยของนักเรียนแ ละ องมาก อย างกันอ างไร แ การดูเฉพาะ า
คะแนนเฉลี่ยอ างเดียวก็ยังไ พอ เพราะนักเรียนสอง องอาจคำนวณ าคะแนนเฉลี่ยออกมาเ ากัน
แ นักเรียน องแรกอาจมีคะแนนเกาะก มกันคือนักเรียน วนให ไ คะแนนใก เคียงกับ าเฉลี่ย แ
อีก องหนึ่งจะมีนักเรียนที่คะแนน างกันมากไ เกาะก มคือมีทั้งคนที่ไ คะแนนสูงมากและคนที่ไ
คะแนนต่ำมาก แ เมื่อคำนวณออกมาแ วไ าเฉลี่ยเ ากันกับ าเฉลี่ยของคะแนนจาก องแรก
4
ช้
ต่
ห้
น้
ห้
ค่
ค่
ง่
ต้
ว่
ห้
ม่
ข้
ด้
ย่
ว่
ส่
ช้
ต่
ค่
ป็
ข้
ป็
ต้
ป็
ม่
ย่
ญ่
ข้
ว่
ด้
ช้
ต่
ต่
ป็
ป็
ข้
ช้
ป็
ป็
ค่
ลุ่
ด้
ต้
ล้
ต่
ห้
ด้
ข้
ม่
ค่
ต้
ค่
ป็
ช้
ห้
ด้
ข้
ล้
ว่
ข้
ห้
ลุ่
ช่
ห้
ช้
ส่
ล่
สุ่
ท่
ค่
น้
ค่
ข้
ญ่
ต่
บ่
ย่
ด้
ค่
ย่
ข้
ข้
ข้
ค่
ด้
ต่
ด้
ย่
ช่
ด้
ห้
ช่
ล้
ลุ่
ต่
ห้
ค่
ข้
ย่
ค่
ข้
ด้
ป็
ห้
ต่
ต่
ป็
ท่
ข้
ช้
ห้
ช่
ป็
ช่
ค่
ค่
ต่
ด้
ช้
กรณีแบบนี้ าเบี่ยงเบนมาตรฐาน (standard deviation) ของคะแนนจากแ ละ องจะสะ อนภาพ
ที่แตก างกันนี้ไ คือ องแรกที่คะแนนโดยมากเกาะก มใก าคะแนนเฉลี่ยจะมี าเบี่ยงเบน
มาตรฐานต่ำในขณะที่ องที่สองที่มีทั้งคนที่ไ คะแนนมากและคะแนน อยจะมี าเบี่ยงเบนมาตรฐาน
สูงก า เ น น

Inferential Statistics
ในงานวิจัย วนให แ ว เรามักไ สามารถเก็บ อมูลทั้งหมดไ เนื่องจากสิ้นเปลืองเวลามาก
หรือบางกรณีก็เ นไปไ ไ ที่จะเก็บ อมูลทั้งหมดมาไ บางกรณีก็เ นเรื่อง งยากและมี าใ ายสูง
เกินไปในการเก็บ อมูลมาทั้งหมด ในกรณีที่เราไ สามารถเก็บ อมูลทั้งหมดมาไ นี้ เราจะใ วิธีการ
มตัวอ าง (sample) มาเพื่อเ นตัวแทนของประชากรทั้งหมด (population) จากนั้นจะวิเคราะ
ทางสถิติเพื่อใ ไ าที่จะสามารถนำมาอนุมาน (infer) าเ นคุณสมบัติของประชากรทั้งหมดนั้นใน
ภายหลัง การใ งานสถิติลักษณะนี้คือที่เรียก าสถิติเชิงอนุมานหรือ inferential statistics
วิธีการที่ใ ใน inferential statistics แยกออกไ เ นสองก ม คือ parameter
estimation และ hypothesis testing สถิติก ม parameter estimation เ นการใ ก มตัวอ าง
มาเพื่อประมาณ าที่ควรจะเ นของประชากรทั้งหมดนั้น และเนื่องจากเ นการประมาณ าจึงมี
โอกาสที่จะผิดพลาดไ ในทางสถิติจึงจะ องพูดถึงระดับความเชื่อมั่น (con dential interval) ไป
วย เ น าหา าเฉลี่ย (mean) จากก มตัวอ างมาไ ก็จะ องบอก า 95% con dence
interval หรือระดับความมั่นใจ า าเฉลี่ยที่ถูก องอ าง อย 95% นั้นจะอ ภายใน วง าใดซึ่งก็จะ
เ นตัวเลข าเฉลี่ยบวกลบ าตัวเลข วงหนึ่ง
สถิติก ม hypothesis testing เ นการใ วิธีการทางสถิติเพื่อหาความสัมพัน ระห าง
ตัวแปร dependent กับ independent (independent variable หรือตัวแปร นเ นตัวที่เราคิด
าเ นเหตุที่ทำใ มีผล อ dependent variable หรือตัวแปรตาม เ น เราอาจคิด า เพศมีผล อ
ความยาวของประโยคที่พูด เพศก็เ นตัวแปร น ความยาวของประโยคก็จะเ นตัวแปรตาม) สถิติ
ก มนี้ยังแยกออกเ น parametric testing กับ non-parametric testing
hypothesis testing จะมี null hypothesis ที่ตรง ามกับสิ่งที่เราคิด เราทดสอบเพื่อจะ
ปฏิเสธ null hypothesis นี้เพื่อที่จะไ ยอมรับ alternative hypothesis ซึ่งเ นสิ่งที่เราคาด าควร
5
สุ่
ด้
ว่
ป็
ลุ่
ป็
ว่
ต่
ย่
ช่
ป็
ค่
ค่
ต้
ถ้
ห้
ป็
ช้
ลุ่
ด้
ห้
ค่
ด้
ข้
ค่
ค่
ป็
ช้
ส่
ด้
ห้
ต่
ม่
ห้
ด้
ค่
ญ่
ป็
ป็
ล้
ว่
ค่
ป็
ข้
ช่
ด้
ต้
ลุ่
ม่
ด้
ต้
ว่
ต้
ลุ่
ป็
ม่
ย่
ด้
ย่
ช้
น้
ข้
ว่
ด้
ลุ่
ป็
ข้
ข้
ด้
ล้
ค่
ป็
ป็
ต้
ช่
น้
ด้
fi
ยุ่
ยู่
ป็
ลุ่
ต่
ป็
ว่
ป็
ค่
ป็
ด้
ห้
ต้
ช่
ว่
ช้
ป็
ค่
ค่
ค่
ลุ่
ท้
ธ์
fi
ช้
ช้
ค่
จ่
ว่
ย่
ว่
ต่
ห์
จะเ น คือโดยปกติ เราคาด าจะมีความสัมพัน ระห างตัวแปรที่เรา องการศึกษาอ แ เราจะตั้ง
null hypothesis าไ มีความสัมพัน ระห างตัวแปรดังก าวเพื่อที่จะปฏิเสธ null hypothesis นั้น
เหตุที่ทางสถิติเราจะตั้งสมมติฐานแบบนี้ ก็เพราะการตั้งสมมติฐานแบบ null hypothesis จะพิสูจ
าไ จริงไ ายก า ตัวอ างเ น สมมติ าเราตั้งสมมติฐาน ามีหนูอ ใน าน การที่เราเดินเ าไปดูใน
านหลาย ๆ ครั้งก็ยังไ พบหนูใน านก็ยังไ เ นเหตุเพียงพอที่จะปฏิเสธสมมติฐานนี้ไ เพราะจริง ๆ
หนูอาจจะออกมาในเวลาที่เราหลับหรือไ ไ เ ามอง แ าเราตั้งสมมติฐาน าไ มีหนูอ ใน าน เรา
สามารถปฏิเสธสมมติฐานนี้ไ ทันทีหากเราพบเห็นหนูสักตัวหนึ่ง ดังนั้น เวลาที่เราตั้งสมมติฐาน าไ มี
ความสัมพัน ใด ๆ แ ใน อมูลมีสิ่งชี้ใ เห็น ามีความสัมพัน บางอ างอ เราก็จะปฏิเสธสมมติฐาน
าไ มีความสัมพัน ไ การตั้งสมมติฐานแบบที่สองจึงเหมาะสมก า สิ่งนี้สะ อนใ เห็นหลักการ
สำคัญที่ Crawley (2005: Kindle Locations 305-306) ก าวไ “absence of evidence is not
evidence of absence”
อ างไรก็ตาม การทดสอบสมมติฐานนี้เ นการสรุปจากก มตัวอ างที่เราสังเกตุเ านั้น จึง
เ นไปไ าอาจมีความผิดพลาดไ ซึ่งความผิดพลาดเ นไ สองลักษณะ ลักษณะแรกคือเราปฏิเสธ
สมมติฐานโดยที่สมมติฐานนั้นเ นจริง ทางสถิติจะเรียก าเ น Type I error อีกลักษณะหนึ่งคือเรา
ควรจะปฏิเสธสมมติฐานนั้นแ เราไ ไ ทำ ทางสถิติเรียก าเ น Type II error มีตัวอ างที่มีคน
เปรียบเทียบ า Type I error เหมือนกับการบอก หญิง อง าไ ไ ตั้งครร วน Type II error
เหมือนกับการบอกกับ ชาย าเขากำลังตั้งครร ในเวลาที่เราทดสอบ null hypothesis นี้เราจะดู
าความ าจะเ นเพื่อบอกถึงความมั่นใจในการปฏิเสธสมมติฐาน วย โดยทั่วไปจะใ าความ าจะ
เ น อยก า 0.05 ซึ่ง งบอกความมั่นใจไ อ าง อย 95% ที่จะปฏิเสธสมมติฐานนั้น
เนื่องจากสถิติที่เราจะใ นั้นมีหลากหลาย การจะเลือกใ สถิติตัวไหนนั้นขึ้นกับชนิดของ
อมูล อมูลที่ใ ในทางสถิติแ งเ นประเภท างๆ ไ แ nominal, ordinal, interval, ratio
• nominal คือ อมูลที่สามารถจัดเ นก มหรือ categorize ไ าเ นอะไร เ น คำตอบ า Yes -
No nominal เ น อมูลที่แยกประเภท างๆชัดเจน เ น เพศ
• ordinal เ น อมูลที่มีการเรียงลำดับจาก อยไปมาก แ ตัวเลขไ ไ มี าที่แ จริงอ เ น scale
1-5 อาจใ เ น 0-4 ก็ไ วง างระห าง 1-2, กับ 2-3 ไ ไ มีนัยยะ ามีความแตก างเ ากัน

6
ว่
บ้
ว่
ค่
ข้
ป็
ป็
ม่
ม่
ป็
น้
ด้
ข้
น่
ว่
ช้
ด้
ว่
ง่
ย่
ป็
ป็
ธ์
ว่
ป็
ข้
ช้
ว่
ป็
ข้
ว่
ธ์
ข้
ต่
ด้
บ่
ผู้
ม่
ม่
ด้
ย่
ข้
ช่
ว่
ด้
ว่
ต่
ช่
ห่
บ่
ป็
ด้
ช้
บ้
ป็
ม่
ป็
ด้
ธ์
ห้
ว่
ม่
ว่
ต่
ด้
ลุ่
ด้
น้
ว่
ม่
ว่
ย่
ฝ้
ป็
ต่
ภ์
ธ์
น้
ป็
ผู้
ว่
ด้
ต่
ช่
ป็
ว่
ถ้
ก่
ท้
ม่
ว่
ล่
ต่
ว่
ป็
ด้
ธ์
ด้
ล่
ว่
ป็
ด้
ด้
ม่
ว้
ว่
ลุ่
ย่
ด้
ม่
ว่
ยู่
ช้
ต้
ว่
ป็
ด้
บ้
ยู่
ค่
ย่
ว่
ภ์
ม่
ท้
ช่
ส่
ท้
ต่
ยู่
ช้
ด้
ยู่
ห้
ยู่
ค่
ท่
ช่
ท่
บ้
ย่
ต่
ว่
ข้
ว่
น่
ม่
น์
• interval มีลักษณะของการเ น scale ที่แ ละ วง างมีความหมายเ าๆกัน เพียงแ า า ตัวเลข
ที่เ นศูน ไ ไ มีความหมายเ นศูน แบบสมบูร (absolute zero) ตัวอ างเ น scale การวัด
อุณหภูมิ ตัวเลข 30 องศาไ ไ มีความหมาย า อนเ นสองเ าของ 15 องศา
• ratio คือ า scale ของตัวเลขที่มี าศูน แบบสมบูร ตัวอ างเ น scale ของการวัดอุณหภูมิที่มี
ห วยเ น kelvin คะแนนสอบของนักเรียน เ น น
แ าในหนังสือสถิติโดยทั่วไปจะแยก อมูลออกเ นสี่ประเภทนี้ แ ในการพิจารณา เราจะ
มอง อมูเ นสองก ม คือก มที่เ นเหมือน ายหรือ label (nominal, ordinal) ซึ่งสถิติที่ใ กับ
อมูลก มนี้เรียก า non-parametric test เ น Chi-square, Mann-Whitney U-test,
Wilcoxon ranked test, Kruskal–Wallis test กับก มที่เ นเหมือนตัวเลขวัด numeric
(interval, ratio) ซึ่งสถิติที่ใ กับ อมูลก มนี้เรียก า parametric test เ น t-test, z test, anova
โดยทั่วไปแ ว การใ สถิตินั้นเ นวิธีการใ เครื่องมือเพื่อ วยยืนยันความคิดหรือสมมติฐาน
บางอ างที่เราคาดไ เ น เรามองเห็นหรือคาด า าจะมีความสัมพัน ระห างตัวแปร าง ๆ ซึ่ง
ความสัมพัน นั้นมีคำอธิบายในเชิงหลักการหรือแนวคิดทฤษฎีบางอ างไ เราจึงไ ใ วิธีการทางสถิติ
ที่เหมาะสมกับ อมูลที่ศึกษาเพื่อ วยยืนยันความสัมพัน ที่มีอ นั้นจาก อมูลที่เก็บมาศึกษา สถิติจึง
มักใ เ นเครื่องมือเพื่อ วยยืนยันถึงการมีอ ของความสัมพัน บางอ างที่เราสามารถใ คำอธิบายไ
เราไ ควรใ วิธีการทางสถิติจับดูความสัมพัน ใด ๆ แ วเมื่อเห็น าไ าที่มีนัยสำคัญทางสถิติแ วก็มา
สรุป าตัวแปรเห านั้นมีความสัมพัน อกันโดยที่ไ มีเหตุผลหรือคำอธิบายที่ดีพอ าทำไมจึงมีความ
สัมพัน กัน เ น สมมติ าเราเก็บ อมูลความสูงของคนกับความนิยมในการใ เสื้อสี างๆ มาคำนวณ
วยวิธีการทางสถิติบางอ างแ วพบ ามีความสัมพัน อกัน ก็ไ ไ หมายความ า ความสูงของคน
จะมีผล อการเลือกใ เสื้อสี าง ๆ ตราบเ าที่เรายังไ สามารถหาเหตุผลอะไรที่จะนำมาใ อธิบาย
ความสัมพัน นี้ไ เ น น

7
ข้
ด้
น่
ป็
ช้
ม่
ข้
ว่
ย่
ป็
ธ์
ป็
ต่
ลุ่
ย์
ป็
ช้
ม่
ค่
ม้
ธ์
ธ์
ว่
ช่
ด้
ข้
ด้
ล่
ว่
ลุ่
ว้
ป็
ส่
ล้
ช่
ช่
ต้
ว่
ย่
ต่
ม่
ลุ่
ช้
ป็
ป็
ด้
ล้
ช้
ช่
ข้
ป็
ข้
ย์
ค่
ว่
ธ์
ต่
ลุ่
ป็
ย์
ยู่
ธ์
ป้
ต่
ว่
ท่
ป็
ข้
ร้
ณ์
ว่
ช่
ต้
ว่
น่
ม่
ช้
ป็
ห่
ล้
ธ์
ช่
ต่
ณ์
ธ์
ม่
ป็
ท่
ยู่
ธ์
ย่
ว่
ลุ่
ม่
ย่
ช่
ด้
ช่
ด้
ค่
ย่
ป็
ข้
ธ์
ท่
ด้
ช่
ว่
ต่
ส่
ย่
ว่
ด้
ช่
ว่
ต่
ช้
ต่
ห้
ต่
ว่
ค่
ช้
ล้
ช้
ด้
บทที่ ๒
การใ โปรแกรม R
R เ นภาษาคอมพิวเตอ ภาษาหนึ่งที่เ นที่นิยมในการใ คำนวณทางสถิติ เพราะเ นโปร
แกมที่ใ ไ ฟรีบนเครื่องคอมพิวเตอ แบบ างๆ ไ าจะใ บน Windows, Mac OS, หรือ Linux
ภาษา R พัฒนามาจากภาษา S ซึ่งพัฒนาขึ้นมาเพื่อใ ในงานสถิติและ อมากลายเ น S+ แ
ซอฟ แว นี้มีราคาแพงเกินไปที่จะซื้อมาใ ในสถาบันการศึกษา ภายหลังนักสถิติสองคนคือ Ross
Ihaka และ Robert Gentleman จึงไ วยกันเขียนซอฟ แว ตามแบบ S+ แ ดึงมาบาง วนเพื่อใ
เพียงพอสำหรับการสอนสถิติและตั้งชื่อ า R เพื่อใ มีนัย ามา อน S โปรแกรม R มีการเผยแพ
แบบ General Public License ใน 1995 โปรแกรม R จึงเ น open source ที่พัฒนามาจาก S+
(ดู Crawley 2005) R เ นที่นิยมใ กันในวงวิชาการเพื่อคำนวณ านสถิติ เพราะมี built-in
function ที่เกี่ยว องกับการคำนวณทางสถิติมาก และมีความสามารถแสดงผลทาง านกราฟ ก
แ โปรแกรม R ดูเหมือนไ มี interface ใ ใ ายๆ แบบ SPSS องสั่งงาน าน command line
แ หากไ จักและ นเคยกับ R แ ว จะเห็น า R มีประสิทธิภาพและทำงานไ เร็วก า และทำไ
มากก าการคำนวณสถิติ และที่สำคัญเ นโปรแกรมฟรี จึงเ นที่นิยมใ ของนักวิชาการจำนวนมาก
นอกจากนี้ ในงานทาง าน data sciences ซึ่งเ นที่สนใจอ างมากใน จจุบัน R ยังเ นภาษาที่
นิยมใ กันในงาน านนี้พอ ๆ กับภาษา Python เพราะ R มี ง ชันทางสถิติที่ใ วยในการประมวล
ผล อมูลให (big data) ไ โดย าย แ ในบทนี้จะก าวถึงการใ งานโปรแกรม R เพื่อคำนวณสถิติ
พื้นฐานสำหรับงานวิจัยทางภาษาศาสต
การติดตัง้ โปรแกรม R
โปรแกรม R สามารถดาว โหลดไ ฟรีจาก http://cran.r-project.org แ วเลือก าจะ
ใ บนเครื่องอะไร เมื่อติดตั้งเสร็จเรียกโปรแกรม R ขึ้นมาจะเห็นเ น console ของมันเอง มี
เครื่องหมาย > แสดง าพ อมจะรับคำสั่ง

8
ช้
ม้
ต่
ข้
ต์
ช้
ว่
ช้
ด้
ร์
ด้
รู้
ญ่
ช้
ป็
ด้
ข้
คุ้
ว่
ด้
ร้
ม่
ด้
ป็
ง่
ล้
ร์
ร์
ปี
น์
ร์
ว่
ด้
ช้
ป็
ช่
ช้
ต่
ต่
ห้
ช้
ด้
ง่
ว่
ป็
ป็
ม่
ห้
ว่
ล่
ว่
ช้
ช้
ต์
ฟั
ย่
ก่
ป็
ป็
ร์
ก์
ช้
ช้
ต้
ป็
ด้
ปั
ช้
ต่
ผ่
ต่
ด้
ช้
ช่
ว่
ป็
ล้
ด้
ส่
ป็
ป็
ว่
ฟิ
ห้
ต่
ด้
ร่
ใ ทดลองพิม คำสั่ง างๆ หลัง > R จะประมวลผลแ วแสดงผลออกมาใ เน >
3+2 จะตอบมา า [1] 5 เราสามารถเก็บ าที่ไ ไ ในตัวแปรแบบที่ใ ในภาษาคอมพิวเตอ ไ
เ น > x = 2+3 เ นการส างตัวแปร x ซึ่งจะมี าเ น 5 หรือ > x = x + 1 จะสั่งใ เพิ่ม าใน
x อีกหนึ่ง บางคนจะนิยมใ เครื่องหมาย <- แทน = โดยมีความหมายเดียวกัน เ น x <- x+1 ก็
หมายถึงใ เพิ่ม าใน x อีก 1 แ วเก็บไ ที่เดิมคือ x
ตัวแปรที่ใ ใน R ตัวพิม ให เล็กถือ ามีความแตก างกัน เมื่อ องการเลิกใ โปรแกรม
R ใ คำสั่ง >q() หรือ >quit() อนจะ ดโปรแกรมเราสามารถเลือก save workspace เพื่อ
โหลด อมูลทั้งหมดที่ทำ างไ กลับมาทำงาน อไ หากมี อสงสัยการใ งานคำสั่งใดใ พิม
>help(….) เ น >help(“getwd”)
>getwd() ดู า working directory ณ จจุบันคืออะไร

9
ช่
ช้
ข้
ห้
ห้
ช่
ว่
ค่
ว่
ช้
ป็
พ์
ค้
ช้
ร้
ว้
ต่
ล้
พ์
ก่
ว้
ญ่
ปั
ปิ
ต่
ว่
ค่
ด้
ค่
ป็
ด้
ว้
ต่
ข้
ล้
ช้
ต้
ช้
ช่
ห้
ช้
ห้
ช่
ห้
ค่
ร์
พ์
ด้
>setwd(“c:/temp/RFiles”) ใ กำหนด working directory ใ อ ที่ c:/temp/RFiles working
directory คือที่ที่โปรแกรมจะถือ าเ นที่ตั้ง นที่จะ านหรือเขียนไฟ ใดใด
การติดตัง้ RStudio
การใ งาน R าน R console เ นการสั่งงาน านทาง command line ซึ่งหลายคนอาจ
ไ นเคย หาก องการใ งาน R ในลักษณะที่มีห าจอ างๆ ใ พ อมสำหรับการแ ไขชุดคำสั่ง างๆ
ห าจอแสดงผล ห าจอแสดงตัวแปร างๆ ฯลฯ ก็สามารถติดตั้ง RStudio เพิ่มเติมไ ใ ไปที่เว็บ
rstudio.com แ วดาว โหลดโปรแกรม RStudio desktop ที่เ น open source edition มาติดตั้ง

การใ RStudio จะ วยอำนวยความสะดวกในเวลาที่เรา องใ ชุดคำสั่งเดิมหลายๆครั้ง


เราสามารถนำชุดคำสั่งทั้งหมดเก็บเ นไฟ โปรแกรม R และเรียกมาใ งาน าน RStudio ไ ทีละ
หลายคำสั่งไ ทำใ ไ องเสียเวลาพิม หรือเรียกคำสั่งให ทีละคำสั่ง

10
ม่
น้
คุ้
ด้
ช้
ช้
ต้
ล้
ห้
น้
ม่
น์
ต้
ผ่
ช้
ว่
ช้
ช่
ป็
ป็
ต่
พ์
ล์
ป็
ต้
น้
อ่
ต่
ผ่
ม่
ห้
ป็
ห้
ร้
ล์
ยู่
ต้
ช้
ช้
ผ่
ก้
ด้
ห้
ด้
ต่
ประเภท อมูลใน R
อมูลพื้นฐานที่ใ ใน R คือ เว็กเตอ ซึ่งเ น อมูลมิติเดียว มี อมูลตัวเดียวหรือหลายตัว
ก็ไ แ จะเ นเ น object ประเภทเดียวกัน object แบบ atomic ที่มีใ ใน R ไ แ character,
numeric, integer, complex number, และ logical (True/False) vector เ นการมอง อมูล
แบบมีลำดับ เ น c(1,3,4) จะ างจาก c(3,4,1)
เราสามารถ อน อมูลเ าโดยตรงเ น vector ใน R ไ โดยพิม c และตาม วยวงเล็บ
บอกลำดับ อมูล (c อมาจาก concatenate เ น ง ชั่นใน R ใ เอา อมูลมา อกันเ น vector)
อมูลที่อ ใน vector องเ น อมูลแบบเดียวกัน เ น เ นตัวเลขทั้งหมดหรือไ ก็ตัวอักษรทั้งหมด
เ น >x = c(10, 5, 23, 18) เ นการส าง vector ที่มี า 4 าตามลำดับคือ 10, 5, 23, 18 ไป
เก็บไ ที่ตัวแปร x เราสามารถ างถึง าแ ละตัวใน vector โดย างถึงลำดับที่ เ น x[2] จะมี า
เ น 5 หาก องการ อน าเ าไปทางคี บอ ดใ ใ คำสั่ง scan() เมื่อใ คำสั่ง x = scan() แ ว
พิม ตัวเลขเ าไป 20 ตัว โดยเ นวรรคใ ตัวเลขแ ละตัว เมื่อบรรทัด อไปเคาะ Enter เลย ก็จะ
หยุดรับ อมูล แ วรายงาน ามี อมูล านเ าใน vector ที่ตั้งชื่อ า x 20 ตัว

หาก อมูลที่นำเ าเ น อมูล างประเภทกัน เ น เ นตัวเลข าง เ น อความ าง


สามารถนำเ าไ โดยใ คำสั่ง list และ างถึง อมูลเฉพาะตำแห งที่ องการไ

อมูล vector และ list จึงเ น อมูลแบบมิติเดียว างกันที่ vector ไ มีการปนกันของ


อมูลอ ภายใน ในกรณีที่ อมูลที่เราใ ในการคำนวณสถิติมีตัวแปรหลายๆตัว อมูลจะมีลักษณะ
เ นตารางโดยที่ อมูลแ ละคอลัม แทนตัวแปรแ ละตัวไ อมูลหลายมิตินี้เ น อมูลแบบ matrix
11
ข้
ข้
ช่
ป็
ป็
ด้
พ์
ว้
ต่
ยู่
ข้
ยู่
ข้
ข้
ข้
ป็
ข้
ข้
ต้
ข้
ข้
ช่
ด้
ป็
ข้
ล้
ป้
ป้
ช้
ย่
ต่
ต้
ค่
ช้
ข้
ข้
ว่
ข้
ป็
ข้
ป็
ข้
ข้
ต่
ว้
อ้
ข้
ข้
น์
ป็
อ่
อ้
ย์
ค่
ต่
ป็
ช้
ห้
ข้
ร้
ข้
ต่
ร์
ป็
ร์
ข้
ห้
ต่
ป็
ช้
ต่
ป็
ฟั
ช่
ข้
ก์
ด้
ป็
ค่
ช่
ข้
ต่
น่
ว่
ค่
ป็
ด้
ห้
อ้
ต้
ข้
ต่
ช้
ข้
ช้
พ์
บ้
ด้
ป็
ม่
ต่
ข้
ข้
ม่
ป็
ช่
ด้
ป็
ก่
ข้
ป็
ด้
ข้
บ้
ล้
ค่
หรือไ ก็ data frame เราจะเรียก าเ น matrix า อมูลทุกตัวในตารางนั้น องเ น object ชนิด
เดียวกัน วน data frame เ นตารางที่ อมูลที่อ างคอลัม เ น อมูล างชนิดกันไ ความ
างของ matrix และ data frame จึงเหมือนความ างระห าง vector กับ list เพียงแ า
matrix และ data frame เ น อมูลหลายมิติ
อมูล data frame เ น อมูลที่ใ อยในงานสถิติ R มอง data frame เ น object
หนึ่งที่มี row และ column เหมือนเ น spreadsheet อันหนึ่ง หลักสำคัญก็คือ าหรือ value
ขอตัวแปรเดียวกันจะ องอ ใน column เดียวกัน รูปแรกแสดงการจัด อมูลที่ไ ถูก อง เพราะจัด
วาง response time ของสามก มแยกจากกันเ นสามคอลัม ในการจัด data frame ของ อมูล
นี้ จะ องจัดแบบรูปสอง คือนำ response time ไ ในคอลัม เดียวกันแ วใ าก ม างๆ เ น า
ในคอลัม Treatment

รูปจาก Crawley, Michael J. (2005). Statistics: An Introduction using R

12
ต่
ม่
ต้
น์
ข้
ส่
ต้
ยู่
ป็
ข้
ป็
ป็
ลุ่
ว่
ข้
ป็
ป็
ข้
ช้
บ่
ป็
ถ้
ยู่
ว้
ต่
ข้
ต่
น์
น์
น์
ว่
ป็
ข้
ข้
ล้
ต่
ห้
ต้
ค่
ม่
ป็
ลุ่
ต้
ค่
ต่
ด้
ป็
ป็
ข้
ต่
ค่
ว่
เราสามารถรวม อมูลหลายๆ vector เ น dataframe ไ โดยมองแ ละ vector เ น
อมูลแ ละคอลัม เ น ในตัวอ าง าง างที่รวมเว็กเตอ gend, age, pref เ า วยกัน วยคำสั่ง
data.frame แ วนำ vector ที่ องการมาประกอบกันโดยหนึ่ง vector จะแทนหนึ่งคอลัม ใน
data frame ที่ส างขึ้น
อมูลใน data frame สามารถ างถึงโดยการเลือกระบุคอลัม ที่ องการไ เ น x$age
หมายถึงนำเฉพาะ อมูลในคอลัม age ของ data frame x มาใ หรือ างโดยใ x[[‘age’]] แทน
ก็ไ หาก องการ างถึง อมูลแ ละตัวด็ าง าน subscription อ เ น x$gend[4] หรือ
x[[‘gend’]][4] มี าเ น ‘male’ ตามตัวอ าง อมูล าง างนี้

การ าน อมูลจากไฟ
เพื่อความสะดวก เราสามารถเตรียม อมูลโดยพิม เ าใน Excel อนไ จากนั้น save ใ
อ ในรูปที่สามารถนำเ าในโปรแกรม R ไ เ น เก็บไฟ แบบ tab delimited จากนั้นจึง าน
อมูลเ ามาเ น data frame โดยใ คำสั่ง read.table
>x1 <- read.table(“c:/temp/data.txt”)
ในกรณีที่ไฟ อมูลไ ไ แยก อมูล วย tab แ ใ สัญลักษ อื่นแทน เ น : ใ เติม
option sep=”:” วย เ น
>x1 <- read.table(“c:/temp/data.txt”, sep=“:”)

13
ข้
ข้
ยู่
ด้
อ่
ข้
ต่
ข้
ข้
ป็
ต้
ร้
ค่
น์
ข้
ล้
ด้
ป็
ล์
ข้
อ้
ช่
ข้
ช่
ข้
ข้
ม่
ล์
น์
ด้
ย่
ช้
ต่
ต้
ข้
ข้
ล่
ด้
ย่
อ้
อ้
ด้
ข้
ช่
ข้
ผ่
ป็
ข้
ล่
ต่
ร์
พ์
ล์
ช้
ข้
ช้
ด้
ต่
ณ์
น์
อ้
ก่
ช่
ต้
ด้
ข้
ต่
ช้
ช่
ด้
ด้
ช่
ด้
ห้
อ่
น์
ป็
ห้
หาก อมูลที่เตรียมไ มี อมูลบรรทัดแรกเ น header ที่บอกชื่อตัวแปรแ ละคอลัม เวลา าน
อมูลเ าใน data frame ก็ องใ option header=TRUE วย หรือหากเก็บ อมูลเ นแบบ
csv ก็ใ ใ คำสั่ง read.csv แทน
คำสั่ง read.table หรือ read.csv จึงเหมาะกับการ าน อมูลที่จับเก็บเ นตารางอ แ ว
เมื่อ านเ ามาก็จะเ น data frame ที่แ ละคอลัม คือ อมูลของตัวแปรเดียวกัน เ น เพศ
คะแนน อายุ วน อมูลแ ละแถวจะเ น อมูลรายการแ ละรายการ
กรณีที่ อมูลเ นไฟ อความหรือ text สามารถใ คำสั่ง readLines เพื่อ าน อความเ า
มาทีละ อห าเ ามาเ น string อมูลทั้งหมดจะเ น vector ของ string แ ละตัวคือหนึ่ง อห า
encoding เ น option สำหรับระบุ character encoding ของไฟ นั้น
>text <- readLines(“c:/temp/DH.txt”,encoding="UTF-8")
text[i] จะเ น อความ อห าที่ i นอกจากคำลั่ง readLines ยังมีคำสั่ง scan าน อมูลจากไฟ
>text <- scan( le="c:/temp/ DHl.txt", what="character", sep="\n")
าน อมูลลักษณะเดียวกัน ดู \n หรือการขึ้น อห าให เ นตัวแยก อมูล าน อมูลตัวอักษรไป
เก็บทีละ อห า ผลที่อาจ างจาก readLines คือ กรณีที่ อห านั้นไ มี อความอะไร คือมีการกด
Enter มากก าหนึ่งหน คำสั่งหลังจะไ าน NULL เ ามา
กรณีที่ องการ าน อมูลเ ามาทีละประโยค ก็สามารถใ คำสั่งเดิม แ ใ sep=”.” แทน
สิ่งที่ไ คือเว็กเตอ ของประโยคที่ระบุ วย full stop ทั้งหมดในไฟ นั้น แ า องการ านเ ามาที
ละคำ ก็ใ ละ option “sep” ออกไป
>text <- scan( le="c:/temp/DHl.txt", what="character", sep=".")
>text <- scan( le="c:/temp/DHl.txt", what="character")
า องการ านไฟ มากหนึ่งไฟ ใ านชื่อไฟ ทั้งหมดออกมา อน จากนั้นวน านไฟ
ไปจนหมด list. les จะหาชื่อไฟ ตามที่ระบุใน pattern เก็บชื่อรายการไฟ for เ นคำสั่งวน
รอบจาก 1 ถึง จำนวนไฟ ทั้งหมด แ วเอาชื่อไฟ แ ละไฟ มา าน อมูลไปเก็บไ ที่ list.data

14
ข้
อ่
อ่
ข้
ข้
ด้
ข้
ย่
ห้
ย่
ข้
ห้
ถ้
ช้
ป็
น้
ป็
ต้
ว่
น้
ข้
ส่
ข้
fi
fi
fi
ข้
ต้
ร์
fi
ป็
ว้
ข้
อ่
ป็
ย่
ป็
ข้
อ่
ล์
ต่
ต่
น้
ล์
ข้
ล์
ต้
ข้
ข้
ล์
ส่
ข้
ด้
ล้
ม่
ป็
อ่
ล์
ป็
ข้
ต่
ห้
ย่
อ่
ล์
ป็
น้
ต่
ข้
น์
ม่
ต่
ข้
ล์
ล์
ย่
ป็
ช้
อ่
อ่
น้
ด้
ล์
ช้
ล์
ข้
ข้
ข้
ม่
ข้
ก่
ต่
ต่
ถ้
ล์
ต่
อ่
อ่
ต้
ต่
ว้
ห้
ข้
ข้
ป็
อ่
น์
ข้
อ่
ข้
ช่
ป็
อ่
ป็
ย่
ข้
ยู่
ล์
อ่
น้
ล้
ข้
ล์
>list. lenames<-list. les(pattern=".csv$")
>list.data<-list()
>for (i in 1:length(list. lenames))
{ list.data[[i]]<-read.csv(list. lenames[i]) }
อมูลแ ละไฟ จะเก็บที่ list.data[i] า องการเ าถึง อมูลแ ละแถวในไฟ นั้น สามารถเรียก าน
list.data[[i]][j] เ น list.data[[2]][5] คือไฟ ที่สองบรรทัดที่ า
นอกจากการสั่งวนรอบใ านไฟ เราสามารถใ อีกวิธีหนึ่งคือ lapply เ นคำสั่งใ
apply ง ชั่นที่ส างขึ้นกับ list ที่ใ รูปแบบคำสั่งคือ lapply( list, function(x) รายละเอียดที่
องการใ ทำ) คำสั่ง าง างนี้จึงไ ผลเหมือนกับ for loop างบน
list.data <- lapply(list. lenames, function(x) scan( le=x, what="character", sep="\n") )
การเลือกใ อมูลบาง วน
เมื่อเรานำ อมูลเ าเ น data frame และ องการใ อมูลเฉพาะ วน เ น ใ แถวที่
อมูลเฉพาะตัวอ างจากเพศชาย เราสามารถกำหนด subset เฉพาะที่ องการไ โดยใ คำสั่ง
subset ในตัวอ าง าง าง เ นการนำ อมูล csv จากไฟ Data-scoring.csv และพิม อมูล
20 รายการแรกออกมาดู จากนั้นดึงเฉพาะ อมูลที่ไ จากก มตัวอ างเพศหญิง โดยใ คำสั่ง
subset(data, Sex == ‘หญิง’) คือดึงรายการจาก Data เฉพาะแถวที่ในคอลัม Sex มี าเ น
‘หญิง‘ เก็บในตัวแปรชื่อ data.sub1 จากนั้นพิม 10 รายการแรกออกมา ก็จะเห็น า
data.sub1 เ นอ างที่ องการ (การใ อมูลเ าภาษาไทย ใ เก็บไฟ เ ารหัสแบบ utf8)

15
ข้
ต้
ข้
fi
ต่
ฟั
ห้
ก์
ป็
ช้
ล์
ข้
ย่
ย่
ย่
ช่
ร้
ข้
ข้
ข้
ต้
fi
ล่
fi
ล่
fi
ข้
ป็
fi
ป็
ส่
ห้
ด้
อ่
ห้
ถ้
ช้
ข้
ต้
ข้
ล์
ล์
ข้
ข้
ข้
ข้
fi
ด้
ต้
พ์
ข้
ช้
ห้
ล์
ห้
ต่
ลุ่
ช้
ข้
ล์
ย่
ข้
ต้
ล์
ส่
น์
ด้
ช่
ป็
พ์
ช้
ช้
ช้
ค่
ข้
ผ่
ป็
ว่
ห้
การคำนวณสถิตพิ นื้ ฐาน
โปรแกรม R มี ง ชั่นพื้นฐานสำหรับคำนวณสถิติ ดังนี้
•mean(x) หา าเฉลี่ยใน อมูลที่เก็บไ ใน vector x
•median(x) หา า median ใน อมูลที่เก็บไ ใน vector x
•sd(x) หา า SD ใน อมูลที่เก็บไ ใน vector x
•var(x) หา า variance ใน อมูลที่เก็บไ ใน vector x
ตัวอ างเ น
16
ย่
ช่
ค่
ค่
ค่
ค่
ข้
ฟั
ข้
ก์
ข้
ว้
ข้
ว้
ว้
ว้
ใน R ไ มี function mode แ เราสามารถใ คำสั่ง which.max ไ เ น >which.max(table(x))
คือแปลง อมูลเ นตารางและนับความถี่ของแ ละหมวด หาตัวที่มี าสูงสุดออกมา

คำสั่ง summary ใ กับ vector เพื่อแสดง าสรุป อมูลซึ่งจะเห็น า min, max, median, mean,
1st quarter, และ 3rd quarter

หาก องการดู อมูลในรูป box graph ใ ใ คำสั่ง boxplot บางครั้งเรียก า “hinge plot” หรือ
“box and whiskers plot” ซึ่งจะแสดงก องบอก 1st Quartile, Median, และ 3rd Quartile
(เ นหนาคือ median) และมีเ น whisker บน าง ที่บอกขอบเขตบน าง ที่ อมูลยังเกาะก ม
อ ตัวอ างเ น
> data = read.csv(“/Users/macbook/data/survey-scoring.csv", header=TRUE,
row.names=1)
าน อมูลตอบแบบสอบถามจากไฟ csv โดยมี header row
> data.ba = subset(data,Edu == 'ปริญญาตรี')
17
อ่
ยู่
ส้
ข้
ต้
ม่
ข้
ย่
ช่
ข้
ป็
ช้
ต่
ส้
ล์
ห้
ช้
ค่
ล่
ช้
ต่
ล่
ข้
ค่
ค่
ด้
ช่
ว่
ล่
ข้
ลุ่
เลือกเฉพาะ อมูล วนที่คนตอบระบุ าเ น ปริญญาตรี
> summary(data.ba$ReadScore)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 35.94 42.42 38.35 45.28 48.00
แสดงผลสรุป อมูลคะแนน วนการเขียนของคนจบปริญญาตรี
>boxplot(data.ba$ReadScore,data.ba$WriteScore,data.ba$ListenScore,data.ba$SpeakS
core, names=c('read','write','listen','speak'),xlab='BA Degree')
สั่งส าง boxplot อมูลคะแนน าน เขียน ง พูด ของคนจบปริญญาตรี names ใ กำหนดชื่อ
อมูลที่ใ แสดง xlab คือ label หรือ าย อความในแกนนอน เ น ขีดบนขีด าง คือ า max
และ min ทั้งนี้ไ รวม วนที่ถูกมอง าเ น outliner ที่แสดงเ นจุดวงกลม เ นขีดหนาตรงกลาง
คือ า median วน านบนก องและ าน างก องคือ อมูลที่ตำแห ง 3/4 และ 1/4 ตามลำดับ
40
30
20
10
0

read write listen speak

BA Degree

18
ข้
ค่
ร้
ห้
ข้
ข้
ม่
ส่
ส่
ข้
ด้
ส่
ส่
ล่
อ่
ว่
ว่
ป็
ป็
ด้
ป้
ล่
ข้
ฟั
ล่
ข้
ป็
ช่
น่
ส้
ล่
ช้
ค่
การ ม อมูล
เราสามารถ ม อมูลจากเวกเตอ ไ วยคำสั่ง sample() ในตัวอ าง าง างนี้ เ นการสั่ง
ใ ม อมูลมาสามตัวจากเวกเตอ x ที่พิม อมูลเ าไปเอง 16 ตัว หากไ ระบุจำนวนจะหมายถึง
ใ มมาจนก าจะหมด เ น sample(x) จะไ อมูลทั้งหมดออกมาแบบ ม sample(x,3) ครั้งที่
สองจะเห็น าไ อมูลคนละตัวกับครั้งแรก

การติดตัง้ package
เราสามารถติดตั้ง package เพิ่มเติมในโปรแกรม R ไ โดยที่ package เ นชุดคำสั่ง
หรือ ง ชั่น างๆ ที่มี เขียนเพิ่มเติมและ องการแ ง นใ อื่นไ ใ วย สามารถเ าไปดูที่ http://
cran.r-project.org/web/views/ หรือ นหา package วยคำ นที่ องการใน http://rseek.org/
ในหนังสือ Analyzing Linguistic Data (Baayan 2008) เขียนไ ส าง package ชื่อ languageR
สำหรับใ ประกอบการอธิบายในหนังสือ เราสามารถติดตั้ง package ของหนังสือเ มนี้โดยพิม คำ
สั่ง install.packages ตามตัวอ าง
•"zipfR",
install.packages(c("rpart", "chron", "Hmisc", "Design","Matrix", "lme4", "coda", "e1071",
"ape", "languageR"), repos = "http://cran.r-project.org")
โปรแกรมจะเชื่อม ออินเทอ เน็ตไปที่ cran.r-project.org เพื่อดาว โหลด package างๆ
ที่ระบุ เมื่อเสร็จสิ้นจะเห็นรายงานผลพ อมทั้งบอก า package นั้นดาว โหลดมาไ ที่ folder ไหน
วนตัว package างๆที่ติดตั้งนั้น จะอ ที่ folder c:\Program Files\R\R-2.11.1\library

19
ส่
ห้
ห้
สุ่
สุ่
ฟั
ข้
สุ่
ก์
ช้
ข้
ว่
ต่
ว่
ด้
ข้
ต่
สุ่
ผู้
ข้
ช่
ต่
ย่
ร์
ร์
ค้
ยู่
ร้
ต้
ร์
พ์
ด้
ข้
ด้
ด้
ข้
บ่
ข้
ว่
ปั
ห้
ด้
ผู้
ผู้
ด้
ค้
ด้
ด้
ช้
ด้
ร้
ต้
น์
สุ่
ย่
ม่
น์
ข้
ล่
ข้
ล่
ว้
ป็
ป็
ต่
พ์
อีกวิธีการหนึ่งคือการ install package ที่มีใน CRAN านเมนูของโปรแกรม R ใ เรียก
“Package & Data” - “package Installer” แ ว นชื่อ package ที่ องการ เมื่อพบ package
นั้นก็เลือก package ที่ องการ และกด “Install Selected”

20
ต้
ล้
ค้
ผ่
ต้
ห้
เมื่อติดตั้ง package LanguageR เรียบ อยแ ว เราสามารถ load package โดยคำสั่ง
library(languageR) โดยที่ languageR คือชื่อของ package ที่ องการโหลด

21
ร้
ล้
ต้
หลังจากติดตั้ง package languageR แ วโหลดเ ามาแ ว จะมี อมูลตัวอ าง วนหนึ่ง
load เ าไป เ น อมูล dative alternation in English ของ Bresnan et al. (2007) เมื่อสัง่
ใ แจง รายการ verb ใน อมูลออกมา 10 รายการ

คอลัม แรกบอก า รับ (recipient) อ ในรูปอะไร เ น NP (Mary gave John a book) หรือ PP
(Mary gave a book to John) คอลัม สุด ายบอกความยาวประโยคเ นเลข log ฐาน e
log(14) = 2.639 ประโยคแรกจึงมีความยาว 14 คำ

22
ห้
น์
ข้
ช่
ว่
ข้
ผู้
ข้
ยู่
น์
ล้
ท้
ป็
ข้
ล้
ข้
ป็
ย่
ส่
การ save อมูลลงไฟ
เราสามารถเก็บ อมูลที่เ น data frame ที่มีอ โดย save เก็บเ นไฟ ไ โดยใ คำสั่ง
write.table
>write.table(verbs, "c:/dativeS.txt") สั่งใ เก็บ data frame “verbs” เ นไฟ ชื่อ dativeS.txt
>write.table(verbs, "/Users/macbook/Documents/dativeS.txt") [ตัวอ างบนเครื่อง Mac]
อมูลในไฟ ที่ไ เ นแ ละบรรทัดแทนแ ละรายการ มี header และ อความอ ใน
เครื่องหมายคำพูด
"RealizationOfRec" "Verb" "AnimacyOfRec" "AnimacyOfTheme" "LengthOfTheme"
"1" "NP" "feed" "animate" "inanimate" 2.6390573
"2" "NP" "give" "animate" "inanimate" 1.0986123
"3" "NP" "give" "animate" "inanimate" 2.5649494
"4" "NP" "give" "animate" "inanimate" 1.6094379
"5" "NP" "offer" "animate" "inanimate" 1.0986123
………
เมื่อมี อมูลเ น text ไฟ (แบบที่ไ จากการ save างบน) เราสามารถนำ อมูลนั้นเ า
มาใน R ไ
>verbs = read.table("c:/dativeS.txt", header=TRUE) สั่งใ านตาราง อมูลในไฟ
datives.txt ซึ่งเ นไฟ ที่มี header บรรทัดแรกสุด
า องการ save อมูลลงไฟ รูปแบบ csv ใ คำสั่ง write.csv
>write.csv(data, "d:/temp/xxx.csv")
การส าง contingency table จาก อมูล data frame ที่มี เ น ในตัวอ าง data
frame “verbs” อมูล RealizationOfRec มี NP, PP และ อมูล AnimacyOfRec มี animate
กับ inanimate เราสามารถส างตารางนับความถี่ของสองตัวแปรนี้ไ วยคำสั่ง xtabs แบบ าง
าง เครื่องหมาย ~ หมายถึง “is a function of” ซึ่งในตัวอ างนี้มีสองตัวแปร วน data บอก า

23
ล่
ด้
ข้
ถ้
ต้
ข้
ข้
ร้
ป็
ข้
ล์
ป็
ล์
ข้
ด้
ข้
ป็
ล์
ร้
ป็
ล์
ต่
ล์
ห้
ด้
ข้
ต่
ช้
ยู่
ย่
ข้
ข้
ด้
ด้
ห้
อ่
ป็
ช่
ย่
ป็
ส่
ล์
ล์
ข้
ข้
ด้
ข้
ย่
ช้
ยู่
ข้
ข้
ว่
ล์
ใ อมูลจาก data frame ไหน จาก อมูลนับไ า NP ที่เ น animate มี 521 เ น inanimate
มี 34 เ น น
> xtabs(~ RealizationOfRec + AnimacyOfRec, data = verbs)

าอยาก าในตัวแปรนั้นมี าอะไรอ าง สามารถใ คำสั่ง levels

verbs.xtabs = xtabs(~ AnimacyOfRec + RealizationOfRec, data = verbs, subset =


AnimacyOfTheme != "animate") เ นการส าง 2x2 contingency table ที่สลับตัวแปรกับ
ตัวอ าง างบน และเพิ่มเงื่อนไข าใน data verbs ใ เอาเฉพาะ วนหรือ subset ที่
AnimacyOfTheme ไ ใ animate แ วเก็บตารางที่ไ ลงใน verbs.xtabs เครื่องหมาย !=
หมายถึง not equal (หากพิม enter อนจบคำสั่ง เราจะเห็นเครื่องหมาย + ในบรรทัดสอง
แสดง าเ นการขึ้นบรรทัดให โดยที่ยังเ นคำสั่ง อเนื่องจากบรรทัดบน)

> sum(verbs.xtabs) สั่งใ หา าผลรวมในตาราง verbs.xtabs ไ าเ น 897 เมื่อสั่ง ใ คูณ


100 หาร วย าผลรวมนี้ ก็ไ เ นเปอ เซ็น ของแ ละ อง (รวมกันทั้งสี่ องเ น 100%)

24
ถ้
ช้
ข้
ย่
ว่
ป็
ข้
รู้
ป็
ด้
ว่
ต้
ค่
ม่
ช่
ค่
ด้
ห้
ม่
ป็
พ์
ค่
ยู่
บ้
ข้
ร์
ว่
ป็
ป็
ล้
ต์
ก่
ต่
ด้
ว่
ร้
ต่
ช้
ช่
ด้
ป็
ห้
ด้
ค่
ช่
ป็
ส่
ป็
ป็
ห้
> mean(verbs[verbs$AnimacyOfRec == "animate", ]$LengthOfTheme) หา า mean
เฉพาะ อมูล วนที่เ น LengthOfTheme ใน verbs แถวที่มีตัวแปร AnimacyOfRec เ น
“animate” จะไ คำตอบเ น 1.540278

> mean(verbs[verbs$AnimacyOfRec != "animate", ]$LengthOfTheme) หา า mean


อมูลเดียวกันที่มีตัวแปร AnimacyOfRec เ น “inanimate” ไ คำตอบ 1.071130

กรณี างบนนี้ ทำรวดเดียวไ วยคำสั่ง tapply คือการสั่งใ ใ ง ชั่นที่กำหนดกับ อมูลที่เรา


องการแยกเ นก มๆ ไ เ น
> tapply(verbs$LengthOfTheme, verbs$AnimacyOfRec, mean)
argument แรกเ น อมูลที่ องการหา า argument สองเ น าหรือ index ที่ใ จำแนกก ม อมูล
ซึ่งในที่นี้มีสอง า คือ “animate” กับ “inanimate” วน argument สุด ายเ น function ที่
องการ apply ในที่นี้คือหา า mean ของ LengthOfTheme แยกตามก ม “animate” กับ
“inanimate”

25
ข้
ต้
ต้
ข้
ข้
ส่
ป็
ค่
ป็
ลุ่
ด้
ป็
ข้
ด้
ช่
ต้
ป็
ค่
ด้
ด้
ค่
ป็
ส่
ป็
ค่
ด้
ห้
ช้
ฟั
ก์
ท้
ลุ่
ช้
ป็
ค่
ค่
ข้
ลุ่
ข้
ป็
การแสดงผล วยกราฟ
เราสามารถสั่งวาดกราฟแ งโดยแจกแจงจำนวน อมูลที่มีในแ ละก มไ เ น สมมติ เรา
อน อมูลเกรด a,b,c,d ของนักเรียนจำนวน 20 คนเก็บไ ในตัวแปร x านทางแ นพิม วยคำ
สั่ง >x = scan(what=“character”) จากนั้นใ คำสั่ง >barplot(table(x)) โปรแกรมจะแสดง
กราฟแ งของ อมูลที่จัดลงตาราง a,b,c,d ใ เราไ

หาก องการแสดงสีที่ างกัน สามารถเติม option col=c("red", "green", "white", "blue") ดังนี้
>barplot(table(x), col=c("red", "green", "white", "blue"))

26
ป้
ต้
ข้
ท่
ข้
ด้
ต่
ท่
ห้
ด้
ช้
ข้
ว้
ต่
ผ่
ลุ่
ด้
ป้
ช่
พ์
ด้
นอกจากคำสั่ง barplot เราสามาถใ คำสั่ง plot สำหรับวาดกราฟแสดงจุดตำแห งที่มี าแกน x,
แกน y ของ อมูลที่มีสองตัวแปร >plot(x,y) โดยที่ x และ y เ น vector ที่มีจำนวน element
เ ากันพ อมทั้งระบุ ชื่อกราฟและชื่อแกน x,y วยคำสั่ง
>plot( dataX, dataY, title=“The title”, xlab=“X-axis label”, ylab= “Y-axis label”)
แ หาก องการแสดงเ นกราฟเ น ใ เติม option type=“l”
หาก องการแสดงเ นกราฟวงกลม ใ ใ
>pie(table(x), col=rainbow(length(table(x))))
คำสั่ง hist() ใ ส างภาพ histogram ของ อมูล เ น
>hist(data.ba$ReadScore)

Histogram of data.ba$ReadScore
40
Frequency

20
0

0 10 20 30 40 50

data.ba$ReadScore

หาก องการดูการกระจายเ น curve มากก า histogram ใ ใ Kernal density plot


>plot(density(data.ba$ReadScore))

27
ท่
ต่
ต้
ต้
ต้
ร้
ข้
ช้
ร้
ป็
ป็
ป็
ส้
ห้
ห้
ช้
ช้
ข้
ว่
ด้
ช่
ห้
ช้
ป็
น่
ค่
density.default(x = data.ba$ReadScore)
Density

0.04
0.00

0 10 20 30 40 50

N = 134 Bandwidth = 2.357

การส างกราฟวงกลม สามารถทำไ วยคำสั่ง pie ซึ่งแสดงเ นสัด วน อยละของ อมูล


วน าง ๆ ดังตัวอ างนี้ อมูลรายการเฉพาะ วนการศึกษา (คอลัม ชื่อ Edu) จะถูกนำมา
แจกแจงตารางความถี่
>group <- table(data$Edu)
>pie(group, col=brewer.pal(4,"Dark2"), radius=3)

>group
Bachelor Certi cate Master PhD
134 10 136 32

28
ส่
ต่
ร้
fi
ย่
ข้
ด้
ด้
ส่
ป็
น์
ส่
ร้
ข้
อมูลที่เ น table สามารถดู ามีหมวดอะไร าง วยคำสั่ง dimnames() และ างถึงแ ละตัวไ
าน subscription ของชื่อหมวดนั้น เ น
>dimnames(group)
[[1]]
[1] "Bachelor" "Certi cate" "Master" "PhD"
>group[['Master']]
[1] 136
library(RColorBrewer) เ น package ที่ วยในการทำกราฟสี าง ๆ ไ โดยระบุใน
option col=”.....” แทนที่จะระบุสีพื้นอ าง col=c(“red”,”blue”,”green”) ใ ใ
col=brewer.pal( n, "setname") โดยที่ n เ นจำนวนสีที่ องการใ แสดง set-name เ นชื่อ set
ที่จะใ ไ เ น Set1, Set2, Set3, Pastel1, Pastel2, Dark2, Greens, Greys, Blues, BuGn,
BuPu, GnBu, Oranges, OrRd, PuBu, PuBuGn, PuRd, Purples, RdPu, Reds, YlGn, YlGnBu,
YlOrBr, YlOrRd เ น น
า องการใ font อื่นเ น font สำหรับแสดงภาษาไทย ใ load libary ‘extrafont’
จากนั้นใ option family = “TH Sarabun New” ในคำสั่งส างกราฟ font TH Sarabun
New ก็จะถูกนำมาใ
>pie(group, col=brewer.pal(4,"Dark2"), family="TH Sarabun New")
า องการส างกราฟแ งแบบ อนหรือแบบเรียงสำหรับ อมูลหลายชุดเพื่อดูเปรียบเทียบ
ก็สามารถทำไ โดยระบุชุด อมูลที่ องใ ใ ครบ ตัวอ างเ น
> counts <- table(data$Speak, data$Edu)
> counts
ต่ำก าปริญญาตรี ปริญญาตรี ปริญญาโท ปริญญาเอก
A1 4 23 6 1
A2 1 12 6 0
B1 1 18 7 1
29
ข้
ผ่
ช้
ด้
ช้
ว่
ป็
ถ้
ถ้
ช่
ต้
ต้
ด้
ป็
ช้
ต้
ช้
ร้
fi
ข้
ว่
ท่
ต้
ช่
ช่
ป็
ช้
ซ้
ห้
บ้
ป็
ย่
ด้
ย่
ช่
ช่
ต้
ข้
ช้
ร้
ห้
ต่
อ้
ด้
ป็
ต่
ห้
ด้
ช้
B2 0 7 9 1
C1 3 55 65 10
C2 1 19 43 19
แปลง อมูลเ นตารางนับคนที่มีระดับ skill ของการพูด างๆ (A1-C2) กับระดับการศึกษา เพื่อจะ
ไ นำไปส างกราฟแ งไ โดยใ คำสั่ง barplot อมูลตาราง counts นี้ เรา องกำหนด label แกน
นอนเอง เพราะ อมูลชื่อคอลัม เ นภาษาไทยไ สามารถแสดงผลในกราฟไ จึงกำหนด
names.arg เ นชื่อ degree ภาษาอังกฤษแทน
> barplot(counts, main="Speaking skill", xlab="Degree of Study", legend =
rownames(counts), names.arg=c("Certi cate", "Bachelor", "Master", "phD"))

Speaking skill

C2
C1
80 100

B2
B1
A2
A1
60
40
20
0

Certificate Bachelor Master phD

Degree of Study

หาก องการเ นกราฟแ งแบบเรียง อกัน ไ ใ แบบ อนทับกัน (stacked) ก็ใ เติมพารามิเตอ
beside=TRUE

30
ด้
ต้
ข้
ร้
ป็
ป็
ป็
ท่
ข้
ท่
ด้
ช้
ต่
น์
ป็
ม่
ข้
ช่
fi
ม่
ซ้
ต่
ต้
ด้
ห้
ร์
> barplot(counts, main="Speaking skill", xlab="Degree of Study", legend =
rownames(counts), names.arg=c("Certi cate", "Bachelor", "Master", "phD"),
beside=TRUE)

Speaking skill
60

A1
A2
50

B1
B2
40

C1
C2
30
20
10
0

Certificate Bachelor Master phD

Degree of Study

หาก องการส างกราฟเ น ใ ใ คำสั่ง plot(VectorData, type=”l”) สำหรับกราฟเ น และ


plot(VectorData, type=”o”) สำหรับกราฟเ นที่มีจุดกำกับ าที่ plot วย เ น
> plot(sort(data$SpeakScore),type="l")

31
ต้
ร้
ส้
ห้
ช้
ส้
fi
ค่
ด้
ช่
ส้
สำหรับกราฟความสัมพัน ระห างตัวแปรสองตัว (x,y) ใ ใ คำสั่ง plot เ นกันโดยมีแห ง
อมูลสอง วน plot(DataX, DataY) เ น
> plot(data$ScoreInt+data$ScoreExp+data$ScoreExpW, data$SpeakScore)
แกนนอนเ นคะแนนที่ไ จากสาม วนรวมกัน ScoreInt, ScoreExp, ScoreExpW แกนตั้งเ น
คะแนน วนการพูด SpeakScore
40
data$SpeakScore

30
20
10
0

0 50 100 150

data$ScoreInt + data$ScoreExp + data$ScoreExpW

32
ข้
ส่
ส่
ป็
ด้
ส่
ธ์
ช่
ว่
ห้
ช้
ช่
ป็
ล่
นอกจากคำสั่งพื้นฐานการส างกราฟตามที่ก าวมา ยังมี package ggplot2 ที่ใ สำหรับ
วยทำกราฟ โดยคำสั่งที่ใ จะเขียนตามหลักไวยากร ของกราฟ ก (grammar of graphics)
ggplot สามารถทำกราฟพื้นฐานแบบที่ก าวมาไ แ กำหนดอง ประกอบอ างเ นระบบชัดเจน
เน
>hist(Data$SpeakScore)
เขียนใหมเ น
>ggplot(data, aes(x = SpeakScore)) + geom_histogram()
ggplot กำหนด อมูลที่ใ คือ อมูลใน data วน aes กำหนดแกน อมูล แ วเติมอง ประกอบ (+)
วยรูปกราฟแบบ histogram
วยการกำหนดอง ประกอบเพิ่มเติมไ นี้ คือการเติม + กราฟหลาย ๆ อ าง ทำใ เราสา
มาถส างกราฟหลายอ าง อนกันไ เ น
> p<-ggplot(data, aes(x = SpeakScore, y = ListenScore))
> p <- p + geom_point(aes(color = SpeakScore)) + geom_smooth(model=lm)
>p
กำหนด อมูลแกน x และแกน y ใ ทำกราฟจุดแสดงความสัมพัน ของ x,y ที่มีสีตามความเ มของ
คะแนน SpeakScore และวาดเ นโ งแสดงความสัมพัน เชิงเ นของ อมูล

หาก องการส างกราฟแ ง ใ ระบุ อมูลหลักที่จำแนกใน x อมูล อยที่จำแนกใน ll


วยอะไร และเติมรูป geom_bar โดยใ ใ stat เ น count คือนับจำนวนใน อมูลนั้น (ทำใ ไ
33
ช่
ด้
ด้
ช่
ร้
ข้
ด้
ป็
ต้
ข้
ย่
ร้
ช้
ซ้
ค์
จ้
ช้
ส้
ท่
ด้
ห้
ค้
ร้
ช่
ห้
ล่
ห้
ช้
ส่
ข้
ด้
ด้
ป็
ล่
ณ์
ต่
ธ์
ส้
ธ์
ข้
ฟิ
ค์
ข้
ข้
ล้
ย่
ย่
ข้
ย่
ป็
ค์
ช้
ห้
ข้
ห้
fi
ม่
องส างตารางนับความถี่แบบตัวอ างที่ านมาแ ว)
>p <- ggplot(data, aes(x=Edu, ll=Speak))
>p <- p + geom_bar(stat="count")
>p

หาก องการ font อื่น ๆ เ น แสดงภาษาไทย ใ เติม theme และระบุ font ที่ องการ
p <- p + theme(text=element_text(size=16, family="TH Sarabun New"))
า องการกราฟแ งแบบที่ อมูล อยเรียง กัน ก็ใ เติม position_dodge() เ าไป
>p <- ggplot(data, aes(x=Edu, ll=Speak))
>p <- p + geom_bar(stat="count", position=position_dodge())
>p

หาก องการแสดงผลคะแนนเ น boxplot แยกตามก มก็ทำไ ในลักษณะเดียวกัน ดังนี้


>p <- ggplot(data, aes(x=Edu, y=SpeakScore))
34
ต้
ถ้
ต้
ร้
ต้
ต้
ท่
ข้
ย่
ย่
fi
fi
ช่
ป็
ผ่
คู่
ล้
ห้
ห้
ลุ่
ด้
ข้
ต้
>p <- p + geom_boxplot()
>p

า องการส างกราฟหลายอันมาเทียบกันตามก ม ก็สามารถทำไ โดยใ facet_grid


แ วระบุตัวแปรที่ องการใ แยกรูปกราฟโดยระบุ อมูล row ~ column ตัวอ าง Edu ~ . จะ
แสดงกราฟตาม row แยกตามวุฒิการศึกษา แ หากเ น . ~ Edu จะแสดงกราฟกลับกันเ นสี่รูป
ตามคอลัม า องการใ สองตัวแปรแยกก ม ก็ระบุทั้ง row ~ column ตามตัวอ าง าง างนี้
>p<-ggplot(data,aes(x = Sex, y=WriteScore+SpeakScore))
>p<-p+geom_boxplot()+facet_grid(. ~ Edu)
>p

>p <- ggplot(data,aes(SpeakScore, ListenScore))


>p <- p + geom_point(aes(color = SpeakScore)) + geom_smooth(model=lm) +

35
ล้
ถ้
น์
ต้
ถ้
ต้
ต้
ร้
ช้
ช้
ลุ่
ต่
ข้
ป็
ลุ่
ด้
ย่
ย่
ช้
ข้
ล่
ป็
facet_grid(Edu ~ .)
>p

า องการเติม อความบรรยายชื่อกราฟ ชื่อแกน อมูล ก็สามารถเติม +ggtitle(“...”) หรือ


+xlab(“...”) หรือ ylab(“...”) หรือ labs(title=”...”, xlab=”...”, ylab=”...”)
การคำนวณ า Z-score
ในการเก็บ อมูลจำนวนหนึ่งมาแจกแจง หากเราเก็บ อมูลไปเรื่อยๆ เ นจำนวนมาก หาก
อมูลนั้นมีการกระจายตัวอ างสมดุลหรือที่เรียก ามี normal distribution เมื่อเราคำนวณ าเฉลี่ย
จาก อมูลนั้น าเฉลี่ยจะเ น าที่อ ตรงกลางของการกระจายตัว ลักษณะนี้ทางสถิติเรียก า
central limit theory เมื่อวาดเ นกราฟก็จะไ เ นรูประฆังคว่ำ และจากกราฟนี้ เมื่อคำนวณ
พื้นที่ที่อ ระห างตำแห งที่ -1.96*sd กับ 1.96*sd พื้นที่นั้นคิดเ นปริมาณ 95% คือเหลือปลาย
ายและปลายขวา างละ 2.5%

36
ข้
ซ้
ข้
ยู่
ถ้
ต้
ว่
ค่
ค่
ข้
ข้
น่
ข้
ย่
ป็
ค่
ป็
ยู่
ว่
ด้
ป็
ข้
ข้
ป็
ป็
ค่
ว่
Crawley, Michael J. (2005: Kindle Location 1124)
การคำนวณ า Z-score อาศัยหลักการที่ก าวมา าง น ปรับ าตัวเลขหรือ normalize โดยใ สูตร
z = (y - y_bar) / sd หาก า y มี ามากก า าเฉลี่ยจะมี าเ นบวก หาก อยก า าเฉลี่ยจะมี า
เ นลบ า z-score ที่ไ นี้จะบอกถึง probability ที่ตำแห งนั้นไ เ น ในตัวอ างของ Crawley
(2005) ที่เก็บ อมูลความสูงของก มตัวอ างมี าเฉลี่ยเ น 170 และมี า sd เ น 8 หากเรา
องการ าจำนวนคนที่มีความสูง อยก า 160 คำนวณไ จาก า z = (160-170)/8 = -1.25 เมื่อ
ใ คำสั่ง >pnorm(-1.25) ไ า 0.1056498 ก็ตีความไ ามีประมาณ 10% หากอยาก าคนที่มี
ความสูงมากก า 185 มีเ าไร ก็คำนวณจาก า z = (185-170)/8 = 1.875 และสั่งหา า
pnorm(1.875) ไ เ ากับ 0.9696036 ตีความไ าคนที่สูงก า 185 มีจำนวน (1-0.9696036)*100
คือประมาณ 4%
ใน R เราสามารถแปลง าใน vector เ น z-score ไ วยคำสั่ง >scale() ดังในตัวอ าง
ที่แสดง าง างนี้ าที่ไ คือ z-score ของ อมูลแ ละตัวตามลำดับ หาก องการ า probability
ของแ ละ าของ z-score ก็ใ ใ คำสั่ง >pnorm() ดังตัวอ าง างที่ าชุดแรกเ น z-score ของ
แ ละ อมูลที่แปลงไ และ าชุดที่สองเ น า probability ของแ ละ อมูล

37
ต้
ป็
ช้
ต่
ต่
ข้
ข้
รู้
ค่
ว่
ค่
ล่
ค่
ข้
ว่
ด้
ค่
ท่
ด้
ด้
ด้
ท่
ด้
ค่
ค่
ค่
ห้
ช้
น้
ลุ่
ค่
ค่
ว่
ป็
ย่
ล่
ข้
ค่
ว่
ค่
ค่
ด้
ค่
ป็
ข้
ว่
ต่
ต้
ป็
ด้
ว่
ด้
ค่
น่
ว่
ย่
ค่
ป็
ด้
ค่
ด้
ล่
ต่
ด้
ข้
ช่
ค่
ค่
ต้
น้
ป็
ย่
ป็
ว่
รู้
ค่
ค่
รู้
ว่
ช้
ย่
ค่
ค่
38
การคำนวณ า t-test
T-test เ นสถิติพื้นฐานตัวหนึ่งที่ใ กันแพ หลาย สามารถใ เปรียบเทียบ าเฉลี่ยของก ม
ตัวอ างกับ าเฉลี่ยของประชากรเพื่อตัดสิน าก มตัวอ างนั้นมาจากประชากรนั้นหรือไ หรือ
เปรียบเทียบ าเฉลี่ยของก มตัวอ างสองก ม ามาจากประชากรเดียวกันหรือไ t-test เ นที่นิยม
ใ ในกรณีที่ก มตัวอ างมีจำนวนไ มาก เ น อยก า 30 ทำใ การคำนวณโดยใ z-test ไ
สามารถใ ไ โปรแกรม R มี ง ชั่นพื้นฐานสำหรับคำนวณสถิติ t.test ดังตัวอ าง อไปนี้
ในตัวอ าง าง าง เ นการหา t-test ของ อมูล DurationPre xNasal ามี mean ที่
างจาก mean การศึกษาครั้ง อนที่มี า 0.053 หรือไ ไ า mean อมูลชุดนี้เ ากับ
0.04981508 95% con dence interval อ ระห าง 0.04551370 ถึง 0.05401646 มี p-
value 0.1358 จึงไ มีนัยสำคัญที่จะ reject null hypothesis า mean ทั้งสองนั้นเ ากันหรือ
มาจาก population เดียวกัน

โดย default R จะคำนวณแบบ two-tailed า องการคำนวณแบบ one-tailed อง


ใ option alternative=”less” หรือ alternative=”greater” เนื่องจาก mean เ น
0.04981508 ซึ่ง อยก า 0.053 จึงเลือกคำนวณ one-tailed แบบ อยก าหรือ less ไ p-
value ดีขึ้นแ ก็ยังไ มีนัยสำคัญทางสถิติ

39
ต่
ช้
ส่
ย่
ช้
ด้
ค่
ค่
ลุ่
ต่
ย่
ค่
น้
ป็
ม่
ย่
ข้
ม่
ล่
ว่
ลุ่
fi
ฟั
ป็
ก์
ย่
ม่
ก่
ค่
ช่
ลุ่
ช้
ว่
ว่
น้
ยู่
ลุ่
ร่
ว่
ข้
ว่
ย่
ถ้
ต้
ม่
ว่
ด้
ห้
ค่
ช้
น้
fi
ว่
ม่
ย่
ต่
ข้
ค่
ช้
ว่
ท่
ป็
ม่
ท่
ด้
ต้
ป็
ลุ่
ม่
อ างไรก็ดี t-test เหมาะกับ อมูลที่มีการกระจายตัวแบบ normal distribution ใน
กรณีที่ อมูลเ น skewed distribution ควรใ Wilcoxon Test ซึ่งจะเห็น า าที่ไ ดีขึ้น แ ก็ยัง
ไ ถึง 0.05

กรณีที่มี อมูลสองชุดเปรียบเทียบหรือสองเวกเตอ สามารถใ t.test นี้ไ แ ในกรณี


เ น paired sample ใ คำนวณแบบ paired sample เพราะจะไ ผลที่ดีก าการเปรียบเทียบ า
mean ปกติ เ น การวัด vowel length ของ พูด 10 คน ในบริบทที่มีเสียงพยัญชนะที่ควบคุม
างกัน ในบริบท x วัด vowel length พูดคนแรกไ 22 บริบท y วัดของ พูดคนแรกไ 26,
พูดคนที่สองวัดในบริบท x ไ 18 ในบริบท y วัดไ 22 … เราสามารถ อน อมูลโดยตรงเ น 2
เวกเตอ x, y แ วหา t.test โดยกำหนด option paired=TRUE ไ ดังนี้

40
ต่
ผู้
ป็
ม่
ข้
ร์
ย่
ป็
ช่
ล้
ข้
ห้
ด้
ข้
ผู้
ช้
ผู้
ด้
ด้
ร์
ด้
ด้
ช้
ป้
ว่
ว่
ค่
ข้
ผู้
ด้
ด้
ต่
ด้
ป็
ต่
ค่
า p ที่ไ อยก า 0.05 จึงสรุป ามีความแตก างระห าง mean หรือสรุป าความ างของบริบท
พยัญชนะมีผล อความยาวสระ
า อมูลไ ใ paired sample เ น เก็บจำนวน อผิดหรือคะแนนนักเรียนสอง อง อง
หนึ่งเ น องทดลอง อีก องเ น องควบคุม ก็ใ t.test เทียบ 2 vector เหมือนกัน แ ไ องใ
paired=TRUE
การนำ อมูลเ าคำนวณ t-test เราสามารถพิม เ าโดยตรงทีละก ม 2 ครั้งแบบ างบน
หรือส างตาราง อมูลใน Excel แ ว save เ นไฟ .csv

จากนั้น านไฟ .csv โดยใ คำสั่ง read.csv มาเก็บในตัวแปรที่กำหนด แ วเรียก t.test กับ
อมูลนี้โดย างถึงแ ละก มเปรียบเทียบแบบ paired sample

41
ค่
ข้
ป็
ร้
อ่
ห้
ด้
ถ้
น้
อ้
ข้
ต่
ล์
ข้
ว่
ข้
ต่
ม่
ช่
ข้
ห้
ลุ่
ช้
ป็
ห้
ว่
ล้
ช่
ป็
ต่
ล์
ช้
ว่
พ์
ข้
ข้
ลุ่
ว่
ล้
ต่
ห้
ต่
ม่
ข้
ต้
ห้
ส่
ไ า p อยก า 0.05 จึงสามารถ reject null hypothesis และสรุป ามีความแตก างกันระห าง
สองก มไ ในกรณีของ paired sample แ ไ สามารถ assume normal distribution ไ ก็
สามารถใ Wilcoxon test ไ โดยใ
>wilcox.test(x, y, paired=TRUE)
การคำนวณ า chi-square
โปรแกรม R มี ง ชั่นพื้นฐานสำหรับคำนวณ า chi-square ซึ่งเ นสถิติแบบที่เ น non-
parametric test ใ กับ อมูลที่เ น category และเ นจำนวนนับ(ความถี่) ใ ลองทดลองส าง
ตาราง อมูล 2 ตัวแปรจาก อมูล auxiliaries ที่อ ใน package languageR วยคำสั่ง xtabs
> xt = xtabs(~ Aux + Regularity, data = auxiliaries)

42
ด้
ค่
ลุ่
ข้
น้
ช้
ด้
ว่
ค่
ช้
ฟั
ข้
ข้
ก์
ด้
ป็
ช้
ต่
ยู่
ม่
ค่
ป็
ว่
ป็
ด้
ห้
ต่
ป็
ด้
ว่
ร้
xt เก็บตารางของตัวแปร Aux กับ Regularity ซึ่งมีจำนวน category เ น 3 และ 2 ตามลำดับ
ไ เ นตารางที่เห็น างบน (หาก องการดู อมูล auxiliaries จะเห็น าเ น อมูลแจกแจงสี่คอลัม
Verb, Aux, VerbalSynsets, และ Regularity คำสั่งนี้จะเอา าจากสอง column คือ Aux กับ
Regularity มานับแจกแจงความถี่เ นตาราง)

prop.table เ นการสั่งใ คำนวณ า probability ของตาราง าใ เฉพาะชื่อตารางแบบแรก จะ


คำนวณภาพรวมทั้งหมดเ น 1 แ ามี argument ที่สองเ น 1 (prop.table(xt,1)) จะคำนวณ
แ ละแถว(row)ใ มี ารวมเ น 1 า argument ที่สองเ น 2 จะคำนวณแ ละคอลัม ใ มี ารวม
เ น1
คำสั่ง mosiacplot(xt) จะวาดภาพแสดงใ เห็นสัด วน างๆ

43
ป็
ด้
ต่
ป็
ป็
ห้
ข้
ค่
ป็
ห้
ป็
ต้
ค่
ป็
ถ้
ต่
ถ้
ห้
ข้
ส่
ต่
ป็
ป็
ถ้
ค่
ส่
ว่
ป็
ป็
ข้
ต่
น์
ห้
ค่
น์
Chisquare test ใ คำสั่ง chisq.test กับตัวแปรที่เก็บตารางความถี่ที่ องการวัด (หลักของ
Chisquare test คือการเปรียบเทียบ า าที่พบ (observed) นี้แตก างจาก าที่ควรจะเ น
(expected) อ างผิดปกติไหม null hypothesis าที่พบนี้ไ ไ แตก างไปจาก าที่ควรจะเ นมาก
นัก นั่นคือตัวแปร นไ ไ มีผลอะไร อตัวแปรตาม สำหรับ สนใจรายละเอียด สามารถหา านสูตร
การคำนวณไ จากหนังสือสถิติทั่วไป)

ผลที่ไ มี า p < 0.05 จึงมีนัยสำคัญทางสถิติที่จะ reject null hypothesis ที่ าสองตัวแปรนี้ไ มี


ความสัมพัน กัน ดังนั้น จึงสรุปไ าสองตัวแปรที่พิจารณานี้มีความสัมพัน กัน
ในกรณีที่ตารางมี าความถี่ อย า expected value อยก า 5 จึงไ ควรใ chi-
square test ใ ไปใ sher test แทนโดยใ คำสั่ง sher.test(xt)
ในการเตรียม อมูลเพื่อใ กับโปรแกรม R เราสามารถเตรียม อมูลเ นตารางโดยแจกแจง
อมูลแ ละรายการที่เก็บมา ไ องนับความถี่ใ

44
ข้
ด้
ต่
ค่
ธ์
ด้
ย่
ห้
ต้
ช้
ม่
ข้
fi
ช้
ด้
ค่
ม่
ต้
ด้
ช้
ว่
ต่
น้
ว่
ค่
ค่
ช้
ห้
ค่
fi
ผู้
ม่
ด้
น้
ต่
ข้
ธ์
ว่
ต่
ต้
ป็
ค่
ว่
ค่
ม่
อ่
ป็
ช้
ป็
ม่
าน อมูลที่ save เ น csv วยคำสั่ง >VAR = read.csv(“FILENAME”) แ วส างตารางนับ
ความถี่ วย xtab แบบตัวอ าง างบน อนจะเรียกใ chisq.test แ าเราเตรียม อมูลมาเ น
ตารางความถี่ ก็สามารถ อนตารางความถี่ลงใน Excel แ วใ save เ น .csv format

แ ว าน าน read.csv เ น >xxt = read.csv(“c:/test.csv”, header = TRUE, row.names =


1) จะไ ตาราง xxt ที่นำไปใ หา chisq.test ไ

45
อ่
ล้
อ่
ข้
ด้
ด้
ผ่
ป็
ป้
ช่
ช้
ย่
ด้
ข้
ก่
ด้
ช้
ล้
ห้
ป็
ต่
ถ้
ล้
ร้
ข้
ป็
หรือพิม เ าโดยตรงโดยส าง matrix ขึ้นมา

าถนัดพิม ไ ตามแถวมากก า และอยากใ label ของ row และ column ก็ทำไ ใ ใ


byrow=TRUE, และใ dimnames

46
ถ้
พ์
ข้
พ์
ล่
ส่
ร้
ว่
ส่
ด้
ห้
ส่
การคำนวณ า anova
ในกรณีเปรียบเทียบ 2 ก ม เราสามารถใ t-test ไ แ ามีมากก า 2 ก มที่ องการ
เปรียบเทียบ เราไ สามารถใ วิธีเปรียบเทียบทีละ โดยใ t-test ไ เพราะจะมี าความผิดพลาดสูง
เรา องใ one-way anova แทน แ ในกรณีที่มี dependent variable หลายตัว องใ manova
แทน (Multivariate analysis of variance) เ น ดูผลสัมฤทธิ์ของนักเรียนก ม างๆ หลังจากไ รับ
วิธีการสอน างกัน แบบนี้ใ anova ไ แ าวัดทั้งผลสัมฤทธิ์และทัศนคติของนักเรียนก ม างๆ
คือมี dependent variable มากก าหนึ่งตัว แบบนี้ใ anova ไ ไ องใ manova แทน วนใน
กรณีที่จำนวน independent variable มีมากขึ้น ก็จะเ น two-way, three-way เ น ใ วิธีการ
สอน างกันและดู จจัยทางเพศ วย ก็จะเ น two-way เ น น
One-way anova มี null hypothesis า mean ของแ ละก มเหมือนกัน หาก reject
หมายความ ามีอ าง อยหนึ่งก มที่ไ เหมือนก มอื่นๆ

ตัวอ างสมมติมีการใ คะแนนจาก ตรวจ 3 คน x,y,z สำหรับใบสมัครจำนวนหนึ่ง อยาก


า า mean ของ ตรวจทั้งสามนั้นมาจากประชากรเดียวกันหรือไ คือ องการดู าทั้งสามคนมี
เกณ การตรวจเหมือนกัน ใ นำคะแนนจาก ตรวจแ ละคนนำเ าในรูป vector เก็บไ ที่ตัวแปร x,
y, และ z จากนั้นใ คำสั่ง data.frame() เพื่อนำ อมูล(ที่ องมีจำนวนเ ากัน)มาส างเ น data
frame ตามที่เห็นเก็บไ ในตัวแปร scores ซึ่งจะเห็นเทียบแ ละรายการไ า ตรวจทั้งสามคนใ
คะแนน สมัครแ ละรายอ างไร

47
รู้
ว่
ต้
ค่
ฑ์
ต่
ผู้
ช้
ต่
ว่
ย่
ต่
ย่
ค่
ปั
ม่
ผู้
น้
ห้
ว้
ย่
ช้
ห้
ช้
ห้
ลุ่
ด้
ลุ่
ว่
ม่
ต่
ด้
ป็
ผู้
ผู้
ต่
ถ้
ลุ่
ช่
ว่
คู่
ช้
ข้
ต่
ช้
ป็
ช้
ป็
ต้
ต้
ด้
ต่
ข้
ม่
ม่
ต่
ด้
ด้
ต่
ต้
ถ้
ลุ่
ช้
ท่
ต้
ด้
ลุ่
ว่
ว่
ต่
ค่
ผู้
ต้
ช่
ว่
ร้
ว้
ลุ่
ช้
ป็
ลุ่
ต้
ช้
ส่
ต่
ด้
ห้
แ อนจะใ คำสั่งหา anova ไ เราจะ องทำการ stack อมูลใ เ นแถวเดียวที่บอก าคะแนนนั้น
มาจากคนไหน อน ดังรูป าง าง วิธีการคือใ คำสั่ง stack() เมื่อ stack แ วจะไ อมูล 24
รายการที่มี values และ ind

48
ต่
ก่
ช้
ก่
ข้
ล่
ด้
ต้
ช้
ข้
ห้
ป็
ล้
ว่
ด้
ข้
ชื่อตัวแปร values กับ ind จะถูกส างใ โดยอัตโนมัติจากการ stack อมูล เราอาจเตรียม อมูล
เองในรูปแบบนี้และใ ชื่อตัวแปรเอง จากนั้นหา า oneway-anova ซึ่งทำไ สองแบบ ใ คำสั่ง
oneway.test() หรือ anova() แ หากจะใ แบบหลังจะ องสั่งใ หา lm() (linear modeling)
อน ตามตัวอ าง าง าง

ตัวอ าง อมูล auxiliaries ใน package languageR แสดงใ เห็นการใ anova (Baayan 2008:
104-108)

ส าง linear model ระห าง VerbalSynsets กับ Aux จาก อมูล auxiliaries แ วหา า one-
way anova ซึ่งพบ ามีนัยสำคัญ หมายความ ามีความ างอ าง อย ในหนึ่งตัวแปรที่อ ใน Aux ที่
มีผล อ variation ที่พบใน VerbalSynsets

เมื่อแจกแจง Aux ใน อมูลพบ า มี 3 ตัว แ เราไ า mean ของตัวไหนที่แตก างจากก ม

49
ก่
ร้
ย่
ต่
ข้
ย่
ข้
ว่
ช้
ข้
ล่
ว่
ว่
ร้
ต่
ห้
ต่
ว่
ช้
ค่
ม่
รู้
ว่
ต่
ต้
ห้
ย่
ข้
น้
ห้
ข้
ช้
ด้
ต่
ล้
ยู่
ค่
ลุ่
ช้
ข้
าจะดู าเ น mean ตัวไหนที่มีผลแตก างจากตัวอื่น เรา องใ function aov() สำหรับคำนวณ
anova แทน แ วเรียกใ TukeyHSD แ สถิติตัวนี้จะใ ไ ในกรณีที่ อมูลแ ละก มมีจำนวนเ า
กัน ในตัวอ างบนเนื่องจากจำนวน อมูล Aux แ ละตัวไ เ ากันจึงใ การคำนวณวิธีนี้ไ ไ ในที่นี้
จะใ อมูล warpbreaks เ นตัวอ างแทนเพราะมีจำนวน อมูล tension แ ละก มเ ากัน (H M
L) และใ function aov() ซึ่งเมื่อสั่ง summary าออกมาจะเห็นผลเหมือน anova)

จากนั้น ใ TukeyHSD (Tukey’s honestly signi cant difference) เพื่อดู

คอลัม แรกแสดง อมูลความ างของ าเฉลี่ยแ ละ จากผลที่แสดงจะเห็น า H-L เ น ที่ส าง


ความ างในก มมากสุด รองมาเ น M-L และ H-M วนคอลัม ที่สองและสามเ น า lower
bound และ upper bound ที่ 95% con dence interval หาก องการดูความ างเ นกราฟ ก็
สามารถใ คำสั่ง >plot(TukeyHSD( )) ไ ซึ่งจะเห็น H-L อ ไกลจาก าศูน มากที่สุด จาก
50
ถ้
ช้
ข้
ต่
น์
ว่
ช้
ช้
ช้
ป็
ย่
ลุ่
ล้
ข้
ช้
ป็
ต่
ป็
ย่
ข้
ค่
ต่
ด้
fi
ต่
ต่
ต่
ค่
fi
คู่
คู่
ส่
ม่
ช้
ข้
ต้
ท่
ด้
ช้
ยู่
น์
ต้
ช้
ข้
ค่
ว่
ต่
ต่
ย์
ลุ่
ต่
ป็
ลุ่
ท่
ค่
ม่
ป็
ป็
ด้
คู่
ร้
ท่
อมูลที่ไ จึงเห็น าความ างของ าเฉลี่ยระห าง H-M ไ มีนัยสำคัญทางสถิติ แ ความ างของ า
เฉลี่ยระห าง H-L และ M-L มีนัยสำคัญทางสถิติ ทำใ สรุปไ า L เ นชุด อมูลที่ างไปจากก ม

Baayen (2008: 108)


การคำนวณ า correlation
correlation เ นการดูความสัมพัน เชิงเ นของสองตัวแปรที่เ น อมูลตัวเลข (y = a +
x*b) R สามารถ plot กราฟแสดงใ เห็นไ วย

51
ข้
ด้
ว่
ค่
ว่
ป็
ต่
ค่
ห้
ด้
ด้
ธ์
ว่
ส้
ห้
ม่
ด้
ว่
ป็
ป็
ข้
ข้
ต่
ต่
ต่
ลุ่
ค่
สั่งใ วาดกราฟแสดงความสัมพัน อมูล meanWeightRating กับ meanSizeRating จาก data
frame ratings

Baayen (2008: 85)


linear regression model จะเ นการหาเ นที่ดีที่สุดที่จะ match อมูลทั้งหมด ซึ่งใ
หลักการของ least square (ใ ผลรวม าความ างระห าง า observe กับ าที่ทำนายจากเ น
model ยกกำลังสองแ วมี า อยสุด) า องการหา า coef cient of correlation ใ ใ คำสั่ง
cor.test

52
ห้
ล้
ค่
น้
ธ์
ห้
ข้
ถ้
ต้
ค่
ป็
ต่
ค่
ส้
ว่
fi
ค่
ข้
ค่
ห้
ช้
ส้
ช้
า coef cient of correlation คือ าที่รายงานในบรรทัดสุด าย จะแสดงถึงความสัมพัน เชิงเ น
ของสองตัวแปร าแปรตามกันอ างไร วน า p-value จะบอกถึงความสัมพัน นั้น ามีนัยสำคัญ
ทางสถิติหรือไ า correlation ยิ่งใก หนึ่งแสดง ามีความสัมพัน เชิงเ นระห างสองตัวแปรนั้น
าเ าใก ศูน จะไ มีความสัมพัน อกัน าเ น าติดลบแสดง ามีความสัมพัน แบบผกผันกัน รูป
าน างตัวอ างกราฟแสดง correlation างๆ

Baayen (2008: 88)


การคำนวณ correlation หาก องการใ spearman correlation ไ ใ pearson
correlation ก็สามารถทำไ โดยการเติม option method=”spearman” เ าไป default ของ
cor.test คือ method=”pearson”

53
ค่
ถ้
ด้
ข้
ล่
ล้
fi
ย่
ย์
ม่
ว่
ม่
ค่
ด้
ย่
ธ์
ต่
ค่
ส่
ล้
ต่
ถ้
ต้
ค่
ป็
ค่
ช้
ว่
ท้
ว่
ธ์
ส้
ข้
ธ์
ว่
ธ์
ม่
ว่
ช่
ธ์
ส้
สำหรับการใ spearman correlation นั้นใ กับ อมูลแบบ ordinal ไ วยไ จำเ น
องเ น อมูลแบบ continuous เหมือน pearson และ spearman correlation เ นการมอง
ความสัมพัน แบบ rank-order ไ ไ เ นแบบ linear model เหมือน pearson าที่ไ จึง างกันไ
ดังตัวอ างนี้ที่มี า pearson = 0.851, spearman = 1

(http://support.minitab.com/en-us/minitab-express/1/help-and-how-to/modeling-
statistics/regression/supporting-topics/basics/a-comparison-of-the-pearson-and-
spearman-correlation-methods/)
Linear model assume า างๆ มีการกระจายตัวแบบปกติ าที่สุดโ งจำนวนเล็ก อย
ก็สามารถเบี่ยงเบนผลไปไ . ญหาของการใ linear modeling าไ ดู อมูลใ ดี จะไ าความ
สัมพัน ที่ไ ไ เ นแบบนั้น ดังตัวอ างนี้

เ นการหา linear modeling ของสองตัวแปร meanSizeRating กับ meanFamiliarity ซึ่งดู


เหมือนมีความสัมพัน เชิงลบอ างมีนัยสำคัญ (-0.2 p < .05) แ หาก plot กราฟมาดูจะเห็นจริงๆ
อมูลควรมองแยกเ นสองก มมากก า (รูปบนขวาแสดง linear modeling) วนรูป าน าง
แสดงการมองแยก อมูลเดียวกันเ นสองก ม

54
ต้
ข้
ป็
ป็
ธ์
ย่
ข้
ม่
ธ์
ด้
ป็
ค่
ข้
ป็
ธ์
ช้
ด้
ลุ่
ปั
ย่
ม่
ป็
ย่
ด้
ค่
ว่
ป็
ต่
ลุ่
ช้
ช้
ข้
ต่
ถ้
ม่
ข้
ค่
ห้
ค่
ต่
ส่
ด้
ด้
ด้
ป็
ด้
ต่
ค่
ม่
ด้
น้
ล่
ป็
ด้
กรณีแบบนี้ ความสัมพัน แบบ linear อาจไ เหมาะ (y = a + b*x) อาจใ วิธีการมองแบบ non-
linear มา วย (y = a + b*x + c*x^2) จะไ เ นแบบพาราโบลา

Baayen (2008: 94)


multiple regression model
โปรแกรม R มี ง ชั่นพื้นฐานสำหรับคำนวณสถิติ ดังนี้ Anova และ linear regression
model ใ กับกรณี dependent variable เ น อมูลตัวเลข อเนื่อง โดย anova ใ กรณีตัวแปร
independent เ นแบบ categorical วน linear regression ใ เมื่อตัวแปร independent เ น
อมูลตัวเลข อเนื่อง
Log-linear และ logistic regression model ใ กับกรณี dependent variable เ น
อมูลแบบ categorical ทั้งสองแบบนี้อ ภายใ statistical model ที่เรียก า generalized
linear model (GLM) Logistic regression model ใ ในกรณี อมูลของ dependent variable

55
ข้
ข้
ช่
ช้
ต่
ป็
ฟั
ธ์
ก์
ส่
ด้
ยู่
ม่
ป็
ส้
ข้
ต้
ช้
ช้
ต่
ข้
ช้
ช้
ว่
ช้
ป็
ป็
เ น 2 ตัวเลือก ที่มองเ น 0 กับ 1 ไ เ น Yes/No Male/Female แ ในกรณีที่เ น category
หลายตัวเลือก จะ องใ log-linear model
Linear regression model เ นการมองความสัมพัน ของ independent variable หนึ่ง
ตัว (y = a+b*x) แ ามีตัวแปร independent variable หลายตัว model จะเ นแบบ
multiple regression model (y = a + b*x1 +c*x2 +d*x3 …) และสามารถใ คำสั่ง lm คำนวณ
model ที่ดีที่สุดออกมาไ แ กระบวนการวิเคราะ จะไ เ นแบบ ายๆ เราไ สามารถดูความ
สัมพัน แบบ ายๆ โดยเอาตัวแปรทีละ มาดู correlation เพราะตัวแปรแ ละแปรอาจมีผล อกัน
ไ ไ เ นอิสระโดยตัวมันเอง เราจึง องดูผลที่ไ จากตัวแปร างๆ ไปพ อมกันในคราวเดียว หากตัว
ไหนไ signi cant คือไ มีผล อ dependent variable ก็จะ อยๆ ตัดออกไป จนเหลือเฉพาะ
ตัวแปรที่เกี่ยว องจริง
ใน simple linear regression คือการมองความสัมพัน ที่ตัวแปร independent มีตัว
เดียว มองในรูปสมการไ เ น y = a + b*x1 เมื่อหา >lm(y ~ x1, data=dfrm) ก็จะไ า
coef cients ออกมา ในกรณี multiple linear regression คือมีตัวแปร independent มากก า
หนึ่งตัว เ น มองในรูปสมการไ เ น y = a + b*x1 + c*x2 +d*x3 เมื่อหา >lm(y ~ x1 + x2 +
x3, data=dfrm) ก็จะไ า coef cients ออกมา การใ lm() เ นการส าง model object ที่
เหมาะกับ อมูล แ จะแสดงผลเพียง า coef cient ระห างตัวแปรเ านั้น หาก องการดู าทาง
สถิติอื่นๆ เรา องใ คำสั่ง summary อีกที ในตัวอ าง าง าง >m = lm(y ~ u + v + w) จะ
ส าง object model “m” ขึ้นมา เมื่อใ คำสั่ง >summary(m) ารายละเอียดทางสถิติ างๆ จะ
แจกแจงออกมา (ดู recipe 11.1-11.4 ใน R Cookbook)

56
ป็
ม่
ร้
ด้
fi
ม่
ป็
ธ์
ช่
ข้
ง่
fi
ต้
ข้
ต้
ช้
ต่
ช้
ป็
ด้
ม่
ค่
ด้
ต่
ด้
ถ้
ป็
ด้
ต่
ป็
ต่
fi
ต้
ค่
ด้
คู่
ป็
ช้
ช่
fi
ด้
ย่
ห์
ข้
ว่
ช้
ต่
ม่
ล่
ธ์
ป็
ค่
ธ์
ป็
ค่
ท่
ร้
ง่
ต่
ร้
ต่
ช้
ม่
ต้
ป็
ต่
ป็
ค่
ต่
ด้
ค่
ว่
า residuals ซึ่งเ น าระยะ างจาก mean จะแสดงใ เห็น า distribution มีลักษณะ
normal ไหม ในสถานการ ที่ normal distribution า mean ควรใก ศูน และ า quartile ที่
1 และ 3 ควรมีขนาดพอๆกัน หากมีลักษณะที่ skew างไหน ก็จะ านจาก า residuals ไ ใน
ตัวอ างนี้ จะเห็น 3Q (1.3730) มากก า 1Q (0.9472) แสดง า skew ไปทางขวา
า coef cient วนของคอลัม Estimate บอก าประมาณของ coef cient (หรือ า
สัมประสิทธิ์ในสมการเชิงเ น b, c, d) หากมี าใก ศูน ก็แสดง าตัวแปรนั้นไ ไ มีบทบาทสำคัญ
คอลัม p-value บอก านัยสำคัญทางสถิติ ายิ่ง อยยิ่งแสดง าตัวแปรนั้นมีผล อตัวแปรตาม
โดยจะเห็นไ จากจำนวนเครื่องหมาย * ที่แสดง
า R2 หรือ coef cient of determination บอกถึงคุณภาพของ model หากมี ามาก
จะดี

57
ย่
น์
ค่
ค่
ค่
ด้
fi
ค่
ส้
ส่
ณ์
fi
ป็
ค่
ว่
ห่
น์
ค่
ค่
ล้
น้
ข้
ค่
ย์
ค่
ว่
ว่
ห้
ว่
อ่
ว่
ล้
ค่
ย์
ม่
ด้
fi
ค่
ต่
ค่
ด้
ค่
า F บอก า model มีนัยสำคัญทางสถิติไหม ซึ่งก็ดูไ จาก า p-value ที่แสดง เวลาดู
ผลควรดูที่ า F อน หากไ มีนัยสำคัญก็ไ จำเ น องพิจารณา อ
จจุบันงานวิจัยทางสังคมศาสต มีงานที่ใ สถิติในก ม regression นี้มาก เพราะ อมูลที่
เก็บมีหลายตัวแปร ซึ่งเราไ าตัวแปรไหนมีผล อตัวแปร dependent และไ าตัวแปร
independent variable แ ละตัวมีผล อกันหรือไ วย จึง องใ สถิติแนวนี้หา model ที่ t กับ
อมูลที่รวบรวมมาไ ดีที่สุด ใน R เราสามารถส าง lm เ น full model ขึ้นมา อน จากนั้นจึง
ลดตัวแปรที่ไ เกี่ยว องลง เ น
>full.model = lm(y ~ x1 + x2 + x3 + x4)
>reduced.model = step(full.model, direction= “back-ward”)
ในตัวอ าง าง าง (recipe 11.7 R Cookbook) จะเห็นในเบื้อง น า x1, x3 มี า
coef cient ที่มีนัยสำคัญ เมื่อลอง step backward เราจะเห็นการลดตัวแปรลงทีละขั้น ขั้นแรกลด
x2 ออก อมาลด x4 ออกจนไ model สุด ายที่มีแ y ~ x1 + x3

58
ข้
fi
ต่
ค่
ปั
ค่
ม่
ก่
ย่
ข้
ด้
ข้
ว่
ล่
ช่
ม่
ต่
ม่
ด้
รู้
ว่
ต่
ร์
ม่
ท้
ป็
ร้
ช้
ต้
ม่
ต่
ด้
ต่
ป็
ลุ่
ต้
ต่
ด้
ช้
ค่
ต้
ว่
ก่
ม่
รู้
ว่
ข้
fi
ค่
นอกจากวิธีการ backward เราอาจทำแบบ forward คือ อยๆเพิ่มตัวแปรที่เกี่ยว อง หรือ
อาจใ วิธีการอื่นๆ อีกที่ Baayen (2008) เขียนไ ในหนังสือ แ การที่จะใ สถิติแบบนี้คำนวณ อง
ศึกษาใ เ าใจหลักการและวิธีการตีความ าตัวเลข างๆ ที่เกี่ยว อง ตลอดจนวิธีการปรับเปลี่ยน
model เพื่อใ ไ ผลที่ดีที่สุด เ น องส าง model แบบที่ independent variable ไ มีผล อกัน
และส าง model แบบที่คิด า independent variable มีผล อกัน จากนั้นเปรียบเทียบ anova
ของทั้งสองแบบ ามีความแตก างอ างมีนัยสำคัญหรือไ และในบรรดา independent variable

59
ช้
ร้
ห้
ข้
ห้
ว่
ด้
ว่
ต่
ช่
ต้
ย่
ร้
ค่
ว้
ต่
ม่
ต่
ข้
ต่
ค่
ช้
ม่
ข้
ต่
ต้
ก็ องปรับ model เพื่อกันตัวแปรที่ไ มีผล อ dependent variable ออกไป การใ สถิติแบบนี้
จึงไ สามารถทำการคำนวณไ ายๆ แบบ chi-square หรือ anova ที่จำเ น องใ สถิติแบบนี้
จึง องศึกษาเพิ่มเติมอ างมากเพื่อทำความเ าใจวิธีการใ และวิเคราะ model างๆ เมื่อเ าใจ
ดีแ ว ก็สามารถใ คำสั่งในโปรแกรม R เพื่อ วยคำนวณไ สนใจสามารถหา านเพิ่มเติมไ ที่
Paolillo, J. C. 2002. Analyzing linguistic variation : statistical models and methods.
Stanford, Calif.: CSLI Publications, Center for the Study of Language and Information.

60
ต้
ต้
ล้
ม่
ช้
ย่
ด้
ง่
ม่
ต่
ข้
ช่
ช้
ด้
ผู้
ห์
ผู้
อ่
ป็
ต่
ต้
ช้
ช้
ด้
ข้
บทที่ 3
การทำเหมือง อมูล
การนำ อมูลเ า
การนำ อมูล text เ ามาเพื่อวิเคราะ สามารถใ คำสั่งพื้นฐาน scan หรือ readLines ตาม
ที่ไ อธิบายไ ในบทที่แ วไ
>text <- scan( le="c:/temp/DHl.txt", what="character", sep="\n")
>text <- readLines(“c:/temp/DH.txt”,encoding="UTF-8")
และหาก องการ าน อมูลมากก าหนึ่งไฟ ก็สามารถ านไฟ ทั้งหมดใน folder มาเก็บเ น list
แ ว apply function scan() กับไฟ ใน list นั้น
>list. lenames<-list. les(pattern=".txt$")
>list.data<-list()
>list.data <- lapply(list. lenames, function(x) scan( le=x, what="character", sep="\n") )
หรือใ คำสั่งใน package tm (text mining) ที่มีคำสั่งใ าน อมูลแห ง างๆ มาส างเ นคลัง
อมูลไ นอกจาก package tm อีก package ที่เ นประโยช คือ wordcloud ที่สามารถ วย
ส างกราฟ กของคำตามขนาดความถี่ของคำไ อนอื่น จะ องติดตั้ง package ที่จำเ น องใ
อน ไ แ
>install.packages(“tm”)
>install.packages(“wordcloud”)
ในระห างการติดตั้ง tm กับ wordcloud package อื่นๆที่จำเ น องใ หากยังไ ไ ติด
ตั้งก็จะถูกติดตั้งไปโดยอัตโนมัติ วย เมื่อติดตั้งเรียบ อยก็เรียกใ package ทั้งสอง านคำสั่ง library
จากนั้นใ โหลดไฟ อมูล ในที่นี้ใ plain text เก็บไ ใน directory เดียวกัน คือไฟ นิยาย 8 เรื่อง
ของ Jane Austen โดยใ คำสั่ง Corpus(DirSource(“...”))
61
ข้
ก่
ล้
ร้
ด้
ช้
fi
ด้
ด้
ห้
ต้
ข้
ก่
ฟิ
ว้
fi
ข้
ว่
อ่
ล์
ข้
ข้
ข้
ล้
fi
ช้
ด้
fi
ข้
ด้
ว่
ช้
ล์
ข้
ล์
ด้
ห์
ร้
ก่
ว้
ป็
อ่
ช้
fi
ห้
อ่
ช้
ต้
ล์
ข้
น์
ล่
ป็
ต่
ต้
ผ่
ช้
ล์
ร้
ป็
ป็
ป็
ม่
ต้
ด้
ช่
ช้
> library(tm)
> library(wordcloud)
> source <- DirSource("/Users/macbook/Cloud/Dropbox/course/Corpuslg/Corpus/
Jane\ austen")
> j.corpus <- Corpus(source, readerControl = list(reader=readPlain))
DirSource ใ บอกแห งและประเภท อมูลที่จะ านเ ามา าเ นไฟ ทั้งหมดใน directory ที่ระบุ
จาก DirSource. ใน tm ใ เรากำหนดแห ง อมูลประเภทอื่น ๆ ไ อีก เ น DataframeSource,
URISource, VectorSource วน readerControl ใ กำหนด า าน อมูลประเภทไหน โดย
deafult เ น plaintext จึงสามารถละไ แ หาก องการ าน อมูลประเภทอื่น องใ
reader=readDOC หรือ readPDF หรือ readXML เ น น
เมื่อโหลด อมูลเรียบ อยแ ว เรียกดู j.corpus จะเห็น ามี 8 documents ที่โหลดมาใน corpus นี้
> j.corpus
<<VCorpus>>
Metadata: corpus speci c: 0, document level (indexed): 0
Content: documents: 8
า องการดูเฉพาะไฟ ใน j.corpus ไ ซึ่งจะบอกความยาวของตัวบทนั้น า องการดูเนื้อความก็ใ
ใ j.corpus[[1]]$content
> j.corpus[[1]]
<<PlainTextDocument>>
Metadata: 7
Content: chars: 885172
การส าง word cloud
เราสามาถใ โมดูล wordcloud ส างภาพรายการคำโดนจำกัดไ ที่ 100 คำที่มีความถี่สูงสุด
> wordcloud(j.corpus,max.words=100)

62
ถ้
ช้
ต้
ร้
ข้
ช้
ป็
ช้
ร้
ล์
ล่
ล้
fi
ห้
ร้
ส่
ด้
ข้
ล่
ข้
ด้
อ่
ต่
ข้
ว่
ป็
ช้
ต้
ว่
ต้
ป็
ว้
ว่
อ่
ล์
ด้
อ่
ข้
ถ้
ข้
ช่
ต้
ต้
ห้
ช้
ซึ่งจะเห็น ามีรายการคำที่เ นคำไวยากร ปรากฏมามากสุด หาก องการลบคำเห านี้ (เรียก า
stop-words) รวมทั้งลบเครื่องหมายวรรคตอน ก็สามารถทำไ โดยใ คำสั่งนี้
> j.corpus <- tm_map(j.corpus, removeWords, stopwords('english'))
> j.corpus <- tm_map(j.corpus, removePunctuation)
เมื่อใ คำสั่ง wordcloud แบบเดิมจะไ

63
ช้
ว่
ป็
ด้
ณ์
ด้
ช้
ต้
ล่
ว่
การ remove คำที่ไ องการออกจาก corpus ยังสามารถใ คำสั่งเดิมแ เพิ่ม option อื่น
ๆ ไ แ removeNumbers ลบตัวเลขออก removeWords, c("department", "email") ลบคำที่
ระบุในรายการออก stripWhitespace ลบ องไฟที่เกิน หรือ stemDocument ถอดห วยคำเติม
ออกใ เหลือรากคำ
หาก องการใ แสดงเ นภาพสีก็สามารถทำไ โดยการเพิ่ม option colors ในคำสั่ง wordcloud
ดังนี้
> wordcloud(j.corpus, max.words=100, colors=brewer.pal(8, “Dark2"))

64
ด้
ต้
ห้
ก่
ห้
ป็
ม่
ต้
ช่
ด้
ช้
ต่
น่
การเพิม่ font เพือ่ ใ ใน wordcloud
สำหรับกรณี อมูลภาษาไทย จะไ สามารถแสดงผลไ ทันที องติดตั้งโมดูล extrafont
> install.packages("extrafont")
แ วเรียกใ โมดูลนี้พ อมติดตั้ง font ที่ องการใน R จากนั้นจึง load font ที่ติดตั้งเพิ่มนี้เ ามา อน
จะเพิ่ม option ในคำสั่ง wordcloud ใ ใ font ภาษาไทยไ โดยใ คำสั่ง อไปนี้>
library(extrafont)
> font_import(pattern="THSarabunNew")
> loadfonts()

65
ล้
ช้
ข้
ร้
ช้
ม่
ต้
ห้
ช้
ด้
ต้
ด้
ช้
ข้
ต่
ก่
เมื่อโหลดฟอน ภาษาไทยใ R จักแ วจึงสามารถใ คำสั่ง wordcloud ส างภาพคำไทยมาไ เ น
กันดังตัวอ างนี้ โดยที่ thai.corpus เ น อมูลที่ส างจากการใ คำสั่ง Corpus เหมือนตัวอ าง าง
นที่ใ ส าง corpus ของ Jane Austen option random.order=FALSE ทำใ คำที่ความถี่สูง
ก าจะปรากฏอ กลางภาพ rot.per กำหนดจำนวนเปอ เซ็น ที่คำถูกจัดเรียงตามแนวดิ่ง
> wordcloud(t.corpus, max.words=100, family="TH Sarabun New", font=2,
random.order=FALSE, rot.per=0.35, colors=brewer.pal(8, “Dark2"))

66
ต้
ว่
ช้
ร้
ย่
ต์
ยู่
ห้
รู้
ล้
ป็
ข้
ร้
ช้
ร์
ต์
ช้
ร้
ห้
ย่
ด้
ข้
ช่
การ นหาใน text
คำสั่งพื้นฐาน grep เ นคำสั่งใ นหาสายอักขระที่ระบุใน อความไ ในตัวอ าง าง
province.names เ นเว็กเตอ ของชื่อจังหวัด คำสั่ง grep ปกติจะใ index ของ อมูลที่มีสาย
อักขระที่กำหนด หาก องการ อความออกมาแทนที่จะเ น index ใ เติม option value-TRUE
>grep(“Nakohn”, province.names)
[1] 19 20 24 34 35 39 60
>grep(“Nakohn”, province.names, value=TRUE)
[1] "Nakhon Phanom" "Nakhon Ratchasima "
[3] "Sakon Nakhon " "Nakhon Nayok "

67
ค้
ป็
ต้
ร์
ข้
ป็
ห้
ค้
ป็
ข้
ห้
ห้
ด้
ข้
ย่
ล่
[5] "Nakhon Sawan " "Phra Nakhon Si Ayutthaya "
[7] "Nakhon Si Thammarat "
pattern ที่ใ ในการหานั้นสามารถเขียนโดยใ regular expression ไ เ น .+[tT]hani หมายถึง
หาคำที่มี thani หรือ Thani โดยที่ างห าเ นตัวอักษรอะไรกี่ตัวก็ไ
> grep(".+[tT]hani",province.names, value=TRUE)
[1] "Ubon Ratchathani" "Udon Thani" "Uthai Thani" "Surat Thani"
การแทนที่ อความ
สามารถใ คำสั่ง sub หรือ gsub รูปแบบคือ gsub( pattern, replace, text) โดยการ น
สามารถใ regular expression ไ ตัวอ าง าง างเ นการเขียน function สำหรับลบ white
space ที่อ ห าและ าย อความ คือ หา [:space:] ที่อ น อความ (^) มากก าหนึ่ง
trim <- function( x ) {
gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}
การหา concordance
>pos<-grep(" ambiguous ",text)
>conx<-sub(" ambiguous "," **ambiguous** ",text[pos])
การส างรายการคำและความถี่
กรณีที่ าเรา าน อมูลเ ามาเ นเว็กเตอ ของคำแ ว
> DH.text<-scan("DH-All.txt","character",sep="")
เราสามารถส างรายการคำพ อมนับความถี่ไ ทันทีโดยใ คำสั่งแจกแจงตารางหรือ table วจัด
เรียงตามความถี่จากมากไป อย วยคำสั่ง sort ดังนี้
> freq<-table(DH.text)
> freql <-sort(freq, decreasing=TRUE)
68
ร้
ช้
ช้
ยู่
ช้
ร้
น้
ข้
ถ้
ท้
อ่
ข้
ข้
น้
ร้
ด้
ข้
ข้
ด้
ป็
น้
ป็
ช้
ด้
ย่
ข้
ร์
ล่
ช้
ยู่
ป็
ต้
ล้
ข้
ด้
ด้
ช่
ว่
แ้
ค้
> freql[1:10]
DH.text
the of and to a in is that for as
13517 10452 8285 5959 5049 4651 2971 2812 2644 2162
จาก อมูลใน corpus ที่มี เราสามารถดูการปรากฏของคำในแ ละเอกสารไ โดยใ คำสั่ง
ส างตารางคำกับเอกสาร TermDocumentMatrix ผลที่ไ จะเห็น าทีไฟ เอกสาร 8 มีจำนวน
ศัพ ทั้งหมด 17523 คำ
> dtm <- DocumentTermMatrix(j.corpus)
> dtm
<<DocumentTermMatrix (documents: 8, terms: 17523)>>
Non-/sparse entries: 51203/88981
Sparsity : 63%
Maximal term length: 32
Weighting : term frequency (tf)
จาก อมูลที่ส างเ นตาราง document-term เราสามารถ explore อมูลในรูปแบบ าง ๆ ไ
เน
> freq <- colSums(as.matrix(dtm))
แจกแจงรายการคำศัพ ทั้งหมดพ อมความถี่โดยการรวมความถี่ที่พบในแ ละ document รวมเ า
วยกัน
> ndFreqTerms(dtm, lowfreq=1000)
[1] "but" "can" "every" " rst" "good" "great" "know" "lady" "little" "may"
"might"
[12] "miss" "mrs" "much" "must" "never" "nothing" "now" "one" "said"
"say" "see"
[23] "she" "soon" "the" "think" "though" "time" "well" "will" "without"

69
ด้
ช่
ร้
fi
ท์
ข้
ร้
ข้
ป็
ท์
ร้
fi
ด้
ว่
ต่
ข้
ต่
ล์
ด้
ต่
ช้
ข้
ด้
"you"
แจงเฉพาะคำที่มีความถี่อ าง อย 1000
> ndAssocs(dtm, "friendship", corlimit=0.9)
หาคำที่มักปรากฏ วมกับคำ า friendship วยระดับ correlation 0.9 ขึ้นไป
> dtms <- removeSparseTerms(dtm, 0.01)
> dim(dtms)
[1] 8 1759
removeSparseTerms ใ ลดขนาดตารางลงโดยนำคำที่ sparse หรือไ ไ ปรากฏทั่วไปออก วน
จะเอาคำใดออกก็ขึ้นกับ าที่ใ าใก หนึ่ง เ น .99 ก็จะแทบไ มีคำไหนออก าต่ำลงเ น .01 ก็
จะเหลือคำที่ปรากฏอ ในทุก document เก็บไ ซึ่งในที่นี้จะเหลือ 1759 คำจากเดิม 17,523 คำ
กรณีที่ อมูลไ ใ text แ อ ในรูปแบบอื่น เ น xml ใ ติดตั้ง package XML โดยใ คำ
สั่ง install.packages(“XML”) เราสามารถใ คำสั่ง xmlToDataFrame ไ โดยระบุ url หรือชื่อไฟ
xml นั้น เ น
> data <- xmlToDataFrame(“000237.xml”)
หาก องการ าน อมูลไฟ xml ทั้งหมดที่กำหนดไ ใน working directory แ วก็สามารถใ ชุดคำ
สั่งนี้ไ list. les ใ แจกแจงชื่อไฟ ทั้งหมดออกมา xmlToDataFrame ใ แปลง อมูลไฟ xml
เ น dataframe ซึ่งในไฟ นี้ อมูลที่ องการอ ในแท็ก body ซึ่งถูกแปลงมาเ นคอลัม ภายใ
ตัวแปร body วย จึงนำ อมูลนี้ของแ ละไฟ มา อ อความกันแ วเก็บไ ใน txt จากนั้นจึงส าง
corpus จาก อมูลที่ไ เก็บไ ใน txt
> les <- list. les()
> txt <- NULL
> for (i in les) { doc <- xmlToDataFrame(i)
+txt <- c(txt, doc$body) }
> dhq.corpus <- Corpus(VectorSource(txt))
> dhq.corpus

70
ป็
fi
fi
ต้
ด้
ช่
fi
อ่
ข้
fi
ด้
fi
ข้
ข้
ร่
ช้
ด้
ยู่
ม่
ค่
ย่
ล์
ช้
ช่
ข้
ว่
ว้
ล์
น้
ส่
ข้
ถ้
ต่
ล์
ล้
ยู่
ต้
ต่
ด้
ช้
ช่
ล์
ว้
ยู่
ต่
ว้
ข้
ช่
ม่
ห้
ล้
ม่
ด้
ด้
ว้
ช้
ล้
ถ้
ป็
ข้
ช่
น์
ช้
ล์
ส่
ช้
ร้
ต้
ล์
<<VCorpus>>
Metadata: corpus speci c: 0, document level (indexed): 0
Content: documents: 106

Web Crawler
เราสามารถใ package ใน R เพื่อ วยในการสกัด อมูลที่ องการจากเว็บเพื่อมาใ ในงาน
ที่ องการไ package หนึ่งที่เ นประโยช เพื่อการนี้คือ rvest ตัวอ าง าง างดัดแปลงจาก
stat4701.github.io/edav/2015/04/02/rvest_tutorial/
> install.packages("rvest")
>library(rvest)
load อมูลจากห าเว็บ review ภาพยนต Arrival มาเก็บไ
> arrival_movie <- html("http://www.imdb.com/title/tt2543164/")
ดึง อมูล rating ออกมาเก็บไ ที่ตัวแปร rating อมูลนี้อ ในแท็ก strong ซึ่งภายใ มีแท็ก span อ
แ ว สกัด text ในนั้นออกมา แปลงเ นตัวเลข เครื่องหมาย %>% เ นการ pipe หรือ ง าน
อมูล อ ซึ่งจะเห็น าในคำสั่งใ เอา อมูลเว็บที่เก็บใน arrival_movie มาสกัด node ที่มีแท็ก
strong แ วก็ span เอา อมูลที่ไ ง อใ html_text() ดึง text ออกมา ง อใ มาแปลง น
ตัวเลข
> rating <- arrival_movie %>%
+ html_nodes("strong span") %>%
+ html_text() %>%
+ as.numeric()
> rating

71
ข้
ล้
ต้
ข้
ต่
ข้
ล้
ด้
น้
ช้
ว่
fi
ข้
ว้
ห้
ป็
ด้
ส่
ข้
ป็
ต่
ร์
ห้
ช่
น์
ข้
ยู่
ว้
ข้
ต้
ป็
ย่
ข้
ส่
ต้
ต่
ล่
ห้
ช้
ส่
ผ่
ป็
ยู่
หากดูภายในเว็บจะเห็น อมูลการใ คะแนนอ ในแท็กนี้
<strong title="8.5 based on 15,578 user ratings"><span itemprop=“ratingValue">8.5</
span></strong>

คำสั่ง อมาสั่งใ หาโหนดที่มี attribute value เ น titleCast (มีเครื่องหมาย # นำห า) แ วดู อ


หา attribute ชื่อ itemprop (มีเครื่องหมาย . นำห า) แ ว อไปจนพบแท็ก span จึง ง อมูล อ
ใ ดึง text ออกมาซึ่งจะเ นชื่อนักแสดง และเนื่องจากพบ อมูลแบบนี้มากก าหนึ่ง จึงดึงทั้งหมด
ออกมาเ นรายการชื่อทั้งหมดไ
> cast <- arrival_movie %>%
+ html_nodes("#titleCast .itemprop span") %>%
+ html_text()
> cast
[1] "Amy Adams” "Jeremy Renner” "Michael Stuhlbarg” "Forest Whitaker" "Sangita
Patel"
[6] "Mark O’Brien" "Abigail Pniowsky” "Tzi Ma” "Nathaly Thibault” "Ruth Chiang"
[11] "Jadyn Malone” "Julia Scarlett Dan” "Russell Yuen” "Anana Rydvald” "Leisa
Reid"

จะเห็น าการใ rvest วยใ เราสามารถดึง อมูล วนที่ องการในห าเว็บมาใ ไ เลย เพียงแ เรา
อง า อมูลนั้นอ ที่ไหน ภายใ แท็กอะไร เพื่อจะไ เขียนคำสั่งสกัดใ ถูกตำแห งไ

72
ต้
ห้
รู้
ต่
ว่
ว่
ข้
ป็
ช้
ห้
ยู่
ข้
ช่
ป็
ห้
ด้
ต้
ห้
ข้
ยู่
ป็
ส่
ด้
น้
ต้
ล้
ข้
ต่
น้
ห้
ว่
ช้
น่
ด้
ด้
น้
ส่
ข้
ล้
ต่
ต่
ต่
Topic modeling
Topic modeling เ นการใ วิธีการทางสถิติเพื่อหา าในเอกสาร างๆที่มีนั้นมีหัว อหรือ
topic อะไรอ าง อาศัยหลักการส างเมทริก ดูการกระจายตัวของคำ างๆในเอกสารส าง
Document-Term matrix ออกมา สมติ ามีเอกสาร d ชิ้น และมีจำนวนรูปศัพ ในเอกสาร
ทั้งหมด n ศัพ ก็จะสามารถส างเมทริก ขนาด d x n ไ ซึ่งเมทริก d x n นี้ สามารถมองไ
าเ นผลมาจากการรวมกันของเทริก ขนาด d x k และ k x n ไ ซึ่ง าเรามอง า k นี้คือจำนวน
topic ทั้งหมดที่มีใน อมูล เราก็สามารถหาคำตอบนี้ไ เพราะจะไ ผลที่บอก า คำที่เกี่ยว องกับ
topic างๆ (1..k) มีคำอะไร าง เกี่ยว องมาก อยเพียงใด วนผลอีกตารางจะบอก าเอกสาร
แ ละชิ้นมีความเกี่ยว องกับ topic างๆ กี่เรื่องและเเกี่ยว องมาก อยแ ไหน อัลกอลิทึมพื้นฐาน
ที่มักใ กันในการทำ topic modeling คือ latent Dirichlet allocation (LDA; Blei, Ng, and
Jordan 2003)

R มีโมดูลที่ วยคำนวณ topic modeling package ที่ องติดตั้ง คือ topicmodels และ
tm เมื่อติดตั้งแ วก็สามารโหลดโมดูล tm กับ topicmodels เ ามาไ ตัวอ าง าง างดัดแปลง
มาจาก “A gentle introduction to topic modeling using R”
> install.packages("topicmodels")
> install.packages("tm")

73
ว่
ต่
ป็
ช้
ต่
ท์
ยู่
บ้
ล้
ข้
ช่
ข้
บ้
ร้
ป็
ต่
ซ์
ช้
ซ์
ข้
ร้
ว่
น้
ด้
ซ์
ด้
ข้
ว่
ต้
ข้
ส่
ด้
น้
ด้
ซ์
ด้
ถ้
ค่
ต่
ว่
ต่
ย่
ว่
ข้
ล่
ท์
ว่
ข้
ข้
ร้
ด้
> library(tm)
> library(topicmodels)
กำหนด folder ที่เก็บไฟ อมูลไ ในที่นี้มีหนังสือที่โหลดมาจาก project Guthenberg จำนวน 8
เม
> setwd("/Users/macbook/Cloud/Dropbox/course/Corpuslg/Corpus/Plato")
านชื่อไฟ ทั้งหมดใน working directory ที่เ น txt
> lenames <- list. les(getwd(),pattern="*.txt")
าน อมูลทุกบรรทัดจากไฟ มาเก็บไ ที่ les ทีละไฟ แ วแปลงเ นเว็กเตอ วยคำสั่ง
VectorSource แ วรวมเ าไ ใน corpus วยคำสั่ง Corpus เก็บไ ที่ docs เมื่อเรียกดู docs
จะเห็นรายงาน าเ น VCorpus หมายถึง Volatile Corpus คือเก็บไ ในห วยความจำหาก ด
โปรแกรม R คลัง อมูลนี้ก็จะหายไป
> les <- lapply( lenames,readLines)
> docs <- Corpus(VectorSource( les))
> docs
<<VCorpus>>
Metadata: corpus speci c: 0, document level (indexed): 0
Content: documents: 8
จากนั้นจึงเตรียม อมูลโดยทำเ นตัวพิม เล็กหมด ลบเครื่องหมายวรรคตอน ลบตัวเลข ลบ
whitespace และลบคำที่เ น stop word เสร็จแ วแปลงคำเ นรูปพื้นฐาน (stemming
process)
> docs <-tm_map(docs,content_transformer(tolower))
> docs <- tm_map(docs, removePunctuation)
> docs <- tm_map(docs, removeNumbers)
> docs <- tm_map(docs, removeWords, stopwords("english"))

74
อ่
อ่
ล่
fi
fi
ข้
ล์
ว่
ข้
ข้
ป็
fi
ล้
fi
ล์
ข้
ป็
ข้
fi
ล์
ป็
ว้
ว้
fi
พ์
ว้
fi
ป็
ด้
ล้
ล์
ล้
ว้
ป็
ว้
ป็
น่
ร์
ด้
ปิ
> docs <- tm_map(docs, stripWhitespace)
> docs <- tm_map(docs,stemDocument)
จาก document vectors ที่มีแปลงเ นเมทริก ของ document กับ term
> dtm <- DocumentTermMatrix(docs)
> dtm
<<DocumentTermMatrix (documents: 8, terms: 11858)>>
Non-/sparse entries: 29785/65079
Sparsity : 69%
Maximal term length: 32
Weighting : term frequency (tf)
dtm เก็บเมทริก ของ Document-Term ซึ่งในที่นี้มี 8 documents และ 11,858
terms าที่อ ในเมทริก เ นความถี่ของคำที่พบในแ ละเอกสาร (term frequency)
> rownames(dtm) <- lenames
> freq <- colSums(as.matrix(dtm))
> length(freq)
[1] 11858
> write.csv(freq[ord],"word_freq.csv")
> ord <- order(freq,decreasing=TRUE)
นำชื่อไฟ มาใ เ นชื่อ row ในเมทริก dtm และรวม าตัวเลขทุกคอลัม หรือทุก document ไ
เ น าความถี่รวมของแ ละคำเก็บไ ใน freq ใน freq จึงมีรายการคำพ อมความถี่รวม แ วเก็บ
เ นไฟ ชื่อ word_freq.csv
> burnin <- 4000
> iter <- 2000
> thin <- 500
> seed <- list(2003,5,63,2456,765)
75
ป็
ป็
ค่
ล์
ค่
ล์
ส่
ยู่
ป็
ต่
fi
ซ์
ซ์
ป็
ว้
ป็
ซ์
ซ์
ต่
ค่
ร้
น์
ล้
ว้
> nstart <- 5
> best <- TRUE
> k<-20
> ldaOut <-LDA(dtm,k, method="Gibbs", control=list(nstart=nstart, seed = seed,
best=best, burnin = burnin, iter = iter, thin=thin))
LDA คือคำสั่ง Latent Dirichlet Allocation สำหรับการทำ topic modeling ซึ่งมี าที่
กำหนดใ ใ กับ algorithm นี้ parameter แรกคือ อมูลที่เ นเมทริก ของ Document-Term
method ที่ใ sampling คือ Gibbs burnin เ นการกำหนดรอบเริ่ม นที่ไ นำผลมาใ
เนื่องจาก วงแรกๆ เ นการ มกระจายคำไปตาม topic างๆ แบบมั่วๆ จนวนรูปไปแ ว burnin
ครั้ง การกระจายคำตาม topic าง ๆ จึงเริ่ม t กับ อมูลจริงมากขึ้น iter คือรอบหลังจากนั้นที่
จะใ ทำในที่นี้คือ 2000 รอบ k เ นจำนวน topic ที่กำหนด า าจะจัดออกมาเ น k topic
nstart คือใ ลองเลือกจุดเริ่ม นคำนวณ model ที่ างกันในที่นี้คือ 5 ซึ่งตำแห งจุดเริ่ม นจะ
กำหนดไ ใน seed
หลังจากคำนวณหา model ที่ดีสุดมาไ แ ว ก็เก็บผลที่ไ ไ ใน ladOut แ วจึงเก็บผลที่
ไ ลงไฟ ตามตัวอ าง าง างนี้
> ldaOut.topics <- as.matrix(topics(ldaOut))
> write.csv(ldaOut.topics, le=paste("LDAGibbs",k, "DocsToTopics.csv"))
> ldaOut.terms <- as.matrix(terms(ldaOut,30))
> write.csv(ldaOut.terms, le=paste("LDAGibbs",k, "TopicsToTerms.csv"))
> topicProbabilities <- as.data.frame(ldaOut@gamma)
> write.csv(topicProbabilities, le=paste("LDAGibbs",k, "TopicProbabilities.csv"))
> topic1ToTopic2 <- lapply(1:nrow(dtm),function(x)
+ sort(topicProbabilities[x,])[k]/sort(topicProbabilities[x,]) [k-1])
> topic2ToTopic3 <- lapply(1:nrow(dtm),function(x)
+ sort(topicProbabilities[x,])[k-1]/sort(topicProbabilities[x,]) [k-2])

76
ด้
ห้
ล์
ว้
ห้
ช่
ช้
ห้
ช้
ย่
ป็
ข้
ล่
สุ่
fi
fi
ต้
ต่
fi
ป็
fi
ด้
ล้
ต่
ข้
ข้
ต่
ป็
ป็
ด้
ว่
ว้
น่
ซ์
ต้
น่
ล้
ป็
ม่
ล้
ต้
ค่
ช้
> write.csv(topic1ToTopic2, le=paste("LDAGibbs",k, "Topic1ToTopic2.csv"))
> write.csv(topic2ToTopic3, le=paste("LDAGibbs",k, "Topic2ToTopic3.csv"))

77
fi
fi
References
• Baayen, R. H. 2008. Analyzing Linguistic Data: A Practical Introduction to Statistics
Using R. Cambridge: Cambridge University Press.
• Blei DM, Ng AY, Jordan MI 2003. Latent Dirichlet Allocation. Journal of Machine
Learning Research, 3, 993–1022
• Crawley, Michael J. 2005. Statistics: An Introduction Using R. 1st ed. Wiley.
• Paolillo, J. C. 2002. Analyzing linguistic variation : statistical models and methods.
Stanford, Calif.: CSLI Publications, Center for the Study of Language and
Information.
• Teetor, Paul. 2011. R Cookbook. 1st ed. O’Reilly Media.
• Woods, A., Fletcher, P. J. and Hughes, A. 1986. Statistics in language studies.
Cambridge; New York: Cambridge University Press.
• Steyvers, Mark and Grif ths, Tom. 2007. Probabilistic Topic Models. in T.
Landauer, D McNamara, S. Dennis, and W. Kintsch (eds), Latent Semantic
Analysis: A Road to Meaning. Laurence Erlbaum (http://psiexp.ss.uci.edu/
research/papers/SteyversGrif thsLSABookFormatted.pdf)

Additional
• R website : http://cran.r-project.org/
• R Tutorial : http://www.r-bloggers.com/r-tutorial-series-r-beginners-guide-and-r-
bloggers-updates/)
• How I used R to create a word cloud, step by step https://
georeferenced.wordpress.com/2013/01/15/rwordcloud/
78
fi
fi
• Building Wordclouds in R https://www.r-bloggers.com/building-wordclouds-in-r/
• How to use your favorite fonts in R charts http://blog.revolutionanalytics.com/
2012/09/how-to-use-your-favorite-fonts-in-r-charts.html
• A gentle introduction to topic modeling using R https://
eight2late.wordpress.com/2015/09/29/a-gentle-introduction-to-topic-modeling-
using-r/
• Hands-On Data Science with R Text Mining http://onepager.togaware.com/
TextMiningO.pdf
• Ggplot2 cheat sheet : https://www.rstudio.com/wp-content/uploads/2015/03/
ggplot2-cheatsheet.pdf

79

You might also like