DataFrame.describe() เป็น method ของ Library ที่ชื่อ Pandas ใช้ในการสร้างสถิติเชิงบรรยาย

สถิติเชิงบรรยายที่ได้จะรวมถึงสถิติที่สรุปแนวโน้มศูนย์กลางการกระจายตัวและรูปร่างของการแจกแจงของชุดข้อมูลโดยจะไม่นับรวมค่า NaN หรือ missing data

Syntax

DataFrame.describe(percentiles=None, include=None, exclude=None)

มาดูว่า parameters แต่ละอันคืออะไรบ้าง

percentiles คือ คล้ายลิสของข้อมูลที่เป็นตัวเลข มีค่าอยู่ระหว่าง 0-1 ใช้กำหนด percentiles ของสถิติที่เราต้องการแสดง ค่า default อยู่ที่ [.25, .50, .75] นั่นหมายถึง 25% 50% และ 75%

เปอร์เซ็นไทล์(Percentile) หมายถึง การหาร้อยละของตำแหน่งที่มีค่าไม่เกินจำนวนๆหนึ่ง เช่น ในเดือนที่ผ่านมา ลูกค้าของห้างสรรพสินค้าคนหนึ่งซื้อของในห้างเป็นจำนวนเงิน 10,000 บาท และจำนวน 10,000 นี้อยู่ตำแหน่งเปอร์เซ็นไทล์ที่ 40 นั่นหมายความว่า 40% ของลูกค้าทั้งหมดในเดือนนี้ซื้อของในห้างไม่เกิน 10,000 บาท เป็นต้น

include คือ คล้ายลิสของประเภทข้อมูลหรือ data type ที่เราต้องการบรรยายในสถิติ ค่า default คือ None ซึ่งจะแสดงข้อมูลที่เป็นตัวเลข int และ float เท่านั้น

exclude คล้ายลิสของประเภทข้อมูลหรือ data type ที่เราไม่ต้องการใช้ในการบรรยายสถิติ ค่า default คือ None ซึ่งจะแสดงข้อมูลที่เป็นตัวเลข int และ float ตามค่าเริ่มต้น แต่หากเรากำหนด ‘float’ ให้อยู่ใน exclude เราจะได้สถิติที่ไม่มีค่าทศนิยมอยู่เลย เป็นต้น

ตัวอย่างสร้างสถิติบรรยายโดยใช้ค่า default

import pandas as pd

scottish_hills = pd.read_csv('/Users/maria/Document/python/scottish_hills.csv')
print(scottish_hills.describe())


output:
            Height    Latitude   Longitude
count   282.000000  282.000000  282.000000
mean   1017.863121   56.991422   -4.730474
std      83.719897    0.413715    0.691941
min     914.600000   56.190293   -6.241638
25%     953.000000   56.670042   -5.171127
50%     998.500000   56.936065   -4.898478
75%    1063.625000   57.208379   -4.302137
max    1344.500000   58.413113   -2.973622

ความหมายของการบรรยายสถิติในแต่ละแถว

count

คือ การนับว่าใน DataFrame นี้มีกี่แถว เช่น ไฟล์ที่เรา import เข้ามาเป็น dataset เกี่ยวกับเนินเขาในสก็อต ซึ่งมีหลายเนินเขามาก และเมื่อเราทำ DataFrame เราจะจัดเนินเขาแต่ละอันให้อยู่ในแถวของมันเอง โดยในที่นี้เรานับได้ 282 แถว หมายความว่า ใน DataFrame มีข้อมูลของเนินเขาจำนวน 282 ลูก

mean

คือ ค่าเฉลี่ย เป็นการนำค่าแต่ละค่าของจำนวนทั้งหมดมาบวกกันและหารด้วยจำนวนทั้งหมด เช่น นำความสูงของแต่ละเนินเขามาบวกกัน จากนั้นหารด้วยจำนวนเนินเขา (มีเนินเขาจำนวน 282 ลูก) เราก็จะได้ค่าเฉลี่ยความสูงของเนินเขา

