วิธีทำให้ข้อมูลเป็นมาตรฐานใน r
ในกรณีส่วนใหญ่ เมื่อผู้คนพูดถึง “การทำให้ตัวแปรในชุดข้อมูลเป็นมาตรฐาน” หมายความว่าพวกเขาต้องการปรับขนาดค่าเพื่อให้ตัวแปรมีค่าเฉลี่ยเป็น 0 และค่าเบี่ยงเบนมาตรฐานจาก 1
สาเหตุที่พบบ่อยที่สุดในการทำให้ตัวแปรเป็นมาตรฐานคือเมื่อคุณทำการวิเคราะห์หลายตัวแปรบางประเภท (เช่น คุณต้องการเข้าใจความสัมพันธ์ระหว่างตัวแปรทำนายหลายตัวและตัวแปรตอบสนอง) และคุณต้องการให้ตัวแปรแต่ละตัวมีส่วนช่วยในการวิเคราะห์อย่างเท่าเทียมกัน
เมื่อมีการวัดตัวแปรในระดับที่แตกต่างกัน ตัวแปรเหล่านั้นมักจะไม่ได้มีส่วนช่วยในการวิเคราะห์อย่างเท่าเทียมกัน ตัวอย่างเช่น หากค่าของตัวแปรหนึ่งมีค่าตั้งแต่ 0 ถึง 100,000 และค่าของตัวแปรอื่นมีตั้งแต่ 0 ถึง 100 ตัวแปรที่มีช่วงมากกว่าจะถูกกำหนดให้มีน้ำหนักมากขึ้นในการวิเคราะห์
นี่เป็นเรื่องปกติเมื่อตัวแปรตัวหนึ่งวัดค่าบางอย่าง เช่น เงินเดือน ($0 ถึง $100,000) และอีกตัวแปรหนึ่งวัดค่าบางอย่างเช่น อายุ (0 ถึง 100 ปี)
ด้วยการกำหนดตัวแปรให้เป็นมาตรฐาน เรามั่นใจได้ว่าแต่ละตัวแปรมีส่วนช่วยในการวิเคราะห์อย่างเท่าเทียมกัน มีสองวิธีทั่วไปในการทำให้ตัวแปร (หรือ “สเกล”) เป็นมาตรฐาน:
- การทำให้เป็นมาตรฐานต่ำสุด-สูงสุด: (X – นาที(X)) / (สูงสุด(X) – นาที(X))
- การกำหนดมาตรฐานของคะแนน Z: (X – μ) / σ
จากนั้นเราจะแสดงวิธีการใช้เทคนิคทั้งสองนี้ใน R
วิธีทำให้ตัวแปร (หรือ “สเกล”) เป็นมาตรฐานใน R
สำหรับแต่ละตัวอย่างต่อไปนี้ เราจะใช้ ม่านตา ชุดข้อมูล R ในตัวเพื่อแสดงวิธีทำให้ตัวแปรเป็นมาตรฐานหรือปรับขนาดใน R:
#view first six rows of iris dataset
head(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1 5.1 3.5 1.4 0.2 setosa
#2 4.9 3.0 1.4 0.2 setosa
#3 4.7 3.2 1.3 0.2 setosa
#4 4.6 3.1 1.5 0.2 setosa
#5 5.0 3.6 1.4 0.2 setosa
#6 5.4 3.9 1.7 0.4 setosa
การทำให้เป็นมาตรฐานขั้นต่ำ-สูงสุด
สูตรสำหรับการทำให้เป็นมาตรฐานขั้นต่ำ-สูงสุดคือ:
(X – นาที(X))/(สูงสุด(X) – นาที(X))
สำหรับแต่ละค่าของตัวแปร เราเพียงแต่หาระยะห่างระหว่างค่านั้นกับค่าต่ำสุด จากนั้นหารด้วยช่วง
หากต้องการนำสิ่งนี้ไปใช้ใน R เราสามารถกำหนดฟังก์ชันง่ายๆ จากนั้นใช้ laply เพื่อนำฟังก์ชันนั้นไปใช้กับคอลัมน์ในชุดข้อมูล ม่านตา ที่เราต้องการ:
#define Min-Max normalization function min_max_norm <- function (x) { (x - min(x)) / (max(x) - min(x)) } #apply Min-Max normalization to first four columns in iris dataset iris_norm <- as.data.frame(lapply(iris[1:4], min_max_norm)) #view first six rows of normalized iris dataset head(iris_norm) # Sepal.Length Sepal.Width Petal.Length Petal.Width #1 0.22222222 0.6250000 0.06779661 0.04166667 #2 0.16666667 0.4166667 0.06779661 0.04166667 #3 0.11111111 0.5000000 0.05084746 0.04166667 #4 0.08333333 0.4583333 0.08474576 0.04166667 #5 0.19444444 0.6666667 0.06779661 0.04166667 #6 0.30555556 0.7916667 0.11864407 0.12500000
โปรดทราบว่าตอนนี้แต่ละคอลัมน์มีค่าระหว่าง 0 ถึง 1 โปรดทราบว่าคอลัมน์ที่ห้า “สปีชีส์” ได้ถูกลบออกจากกรอบข้อมูลนี้แล้ว เราสามารถเพิ่มมันได้อย่างง่ายดายโดยใช้รหัสต่อไปนี้:
#add back Species column iris_norm$Species <- iris$Species #view first six rows of iris_norm head(iris_norm) # Sepal.Length Sepal.Width Petal.Length Petal.Width Species #1 0.22222222 0.6250000 0.06779661 0.04166667 setosa #2 0.16666667 0.4166667 0.06779661 0.04166667 setosa #3 0.11111111 0.5000000 0.05084746 0.04166667 setosa #4 0.08333333 0.4583333 0.08474576 0.04166667 setosa #5 0.19444444 0.6666667 0.06779661 0.04166667 setosa #6 0.30555556 0.7916667 0.11864407 0.12500000 setosa
มาตรฐานคะแนน Z
ข้อเสียของเทคนิคการทำให้เป็นมาตรฐานขั้นต่ำ – สูงสุดคือการย้ายค่าข้อมูลให้ใกล้กับค่าเฉลี่ยมากขึ้น หากเราต้องการให้แน่ใจว่าค่าผิดปกตินั้นมีน้ำหนักมากกว่าค่าอื่นๆ การใช้มาตรฐานคะแนน z จะเป็นเทคนิคที่ดีกว่าในการนำไปใช้
สูตรในการกำหนดมาตรฐานของคะแนน z มีดังนี้:
(X – μ) / σ
สำหรับแต่ละค่าของตัวแปร เราเพียงลบค่าเฉลี่ยของตัวแปรแล้วหารด้วยค่าเบี่ยงเบนมาตรฐานของตัวแปร
เพื่อนำไปใช้ใน R เรามีหลายทางเลือก:
1. สร้างมาตรฐานให้กับตัวแปร
หากเราเพียงต้องการสร้างมาตรฐานให้กับตัวแปรในชุดข้อมูล เช่น Sepal.Width ในชุดข้อมูล iris เราสามารถใช้โค้ดต่อไปนี้:
#standardize Sepal.Width iris$Sepal.Width <- (iris$Sepal.Width - mean(iris$Sepal.Width)) / sd(iris$Sepal.Width) head(iris) # Sepal.Length Sepal.Width Petal.Length Petal.Width Species #1 5.1 1.01560199 1.4 0.2 setosa #2 4.9 -0.13153881 1.4 0.2 setosa #3 4.7 0.32731751 1.3 0.2 setosa #4 4.6 0.09788935 1.5 0.2 setosa #5 5.0 1.24503015 1.4 0.2 setosa #6 5.4 1.93331463 1.7 0.4 setosa
ตอนนี้ค่า Sepal.Width ได้รับการปรับขนาดเพื่อให้ค่าเฉลี่ยเป็น 0 และส่วนเบี่ยงเบนมาตรฐานคือ 1 เรายังสามารถตรวจสอบสิ่งนี้ได้หากต้องการ:
#find mean of Sepal.Width mean(iris$Sepal.Width) #[1] 2.034094e-16 #basically zero #find standard deviation of Sepal.Width sd(iris$Sepal.Width) #[1] 1
2. สร้างมาตรฐานให้กับตัวแปรหลายตัวโดยใช้ฟังก์ชันสเกล
หากต้องการทำให้ตัวแปรหลายตัวเป็นมาตรฐาน เราสามารถใช้ฟังก์ชัน สเกล ได้ ตัวอย่างเช่น รหัสต่อไปนี้แสดงวิธีปรับขนาดสี่คอลัมน์แรกของชุดข้อมูล ม่านตา :
#standardize first four columns of iris dataset
iris_standardize <- as.data.frame(scale(iris[1:4]))
#view first six rows of standardized dataset
head(iris_standardize)
# Sepal.Length Sepal.Width Petal.Length Petal.Width
#1 -0.8976739 1.01560199 -1.335752 -1.311052
#2 -1.1392005 -0.13153881 -1.335752 -1.311052
#3 -1.3807271 0.32731751 -1.392399 -1.311052
#4 -1.5014904 0.09788935 -1.279104 -1.311052
#5 -1.0184372 1.24503015 -1.335752 -1.311052
#6 -0.5353840 1.93331463 -1.165809 -1.048667
โปรดทราบว่าตามค่าเริ่ม ต้น ฟังก์ชันมาตราส่วนจะพยายามทำให้แต่ละคอลัมน์ในกรอบข้อมูลเป็นมาตรฐาน ดังนั้น เราจะได้รับข้อผิดพลาดหากเราพยายามใช้ มาตราส่วน (ม่านตา) เนื่องจากคอลัมน์ Species ไม่ใช่ตัวเลขและไม่สามารถกำหนดมาตรฐานได้:
scale(iris) #Error in colMeans(x, na.rm = TRUE): 'x' must be numeric
อย่างไรก็ตาม เป็นไปได้ที่จะสร้างมาตรฐานเฉพาะตัวแปรบางตัวในกรอบข้อมูลในขณะที่ยังคงรักษาตัวแปรอื่นๆ ทั้งหมดไว้เหมือนกันโดยใช้แพ็คเกจ dplyr ตัวอย่างเช่น รหัสต่อไปนี้ทำให้ตัวแปร Sepal.Width และ Sepal.Length เป็นมาตรฐาน ในขณะที่ยังคงรักษาตัวแปรอื่นๆ ทั้งหมดไว้เหมือนเดิม:
#load dplyr package library(dplyr) #standardize Sepal.Width and Sepal.Length iris_new <- iris %>% mutate_each_(list(~scale(.) %>% as.vector), vars = c("Sepal.Width","Sepal.Length")) #view first six rows of new data frame head(iris_new) # Sepal.Length Sepal.Width Petal.Length Petal.Width Species #1 -0.8976739 1.01560199 1.4 0.2 setosa #2 -1.1392005 -0.13153881 1.4 0.2 setosa #3 -1.3807271 0.32731751 1.3 0.2 setosa #4 -1.5014904 0.09788935 1.5 0.2 setosa #5 -1.0184372 1.24503015 1.4 0.2 setosa #6 -0.5353840 1.93331463 1.7 0.4 setosa
โปรดทราบว่า Sepal.Length และ Sepal.Width ได้รับการกำหนดมาตรฐาน โดยตัวแปรทั้งสองมีค่าเฉลี่ยเป็น 0 และค่าเบี่ยงเบนมาตรฐานเป็น 1 ในขณะที่ตัวแปรอีกสามตัวในกรอบข้อมูลยังคงไม่เปลี่ยนแปลง