การวิเคราะห์สถิติพื้นฐานด้วยภาษา R

ผศ.ดร.ธีรศักดิ์ เอโกบล

9 ก.พ. 2564

ภาษา R นิยมนำมาใช้เพื่อวิเคราะห์และนำเสนอข้อมูลทางสถิติ เนื่องจากมีฟังก์ชั่นและแพคเกจที่เหมาะสมกับประเภทของข้อมูลให้เลือกใช้เป็นจำนวนมาก ก่อนเริ่มต้นวิเคราะห์ข้อมูลจะต้องนำข้อมูลเข้าสู่โปรแกรม ทำได้หลายวิธี เช่น ใช้ฟังก์ชั่น read.table() read.csv() หรือ read.xlsx() โดยสามารถดาวน์โหลดข้อมูลที่จะใช้ในบทเรียนนี้ได้จากลิงค์ https://drive.google.com/drive/folders/1_miaZYJ8GB6iNuuvwVb6Kf0pr2aGNFYe?usp=sharing และสามารถดาวน์โหลดโปรแกรม R ได้จาก (https://www.r-project.org/) และโปรแกรมสำหรับช่วยเขียนภาษา R (R editor) คือ RStudio (https://rstudio.com/)

ข้อมูลทางชีววิทยาอาจเป็นข้อมูลตัวแปรเดียว (univariate data) หรือหลายตัวแปร (multivariate data) ซึ่งอาจเป็นข้อมูลเชิงคุณภาพ (qualitative หรือ categorical data) และข้อมูลเชิงปริมาณ (quantitative หรือ numerical data) ซึ่งแบ่งเป็นข้อมูลเชิงปริมาณที่ต่อเนื่อง (continuous data) และข้อูลเชิงปริมาณที่ไม่ต่อเนื่อง (discrete data) การเก็บข้อมูลจากการทดลองทางชีววิทยาอาจไม่สามารถทดลองกับประชากรที่สนใจทั้งหมด (population) จึงต้องมีการเลือกทดลองกับกลุ่มตัวอย่าง (sample) วิธีการสุ่มตัวอย่างมีหลายวิธี ได้แก่ การสุ่มอย่างง่าย (simple random sampling) โดยใส่คืนหรือไม่ใส่คืน หรือการสุ่มแบบ stratified sampling ที่มีการแบ่งกลุ่มของตัวอย่างเป็นกลุุ่มย่อยเสียก่อน หรือการสุ่มอย่างมีระบบ systematic sampling เช่น การเลือกหนึ่งตัวอย่างจากสิบตัวอย่างที่สนใจ

การออกแบบการทดลอง (experimental design) ทางชีววิทยาเป็นพื้นฐานสำคัญเพื่อให้ได้ข้อมูลที่สามารถนำมาวิเคราะห์ทางสถิติต่อไปได้และน่าเชื่อถือ การทดลองทางชีววิทยาที่ดีจะต้องมีการกำหนดตัวแปรที่ชัดเจน ประกอบด้วย ตัวแปรต้นอิสระ (independent variable) ที่ต้องการศึกษาหรือสนใจ ตัวแปรตาม (dependent variable) ซึ่งเป็นผลสืบเนื่องจากอิทธิพลของตัวแปรต้น และตัวแปรควบคุม (controlled variable) เป็นปัจจัยอื่นๆ ที่ต้องควบคุมให้เหมือนกัน ทำให้การทดลองทางชีววิทยาจะต้องมีชุดควบคุม (control set) เพื่อเปรียบเทียบกับชุุดที่มีตัวแปรต้น (treatment set) อีกทั้งการทดลองที่จะให้ผลที่น่าเชื่อถือจะต้องมีการทำซ้ำ (replication) โดยการทำซ้ำนั้นจะมีสองแบบคือ การทำซ้ำตัวอย่าง (biological replicate) ซึ่งทำการทดลองกับตัวอย่างที่ต่างกันในแต่ละซ้ำ และการทำซ้ำเชิงเทคนิค (technical replicate) ซึ่งเป็นการวิเคราะห์ตัวอย่างเดิมด้วยวิธีการเดียวกันหลายๆ หน การออกแบบการทดลองมีหลายแบบ ดังนี้

