تطبيع البيانات , مهارة على كل محلل اتقانها


مهارة


ما المقصود بتطبيع البيانات؟

تطبيع البيانات هي عبارة عن مجموعة من العمليات الأولية نجريها على البيانات. قبل ان نبحر في ما تتضمنه هذه العمليات, اود ان ألفت انتباهك على ان “تطبيع البيانات” في مجال تحليل البيانات هو مفهوم مختلف تمام عن “تطبيع قواعد البيانات” والذي يندرج تحت مجال هندسة وتصميم قواعد البيانات. الهدف من تطبيع البيانات هو ان نوجد وحدة قياس موحدة لكل المتغيرات. وحدة القياس هذه سوف تمنع الصفات المتغيرية في المتغيرات ذو وحدات القياس الكبيرة من ابتلاع او سحق الصفات المتغيرية في المتغيرات ذو وحدات قياس اصغر. إن احسست ان هذه التعاريف بدأت في أخذ مسار تجريدي أو انك بدأت تشعر بالصداع, لا يهمك رح نأخذ مثال بعد قليل يوضح كل هذه المصطلحات.

ما العمليات المتوفرة للقيام بهذه المهمة؟

هناك الكثير من العمليات المتوفرة للتطبيع البيانات ولكن اشهرها هو

  • Z-score Standardization

  • Min-Max normalization

  • Decimal Scaling

كل هذه العمليات تسعى للوصول إلى نفس الغاية وهي تسوية جميع المتغيرات إلى وحدة قياس موحدة.

الـ Min-Max normalization تسعى إلى تحويل جميع قيم المتغير إلى قيم تقع ما بين الصفر والواحد. هذه العملية تبين مدى بعد القيمة عن القيمة الدنيا للمتغير ونسبتها إلى المدى (وهو الفرق بين القيمة العليا والقيمة الدنيا). ليس هناك افضل من نرى ترجمة هذا التعريف بلغة الرياضيات. هذه هي المعادلة

\[ X_{mm}=\frac{x−min(X)}{max(X)−min(X)} \]

العملية الثانية وهي Z-score Standardization. هذه العملية مشهورة جدا في وسط المحللين الإحصائيين. بل بالإمكان ان نجزم انه لا يوجد كتاب عن الإحصاء لا يحوي المعادلة لهذه العملية. هذه العملية تقوم بتطبيع القيم من خلال طرح القيمة من المتوسط وتقسيمه على الإنحراف المعياري للمتغير. هذه العملية سوف تحول جميع القيم إلى قيم موجبة او سالبة ويتوسطها المتوسط الحسابي وسوف تكون قميته صفر. خلينا نشوف هذه المعادلة الشهيرة

\[ Z_{score}=\frac{x−mean(X)}{Std(X)} \]

أخيرًا وليس آخرا, الـ Decimal Scaling. بالرغم من ان هذه العملية في غاية السهولة الا انها اقل شهرة من العمليات الأخرى. كل ما علينا القيام به هو إيجاد القيمة المطلقة للقيمة العليا للمتغير وحساب عدد الارقام الغير كسرية فيه. ثم إدراجها في هذه المعادلة البسيطة. ما تحاول فعله هذه العملية هو تحويل جميع الارقام إلى اعداد كسرية .

\[ X^∗_{decimal}=\frac{x}{10d} \] ملاحظة : نعوض قيمة d بالقيمة التي اوجدناها في التعريف

مثال : حل مشاكل التصوير البياني

كل ما تعلمناه إلى الآن ممتاز ورائع ولكن إذا توقفنا هنا ستكون هذه المعادلات والتعاريف بدون قيمة عملية. لذلك وكما وعدتك في اول المقال, سوف نتداول مثال يبين تطبيق عملي لهذه المعادلات. في الحقيقة سوف نحاول حل مشكلة شائعة في التصوير البياني. تخيل السيناريوهات التالي

  1. انت عندك مصنع وتود معرفة (عن طريق رسم بياني) إذا كان مستويات الإنتاج تترابط في حركتها مع مستويات الأرباح .

  2. انت لديك فضول في معرفة فيما إذا كانت اسعار الأسهم لشركة معينة تترابط في حركتها مع اسعار اسهم شركة أخرى (من خلال رسم بياني ايضا).

