تعد خوض تحديات تحليل البيانات طريقة رائعة للحصول على خبرة عملية في بايثون وتسريع تعلمك. سيعرضك هذا للعديد من مفاهيم بايثون الأساسية، مثل العمل مع أنواع ملفات مختلفة، والتلاعب بأنواع مختلفة من البيانات (مثل الأعداد الصحيحة والسلاسل)، والتكرار، وتصور البيانات. علاوة على ذلك، ستتعلم أيضًا تقنيات تحليل البيانات المهمة مثل تنظيف البيانات، وتنعيم البيانات المشوشة، وإجراء الاختبارات الإحصائية وتحليل الارتباط، والمزيد. على طول الطريق، ستتعلم أيضًا العديد من الوظائف المضمنة ومكتبات بايثون التي تجعل عملك أسهل.
إن معرفة الخطوات التي يجب اتباعها في عملية تحليل البيانات تتطلب القليل من الخبرة. بالنسبة لأولئك الذين يرغبون في استكشاف تحليل البيانات، ستوضح لك هذه المقالة دليلًا خطوة بخطوة لتحليل البيانات باستخدام بايثون. سنقوم بتنزيل مجموعة بيانات وقراءتها وبدء بعض تحليلات البيانات الاستكشافية لفهم ما نعمل عليه. بعد ذلك، سنتمكن من اختيار أفضل تقنية تحليل للإجابة على بعض الأسئلة المثيرة للاهتمام حول البيانات.
تستهدف هذه المقالة محللي البيانات المبتدئين الذين لديهم بالفعل القليل من الخبرة في البرمجة والتحليل.
بايثون لتحليل البيانات
تلعب عملية فحص البيانات وتنقيتها وتحويلها ونمذجتها لاكتشاف معلومات مفيدة دورًا بالغ الأهمية في مجال الأعمال والتمويل والأوساط الأكاديمية وغيرها من المجالات. سواء كان الأمر يتعلق بفهم سلوك العملاء أو تحسين العمليات التجارية أو اتخاذ قرارات مستنيرة، فإن تحليل البيانات يوفر لك الأدوات اللازمة لإطلاق العنان لرؤى قيمة من البيانات.
برزت لغة بايثون كأداة مفضلة لتحليل البيانات نظرًا لبساطتها وتعدد استخداماتها والعديد من مكتباتها مفتوحة المصدر. وبفضل تركيبها النحوي البديهي ومجتمعها الكبير على الإنترنت، تمكن بايثون المبتدئين والخبراء من أداء مهام تحليل البيانات المعقدة بكفاءة. تتيح المكتبات مثل pandas وNumPy وMatplotlib هذا من خلال توفير وظائف أساسية لجميع جوانب عملية تحليل البيانات.
تبسط مكتبة pandas عملية العمل مع البيانات المنظمة (على سبيل المثال، البيانات الجدولية، والسلاسل الزمنية). توفر NumPy، التي تُستخدم في الحوسبة العلمية في Python، كائنات ووظائف مصفوفة قوية للعمليات العددية. وهي ضرورية للحسابات الرياضية المشاركة في تحليل البيانات. وهي مفيدة بشكل خاص للعمل مع البيانات الضخمة، لأنها فعالة للغاية. Matplotlib هي مكتبة شاملة لإنشاء التصورات في Python؛ فهي تسهل استكشاف رؤى البيانات وتوصيلها.
في الأقسام التالية، سنستفيد من هذه المكتبات لتحليل مجموعة بيانات من العالم الحقيقي وإظهار عملية الانتقال من البيانات الخام إلى الاستنتاجات المفيدة.
مجموعة بيانات البقع الشمسية
بالنسبة لمثال تحليل بيانات بايثون هذا، سنعمل مع مجموعة بيانات Sunspots، والتي يمكن تنزيلها من Kaggle. تتضمن البيانات رقم صف وتاريخًا وملاحظة للعدد الإجمالي للبقع الشمسية لكل شهر من عام 1749 إلى عام 2021.
البقع الشمسية هي مناطق من الغلاف الضوئي للشمس تكون أبرد مؤقتًا من المواد المحيطة بها بسبب انخفاض النقل الحراري للطاقة. وبالتالي، تبدو أغمق ويمكن ملاحظتها بسهولة نسبيًا – وهو ما يفسر الفترة الزمنية الطويلة بشكل مثير للإعجاب لمجموعة البيانات. يمكن أن تستمر البقع الشمسية في أي مكان من بضعة أيام إلى بضعة أشهر، ويتراوح قطرها من حوالي 16 كم إلى 160.000 كم. يمكن أيضًا ربطها بالتوهجات الشمسية والقذف الكتلي الإكليلي، مما يجعل فهمها مهمًا للحياة على الأرض.
بعض الأسئلة المثيرة للاهتمام التي يمكن التحقيق فيها هي:
- ما هي فترة نشاط البقع الشمسية؟
- متى يمكننا أن نتوقع الذروة القادمة للنشاط الشمسي؟
مثال لتحليل البيانات باستخدام بايثون
الخطوة 1: استيراد البيانات
بمجرد تنزيل مجموعة بيانات Sunspots، فإن الخطوة التالية هي استيراد البيانات إلى بايثون. هناك عدة طرق للقيام بذلك؛ الطريقة التي تختارها تعتمد على تنسيق بياناتك.
إذا كان لديك بيانات في ملف نصي، فقد تحتاج إلى قراءة البيانات سطرًا بسطر باستخدام حلقة for.
بدلاً من ذلك، يمكن أن تكون البيانات بتنسيق JSON. في هذه الحالة، يمكنك استخدام مكتبة json في بايثون.
الطريقة الشائعة لتخزين البيانات هي إما في ملفات Excel (.xlsx) أو ملفات القيم المفصولة بفواصل (.csv). في كلتا الحالتين، يمكنك قراءة البيانات مباشرة في إطار بيانات pandas. هذه طريقة مفيدة لتحليل البيانات، حيث يمكنك استخدام العديد من وظائف pandas المفيدة مباشرة لمعالجة البيانات. تتضمن مقالات كيفية قراءة وكتابة ملفات CSV في Python وكيفية قراءة وكتابة ملفات Excel في Python تمارين تفاعلية لتوضيح هذه الوظيفة.
نظرًا لأن مجموعة بيانات Sunspots بتنسيق CSV، فيمكننا قراءتها باستخدام pandas. إذا لم تقم بتثبيت pandas بعد، فيمكنك القيام بذلك باستخدام أمر سريع:
pip install pandas
الآن، يمكنك استيراد البيانات إلى DataFrame:
>>> import pandas as pd
>>> df = pd.read_csv('Sunspots.csv', index_col=0, parse_dates=['Date'])
تقوم دالة read_csv()
بتحليل البيانات تلقائيًا. وتأتي مع العديد من الوسائط لتخصيص كيفية استيراد البيانات. على سبيل المثال، تحدد وسيطة index_col
العمود الذي سيتم استخدامه كعلامة للصف. تحدد وسيطة parse_dates
العمود الذي يحتوي على التواريخ. يحتوي إطار البيانات الخاص بنا، المسمى df، على بيانات البقع الشمسية باسم المتغير Monthly Mean Total Sunspot Number وتاريخ الملاحظة باسم المتغير Date.
الخطوة 2: تنظيف البيانات وإعدادها
تتضمن عملية تنظيف البيانات التعامل مع القيم المفقودة، وتحويل المتغيرات إلى أنواع البيانات الصحيحة، وتطبيق أي مرشحات.
إذا كانت بياناتك تحتوي على قيم مفقودة، فهناك عدد من الطرق الممكنة للتعامل معها. يمكنك ببساطة تحويلها إلى NaN
(ليست رقمًا). أو يمكنك إجراء تعبئة للأمام (للخلف)، والتي تنسخ القيمة السابقة (التالية) إلى الموضع المفقود. أو يمكنك أيضًا الاستيفاء باستخدام القيم المجاورة لاستقراء قيمة إلى الموضع المفقود. تعتمد الطريقة التي تختارها على حالة الاستخدام الخاصة بك.
يجب عليك أيضًا التحقق من تخزين البيانات الرقمية على هيئة عدد عشري أو عدد صحيح؛ وإلا، فيتعين عليك تحويلها إلى نوع البيانات الصحيح. وإذا كانت هناك قيم شاذة في بياناتك، فيمكنك التفكير في إزالتها حتى لا تؤثر على نتائجك.
أو ربما تعمل مع بيانات نصية وتحتاج إلى إزالة علامات الترقيم والأرقام من النص وتحويل كل شيء إلى أحرف صغيرة. تندرج كل هذه الاعتبارات تحت مظلة تنظيف البيانات. للحصول على بعض الأمثلة الملموسة.
لنبدأ بالحصول على نظرة عامة على مجموعة البيانات الخاصة بنا:
>>> df.head()
Date Monthly Mean Total Sunspot Number
0 1749-01-31 96.7
1 1749-02-28 104.3
2 1749-03-31 116.7
3 1749-04-30 92.8
4 1749-05-31 141.7
تطبع الدالة df.head()
أول 5 صفوف من البيانات. يمكنك رؤية رقم الصف (بدءًا من الصفر)، والتاريخ (بتنسيق yyyy-mm-dd)، وملاحظة عدد البقع الشمسية للشهر. للتحقق من أنواع البيانات للمتغيرات، قم بتنفيذ الأمر التالي:
>>> df.dtypes
Date datetime64[ns]
Monthly Mean Total Sunspot Number float64
dtype: object
يحتوي التاريخ على نوع البيانات datetime64
، والذي يستخدم لتخزين التواريخ في pandas، ومتغير عدد البقع الشمسية هو عدد عشري.
بعد ذلك، إليك كيفية التحقق مما إذا كانت هناك أي نقاط بيانات مفقودة في متغير Mean Total Sunspot Number:
>>> any(df['Monthly Mean Total Sunspot Number'].isna())
False
يستفيد هذا من الدالة المضمنة isna()
، والتي تتحقق لمعرفة ما إذا كانت هناك أي قيم مفقودة. وتعيد سلسلة من القيم المنطقية – True
إذا كانت القيمة مفقودة، وFalse
إذا لم تكن كذلك. بعد ذلك، نستخدم الدالة المضمنة any()
للتحقق مما إذا كانت أي من القيم المنطقية صحيحة. وهذا يعيد False
، مما يشير إلى عدم وجود قيم مفقودة في بياناتنا.
الخطوة 3: تحليل البيانات الاستكشافية
المرحلة التالية هي البدء في تحليل بياناتك من خلال حساب إحصائيات التلخيص، ورسم الهستوجرامات ومخططات التشتت، أو إجراء اختبارات إحصائية. والهدف هو اكتساب فهم أفضل للمتغيرات، ثم استخدام هذا الفهم لتوجيه بقية التحليل. بعد إجراء تحليل استكشافي للبيانات، سيكون لديك فهم أفضل لشكل بياناتك وكيفية استخدامها للإجابة على الأسئلة.
نقطة البداية الجيدة هي إجراء تحليل إحصائي أساسي لتحديد المتوسط والوسيط والانحراف المعياري وما إلى ذلك. ويمكن تحقيق ذلك بسهولة باستخدام الدالة df.describe()
:
>>> df.describe()
Monthly Mean Total Sunspot Number
count 3265.000000
mean 81.778775
std 67.889277
min 0.000000
25% 23.900000
50% 67.200000
75% 122.500000
max 398.200000
لدينا إجمالي 3265 ملاحظة ومتوسط أكثر من 81 بقعة شمسية شهريًا. الحد الأدنى هو صفر والحد الأقصى هو 398. وهذا يعطينا فكرة عن نطاق القيم النموذجية. الانحراف المعياري حوالي 67، مما يعطينا فكرة عن مدى اختلاف عدد البقع الشمسية.
لاحظ أن النسبة المئوية 50% أقل من المتوسط. وهذا يعني أن البيانات منحرفة نحو قيم أقل. وهذه معلومات مفيدة للغاية إذا أردنا إجراء إحصاءات أكثر تقدمًا لأن بعض الاختبارات تفترض توزيعًا طبيعيًا.
يمكننا تأكيد ذلك من خلال رسم رسم بياني لعدد البقع الشمسية شهريًا. التصور هو مهارة مهمة في تحليل بيانات بايثون. سنستخدم matplotlib. يمكن أيضًا تثبيته بسهولة باستخدام أمر pip install
. يبدو الكود لرسم رسم بياني مثل هذا:
import matplotlib.pyplot as plt
plt.hist(df['Monthly Mean Total Sunspot Number'], bins=20)
plt.ylabel('Counts')
plt.xlabel('Monthly Mean Sunspots')
plt.show()
الآن يمكننا أن نرى أن القيمة الأكثر شيوعًا هي أقل من 20 بقعة شمسية للشهر، والأرقام التي تزيد عن 200 نادرة جدًا. أخيرًا، دعنا نرسم سلسلة زمنية لرؤية مجموعة البيانات الكاملة:
plt.plot(df['Date'], df['Monthly Mean Total Sunspot Number'])
plt.xlabel('Date')
plt.ylabel('Number of Sunspots')
plt.show()
يمكننا أن نرى من الرسم البياني أعلاه أن هناك زيادة ونقصانًا دوريًا في عدد البقع الشمسية. ويبدو أن الحد الأقصى يحدث كل 9 إلى 12 عامًا تقريبًا. ويطرح سؤال طبيعي حول المدة الدقيقة لهذه الفترة.
إن معالجة الإشارات موضوع مفصل، لذا سنتناول بعض التفاصيل الدقيقة. لتبسيط الأمر، نحتاج إلى تحليل الإشارة أعلاه إلى طيف ترددي، ثم إيجاد التردد السائد. ومن هذا يمكننا بعد ذلك حساب الفترة. لحساب طيف التردد، يمكن استخدام تحويل فورييه، والذي يتم تنفيذه في NumPy:
import numpy as np
# Perform Fast Fourier Transform
fft_result = np.fft.fft(df['Monthly Mean Total Sunspot Number'])
fft_freq = np.fft.fftfreq(len(df))
حاول رسم الطيف الترددي وستلاحظ العديد من القمم. أحد تلك التفاصيل الدقيقة في معالجة الإشارات هو وجود قمم في بداية ونهاية المصفوفة np.abs(fft_result)
. يمكننا أن نرى من السلسلة الزمنية التي رسمناها أعلاه أن الفترة يجب أن تكون في مكان ما بين 9 إلى 12 عامًا، لذا يمكننا استبعاد هذه القمم بأمان عن طريق تقطيع مصفوفة الحجم لتصفية الترددات غير المرغوب فيها:
# Find dominant frequency (and period)
magnitude = np.abs(fft_result)
dominant_freq_index = np.argmax(magnitude[1:100]) + 1
dominant_freq = fft_freq[dominant_freq_index]
# Convert frequency to period
dominant_period = 1 / dominant_freq
print("Dominant period: {} years".format(dominant_period/12))
النتيجة هي كما يلي:
Dominant period: 10.883333333333333 years
لقد استخدمنا دالة argmax()
في NumPy لإيجاد مؤشر التردد الأقصى، واستخدمناها لإيجاد التردد، ثم حولناها إلى فترة زمنية. وأخيرًا قمنا بطباعة النتائج كفترة زمنية من السنوات.
يعد هذا مثالاً رائعًا لاستخدام الفهم المكتسب من تحليل البيانات الاستكشافي لإعلام معالجة البيانات لدينا حتى نحصل على نتيجة منطقية.
الخطوة 4: استخلاص الاستنتاجات من البيانات
لقد تمكنا من معرفة أن متوسط عدد البقع الشمسية شهريًا يبلغ حوالي 81، لكن التوزيع منحرف بشدة نحو أعداد أقل. في الواقع، فإن العدد الأكثر شيوعًا للبقع الشمسية شهريًا أقل من 20، ولكن في فترة النشاط الشمسي المرتفع (النسبة المئوية الخامسة والسبعين)، قد يكون هناك أكثر من 120.
من خلال رسم السلسلة الزمنية، يمكننا أن نرى أن الإشارة دورية ونحصل على فكرة عن وجود حد أقصى وحد أدنى منتظمين لعدد البقع الشمسية. ومن خلال إجراء بعض معالجة الإشارات، حددنا أن الحد الأقصى لعدد البقع الشمسية يحدث كل 11 عامًا تقريبًا. ومن رسم السلسلة الزمنية، يمكننا أن نرى أن الحد الأقصى الأخير كان حوالي عام 2014، مما يعني أن الحد الأقصى التالي يجب أن يكون حوالي عام 2025.
أمثلة إضافية لتحليل البيانات باستخدام بايثون
يقدم العمل مع مجموعة بيانات Sunspots بعض المزايا الفريدة – على سبيل المثال، إنها ليست مجموعة بيانات شائعة. يمكن أن يعلمنا هذا المثال لتحليل بيانات Python أيضًا الكثير عن البرمجة في Python. لقد تعلمنا كيفية قراءة البيانات في إطار بيانات pandas وتلخيص بياناتنا باستخدام الوظائف المضمنة. لقد قمنا ببعض التخطيطات باستخدام Matplotlib وحصلنا على لمحة عن معالجة الإشارات باستخدام NumPy. لقد قمنا أيضًا بتقطيع المصفوفة قليلاً للحصول على نتائج منطقية.
لقد بدأنا للتو في تحليل بيانات البقع الشمسية باستخدام بايثون. وهناك العديد من الأسئلة الأخرى المثيرة للاهتمام التي يمكن الإجابة عليها. على سبيل المثال، هل هناك اتجاه في عدد البقع الشمسية على مدار 272 عامًا من البيانات؟ ما هي المدة التي يستمر فيها الحد الأقصى؟ كم عدد البقع الشمسية التي يجب أن تكون موجودة خلال الحد الأقصى التالي المتوقع؟ يمكن الإجابة على كل هذه الأسئلة باستخدام بايثون.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.