يستخدم محللو البيانات أدوات البرمجة لتحليل البيانات، واكتشاف الاتجاهات ذات المغزى، ومساعدة الشركات على اتخاذ قرارات فعالة. حيث سمحت قوة الحوسبة في الوقت الحالي إجراء التحليلات على ملايين البيانات في بضع دقائق فقط.
نستعرض أدناه طرق تحليل البيانات باستخدامPython البيانات الرقمية باستخدام مكتبة NumPy، والجدولية عبر مكتبة Pandas، وتصويرها باستخدام مكتبة Matplotlib.
لماذا تحليل البيانات باستخدام بايثون؟
رغم تعدد لغات البرمجة المتاحة، ولكن تحليل البيانات باستخدام بايثون هو الأكثر شيوعاً من قبل الإحصائيين والمهندسين والعلماء، للأسباب التالية:
1- بايثون سهل التعلم والفهم.
2- لغة مرنة قابلة للتطوير.
3- فيها الكثير من المكتبات للحساب العددي ومعالجة البيانات، الرسومات وتصور البيانات لبناء الرسوم البيانية.
4- يوجد دعم مجتمعي كبير يساعد في حل مختلف أنواع الاستعلامات.
أهم مكتبات بايثون لتحليل البيانات
في الواقع يعود السبب الرئيسي إلى تحليل البيانات باستخدام بايثون هو أنها توفر مجموعة متنوعة من المكتبات، أبرزها:
NumPy: تدعم هذه المكتبة المصفوفات ذات الأبعاد n وتوفر أدوات الحوسبة العددية، تفيد في الجبر الخطي وتحويل فورييه.
Pandas: توفر وظائف للتعامل مع البيانات المفقودة وإجراء العمليات الحسابية على البيانات.
Matplotlib: تُستخدم لرسم نقاط البيانات وإنشاء تصورات تفاعلية للبيانات.
SciPy: تُستخدم في الحوسبة العلمية، فيها وحدات الجبر الخطي والتكامل والاستيفاء ومعالجة الإشارات والصور.
Scikit-Learn: تضم ميزات تساعد في بناء نماذج الانحدار والتصنيف والتجميع.
الاستعداد لتحليل البيانات في Python
عندما تختار لغة بايثون لتحليل البيانات ستمر بمراحل التحليل التالية: السؤال أو تحديد متطلبات البيانات، إعداد أو جمع البيانات، تنظيف ومعالجة، تحليل، مشاركة، التصرف أو اتخاذ القرار.
متطلبات تثبيت Python
شغَل Python IDE على جهازك ننصح Jupyter Notebook لكون واجهته تسهل إنشاء وعرض التصورات. ثم ثبَت مكتبات بايثون pandas و Seaborn.
لمحة حول المصفوفات في بايثون
NumPy عبارة عن حزمة معالجة مصفوفة في Python وتوفر كائن مصفوفة متعدد الأبعاد عالي الأداء وأدوات للعمل مع هذه المصفوفات.
المصفوفات في NumPy
مصفوفة NumPy عبارة عن جدول من العناصر لها نفس النوع، مفهرسة بواسطة مجموعة من الأعداد الصحيحة الموجبة. يُطلق على عدد أبعاد المصفوفة رتبة. تُعرف الأعداد الصحيحة التي تعبر عن حجم المصفوفة على طول كل بُعد بشكل المصفوفة.
إنشاء مصفوفة NumPy
يمكن إنشاء مصفوفات NumPy بطرق متعددة، باستخدام أنواع بيانات مختلفة على سبيل المثال: القوائم والمجموعات وغيرها.
لإنشاء مصفوفة فارغة باستخدام الدالة:
numpy.empty(shape, dtype=float, order=’C’)
Import numpy as np
b = np.empty(3, dtype = int)
print(b)
لإنشاء مصفوفة صفرية باستخدام الدالة:
numpy.zeros(shape, dtype = None, order = ‘C’)
Import numpy as np
b = np.zeros(2, dtype = int)
print(b)
العمليات على مصفوفات Numpy
Import numpy as np
تعريف المصفوفتين
a = np.array([first member, second, …])
b = np.array([first member, second, …])
الجمع باستخدام عامل حسابي
add_ans = a+b
print(add_ans)
الجمع باستخدام دالة numpy
add_ans = np.add(a, b)
print(add_ans)
الطرح باستخدام عامل حسابي
sub_ans = a-b
print(sub_ans)
الطرح باستخدام دالة numpy
sub_ans = np.subtract(a, b)
print(sub_ans)
الضرب باستخدام عامل حسابي
mul_ans = a*b
print(mul_ans)
الضرب باستخدام دالة numpy
mul_ans = np.multiply(a, b)
print(mul_ans)
القسمة باستخدام عامل حسابي
div_ans = a/b
print(div_ans)
القسمة باستخدام دوال numpy
div_ans = np.divide(a, b)
print(div_ans)
فهرسة مصفوفة NumPy
يمكن إجراء الفهرسة في NumPy باستخدام مصفوفة كفهرس.
import numpy as np
لإنشاء سلسلة من الأعداد الصحيحة
a = np.arange(step,start,stop)
يتم تحديد الفهارس داخل دالة np.array()
newarr = a[np.array([3, 1, 2 ])]
تقطيع المصفوفات باستخدام NumPy
الرمز x[obj] حيث x هي المصفوفة وobj هي الفهرس، يحدث التقطيع الأساسي عندما يكون obj هو:
اسم المصفوفة[start:stop:step]
عدد صحيح.
أو مجموعة من الكائنات والأعداد الصحيحة.
لو أردنا إنشاء مصفوفة تتكون من تسلسل العناصر من 0 إلى 19 بالترتيب نكتب:
a = np.arange(20)
print(a[-8:14:1])
كما يمكن أن نكتب الصيغة:
print(“\n a[8:] = “,a[8:])
يشير (:) إلى احتساب جميع العناصر حتى النهاية.
بث مصفوفة NumPy
يقصد بمصطلح البث كيفية تعامل numpy مع المصفوفات ذات الأبعاد المختلفة أثناء إجراء العمليات الحسابية، حيث يتم بث المصفوفة الأصغر عبر المصفوفة الأكبر بحيث يكون لها أشكال متوافقة.
اتبع القواعد التالية عند بث مصفوفتين معاW:
يمكن بث المصفوفتين معًا إذا كانتا متوافقتين مع جميع الأبعاد.
إذا لم يكن للمصفوفتين نفس الرتبة، فقم بإضافة الرقم 1 إلى شكل المصفوفة ذات الرتبة الأقل حتى يصبح للشكلين نفس الطول.
تكون المصفوفتان متوافقتين في بُعد واحد إذا كان لهما نفس الحجم في البعد أو إذا كان حجم أحد المصفوفتين 1 في هذا البعد.
بعد البث، يتصرف كل مصفوفة كما لو كانت ذات شكل يساوي الحد الأقصى من أشكال عناصر المصفوفتين المدخلتين.
في أي بُعد حيث كان حجم المصفوفة الأولى 1 وكان حجم المصفوفة الأخرى أكبر من 1، يتصرف المصفوفة الأولى كما لو تم نسخها على طول هذا البعد.
import numpy as np
v = np.array([36,24,12])
w = np.array([55,45])
print(np.reshape(v, (3, 1)) * w)
الدالة reshape تأخذ المصفوفة v وتعيد تشكيلها إلى مصفوفة عمودية (3 صفوف، 1 عمود). يتم ضربها بالمصفوفة w. بسبب خاصية “البث” في NumPy، يتم توسيع wلتتناسب مع أبعاد v، بحيث يمكن تنفيذ العملية الحسابية.
مراحل تحليل البيانات باستخدام PYTHON
تمر عملية تحليل البيانات في بايثون بمراحل التحليل المتمثلة بفهم ومعالجة البيانات وتصويرها وتكون باتباع الخطوات التالية:
تحميل مجموعة البيانات
افتح Jupyter Notebook وانتقل إلى الدليل الذي قمت بحفظ مجموعة البيانات فيه. ثم، قم بإنشاء ملف Python جديد واكتب التعليمات البرمجية التالية:
import pandas as pd
df = pd.read_csv(filename.csv’)
مرحلة الفحص والاستكشاف
بحيث تسمح بفهم البيانات معرفة عدد الأعمدة، أنواع البيانات في الأعمدة القيم المكررة والمفقودة. كما
توفر بايثون إحصائيات وصفية لجميع المتغيرات الرقمية في مجموعة البيانات تتضمن: عدد كل عمود مع متوسط قيمته والانحراف المعياري والحد الأدنى والحد الأقصى للقيم.
يمكن فعل ذلك التعليمات البرمجية التالي:
df.shape() إرجاع أبعاد الداتا فريم
df.describe() إرجاع وصف موجز حول البيانات
df.head() إرجاع الترويسات في الداتا فريم
df.column() إرجاع الأعمدة
df.till() إرجاع عدد الأعمدة
df.info() إرجاع نوع البيانات في كل عمود
df. count() حساب مجموع قيم الداتا فريم ككل
df.unique() إرجاع القيم المكررة في الداتا فريم
df[‘ column_name ‘].unique() إرجاع القيم المكررة في كل عمود
df[‘column_name’]. count() حساب مجموع قيم كل عمود
df.max() إرجاع القيمة الكبرى
df.min() إرجاع القيمة الكبرى
df.mean() إرجاع القيمة الكبرى
نستطيع استعمال gropby لمعرفة معلومات محددة من عدة أعمدة.
طباعة أسماء الأعمدة وأرقامها:
for i,v in df(df.column)
print(i,v)
Pandas GroupBy
df = pd.DataFrame(data1)
print(“Original Dataframe”)
display(df)
تطبيق دالة groupby() على
gk = df.groupby(‘Variable_Name’)
print(“After Creating Groups”)
gk.first()
Pandas Aggregation
التجميع هو حساب إحصائيات موجزة عن كل مجموعة، حيث تستكشف الدالة المجمعة قيمة مجمعة واحدة لكل مجموعة. بعد تقسيم البيانات إلى مجموعات باستخدام الدالة groupby، يمكن عمل إحصاءات عليها.
grp1 = df.groupby(‘Name’)
grp1.aggregate(np.sum)
ربط ودمج الداتا فريم عبر Pandas في Python
أحياناً قد نحتاج دمج الداتا فريم، في الواقع لا يمكن إجراء ذلك إلا على إطارين بيانات في وقت واحد، يشار إليهما كجدولين يسار ويمين. يسمى العمود المشترك الذي سيتم فيه ربط إطاري البيانات بالمفتاح. من الممارسات الجيدة استخدام المفاتيح التي تحتوي على قيم فريدة في جميع أنحاء العمود لتجنب التكرار غير المقصود لقيم الصف. توفر Pandas عدة طرق للدمج:
تُستخدم concat لدمج (تجميع) الداتا فريم بشكل عمودي أو أفق، كما يمكن دمج عدة مفاتيح أو إعادة الفهرسة.
result_vertical = pd.concat([df1, df2], axis=0)
result_horizontal = pd.concat([df1, df2], axis=1)
result_reset_index = pd.concat([df1, df2], axis=0, ignore_index=True)
result_with_keys = pd.concat([df1, df2], keys=[‘df1’, ‘df2’])
كما توفر دالة merge() دمج الداتا فريم بناءً على أعمدة أو فهارس مشتركة.
res = pd.merge(df1, df2, on=’key’)
في حين يوجد join تسمح بالدمج بحسب الصفوف التي يجب أن تحتفظ ببياناتها وهي:
- Inner Join: لا يُعيد إلا الصفوف التي تحتوي قيم متطابقة في كلا الجدولين.
- Outer Join: يُعيد كل الصفوف من الجدولين، ويملأ القيم المفقودة بـ NaN.
- Left Join: يُعيد كل الصفوف من الجدول الأيسر والصفوف المطابقة لها من الجدول الأيمن.
- Right Join: يُعيد كل الصفوف من الجدول الأيمن والصفوف المطابقة لها من الجدول الأيسر.
inner_join = pd.merge(df1, df2, on=’key’, how=’inner’)
outer_join = pd.merge(df1, df2, on=’key’, how=’outer’)
left_join = pd.merge(df1, df2, on=’key’, how=’left’)
right_join = pd.merge(df1, df2, on=’key’, how=’right’)
مرحلة تنظيف البيانات ومعالجتها
تعتبر مرحلة معالجة البيانات من أهم الخطوات في التحليل وتشمل:
التحقق من القيم المفقودة
قد تحدث القيم المفقودة عند وجود نقص في المعلومات عن عنصر واحد أو أكثر أو لوحدة كاملة، يمكن التحقق باستخدم الدالة isnull().
df.isnull().sum().sum() حساب العدد الإجمالي للقيم الفارغة
df.isnull().any اختبار قيم الأعمدة
التعامل مع الق يم المفقودة في مجموعة بيانات
أبسط خيار للتعامل معها هو عمل dropnaللصفوف التي تحتوي على قيم مفقودة.
بداية نعمل نسخة من الداتا فريم قبل إزالة القيم المفقودة، كي نستطيع العودة إلى الأصلي في أي وقت دون فقدان بيانات قيمة.
df2 = df.copy()
df2 = df2.dropna(axis=n) n=0 for rows, 1 for columns
كما يمكن ملئ القيم المفقودة باستعمال fillna() بالقيمة السابقة أو اللاحقة أو الوسطى بينهما
كما يلي:
df.fillna(0, inplce=True)
df.fillna(df.mean(), axis=n) n=0 for rows, 1 for columns
df.fillna(method=”ffill”, axis=0)
df.fillna(method=”bfill”, axis=0)
ثم نستعمل info() للتأكد من النتائج وعملية المعالجة بشكل صحيح df2.info().
التحقق من التكرارات
تساعد طريقة Pandas drop_duplicates() في إزالة التكرارات من إطار البيانات.
data = df.drop_duplicates(subset =”column_name”,)
كما يمكن اكتشاف مجموعة البيانات هل هي متوازنة أم لا، أي أن جميع الأنواع تحتوي على كميات متساوية من الصفوف أم لا.
باستخدام الدالة.value_counts() فهي تعيد هذه الدالة سلسلة تحتوي على عدد القيم الفريدة. كود بايثون لحساب القيم في عمود ما:
df.value_counts(“column_name”)
التحقق من القيم المتطرفة
القيمة المتطرفة هي عنصر/كائن بيانات ينحرف بشكل كبير عن بقية الكائنات، قد ينتج ذلك عن أخطاء القياس أو التنفيذ. يشار إلى التحليل لاكتشاف القيم المتطرفة باسم تعدين القيم المتطرفة. هناك العديد من الطرق لاكتشاف القيم المتطرفة بما في ذلك رسم مخطط بيامي للصندوق لملاحظتها.
إزالة القيم المتطرفة
لإزالة القيم المتطرفة، يجب اتباع نفس عملية إزالة إدخال من مجموعة البيانات باستخدام موضعه الدقيق في مجموعة البيانات. يمكن استكشاف القيم المتطرفة باستخدام IQR ثم سنزيلها، ثم نرسم مخططًا بيانيًا للصندوق للتأكد من إزالة القيم المتطرفة.
مرحلة التحليل الاستكشافي باستخدام الإحصاء الوصفي
تلخص الإحصاءات الوصفية خصائص مجموعة البيانات، يمكن حسابها في Python بسهولة باستخدام مكتبات مثل pandas وnumpy وscipy باتباع التعليمات البرمجية التالية:
pip install pandas numpy scipy
import pandas as pd
import numpy as np
from scipy import stats
desc_stats = df.describe()
mean = np.mean(df) لحساب القيمة المتوسطة لمجموعة من البيانات
median = np.median(df) تُستخدم لحساب القيمة التي تقع في منتصف مجموعة من البيانات بعد ترتيبها. الوسيط، يُعتبر أكثر قوة من المتوسط في حالة وجود قيم متطرفة.
std_dev = np.std(df) لقياس مدى تشتت أو تباين مجموعة من البيانات حول المتوسط، يوفر فكرة عن كيفية تباعد القيم في مجموعة البيانات.
variance = np.var(df) لقياس مدى تشتت القيم في مجموعة بيانات حول المتوسط، تعطي فكرة عن مدى تفرق البيانات كلما زادت القيمة، زاد تشتت البيانات.
mode = stats.mode(df) تُستخدم لتحديد القيمة الأكثر تكراراً في مجموعة من البيانات
skewness = stats.skew(df) لقياس درجة انحراف توزيع البيانات عن التوزيع الطبيعي، تعطي فكرة عن كيفية توزيع البيانات حول المتوسط.
kurtosis = stats.kurtosis(df) لقياس درجة “الكثافة” في توزيع البيانات، يشير إلى مدى تركّز البيانات حول المتوسط، وكذلك مدى وجود القيم القصوى.
مرحلة تصوير البيانات باستخدام Matplotlib
Matplotlib وهو عبارة عن مكتبة تصور مذهلة في Python سهل الاستخدام تم بناؤه على مصفوفات NumPy ومصمم للعمل مع مجموعة SciPy الأوسع ويتكون من عدة مخططات بما في ذلك الخط والشريط والتشتت والمدرج التكراري وغيرها.
Pyplot
Pyplot هي وحدة Matplotlib توفر واجهة تشبه MATLAB، توفر Pyplot وظائف تتفاعل مع الشكل حيث تسمح بإنشاء شكل وتزيين الرسم البياني بالعلامات وإنشاء منطقة رسم فيه.
لعمل تصوير لبيانات يجب استدعاء المكتبة أولاً:
import matplotlib.pyplot as plt
يوفر Pyplot مخططات لتصميم داشبورد تفاعلية تلبي احتياجات العميل، ومن أهمها:
مخطط خطي
هو رسم بياني يمثل فئة البيانات العددية بشكل خطوط عبر الزمن أو عبر تسلسل معين، يمكن تمثيله باستخدام plot().
plt.plot(df[variable1], df[variable2])
مخطط شريطي
هو رسم بياني يمثل فئة البيانات بأشرطة مستطيلة ذات أطوال وارتفاعات تتناسب مع القيم التي تمثلها. يمكن رسمها أفقياً أو رأسياً. يصف المخطط الشريطي المقارنات بين الفئات المنفصلة، ويمكن إنشاؤه باستخدام bar().
plt.bar(df[variable1], df[variable2])
مخطط دائري
هو رسم بياني يمثل فئة البيانات بشكل دائري يُستخدم لتمثيل البيانات النسبية كأجزاء من كل، باستخدام pie().
plt.pie(df[variable1], df[variable2], labels=labels, autopct=’%1.1f%%’, startangle=90)
المدرجات التكرارية
يستخدم لتمثيل البيانات في شكل بعض المجموعات، وهو نوع من المخططات الشريطية حيث يمثل المحور X نطاقات الصناديق بينما يعطي المحور Y معلومات حول التردد. لإنشاء رسم بياني تكراري، تتمثل الخطوة الأولى في إنشاء سلة من النطاقات، ثم توزيع النطاق الكامل للقيم على سلسلة من الفواصل، وحساب القيم التي تقع في كل من الفواصل. يتم تحديد السلال بوضوح على أنها فواصل متتالية غير متداخلة من المتغيرات. تُستخدم الدالة hist() لحساب وإنشاء رسم بياني تكراري لـ x.
plt.hist(df[“variable2”])
رسم بياني مبعثر في مكتبة Matplotlib
تُستخدم الرسوم البيانية للنقاط المتشتتة لمراقبة العلاقة بين المتغيرات وتستخدم النقاط لتمثيل العلاقة بينها. تُستخدم طريقة scatter() في مكتبة matplotlib لرسم رسم بياني للنقاط المتشتتة.
plt.scatter(df[“variable1”], df[“variable2”])
رسم بياني مربع
تمثيل مرئي جيد جداً عندما يتعلق الأمر بقياس توزيع البيانات. يرسم بوضوح القيم المتوسطة والقيم المتطرفة والرباعيات. إن فهم توزيع البيانات هو عامل مهم آخر يؤدي إلى بناء نموذج أفضل. إذا كانت البيانات تحتوي على قيم متطرفة، فإن الرسم البياني المربع هو الطريقة الموصى بها لتحديدها واتخاذ الإجراءات اللازمة. يوضح الرسم البياني المربع والشارب كيفية توزيع البيانات. يتم تضمين خمس قطع من المعلومات بشكل عام في الرسم البياني
plt.boxplot(df[“variable2”])
خرائط حرارية heatmap
تساعد في تمثيل حجم الظاهرة على شكل ألوان، حيث تعرض الخريطة الحرارية مصفوفة ارتباط ثنائية الأبعاد بين بعدين منفصلين، باستخدام خلايا ملونة لتمثيل البيانات من مقياس أحادي اللون عادةً. تظهر قيم البعد الأول كصفوف الجدول بينما البعد الثاني عبارة عن عمود. يتناسب لون الخلية مع عدد القياسات التي تطابق القيمة البعدية.
تعتبر مثالية لتحليل البيانات لأنها تجعل الأنماط قابلة للقراءة بسهولة وتسلط الضوء على الاختلافات والتباين في نفس البيانات.
ملاحظة: يجب تمرير البيانات هنا باستخدام طريقة corr() لتوليد خريطة حرارية للارتباط. كما تقوم بإزالة الأعمدة التي لن تكون ذات فائدة أثناء توليد خريطة حرارية للارتباط وتحدد الأعمدة التي يمكن استخدامها.
plt.imshow(df.corr() , cmap = ‘autumn’ , interpolation = ‘nearest’ )
إضافة خصائص للمخطط
عنوان المخطط
plt.title(“your comment”)
إضافة الأساطير
plt.legend([” your comment”])
ptl.show()
باختصار، يحتاج تحليل البيانات باستخدام بايثون فهماً جيداً لكل من المكتبات المتوفرة، ومهارات في التعامل مع البيانات وتنظيفها، إضافةً القدرة على استخدام المخططات في تصور البيانات بفعالية. مما يساعد على استخراج الرؤى القيمة من البيانات واتخاذ قرارات مستنيرة، فهو خيار ممتاز للمبتدئين والمحترفين.