Scale / Normalize
scale_values · numbers · number, text
2026-09-24
กำลังประมวลผล…
scale_values · numbers · number, text
2026-09-24
คอลัมน์ อายุ มีค่า 20–60 ส่วน รายได้ มีค่า 15,000–200,000 การเอาสองคอลัมน์นี้มาเทียบหรือรวมเป็นคะแนนเดียวกันตรง ๆ จะทำให้รายได้กลบอายุจนหมด เทคนิคนี้ปรับสเกลให้อยู่บนฐานเดียวกันก่อน โดยสร้างคอลัมน์ใหม่และเก็บค่าดิบไว้เสมอ
minmax แปลงให้อยู่ระหว่าง 0 ถึง 1 ตามค่าต่ำสุดและสูงสุด เข้าใจง่ายแต่ไวต่อค่าสุดโต่งzscore บอกว่าค่าห่างจากค่าเฉลี่ยกี่เท่าของส่วนเบี่ยงเบนมาตรฐาน ค่าติดลบคืออยู่ต่ำกว่าค่าเฉลี่ยlog บีบข้อมูลที่เบ้ขวาให้ดูเป็นปกติขึ้น ใช้ได้เฉพาะค่าที่มากกว่าศูนย์ ค่าที่เหลือจะเป็นค่าว่างพร้อมคำเตือนintoNewColumn เปิดอยู่เป็นค่าเริ่มต้น ค่าดิบจึงไม่หาย| Parameter | Type | Default |
|---|---|---|
column | string | — |
method | minmax | zscore | log | "minmax" |
intoNewColumn | boolean | true |
newColumnName | string | — |
decimals | number | 6 |
import json
import math
def scale_values(values, method='minmax', decimals=6):
numbers = [v for v in values if isinstance(v, (int, float)) and not isinstance(v, bool)]
if not numbers:
return [None for _ in values]
if method == 'minmax':
low, high = min(numbers), max(numbers)
scale = (lambda v: None) if low == high else (lambda v: round((v - low) / (high - low), decimals))
elif method == 'zscore':
mean = sum(numbers) / len(numbers)
deviation = math.sqrt(sum((v - mean) ** 2 for v in numbers) / len(numbers))
scale = (lambda v: None) if deviation == 0 else (lambda v: round((v - mean) / deviation, decimals))
else:
scale = lambda v: None if v <= 0 else round(math.log(v), decimals)
return [None if not isinstance(v, (int, float)) or isinstance(v, bool) else scale(v) for v in values]
values = [0, 5, 10, None]
result = {
'minmax': scale_values(values),
'zscore': scale_values(values, 'zscore', 4),
'log': scale_values(values, 'log', 4),
}
print(json.dumps(result, ensure_ascii=False))
จะทำคะแนนลูกค้าจาก recency, frequency และ monetary ซึ่งหน่วยคนละแบบ รัน scale_values แบบ minmax กับทั้งสามคอลัมน์เพื่อให้ได้ค่า 0–1 แล้วค่อยรวมกัน แต่ก่อนหน้านั้นให้เปิด Outlier Review ดู monetary ก่อน ถ้ามีลูกค้ารายเดียวที่ยอดสูงกว่าคนอื่นสิบเท่า ค่าที่ปรับสเกลของคนอื่นจะกองอยู่ใกล้ศูนย์ทั้งหมด ให้ใช้ winsorize ก่อนหรือเปลี่ยนไปใช้ log
ใช้ winsorize หรือ outlier_iqr ก่อนเพื่อลดผลของค่าสุดโต่ง ใช้ convert_unit เมื่อเป้าหมายคือหน่วยจริง และใช้ bucket_values เมื่ออยากได้กลุ่มที่คนอ่านเข้าใจแทนตัวเลขที่ปรับสเกลแล้ว