إن إحدى المهارات الحيوية التي يجب أن يتمتع بها محترف البيانات الماهر هي التعامل الفعّال مع مجموعات البيانات الضخمة، وضمان جودة البيانات وموثوقيتها. تُعَد البيانات القطعة الأساسية والمحورية لأي نظام بيانات، ومهما كانت المهارات الجيدة التي تمتلكها في جوانب أخرى من مهنتنا، فهذه هي المهارات التي لا يمكنك تجاهلها.
في هذه المقالة، أستكشف تقنيات قوية لإجراء عمليات فحص ضمان الجودة على مجموعات البيانات الكبيرة باستخدام مكتبة Deequ والأساليب الإحصائية. من خلال الجمع بين الأساليب التي أشرحها أدناه، ستتمكن من الحفاظ على سلامة البيانات، وتحسين ممارسات إدارة البيانات، ومنع المشكلات المحتملة في التطبيقات اللاحقة.
عمليات التحقق من ضمان الجودة باستخدام مكتبة Deequ
لماذا دييكو؟
إن ضمان جودة البيانات على نطاق واسع مهمة شاقة، وخاصة عند التعامل مع مليارات الصفوف المخزنة في أنظمة الملفات الموزعة أو مستودعات البيانات. مكتبة Deequ عبارة عن إطار عمل مفتوح المصدر لتحليل البيانات وضمان الجودة مبني على Spark وهو أداة حديثة ومتعددة الاستخدامات مصممة لحل هذه المشكلة. ما يميزها عن الأدوات المماثلة هو قدرتها على التكامل بسلاسة مع Spark، والاستفادة من قوة المعالجة الموزعة للتعامل بكفاءة مع مجموعات البيانات واسعة النطاق.
عند تجربته، سترى كيف تتيح لك مرونته تحديد قواعد التحقق المعقدة المصممة خصيصًا لمتطلباتك المحددة، مما يضمن تغطية شاملة. بالإضافة إلى ذلك، يتميز Deequ بمقاييس شاملة وقدرات اكتشاف الشذوذ التي ستساعدك على تحديد مشكلات جودة البيانات ومعالجتها بشكل استباقي. بالنسبة لمحترفي البيانات الذين يعملون مع مجموعات بيانات كبيرة وديناميكية، فإن Deequ هو حل مثالي. دعنا نرى كيف يمكننا استخدامه.
إعداد Deequ
يمكن الوصول إلى مزيد من التفاصيل حول إعداد مكتبة Deequ وحالات الاستخدام المتعلقة بإنشاء ملفات تعريف البيانات هنا . من أجل التبسيط، في هذا المثال، قمنا فقط بإنشاء عدد قليل من سجلات الألعاب:
val rdd = spark.sparkContext.parallelize(Seq( Item(1, "Thingy A", "awesome thing.", "high", 0), Item(2, "Thingy B", "available at http://thingb.com", null, 0), Item(3, null, null, "low", 5), Item(4, "Thingy D", "checkout https://thingd.ca", "low", 10), Item(5, "Thingy E", null, "high", 12))) val data = spark.createDataFrame(rdd)
تحديد افتراضات البيانات
تتضمن معظم تطبيقات البيانات افتراضات ضمنية حول سمات البيانات، مثل القيم غير الفارغة والتفرد. مع Deequ، تصبح هذه الافتراضات واضحة من خلال اختبارات الوحدة. فيما يلي بعض الاختبارات الشائعة:
عدد الصفوف: تأكد من أن مجموعة البيانات تحتوي على عدد معين من الصفوف.
اكتمال السمة: تأكد من أن السمات مثل id وproductName ليست فارغة أبدًا.
تفرد السمة: تأكد من أن بعض السمات، مثل المعرف، فريدة.
نطاق القيمة: التحقق من أن السمات مثل الأولوية وعدد المشاهدات تقع ضمن النطاقات المتوقعة.
مطابقة الأنماط: تأكد من أن الأوصاف تحتوي على عناوين URL عندما يكون ذلك متوقعًا.
الخصائص الإحصائية: تأكد من أن متوسط السمات الرقمية يلبي معايير محددة.
إليك كيفية تنفيذ هذه الفحوصات باستخدام Deequ:
import com.amazon.deequ.VerificationSuite import com.amazon.deequ.checks.{Check, CheckLevel, CheckStatus} val verificationResult = VerificationSuite() .onData(data) .addCheck( Check(CheckLevel.Error, "unit testing my data") .hasSize(_ == 5) // we expect 5 rows .isComplete("id") // should never be NULL .isUnique("id") // should not contain duplicates .isComplete("productName") // should never be NULL // should only contain the values "high" and "low" .isContainedIn("priority", Array("high", "low")) .isNonNegative("numViews") // should not contain negative values // at least half of the descriptions should contain a url .containsURL("description", _ >= 0.5) // half of the items should have less than 10 views .hasApproxQuantile("numViews", 0.5, _ <= 10)) .run()
تفسير النتائج
بعد تشغيل هذه الفحوصات، يقوم Deequ بترجمتها إلى سلسلة من وظائف Spark، والتي يقوم بتنفيذها لحساب المقاييس على البيانات. بعد ذلك، يقوم باستدعاء وظائف التأكيد الخاصة بك (على سبيل المثال، _ == 5 لفحص الحجم) على هذه المقاييس لمعرفة ما إذا كانت القيود سارية على البيانات. يمكننا فحص الكائن "verificationResult" لمعرفة ما إذا كان الاختبار قد وجد أخطاء:
import com.amazon.deequ.constraints.ConstraintStatus if (verificationResult.status == CheckStatus.Success) { println("The data passed the test, everything is fine!") } else { println("We found errors in the data:\n") val resultsForAllConstraints = verificationResult.checkResults .flatMap { case (_, checkResult) => checkResult.constraintResults } resultsForAllConstraints .filter { _.status != ConstraintStatus.Success } .foreach { result => println(s"${result.constraint}: ${result.message.get}") } }
إذا قمنا بتشغيل المثال، فسنحصل على الإخراج التالي:
We found errors in the data: CompletenessConstraint(Completeness(productName)): Value: 0.8 does not meet the requirement! PatternConstraint(containsURL(description)): Value: 0.4 does not meet the requirement!
وجد الاختبار أن افتراضاتنا قد تم انتهاكها! فقط 4 من أصل 5 (80%) من قيم سمة اسم المنتج ليست فارغة، و2 فقط من أصل 5 (أي 40%) من قيم سمة الوصف تحتوي على عنوان URL. لحسن الحظ، أجرينا اختبارًا ووجدنا الأخطاء؛ يجب على شخص ما إصلاح البيانات على الفور!
التحقق من ضمان الجودة باستخدام الأساليب الإحصائية
في حين توفر Deequ إطارًا قويًا للتحقق من صحة البيانات، فإن دمج الأساليب الإحصائية يمكن أن يعزز عمليات التحقق من الجودة، خاصة إذا كنت تتعامل مع مقاييس مجمعة لمجموعة بيانات. دعنا نرى كيف يمكنك استخدام الأساليب الإحصائية لمراقبة جودة البيانات وضمانها.
تتبع عدد السجلات
فكر في سيناريو عمل حيث تنتج عملية ETL (استخراج وتحويل وتحميل) N سجلاً في مهمة مجدولة يوميًا. قد ترغب فرق الدعم في إعداد عمليات فحص ضمان الجودة لإصدار تنبيه إذا كان هناك انحراف كبير في عدد السجلات. على سبيل المثال، إذا كانت العملية تنتج عادةً ما بين 9500 إلى 10500 سجل يوميًا على مدار شهرين، فإن أي زيادة أو نقصان كبير قد يشير إلى وجود مشكلة في البيانات الأساسية.
يمكننا استخدام طريقة إحصائية لتحديد هذه العتبة التي يجب على العملية عندها رفع تنبيه إلى فريق الدعم. فيما يلي رسم توضيحي لتتبع عدد السجلات على مدار شهرين:
ولتحليل ذلك، يمكننا تحويل بيانات عدد السجلات لمراقبة التغيرات اليومية. وتتذبذب هذه التغيرات عمومًا حول الصفر، كما هو موضح في الرسم البياني التالي:
عندما نمثل معدل التغير هذا بتوزيع طبيعي، فإنه يشكل منحنى جرسي، مما يشير إلى أن البيانات موزعة بشكل طبيعي. التغير المتوقع هو حوالي 0%، مع انحراف معياري بنسبة 2.63%.
يشير هذا التحليل إلى أن عدد السجلات يقع عادةً ضمن نطاق -5.26% إلى +5.25% بنسبة ثقة 90%. بناءً على ذلك، يمكنك وضع قاعدة لإصدار تنبيه إذا انحرف عدد السجلات عن هذا النطاق، مما يضمن التدخل في الوقت المناسب.
تتبع تغطية السمات
تشير تغطية السمة إلى نسبة القيم غير الفارغة إلى إجمالي عدد السجلات في لقطة مجموعة البيانات. على سبيل المثال، إذا كان 8 من أصل 100 سجل يحتوي على قيمة فارغة لسمة معينة، فإن التغطية لهذه السمة تكون 92%.
دعنا نراجع حالة عمل أخرى تتضمن عملية ETL لإنشاء لقطة جدول منتج يوميًا. نريد مراقبة تغطية سمات وصف المنتج. إذا انخفضت التغطية عن حد معين، فيجب رفع تنبيه لفريق الدعم. يوجد أدناه تمثيل مرئي لتغطية السمات لوصف المنتج على مدار شهرين:
ومن خلال تحليل الاختلافات المطلقة بين كل يوم وآخر في التغطية، نلاحظ أن التغيرات تتأرجح حول الصفر:
إن تمثيل هذه البيانات كتوزيع طبيعي يظهر أنها موزعة بشكل طبيعي مع تغير متوقع يبلغ حوالي 0% وانحراف معياري يبلغ 2.45%.
كما نرى، بالنسبة لهذه المجموعة من البيانات، يتراوح نطاق تغطية سمات وصف المنتج عادةً من -4.9% إلى +4.9% بنسبة ثقة 90%. بناءً على هذا المؤشر، يمكننا تعيين قاعدة لإصدار تنبيه إذا انحرف نطاق التغطية عن هذا النطاق.
عمليات التحقق من ضمان الجودة باستخدام خوارزميات السلاسل الزمنية
إذا كنت تعمل مع مجموعات بيانات تظهر اختلافات كبيرة بسبب عوامل مثل الموسمية أو الاتجاهات، فقد تؤدي الأساليب الإحصائية التقليدية إلى ظهور تنبيهات خاطئة. تقدم خوارزميات التسلسل الزمني نهجًا أكثر دقة، مما يحسن دقة وموثوقية عمليات التحقق من ضمان الجودة.
لإنتاج تنبيهات أكثر منطقية، يمكنك استخدام إما
دعنا نجري نموذجًا محاكاة للمبيعات اليومية التي تعرض أنماط الاتجاه والأنماط الموسمية باستخدام Holt-Winters:
import pandas as pd from statsmodels.tsa.holtwinters import ExponentialSmoothing # Load and preprocess the dataset data = pd.read_csv('sales_data.csv', index_col='date', parse_dates=True) data = data.asfreq('D').fillna(method='ffill') # Fit the Holt-Winters model model = ExponentialSmoothing(data, trend='add', seasonal='add', seasonal_periods=365) fit = model.fit() # Forecast and detect anomalies forecast = fit.fittedvalues residuals = data - forecast threshold = 3 * residuals.std() anomalies = residuals[abs(residuals) > threshold] print("Anomalies detected:") print(anomalies)
باستخدام هذه الطريقة، يمكنك اكتشاف الانحرافات الهامة التي قد تشير إلى مشكلات في جودة البيانات، مما يوفر نهجًا أكثر دقة لفحوصات ضمان الجودة.
آمل أن تساعدك هذه المقالة على تنفيذ عمليات التحقق من ضمان الجودة بكفاءة لمجموعات البيانات الضخمة لديك. من خلال استخدام مكتبة Deequ ودمج الأساليب الإحصائية وخوارزميات السلاسل الزمنية، يمكنك ضمان سلامة البيانات وموثوقيتها، مما يؤدي في النهاية إلى تحسين ممارسات إدارة البيانات لديك.
سيساعدك تنفيذ التقنيات الموضحة أعلاه على منع المشكلات المحتملة في التطبيقات اللاحقة وتحسين الجودة الشاملة لعمليات سير عمل البيانات لديك.