आर में डेटा को सामान्य कैसे करें
ज्यादातर मामलों में, जब लोग किसी डेटा सेट में वेरिएबल्स को “सामान्यीकृत” करने के बारे में बात करते हैं, तो उनका मतलब होता है कि वे मानों को इस तरह स्केल करना चाहते हैं कि वेरिएबल का माध्य 0 हो और 1 से मानक विचलन हो।
चर को मानकीकृत करने का सबसे आम कारण तब होता है जब आप किसी प्रकार का बहुभिन्नरूपी विश्लेषण कर रहे होते हैं (यानी, आप कई भविष्यवक्ता चर और एक प्रतिक्रिया चर के बीच संबंध को समझना चाहते हैं) और आप चाहते हैं कि प्रत्येक चर विश्लेषण में समान रूप से योगदान दे।
जब चर को विभिन्न पैमानों पर मापा जाता है, तो वे अक्सर विश्लेषण में समान रूप से योगदान नहीं करते हैं। उदाहरण के लिए, यदि एक चर का मान 0 से 100,000 तक है और दूसरे चर का मान 0 से 100 तक है, तो अधिक सीमा वाले चर को विश्लेषण में अधिक महत्व दिया जाएगा।
यह सामान्य है जब एक चर वेतन ($0 से $100,000) जैसी कोई चीज़ मापता है और दूसरा चर उम्र (0 से 100 वर्ष) जैसी कोई चीज़ मापता है।
चरों को मानकीकृत करके, हम यह सुनिश्चित कर सकते हैं कि प्रत्येक चर विश्लेषण में समान रूप से योगदान देता है। वेरिएबल्स को सामान्य बनाने (या “स्केल”) के दो सामान्य तरीके हैं:
- न्यूनतम-अधिकतम सामान्यीकरण: (एक्स – न्यूनतम(एक्स)) / (अधिकतम(एक्स) – न्यूनतम(एक्स))
- Z स्कोर का मानकीकरण: (X – μ) / σ
फिर हम दिखाएंगे कि इन दोनों तकनीकों को आर में कैसे लागू किया जाए।
आर में वेरिएबल्स को सामान्यीकृत (या “स्केल”) कैसे करें
निम्नलिखित प्रत्येक उदाहरण के लिए, हम अंतर्निहित आर डेटासेट आईरिस का उपयोग यह बताने के लिए करेंगे कि आर में वेरिएबल को सामान्य कैसे करें या स्केल करें:
#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
न्यूनतम-अधिकतम सामान्यीकरण
न्यूनतम-अधिकतम सामान्यीकरण का सूत्र है:
(एक्स – न्यूनतम(एक्स))/(अधिकतम(एक्स) – न्यूनतम(एक्स))
किसी चर के प्रत्येक मान के लिए, हम बस उस मान और न्यूनतम मान के बीच की दूरी पाते हैं, फिर उसे सीमा से विभाजित करते हैं।
आर में इसे लागू करने के लिए, हम एक साधारण फ़ंक्शन को परिभाषित कर सकते हैं और फिर उस फ़ंक्शन को आईरिस डेटासेट में कॉलम पर लागू करने के लिए लैपली का उपयोग कर सकते हैं:
#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-स्कोर को मानकीकृत करने का सूत्र इस प्रकार है:
(एक्स – μ) / σ
किसी चर के प्रत्येक मान के लिए, हम बस चर का औसत मान घटाते हैं और फिर चर के मानक विचलन से विभाजित करते हैं।
आर में इसे लागू करने के लिए, हमारे पास कई विकल्प हैं:
1. एक चर का मानकीकरण करें
यदि हम किसी डेटासेट में किसी वेरिएबल को मानकीकृत करना चाहते हैं, जैसे कि आईरिस डेटासेट में Sepal.Width, तो हम निम्नलिखित कोड का उपयोग कर सकते हैं:
#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
ध्यान दें कि स्केल फ़ंक्शन, डिफ़ॉल्ट रूप से, डेटा फ़्रेम में प्रत्येक कॉलम को सामान्य करने का प्रयास करता है। इसलिए, अगर हम स्केल (आइरिस) का उपयोग करने का प्रयास करेंगे तो हमें एक त्रुटि मिलेगी क्योंकि प्रजाति कॉलम संख्यात्मक नहीं है और इसे मानकीकृत नहीं किया जा सकता है:
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 है, जबकि डेटा फ्रेम में अन्य तीन चर अपरिवर्तित रहते हैं।