std

คือ ค่า Standard Deviation (SD) หรือค่าเบี่ยงเบนมาตรฐาน ค่านี้มีความสำคัญโดยจะใช้บอกค่าเฉลี่ยของระยะห่างของข้อมูลแต่ละตัวจากค่าเฉลี่ย โดยจะเปรียบเทียบกับค่า mean หรือค่าเฉลี่ยร่วมด้วย หากค่า std ต่ำ แปลว่า ค่าของข้อมูลแต่ละตัวไม่ต่างกันมาก หากค่า std สูง แปลว่า ค่าของข้อมูลแต่ละตัวมีความต่างกันมาก มีการกระจายของข้อมูลสูง

การใช้ประโยชน์จากการอ่านค่า SD

ตัวอย่างเช่น ในวงการอุตสาหกรรม ผู้ผลิตจะต้องผลิตสินค่าที่มีค่า SD ต่ำ คือ ผลิตภัณฑ์ทุกตัวจะต้องเหมือนกัน เช่น กาแฟน้ำหนัก 100 กรัม แต่ละถุงอาจจะไม่ 100 กรัมเป๊ะๆ เช่น 100.2, 100.4, 100.1 เป็นต้น หมายความว่า แต่ละถุงมีระยะห่างของปริมาณอยู่ที่ 0.2, 0.4, 0.1 ตามลำดับ
โดยหากต่างไม่เกิน 0.5 – 1.0 กรัมแบบนี้ คือค่อนข้างโอเค
แต่ถ้าถุงหนึ่งหนัก 100 กรัม อีกถุงหนึ่งหนัก 120, 135, 150 กรัม แบบนี้จะมีค่า SD สูง แปลว่าน้ำหนักของแต่ละถุงมีน้ำหนักต่างกันมาก แทนที่จะบรรจุ 100 กรัม(และขายด้วยราคาสำหรับ 100 กรัม) ตามที่ระบุหน้าถุง เราจะได้ถุงที่ระบุ 100 กรัม แต่ปริมาณจริงมากกว่า 100 กรัมเยอะ ในขณะที่ยังคงต้องขายราคา 100 กรัมอยู่(เพราะบรรจุภัณฑ์ระบุว่า 100 กรัม) ทำให้ผู้ผลิตไม่ได้เงินเท่าที่ควร

อีกตัวอย่างหนึ่งที่ต้องนำค่าเฉลี่ยมาพิจารณาร่วมด้วย คะแนนสอบของนักเรียนในชั้นเรียน

  • ค่า SD ต่ำ + ค่าเฉลี่ยต่ำ —> นักเรียนทุกคนได้คะแนนพอๆกัน ไม่ต่างกันมาก ในขณะที่ค่าเฉลี่ยต่ำ แปลว่านักเรียนทุกคนทำข้อสอบไม่ค่อยได้
  • ค่า SD ต่ำ + ค่าเฉลี่ยสูง —> นักเรียนทุกคนได้คะแนนพอๆกัน ในขณะที่ค่าเฉลี่ยสูง แปลว่านักเรียนทุกคนทำข้อสอบได้ และข้อสอบชุดนี้ค่อนข้างง่ายสำหรับนักเรียนกลุ่มนี้
  • ค่า SD สูง + ค่าเฉลี่ยต่ำ —> นักเรียนแต่ละคนได้คะแนนต่างกันมาก เช่น คนที่ทำข้อสอบได้ ก็ทำคะแนนได้เยอะเลย คนที่ทำไม่ได้ก็ทำคะแนนได้น้อยมาก ในขณะที่ค่าเฉลี่ยต่ำ โดยรวมแล้วคะแนนเฉลี่ยของนักเรียนทุกคนไม่เยอะ เพราะคะแนนของคนที่ได้คะแนนน้อยมีมากกว่าและมันไปรั้งคนที่ได้คะแนนมาก วิชาประเภทนี้มักเป็นวิชาที่เน้นความเข้าใจ อาจมีจำนวนข้อมาก แต่ละข้อมีคะแนนไม่เยอะ
  • ค่า SD สูง + ค่าเฉลี่ยสูง —> นักเรียนแต่ละคนได้คะแนนต่างกันมาก แต่เพราะค่าเฉลี่ยสูง เป็นไปได้ว่าคนได้คะแนนสูงก็อาจจะได้คะแนนเต็มไปเลย ข้อสอบที่ได้ค่า SD และ ค่าเฉลี่ยออกมาแบบนี้ เช่น GAT เชื่อมโยง คือคนที่ทำได้ก็มักจะได้คะแนนเต็ม คนที่ทำไม่ได้ก็ได้คะแนนน้อยไปเลย หรือข้อสอบที่มีจำนวนข้อน้อยแต่คะแนนเยอะ เป็นต้น

