การปรับมาตรฐานฮิสโตแกรม (Normalized Histogram) ทำให้พื้นที่ใต้กราฟเท่ากับ 1 แทนที่จะเป็นจำนวนนับ (counts) ทำให้เปรียบเทียบการกระจายของข้อมูลชุดต่างๆ ได้แม่นยำขึ้น แม้ขนาดตัวอย่างจะต่างกัน
ขั้นตอนการทำงาน
- นำเข้า
matplotlib.pyplot - เตรียมข้อมูล (รายการตัวเลข)
- พลอตฮิสโตแกรมด้วย
plt.hist()โดยตั้งค่าdensity=True - แสดงผลด้วย
plt.show()
ตัวอย่างโค้ด
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
k = [5, 5, 5, 5]
x, bins, patches = plt.hist(k, density=True)
plt.show()
คำอธิบาย
density=Trueทำให้ความสูงของแท่ง = ความถี่ / (จำนวนข้อมูลทั้งหมด × ความกว้างกลุ่ม)- พื้นที่รวมของแท่งทั้งหมด = 1 (integral = 1)
- คืนค่า:
n(ความหนาแน่น),bins(ขอบเขตกลุ่ม),patches(ออบเจกต์แท่ง)
เปรียบเทียบ: Counts vs Density
import numpy as np
import matplotlib.pyplot as plt
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(0, 1, 100) # ขนาดตัวอย่างต่างกัน
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
# Counts - ขนาดตัวอย่างส่งผลต่อความสูง
ax1.hist(data1, bins=30, alpha=0.5, label='n=1000')
ax1.hist(data2, bins=30, alpha=0.5, label='n=100')
ax1.set_title('Counts')
ax1.legend()
# Density - แสดงรูปทรงการกระจายจริง
ax2.hist(data1, bins=30, density=True, alpha=0.5, label='n=1000')
ax2.hist(data2, bins=30, density=True, alpha=0.5, label='n=100')
ax2.set_title('Density (Normalized)')
ax2.legend()
plt.show()
การประยุกต์ใช้
- เปรียบเทียบการกระจายระหว่างกลุ่มข้อมูลขนาดต่างกัน
- ประมาณ Probability Density Function (PDF)
- สถิติเชิงอนุมาน การทดสอบสมมติฐาน
- Machine Learning: feature distribution visualization
หมายเหตุ
ใน Matplotlib รุ่นเก่าใช้ normed=True แต่ถูก deprecated แล้ว ควรใช้ density=True แทน