هناك اكثر من طريقة للقيام بالمهمة في السناريو الأول. بإمكاننا رسم الخط البياني لمستويات الإنتاج والأرباح كلٌ في جهة مستقلة ومحاولة إيجاد اي ترابط عينياً. هذه الطريقة مجهدة للعين وغير فعّالة وهي طريقة سيئة لتصوير البيانات. الطريقة الأخرى هي ان نحاول ان نرسمهم في رسمة بيانية واحدة . هذه الطريقة ايضا لها مشاكلها وسوف نناقشها بعد قليل. لغرض برهنة ما ذكرناه عن المشاكل المتعلقة بهذه الطريقتين, رح نجربها كلها

بما أنني لا املك بيانات حقيقة عن مستويات الإنتاج والأرباح, سوف اقوم بخلق بيانات مزيفة عشوائية من توازيع مختلفة تحاكي السيناريو الأول.

production <- rlnorm(100 ,10, 1)
profit <- rnorm(100,300,110)

ملاحظة هامشية: في هذا الكود استخدمت التوزيع اللوغاريتمي الطبيعي لمستويات الإنتاج لكي نضمن ان تكون جميع القيم موجبة. اخترت المتوسط اللوغارتمي ان يكون ١٠ والإنحراف المعياري اللوغارتمي ١. بالنسبة إلى مستوى الارباح, فقد قمت بستخدام التوزيع الطبيعي لأن الارباح قد تكون موجبة او سالبة.

دعنا نحاول رسم البيانات كلً على حدة.

#Ploting Produciton Alone
plot(
  production ,
  type = "l",
  xlab = "Number of Days",
  ylab = "Units",
  main = "Production Trend",
  col = "purple"
)

#Ploting Profit Alone
plot(
  profit,
  type = "l",
  xlab = "Number of Days",
  ylab = "Saudi Riyal",
  main = "Profit Trend",
  col = "darkgreen"
)

كما ترى , يكاد من المستحيل ان نجد اي ترابط بين المتغيرين بالنظر فقط. الآن دعنا نحاول رسمهم في رسمة بيانية واحدة. ولكن قبل ان نفعل ذلك, الا تجده من الغير منطقي ان نرسم متغيرين ذو وحدات مختلفة في نفس الرسم البياني؟. هل نعيد تسمية وحدة المحور العمودي بالريال السعودي او بعدد السلع. المشكلة الأخرى وهي الأكثر اهمية هي ان الصفات المتغيرية في مستويات الإنتاج ذو وحدة القياس الكبيرة سوف تسحق الصفات المتغيرية في مستويات الارباح ذو وحدة القياس الصغيرة.

هذا سوف يحول كل ما رأيناه من صعود وهبوط في مستويات الارباح إلى شبه خط مستقيم.

خلينا نشوف إذا كان هذا الكلام صحيح ولا أنا جالس اتفلسف من راسي ههههه

yrange <- range(min(profit, production), max(profit, production))

plot(
  production,
  type = "l",
  xlab = "Number of Days" ,
  ylab = "SAR & Units",
  ylim = yrange,
  col = "purple",
  main = "Production & Profits"
)

lines(profit, col = "darkgreen")

بالضبط كما توقعنا. لاحظ خط الارباح كيف اصبح صغير وضئيل مقارنة بمستويات الإنتاج.

لحل هذه المشكلة , دعنا نستدعي غرام الإحصائيين المعادلة الغنية عن التعريف z-score . سوف نحاول تطبيع البيانات بستخدام هذه المعادلة. لحسن الحظ R لديه دالة لطيفة وبسيطة تدعى scale() وهي تقوم بتطبيع جميع البيانات حسب المعادلة المذكورة. لكن قبل ان نستخدم هذه الدالة نريد ان نتأكد بأن ما تعلمناه عن z-score هو نفس ما تقوم به هذه الدالة. دعنا نختبر إذا ما كانت القيمة الأولى لمستويات الإنتاج بعد اكمال المعادلة, هي نفسها التي سيتنتجها لنا R. لنكتب هذا الكود التالي.