1) การทดลองแบบสุ่มสมบูรณ์ (Completely randomized design, CRD) เป็นรูปแบบของการทดลองที่การจัด treatment ต่างๆ ให้กับตัวอย่างจะเป็นเเบบสุ่ม การออกแบบการทดลองแบบนี้จะเหมาะกับตัวอย่างที่มีความแตกต่างกันไม่มาก (homogeneous sample)

2) การทดลองแบบบล็อค (randomized block design, RBD) ใช้การออกแบบการทดลองแบบนี้เมื่อตัวอย่างมีคความแตกต่างกันมาก จำเป็นต้องแบ่งตัวอย่างเป็นกลุ่มย่อย (strata) ที่มีลักษณะหรือความคล้ายคลึงกันก่อน แล้วจึงทดสอบกับ treatment ต่างๆ แบบสุ่ม โดยที่ treatment และ block จะต้องไม่มีความสัมพันธ์กัน โดยการออกแบบการทดลองลักษณะนี้ไม่ควรมี treatment จำนวนมากและความแตกต่างกันมากระหว่าง block เช่น การศึกษาการแสดงออกของยีนของแมลงหวี่สามจีโนไทป์ จีโนไทป์ละ 5 ตัว

3) การทดลองแบบลาตินสแควร์ (Latin square design, LSD) ใช้ในกรณีที่ตัวอย่างในการทดลองแบบ RBD มีความผันแปรค่อนข้างสูง การทดลองแบบ LSD จึงออกแบบให้มีการทดสอบตัวแปรแบบสองทางโดยให้มีจำนวน treatment เท่ากับจำนวน replicate เช่น ต้องการทดสอบ 4 treatments กับ 2 ปัจจัย ก็จะออกแบบการทดลองแบบ 4x4 โดยที่ปัจจัยทั้งสอง (factors) ไม่ควรมีอิทธิพลต่อกัน

4) การทดดลองแบบแฟคทอเรียล (Factorial design) เหมาะกับการทดลองที่แต่ละ treatment ประกอบด้วยอิทธิพร่วมกันของหลายปัจจัย ทำให้มีผลจากแต่ละปัจจัยและผลที่ร่วมกันระหว่างปัจจัย (interaction effect) การทดลองแบบ factorial จึงออกแบบโดยพิจารณาจำนวน factor (n) และจำนวน level หรือระดับที่สนใจ (s) เช่น การทดสอบยาสองชนิดกับการตอบสนองของเซลล์มะเร็ง โดยยาแต่ละชนิดมี 2 ระดับความเข้มข้น คือ 0 และ 5 mg การศึกษาผลของยาสองชนิดนี้และความเข้มข้นร่วมกันจะเป็นการทดลองแบบ 2 factors 2 levels

5) การทดลองแบบมีอ้างอิง (reference design) ในการทดลองทางชีววิทยาอาจมีลักษณะของการเปรียบเทียบค่าหรือผลของแต่ละ treatment กับค่าอ้างอิงหรือ reference เพื่อให้สามารถเปรียบเทียบค่าจาก treatment ที่แตกต่างกันได้

ในบทเรียนนี้จะแนะนำการวิเคราะห์ข้อมูลด้วยภาษา R โดยใช้ข้อมูลจากการทดลองทางชีววิทยาประเภทต่างๆ เป็นตัวอย่างประกอบเพื่อให้ผู้เรียนเข้าใจแนวการวิเคราะห์ข้อมููลเบื้องต้นทางสถิติ

ข้อมูลชุดที่ 1 เป็นข้อมูลจากการทดลองวัดระดับฮอร์โมนเซโรโทนินในระบบประสาทของตั๊กแตนในสามช่วงเวลาคือ 0 1 และ 2 ชั่วโมง คำถาม 1 ข้อมููลนี้ควรมาจากการออกแบบการทดลองแบบใด สามารถระบุตัวแปรต้นและตัวแปรตามได้หรือไม่

ฟังก์ชั่น summary() ใช้เพื่อรายงานสถิติเบื้องต้นของข้อมูล ได้แก่ ค่าสูงสุด ต่ำสุด มัธยฐาน ค่าเฉลี่ยและควอนไทล์ และหากต้องการทราบรายละเอียดการใช้งานของฟังก์ชั่นสามารถใช้ฟังก์ชั่น help() หรือ ? เพื่อศึกษารายละเอียดได้