การหาค่า SD

1. หาค่าเฉลี่ยของกลุ่มตัวอย่าง เช่น ข้อมูล 4, 6, 5, 9, 8, 2,7 มีค่าเฉลี่ยคือ
(4 + 6 + 5 + 9 + 8 + 2 + 7) ÷ 7 = 5.85714285714


2. นำข้อมูลแต่ละตัวลบด้วยค่าเฉลี่ย จากนั้นยกกำลังสอง
 (4 – 5.85714285714)2 = 3.44897959183
(6 – 5.85714285714)2 = 0.02040816326
(5 – 5.85714285714)2 = 0.73469387754
(9 – 5.85714285714)2 = 9.87755102043
(8 – 5.85714285714)2 = 4.59183673471
(2 – 5.85714285714)2 = 14.8775510204
(7 – 5.85714285714)2 = 1.30612244899


3. นำผลที่ได้จากข้อสองมาบวกกันแล้วหารด้วยจำนวนข้อมูล -1 (n-1)
3.44897959183 + 0.02040816326 + 0.73469387754 + 9.87755102043 + 4.59183673471 + 14.8775510204 + 1.30612244899 = 34.8571428572
นำผลที่ได้มาหารด้วย จำนวนข้อมูล -1
34.8571428572 ÷ (7-1) = 5.80952380953

4. หาค่ารากที่สองของจำนวนที่ได้
√5.80952380953 = 2.41029537807

ค่าที่ได้จากการหารากที่สอง จะเป็นค่า SD ในตัวอย่างนี้ ปัดทศนิยมแล้วจะได้ 2.41

min

คือ จำนวนที่มีค่าน้อยที่สุดในคอลัมน์นั้น

ค่าเปอร์เซ็นไทล์

จะเห็นว่าสถิติที่ได้แยกเปอร์เซ็นไทล์ออกเป็น 25% 50% และ 75% ตามค่า default

max

คือ จำนวนที่มีค่ามากที่สุดในคอมลัมน์นั้น

นอกจากแสดงสถิติเชิงบรรยายตามค่าเริ่มต้นของ method แล้ว เรายังสามารถกำหนดให้มันแสดงออกมาได้อย่างที่เราต้องการโดยเฉพาะด้วยได้ เช่น

กำหนดค่าเปอร์เซ็นไทล์ใหม่

ใน parameter percentile ให้ระบุ ค่าเปอร์เซ็นไทล์ใหม่ โดยค่านั้นต้องอยู่ระหว่าง 0-1

import pandas as pd

scottish_hills = pd.read_csv('/Users/maria/Document/python/scottish_hills.csv')
perc = [.20, .40, .60, .80]
print(scottish_hills.describe(percentiles = perc))

output:
            Height    Latitude   Longitude
count   282.000000  282.000000  282.000000
mean   1017.863121   56.991422   -4.730474
std      83.719897    0.413715    0.691941
min     914.600000   56.190293   -6.241638
20%     945.000000   56.617735   -5.247985
40%     981.000000   56.858588   -4.995882
50%     998.500000   56.936065   -4.898478
60%    1019.000000   57.061028   -4.694618
80%    1083.800000   57.282679   -4.200695
max    1344.500000   58.413113   -2.973622