#Applying the formula of z-score
(production[1] - mean(production)) / sd(production)
## [1] 3.669554
#the magic formula
scale(production)[1]
## [1] 3.669554

حسب التعريف للمعادلة كلا الكودين يعطينا نفس القيمة.

ملاحظة هامشية: الدالة ()scale تقوم بتطبيع جميع البيانات, لذلك انا ارفقت بعد الدالة هذه القيمة [1] لأنني فقط مهتم بأول قيمة في مستويات الإنتاج.

في حالتي انا حصلت على قيمة -0.3074291 . طبعا القيمة هذه قد تختلف عنك لإن البيانات تم خلقها عشوائية. ولكن المهم هو ان القيمة نفسها تنتج من كلا الكودين. هذه التجربة البسيطة تحققت من صحة فهمنا للمعادلة.

خلينا نرجع إلى السيناريو الأول ونحاول رسم البيانات في رسمة بيانية واحدة ولكن بعد عملية التطبيع.

إذا شغلنا الكود, سوف نرى بوضوح كيف يتحرك كل من الإنتاج والأرباح في رسمة بيانية واحدة حسب وحدة قياس موحدة.

scaled_profit <- scale(profit)
scaled_production <- scale(production)

yrange <-
  range(min(scaled_profit, scaled_production),
        max(scaled_profit, scaled_production))
plot(
  scaled_production,
  type = "l",
  xlab = "Number of Days" ,
  ylab = "SAR & Units",
  ylim = yrange,
  col = "purple",
  main = "Production &Profits"
)
lines(scaled_profit, col = "darkgreen")

الآن دعنا نتداول السيناريو الثاني. على خلاف مع المثال الأول, سوف نستخدم بيانات حقيقة تم تقشيرها من موقع تداول.للحصول على البيانات لهذا المثال انصحك باللإطلاع على مقالتي حول تقشير الويب و الحصول على الاكواد المطلوبة. لنفترض اننا مهتمين بمعرفة فيما إذا كانت اسعار بنك الرياض

(ورمزها : 1010 ) تترابط في حركتها مع اسعار شركة سابك (ورمزها: 2010) خلال فترة شهرين ابريل و مايو من سنة ٢٠١٦.

سوف نضع كل ما تعلمناه إلى الأن من خلال كتابة الكود التالي:

comp1 <- getCompanyRecords(startDate = "2016-04-01",
                           endDate = "2016-05-31",
                           companySymbol = "1010")

comp2 <- getCompanyRecords(startDate = "2016-04-01",
                           endDate = "2016-05-31",
                           companySymbol = "2010")

scaled_comp1 <- scale(comp1$lastTradePrice)
scaled_comp2 <- scale(comp2$lastTradePrice)
yrange <- range(min(scaled_comp2, scaled_comp1),
                max(scaled_comp2, scaled_comp1))

plot(
  scaled_comp1,
  type = "l",
  xlab = "Days" ,
  ylab = "z-score",
  ylim = yrange,
  col = "purple",
  main = "Riyad Bank & Saudi Basic Industries Corp."
)
lines(scaled_comp2, col = "darkgreen")

legend(
  length(scaled_comp1) * 0.75,
  max(yrange) * 0.9,
  legend = c("Riyad", "Sabic"),
  col = c("purple", "darkgreen"),
  lwd = c(1, 1)
)

هذا الرسم البياني يبين مدى ترابط اسعار الشركتين. بالإضافة إلى ذلك, يمكننا ان نرى مدى حدة تقلب الأسعار. كما هو في الرسم البياني, نرى ان شركة سابك اقل تقلباً من بنك الرياض. كذلك نرى ان هناك بعض الترابط ولكن ليس بصورة متطابقة.

في الختام, هذا كل ما اردت ان اشارك فيه واتمنى انك استمتعت بقراءة هذا المقال. ولكن الأهم ان تكون قد تعلمت امور جديدة حول تطبيع البيانات واهميتها في تحليل البيانات. إذا كان لديك اي ملاحظات او اقتراحات أرجو انك ترسلها عبر قسم التعليقات وشكراً.


جرب بنفسك

كامل الكود تجده هنا

comments powered by Disqus