การแสดงข้อมูลด้วย stripchart() ระหว่าง serotoninLevel กับ treatmentTime ทำให้เห็นการกระจายของข้อมูลระดับฮอร์โมนที่ระยะเวลาต่างๆ ภาษา R มีหลายแพคเกจและคำสั่งสำหรับแสดงผลกราฟให้เลือก เช่น plot() stripchart() หรือ ggplot() จากแพคเกจ ggplot2

เราสามารถคำนวณค่าเฉลี่ย (mean) ส่วนเบี่ยงเบนมาตรฐาน (sd) และค่าคลาดเคลื่อน (se) ของระดับฮอร์โมนในแต่ละช่วงเวลาได้ดังนี้

จากตัวอย่างข้างต้นสามารถใช้ฟังก์ชั่น var() ในการหาค่าความแปรปรวนของแต่ละ treatment ในตัวอย่างได้ และสามารถทำการเพิ่มข้อมูลค่าเฉลี่ยและค่าคลาดเคลื่อนลงใน stripchart ด้วยฟังก์ชั่น segments() และ points()

การรู้จักและเข้าใจรูปแบบของข้อมูลเป็นสิ่งจำเป็น ก่อนเลือกวิธีวิเคราะห์ทางสถิติ จะต้องรู้จักลักษณะเบื้องต้นของข้อมูลที่มีก่อน (data exploration) รวมถึงหากจำเป็นต้องเตรียมหรือจัดรูปแบบของข้อมูลให้เหมาะสม(data cleaning and preparation) เช่น หากมีข้อมูลสูญหาย (missing data, NA) จากตัวอย่างของข้อมูล locustSerotonin ซึ่งแสดงข้อมูลระดับฮอร์โมน serotonin ในแมลงที่เวลา 0 1 และ 2 ชั่วโมง ข้อมูลชุดนี้มีสองตัวแปรคือ เวลาเป็นตัวแปรอิสระ และระดับของฮอร์โมนเป็นตัวแปรตาม เมื่อเข้าใจลักษณะของข้อมูลแล้ว จึงสามารถเลือกวิธีการทางสถิติเชิงบรรยาย (descriptive statistics) เพื่ออธิบายข้อมูลนั้นๆ ได้ เช่นการคำนวนค่าเฉลี่ย (mean) ส่วนเบี่ยงเบนมาตรฐาน (standard deviation) ค่ากลาง (mode) รวมทั้งการวิเคราะห์สถิติเชิงอนุมาน (Inferential statistics) เพื่อตอบสมมติฐานหรือหาข้อสรุปจากข้อมูลตัวอย่างที่มี เช่น การวิเคราะห์สหสัมพันธ์ (correlation) การวิเคราะห์ความแปรปรวน (analysis of variance)

หากมีคำถามว่าระดับฮอร์โมนจากสามช่วงเวลามีความแตกต่างกันหรือไม่ เมื่อทำการวิเคราะห์ ANOVA ด้วยฟังก์ชั่น aov() พบว่ายอมรับสมมติฐานหลักซึ่งกล่าวว่า ระดับของฮอร์โมนที่ระยะเวลาต่างๆ นั้นไม่แตกต่างกันที่ p < 0.05

หรืออาจใช้การทดสอบ Student's t-test

ข้อมูลชุดที่ 2 ข้อมูลเหตุการเสียชีวิตจากเสือในเนปาล เป็นข้อมูลเชิงคุณภาพที่ต้องนับหรือแจกแจงความถี่ (frequency)

ฟังก์ชั่น table() ใช้สำหรับแจกแจงความถี่ของข้อมูลแล้วจัดเรียงค่าที่นับได้ด้วยฟังก์ชั่น sort() สามารถจัดรูปแบบเป็นตารางด้วยฟังก์ชั่น data.frame() เพิ่มผลรวมค่าความถี่ด้วยฟังก์ชั่น addmargins()

แสดงผลความถี่ด้วยกราฟแท่ง (bar plot)

จากกราฟแท่งจะพบว่าสาเหตุการเสียชีวิตหลักในข้อมูลุดนี้คือ การตัดหญ้าหรือเก็บฟางเลี้ยงสัตว์ (grass/fodder) ข้อมูลที่มีปริมาณมากและหลากหลายเมื่อแสดงข้อมูลในรูปแบบกราฟจะทำให้เห็นรูปแบบและความสัมพันธ์ของข้อมูลชัดเจนขึ้น

