Log transformation
การทำ Log transformation เป็นเทคนิคที่ใช้ในการแปลงข้อมูลที่เบ้เพื่อให้ได้การกระจายที่ใกล้เคียงกับการกระจายแบบปกติมากขึ้น (Normal distribution) ทำได้โดยการนำ logarithm ของข้อมูลแต่ละจุด ซึ่งถูกนำมาใช้ประโยชน์เมื่อต้องจัดการกับข้อมูลที่เบ้ขวา เพราะช่วยบีบส่วนบนของการกระจายในขณะที่ยืดส่วนล่างออก
ตัวอย่าง Python code สำหรับ Log transformation
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# สร้างข้อมูลที่เบ้ขวา
np.random.seed(42)
data = np.random.lognormal(mean=0, sigma=1, size=1000)
# ทำการแปลงข้อมูลด้วย log
log_data = np.log(data)
# สร้างกราฟ
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# ข้อมูลต้นฉบับ
ax1.hist(data, bins=30, edgecolor='black')
ax1.set_title('Original data')
ax1.set_xlabel('Value')
ax1.set_ylabel('Frequency')
# ข้อมูลที่แปลงด้วย log
ax2.hist(log_data, bins=30, edgecolor='black')
ax2.set_title('Log Transformed data')
ax2.set_xlabel('Log(Value)')
ax2.set_ylabel('Frequency')
plt.tight_layout()
plt.show()
# ทำการทดสอบ Shapiro-Wilk เพื่อดูการกระจายแบบปกติ
_, p_value_original = stats.shapiro(data)
_, p_value_log = stats.shapiro(log_data)
print(f"Shapiro-Wilk p-value (Original data): {p_value_original:.6f}")
print(f"Shapiro-Wilk p-value (Log Transformed data): {p_value_log:.6f}")
การทำงานของ Code ดังนี้
- สร้างข้อมูลที่เบ้ขวาโดยใช้การกระจายแบบ log normal
- ใช้
np.log()
เพื่อแปลงข้อมูลด้วย Log - สร้างฮิสโตแกรมของข้อมูล Original และข้อมูลที่แปลงแล้ว (Transformed data)
- ทำการทดสอบ Shapiro-Wilk เพื่อดูว่าข้อมูลมีการกระจายแบบปกติหรือไม่
การทดสอบ Shapiro-Wilk ช่วยประเมินว่าข้อมูลมีการกระจายแบบปกติหรือไม่ ถ้าค่า p-value > 0.05 แสดงว่าข้อมูลไม่แตกต่างจากการกระจายแบบปกติอย่างมีนัยสำคัญ
Blog นี้ เขียนร่วมกับ Claude.ai โดยใช้ Prompt
Please explain about log transformation for getting normal distribution with python code.