ข้อมูลชุดที่ 3 เป็นข้อมูลความยาว (lengthMm) และน้ำหนัก (massKg) ของแซลมอนเพศเมียจำนวน 228 ตัว ที่มีอายุ 2 และ 3 ปี

แสดงข้อมูลน้ำหนักเป็นค่าความถี่ด้วยฟังก์ชั่น hist() โดยกำหนดช่วงของน้ำหนักเป็น 0.1 0.3 และ 0.5 ด้วยฟังก์ชั่น seq() โดยกำหนดค่าต่ำสุดเป็น 1 และสูงสุดเป็น 4

ความสัมพันธ์ระหว่างขนาดและน้ำหนักสามารถตรวจดูเบื้องต้นด้วยการแสดงกราฟการกระจาย (scatter plot) ทำสอบความสัมพันธ์ระหว่างขนาดกับน้ำหนักด้วยการวิเคราะห์ correlation ด้วยฟังก์ชั่น cor() รวมถึงการเปรียบเทียบขนาดและน้ำหนักของปลาที่มีอายุ 2 และ 3 ปี ด้วยการวิเคราะห์ independent t-test โดยใช้ฟังชั่น t.test() พบว่าตัวแปรทั้งสองมีความสัมพันธ์กัน

ทำการแยกข้อมูลของปลาอายุ 2 และ 3 ปี เก็บในตัวแปรใหม่ชื่อ age2 และ age3 แล้ววิเคราะห์สหสัมพันธ์ระหว่างขนาดและน้ำหนักของปลาแต่ละอายุ

แสดงความสัมพันธ์ของข้อมูลด้วย scatter plot เพื่อศึกษาการกระจายและแนวโน้มของข้อมูล โดยใช้ฟังก์ชั่น scatter.smooth()

จากการทดสอบ t-test ดังกล่าวพบว่าขนาดและน้ำหนักของปลาอายุ 2 และ 3 ปีมีความแตกต่างกันอย่างมีนัยสำคัญยิ่งทางสถิติที่ p < 0.01 หากต้องการวิเคราะห์ความสัมพันธ์ของตัวแปรทั้งสองเพื่อใช้ทำนายค่าน้ำหนักหรือขนาดที่ไม่ทราบมาก่อนได้ ด้วยการสร้างโมเดลเชิงเส้น (linear model) โดยใช้ฟังก์ชั่น lm()

จากโมเดลดังกล่าวพบความสัมพันธ์ น้ำหนัก = 0.02(ขนาด) - 4.93 สามารถใช้ความสัมพันธ์นี้ทำนายค่าน้ำหนักหรือขนาดที่ไม่ทราบมาก่อนได้

ข้อมูลชุดที่ 4 เป็นข้อมูลการติดเชื้อมาลาเรียในนกแสดงความสัมพันธ์ของการแยกไข่นกออกกับการติดเชื้อมาลาเรียในนก

ในกรณีนี้ข้อมูลมาจากการทดลองแบบ factorial design 2x2 ซึ่งทดสอบสองปัจจัย (factors) และแต่ละปัจจัยมีสองระดับ (levels) ใช้ฟังก์ชั่น factor() ในการเปลี่ยนข้อมูลกลุ่ม (treatment) ให้เป็น levels สร้างตาราง contingency ด้วยฟังก์ชั่น table() และคำนวนผลรวมด้วยฟังก์ชั่น addmargins()

เมื่อแสดงผลด้วยกราฟแท่งของทั้งสองปัจจัยจะเห็นว่า การไม่แยกไข่ออก (control) ทำให้นกเป็นมาลาเรียน้อยลง หากต้องการทดสอบว่าสองปัจจัยนี้มีความเกี่ยวข้องหรือไม่ ทำได้ด้วยการทดสอบไคน์สแควร์ โดยใช้ฟังก์ชั่น chisq.test()

ผลการทดสอบพบค่า p value น้อยกว่า 0.05 แสดงว่าปัจจัยทั้งสองนั้นไม่เป็นอิสระต่อกัน หรืออาจเกี่ยวข้องกันนั่นเอง

ข้อมูลชุดที่ 5 เป็นข้อมูลลวดลายของพ่อปลาหางนกยูงกับลาดลายของลูกปลา

ดูการกระจายของข้อมูลด้วยฟังก์ชั่น plot() และเมื่อทดสอบสหสัมพันธ์พบว่าทั้งสองตัวแปรมีความสัมพันธ์กันในระดับหนึ่ง

เมื่อนำข้อมูลของทั้งสองตัวแปรมาสร้างโมเดลเชิงเส้นด้วยฟังก์ชั่น lm() จะได้ความสัมพันธ์เป็น sonAttractiveness = 0.98(fatherOrnamentation) + 0.01 โดยสามารถใช้สมการนี้ในการทำนายแนวโน้มจากข้อมูลใหม่ได้ (prediction)

ข้อมูลชุดที่ 6 ระดับของฮีโมโกลบินกับความสูงจากระดับน้ำทะเล โดยประกอบด้วยข้อมูลจากพื้นที่สูงจากระดับน้ำทะเล 3 ตำแหน่งเทียบกับพื้นที่ที่ระดับน้ำทะเลปกติ

จาก strip chart พบว่าระดับของฮีโมโกลบินของตัวอย่างจาก Andes มีระดับสูงกว่าพื้นที่อื่นๆ และจะเห็นความแตกต่างนี้ชัดเจนมากขึ้นเมื่อแดงผลข้อมูลด้วยฟังก์ชั่น boxplot() เพื่อแสดงผลระดับฮีโมโกลบินตามกลุ่มตัวอย่างประชากร

ตกแต่งกราฟด้วยการปรับพารามิเตอร์ของฟังก์ชั่น boxplot() ได้แก่ สี (col) ขนาดของกล่องข้อมูล (boxwex) สีและขนาดของข้อมูลที่เป็น outlier (outcol, outcex, outlty) และชื่อแกน (xlab และ ylab)

หากต้องการทดสอบสมมติฐานว่าระดับของฮีโมโกลบินของประชากรจาก Andes แตกต่างจาก USA หรือไม่ ทำได้โดยเลือกข้อมูลส่วนที่สนใจแล้วทำการทดสอบ t-test ผลการวิเคราะห์พบว่าระดับฮีโมโกลบินของสองพื้นที่นี้มีความแตกต่างกันอย่างมีนัยสำคัญ

ข้อมูลชุดที่ 7 การระบาดของโรคหัดในประเทศอังกฤษและเวลส์ระหว่างปี ค.ศ. 1995-2011 ข้อมูลแบ่งเป็นรายสามเดือนในแต่ละปี

เมื่อแสดงข้อมูลจำนวนเคสการระบาดของโรคในช่วงเวลาที่สนใจด้วยกราฟเส้น (line plot) ในฟังก์ชั่น plot() จะเห็นว่าโรคนี้มีแนวโน้มการระบาดเพิ่มขึ้นมากจากอดีต

ข้อมูลชุดที่ 8 เป็นข้อมูลเปรียบเทียบความเร็วการวิ่งของแมงมุมก่อนและหลังตัดรยางค์

เมื่อแบ่งข้อมูล treatment เป็นสองกลุ่ม แล้วแสดงข้อมูลด้วยฟังก์ชั่น boxplot() พบว่าความเร็วของแมงมุมหลังตัดรยางค์จะมากกว่าก่อนตัดรยางค์

แบ่งข้อมูลนี้เป็นก่อนและหลังตัดรยางค์ เก็บไว้ในตัวแปร sppedBefore และ speedAfter

คำนวนค่ากลางและควอนไทล์ของความเร็วก่อนและหลังด้วยฟังก์ชั่น median() และ quantile()

เนื่องจากข้อมูลนี้เป็นการเปรียบเทียบความเร็วของแมงมุมก่อนและหลังการตัดรยางค์ หากต้องการทดสอบทางสถิติว่าการทดลองก่อนและหลังนี้มีความเร็วแตกต่างกันหรือไม่ สามารถทำได้ด้วยการทดสอบ paired t-test ผลการทดสอบพบว่าความเร็วก่อนและหลังนั้นแตกต่างกันอย่างมีนัยสำคัญ

ข้อมูลชุดที่ 9 เป็นข้อมูลลักษณะ lateral plates ของปลา stickleback ที่มีจีโนไทป์ MM Mm และ mm

ทำการแปลงข้อมูล genotype ให้เป็นข้อมูลประเภท factor ด้วยฟังก์ชั่น factor() แล้วแสดง histogram ด้วยฟังก์ชั่น histogram() ในแพคเกจ lattice ที่เรียกใช้งานโดยฟังก์ชั่น library() จากกราฟจะเห็นว่าสัญลักษณ์ | genotype ใช้สำหรับแยกการแสดงข้อมูลตามกลุ่มของ genotype จาก histogram จะเห็นว่า lateral plate ของปลาทั้งสามกลุ่มจีโนไทป์มีความแตกต่างกัน

ในกรณีตัวแปรหน่งมีข้อมูลหลายระดับหรือ levels สามารถใช้ฟังก์ชั่น tapply() เพื่อดำเนินการฟังก์ชั่นที่ต้องการ (FUN) ได้แก่ mean() length() sd() median() กับข้อมูลประเภท factor ซึ่งมีหลาย levels (INDEX) จากการวิเคราะห์พบว่า genotype Mm จะมีค่าความยาวเฉลี่ยของ lateral plate อยู่ระหว่าง genotypes MM และ mm

สรุปข้อมูลจากการวิเคราะห์สถิติเชิงบรรยายเป็นตารางด้วยฟังก์ชั่น data.frame()

sticklebackFreq <- table(data9$genotype, dnn = "genotype") sticklebackFreq

คำนวนสัดส่วนความถี่ของ genotype แต่ละแบบ

หากต้องการทดสอบว่าสัดส่วนของ genotype จากข้อมูลชุดนี้สอดคล้องกับค่าสัดส่วนทางทฤษฎีหากการถ่ายทอดทางพันธุกรรมของยีนนี้ควบคุมตามกฏของเมนเดลหรือไม่ สามารถทำได้โดยการทดสอบไคน์ สแคร์ (goodness of fit test) ด้วยฟังก์ชั่น chisq.test() ว่าสัดส่วนของ MM: Mm: mm เท่ากับ 1:2:1 ซึ่งผลการทดสอบพบว่าค่า p value มากกว่า 0.05 จงสามารถสรุปได้ว่าค่าสัดส่วนที่ได้นั้นไม่แตกต่างจากค่าทางทฤษฎี

ข้อมูลชุดที่ 10 เป็นข้อมูลอัตราความถี่ในการเลื้อย (undulationRateHz) ของงูจำนวน 8 ตัว แสดงการกระจายของข้อมูลด้วย histogram โดยใช้ฟังก์ชั่น hist()

ข้อมูลนี้มีเพียงตัวแปรเดียว สามารถคำนวนค่าสถิติเชิงบรรยายเบื้องต้นได้ พบว่าอัตราความถี่ในการเลื้อยของงูกลุ่มนี้เฉลี่ยอยู่ที่ 1.375 มีค่าส่วนเบี่ยงเบนมาตรฐานและความแปรปรวนเท่ากับ 0.324 และ 0.105 ใช้ฟังก์ชั่น round() ในการกำหนดตำแหน่งทศนิยม

ข้อมูลชุดที่ 11 เป็นข้อมูลความยาวของยีนในมนุษย์ ฟังก์ชั่น nrow() แสดงจำนวนแถวในไฟล์ของข้อมูลนี้ เป็นข้อมูลเชิงปริมาณที่มีเพียงตัวแปรเดียว

ในการแสดงผลการวิเคราะห์สามารถเพิ่มข้อความหรือคำอธิบายเพื่อให้เข้าใจผลการวิเคราะห์ง่ายขึ้น โดยใช้ฟังก์ชั่น paste()

ข้อมูลชุดที่ 12 เป็นข้อมูลของยีนที่พบได้บนโครโมโซม X สามารถสรุปข้อมูลความถี่เบื้องต้นได้ด้วยฟังก์ชั่น table()

เมื่อจัดข้อมูลเป็นตารางแสดงความถี่ หากมีสมมติฐานว่ายีนกระจายสม่ำเสมอด้วยจำนวนพอๆ กันในแต่ละโครโมโซมเช่น 882 ยีนต่อโครโมโซม แล้วจำนวนยีนที่พบบนโครโมโซม X สอดคล้องตามนี้หรือไม่ สามารถใช้การทดสอบไคน์ สแควร์เพื่อทดสอบสมมติฐานนี้ได้ ผลการทดสอบแสดงให้เห็นว่ายีนบนโครโมโซม X มีจำนวนไม่เท่ากับยีนบนโครโมโซมอื่นๆ

ข้อมูลชุดที่ 13 เป็นข้อมูลการกระจายของนกทะเลทรายในสถานที่แห่งหนึ่ง

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