مقدمة
إن البيانات اليوم تمثل ثروة نستطيع من خلالها الوصول إلى قرارات حاسمة ومهمة لنجاح المشاريع والأعمال. بل إن البعض يصف البيانات بالنفط الجديد من حيث الأهمية والثروة. ولكن مثل ما أن النفط ترتفع قيمته بعد معالجته وتصفيته، كذلك الحال في البيانات عندما يتم معالجتها وتحليلها. ونحن كعلماء أو محللي بيانات، علينا مهمة أخذ البيانات وتمثيلها بطريقة سلسة وواضحة، يستطيع من خلالها المختص وغير المختص فهم ماذا حصل وماذا تمثل هذه البيانات.
بمعنى آخر، إن من أجل صناعة القرار بناءً على البيانات، لابد من فهم البيانات بوضوح، ومجرد النظر إلى أرقام مخزنة في جداول لن يعطينا نظرة شاملة تجعلنا نفهم تمام ماذا حصل. و من أجل تبسيط البيانات وفهم معناها بطريقة شاملة، نقوم بترجمة البيانات من خلال رسمها برسوم بيانية. فرسم البيانات يعتبر إحدى الركائز في مهمة تحليل البيانات من أجل استنباط فوائد ملموسة واستنتاجات منطقية، حيث أن الرسم يسهل علينا معرفة ماذا حصل، وماهي الأنماط الي تشكلت، وهل هناك قيم متطرفة أم لا.
أهداف الدرس
- معالجة وإعادة تسمية البيانات من اللغة العربية إلى الإنجليزية
- القيام بعمل تحليل بيانات استكشافي باستخدام مكتبتي (Matplotlip, Seaborn)
- الوصول لاستنتاجات مفيدة بناء على الرسومات
ماهي البيانات المستخدمة؟
لنفترض أنك محلل بيانات في شركة استثمارات عقارية، وقد طلب منك تحليل سوق العقار السعودي في بداية عام 2022. مهمتك هي الحصول على البيانات الملائمة ووضعها في رسوم بيانية سهلة الاستيعاب كي تساعد مجلس الإدارة في أخذ القرارات الصحيحة. موقع البيانات السعودية المفتوحة يقدم بيانات عقارية مفتوحة المصدر (أي متاحة للاستخدام بشكل مجاني)، وهي تمثل الصفقات العقارية التي تمت في السعودية في عام 2022 من شهر يناير إلى منتصف شهر إبريل، وهي أيضا إطار البيانات المستخدم في هذا الدرس.
بعد الدخول على الرابط ستجد البيانات في صيغ مختلفة مثل السي اس في والإكسل. قم بتحميل صيغة السي اس في CSV.
ماذا نريد أن نفعل؟
الخطوة الأولى: استدعاء المكتبات اللازمة
Step One: Import Necessary Libraries
import pandas as pd # For dataframe manipulation - لإجراء التعديلات اللازمة على البيانات
import numpy as np # For specifying ranges in plots - لتحديد المدى في الرسمات
import matplotlib.pyplot as plt # For plotting 1 - المكتبة الأولى للرسم
import seaborn as sns # For plotting 2 - المكتبة الثانية للرسم
الخطوة الثانية: فحص البيانات
Step Two: Inspect Data
df = pd.read_csv('realestate.csv') # Read the CSV file - قم بقراءة ملف السي اس في
df.head()
| رقم مرجعي | المنطقة | المدينة | الحي | المخطط | رقم القطعة | التاريخ | تصنيف العقار | نوع العقار | عدد العقارات | السعر (ر.س) | المساحة | سعر المتر المربع |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 16074562 | منطقة الرياض | الافلاج | حي/الخالدية | مخطط/349 | قطعة 255 | 2/1/2022 | سكني | قطعة أرض | 1 | 70000 | 820.53 | 85.3107 |
1 | 16077290 | منطقة الرياض | البجاديه | حي/11 بالدخل المحدود غرب البجادية | مخطط/أخرى | قطعة 448 | 2/1/2022 | سكني | قطعة أرض | 1 | 10000 | 625.00 | 16.0000 |
2 | 16077316 | منطقة الرياض | الخرج | حي/60حى اليرموك مخطط 1009 الجزء الثانى | مخطط/أخرى | قطعة 1063 | 2/1/2022 | سكني | قطعة أرض | 1 | 100000 | 624.07 | 160.2384 |
3 | 16073025 | منطقة الرياض | الخرج | حي/68 حى اليرموك مخطط 1009/ 2 | مخطط/أخرى | قطعة 1222 | 2/1/2022 | تجاري | قطعة أرض | 1 | 110000 | 581.05 | 189.3124 |
4 | 16069867 | منطقة الرياض | الخرج | حي/827 حى هجرة الصاع | مخطط/أخرى | قطعة 1071 | 2/1/2022 | سكني | قطعة أرض | 1 | 40000 | 630.00 | 63.4920 |
0 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
رقم مرجعي | 16074562 | 16077290 | 16077316 | 16073025 | 16069867 |
المنطقة | منطقة الرياض | منطقة الرياض | منطقة الرياض | منطقة الرياض | منطقة الرياض |
المدينة | الافلاج | البجاديه | الخرج | الخرج | الخرج |
الحي | حي/الخالدية | حي/11 بالدخل المحدود غرب البجادية | حي/60حى اليرموك مخطط 1009 الجزء الثانى | حي/68 حى اليرموك مخطط 1009/ 2 | حي/827 حى هجرة الصاع |
المخطط | مخطط/349 | مخطط/أخرى | مخطط/أخرى | مخطط/أخرى | مخطط/أخرى |
رقم القطعة | قطعة 255 | قطعة 448 | قطعة 1063 | قطعة 1222 | قطعة 1071 |
التاريخ | 2/1/2022 | 2/1/2022 | 2/1/2022 | 2/1/2022 | 2/1/2022 |
تصنيف العقار | سكني | سكني | سكني | تجاري | سكني |
نوع العقار | قطعة أرض | قطعة أرض | قطعة أرض | قطعة أرض | قطعة أرض |
عدد العقارات | 1 | 1 | 1 | 1 | 1 |
السعر بالريال السعودي | 70000 | 10000 | 100000 | 110000 | 40000 |
المساحة | 820.53 | 625.00 | 624.07 | 581.05 | 630.00 |
سعر المتر المربع | 85.3107 | 16.0000 | 160.2384 | 189.3124 | 63.4920 |
# Let us check the columns' names in the dataframe - فلنتحقق من أسماء الأعمدة في إطار البيانات المستخدم
df.columns
Index(['رقم مرجعي', 'المنطقة', 'المدينة', 'الحي', 'المخطط', 'رقم القطعة', 'التاريخ', 'تصنيف العقار', 'نوع العقار', 'عدد العقارات', 'السعر بالريال السعودي', 'المساحة ', 'سعر المتر المربع'], dtype='object')
كما هو واضح أمامنا، إن جميع أسماء المزايا (الأعمدة) المستخدمة في إطار البيانات مسمى باللغة العربية. ومن أجل سهولة تحليل ورسم البيانات، يستحسن تحويل الأسماء والبيانات من اللغة العربية إلى الإنجليزية
الخطوة الثالثة: ترجمة أسماء الأعمدة إلى اللغة الإنجليزية
Step Three: Translate Columns Names to English
# Firstly, we rename columns names - أولا، سنقوم بإعادة تسمية أسماء الأعمدة
df = df.rename(columns={'رقم مرجعي':'Reference_Num','المنطقة':'State','المدينة':'City',
'الحي':'District','المخطط':'Area','رقم القطعة':'Land_Number',
'التاريخ':'Date','تصنيف العقار':'Category','نوع العقار':'Type',
'عدد العقارات':'Num_of_Properties','السعر بالريال السعودي':'Price_SAR',
'المساحة ':'Land_Area','سعر المتر المربع':'SM_Price'})
# Let us check the new columns names - فلنقم بالتحقق من الأسماء الجديدة
df.head(2)
| Reference_Num | State | City | District | Area | Land_Number | Date | Category | Type | Num_of_Properties | Price_SAR | Land_Area | SM_Price |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 16074562 | منطقة الرياض | الافلاج | حي/الخالدية | مخطط/349 | قطعة 255 | 2/1/2022 | سكني | قطعة أرض | 1 | 70000 | 820.53 | 85.3107 |
1 | 16077290 | منطقة الرياض | البجاديه | حي/11 بالدخل المحدود غرب البجادية | مخطط/أخرى | قطعة 448 | 2/1/2022 | سكني | قطعة أرض | 1 | 10000 | 625.00 | 16.0000 |
| 0 | 1 |
---|---|---|
Reference_Num | 16074562 | 16077290 |
State | منطقة الرياض | منطقة الرياض |
City | الافلاج | البجاديه |
District | حي/الخالدية | حي/11 بالدخل المحدود غرب البجادية |
Area | مخطط/349 | مخطط/أخرى |
Land_Number | قطعة 255 | قطعة 448 |
Date | 2/1/2022 | 2/1/2022 |
Category | سكني | سكني |
Type | قطعة أرض | قطعة أرض |
Num_of_Properties | 1 | 1 |
Price_SAR | 70000 | 10000 |
Land_Area | 820.53 | 625.00 |
SM_Price | 85.3107 | 16.0000 |
الخطوة الرابعة: التخلص من الأعمدة الغير مهمة
Step Four: Drop Unnecessary Columnsنحن كمحللي بيانات. نعلم أن كل عمود يمثل صفة (فيتشر - Feature) معينة في جدول البيانات. وإنه من الطبيعي أن تختلف أهمية كل عمود عن الآخر. فبحسب الهدف من تحليل البيانات، يمكننا تحديد ماهي الأعمدة التي نحتاج إليها. وإن محلل البيانات الماهر يتخلص من الأعمدة التي لا حاجة لها من أجل الحفاظ على الذاكرة وسلاسة التحليل.
# We will drop 5 columns as follows - سنقوم بإزالة ٥ أعمدة كالتالي
df = df.drop(['Reference_Num','District','Area','Land_Number','Num_of_Properties'],axis = 1)
df.head()
| State | City | Date | Category | Type | Price_SAR | Land_Area | SM_Price |
---|---|---|---|---|---|---|---|---|
0 | منطقة الرياض | الافلاج | 1/2/2022 | سكني | قطعة أرض | 70000 | 820.53 | 85.3107 |
1 | منطقة الرياض | البجاديه | 1/2/2022 | سكني | قطعة أرض | 10000 | 625.00 | 16.0000 |
2 | منطقة الرياض | الخرج | 1/2/2022 | سكني | قطعة أرض | 100000 | 624.07 | 160.2384 |
3 | منطقة الرياض | الخرج | 1/2/2022 | تجاري | قطعة أرض | 110000 | 581.05 | 189.3124 |
4 | منطقة الرياض | الخرج | 1/2/2022 | سكني | قطعة أرض | 40000 | 630.00 | 63.4920 |
| 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
State | منطقة الرياض | منطقة الرياض | منطقة الرياض | منطقة الرياض | منطقة الرياض |
City | الافلاج | البجاديه | الخرج | الخرج | الخرج |
Date | 1/2/2022 | 1/2/2022 | 1/2/2022 | 1/2/2022 | 1/2/2022 |
Category | سكني | سكني | سكني | تجاري | سكني |
Type | قطعة أرض | قطعة أرض | قطعة أرض | قطعة أرض | قطعة أرض |
Price_SAR | 70000 | 10000 | 100000 | 110000 | 40000 |
Land_Area | 820.53 | 625.00 | 624.07 | 581.05 | 630.00 |
SM_Price | 85.3107 | 16.0000 | 160.2384 | 189.3124 | 63.4920 |
تذكر أن تخلصنا من هذه الأعمدة الخمسة لا يعني بالضرورة أن هذه الأعمدة غير مهمة إطلاقا. بل ربما هذه الصفات ذات أهمية كبيرة في مشاريع تحليل البيانات الأخرى مثل صنع نماذج تعلم الآلة. لقد تخلصنا من هذه الأعمدة فقط لأننا نريد أن نضع تركيزنا على تحليل الأعمدة الأخرى ورسم رسومات بيانية مناسبة لها.
الخطوة الخامسة: ترجمة البيانات إلى اللغة الإنجليزية
Step Five: Translate Data to Englishقمنا بالسابق بترجمة أسماء الأعمدة، والآن سوف نقوم بترجمة البيانات داخل الأعمدة. نحن نقوم بترجمة البيانات لأن مكتبتي الرسم المستخدمة في الرسم لا تدعم اللغة العربية جيدًا. ولذلك، بما أن الترجمة لا تستغرق وقت كثيرا منا في عملية معالجة البيانات. سنقوم بالترجمة من أجل سهولة استخدام مكتبتي الرسم matplotlib و seaborn
# We will use 'unique' code to identify the 'unique' entities in each column
# سوف نقوم باستخدام كود 'يونيك' من إجل معرفة العناصر المميزة في كل عمود والتي تحتاج إلى ترجمة
display(df.State.unique())
print('Number of unique entities in "State" column is', len(df.State.unique()))
print('--------')
display(df.Category.unique())
print('Number of unique entities in "Category" column is', len(df.Category.unique()))
print('--------')
display(df.Type.unique())
print('Number of unique entities in "Type" column is', len(df.Type.unique()))
print('--------')
display(df.City.unique())
print('Number of unique entities in "City" column is', len(df.City.unique()))
array(['منطقة الرياض', 'منطقة مكة المكرمة', 'منطقة المدينة المنورة', 'منطقة القصيم', 'المنطقة الشرقية', 'منطقة عسير', 'منطقة تبوك', 'منطقة حائل', 'منطقة الحدود الشمالية', 'منطقة جازان', 'منطقة نجران', 'منطقة الباحة', 'منطقة الجوف'], dtype=object)
Number of unique entities in "State" column is 13 --------
array(['سكني', 'تجاري', 'زراعي', 'صناعي'], dtype=object)
Number of unique entities in "Category" column is 4 --------
array(['قطعة أرض', 'أرض زراعية', 'بيت', 'شقة', 'معرض/محل', 'فيلا', 'مرفق', 'إستراحة', 'مركز تجاري', 'عمارة'], dtype=object)
Number of unique entities in "Type" column is 10 --------
array(['الافلاج', 'البجاديه', 'الخرج', 'الدرعيه', 'الدلم', 'الدوادمي', 'الرياض', 'الرين', 'الزلفي', 'الغاط', 'المزاحميه', 'حريملاء', 'حوطة بني تميم', 'حوطة سدير', 'رماح', 'شقراء', 'ضرماء', 'عفيف', 'مرات', 'وادي الدواسر', 'الخرمه', 'الطائف', 'القنفذه', 'الليث', 'المويه', 'تربه', 'جده', 'رابغ', 'رنيه', 'مكة المكرمة', 'الحناكية', 'المدينة المنورة', 'وادي الفرع', 'البدائع', 'البكيريه', 'الرس', 'المذنب', 'بريده', 'ابقيق', 'الاحساء', 'الجبيل', 'الخبر', 'الخفجي', 'الدمام', 'القطيف', 'النعيريه', 'حفر الباطن', 'ابها', 'احد رفيده', 'النماص', 'بلقرن', 'بيشه', 'تثليت', 'خميس مشيط', 'سراة عبيده', 'ظهران الجنوب', 'محايل عسير', 'تبوك', 'حقل', 'ضباء', 'الحائط', 'بقعاء', 'حائل', 'العويقيله', 'طريف', 'عرعر', 'ابو عريش', 'بيش', 'جيزان', 'صامطه', 'ثار', 'شروره', 'نجران', 'الباحه', 'المخواة', 'بلجرشي', 'القريات', 'دومة الجندل', 'سكاكا', 'طبرجل', 'السليل', 'ثادق', 'المهد', 'عنيزه', 'العيون', 'رأس تنوره', 'تيماء', 'الشنان', 'رفحاء', 'نصاب', 'الدرب', 'يدمه', 'ميسان', 'ضريه', 'عقلة الصقور', 'حرض', 'العلا', 'العرضيه الجنوبيه', 'قرية العليا', 'فرسان', 'أضم', 'لينه', 'رفائع الجمش', 'احد المسارحه', 'جبه', 'سميراء'], dtype=object)
Number of unique entities in "City" column is 106
بناءً على ما وجدنا. سنقوم بترجمة ثلاث أعمدة، وهي المنطقة، تصنيف العقار، والنوع. ولن نقوم بترجمة عمود المدينة لحفظ الوقت. ولكن سنعود لاحقا إلى عمود المدينة وسنتعامل معه بطريقة أخرى.
# We translate by using the following method - نقوم بالترجمة بالطريقة التالية
## First we use .loc to locate the cells which include the state name, then we replace them with the new value
## نقوم أولا بتحديد مكان الخلايا التي تحتوي على اسم المنطقة باللغة العربية، ثم نقوم باستبدالها باسمها الإنجليزي
df.loc[df['State']=='منطقة المدينة المنورة','State'] = 'Al-Madinah'
df.loc[df['State']=='منطقة مكة المكرمة','State'] = 'Makkah'
df.loc[df['State']=='منطقة الرياض','State'] = 'Riyadh'
df.loc[df['State']=='منطقة تبوك','State'] = 'Tabuk'
df.loc[df['State']=='منطقة عسير','State'] = 'Aseer'
df.loc[df['State']=='المنطقة الشرقية','State'] = 'Estern'
df.loc[df['State']=='منطقة القصيم','State'] = 'Al-Qassim'
df.loc[df['State']=='منطقة جازان','State'] = 'Jazan'
df.loc[df['State']=='منطقة الحدود الشمالية','State'] = 'Northern Borders'
df.loc[df['State']=='منطقة حائل','State'] = 'Hail'
df.loc[df['State']=='منطقة الجوف','State'] = 'Al-Jowf'
df.loc[df['State']=='منطقة الباحة','State'] = 'Al-Bahah'
df.loc[df['State']=='منطقة نجران','State'] = 'Najran'
# Then we use .unique to check if the all entities has been translated successfully.
# سوف نقوم بالتحقق أن جميع عناصر عمود "المنطقة" (ستيت) قد تمت ترجمته بنجاح
df.State.unique()
array(['Riyadh', 'Makkah', 'Al-Madinah', 'Al-Qassim', 'Estern', 'Aseer', 'Tabuk', 'Hail', 'Northern Borders', 'Jazan', 'Najran', 'Al-Bahah', 'Al-Jowf'], dtype=object)
# We do the same process with Category column - نقوم بنفس الخطوات مع عمود التصنيف
df.loc[df['Category']=='سكني','Category'] = 'Residential'
df.loc[df['Category']=='تجاري','Category'] = 'Commercial'
df.loc[df['Category']=='زراعي','Category'] = 'Agricultural'
df.loc[df['Category']=='صناعي','Category'] = 'Industrial'
display(df.Category.unique())
# And we do the same process with Type column - نقوم بنفس الخطوات مع عمود النوع
df.loc[df['Type'] =='مرفق','Type'] = 'annex house'
df.loc[df['Type'] =='فيلا','Type'] = 'villa'
df.loc[df['Type'] =='معرض/محل','Type'] = 'showroom/store'
df.loc[df['Type'] =='شقة','Type'] = 'apartment'
df.loc[df['Type'] =='بيت','Type'] = 'house'
df.loc[df['Type'] =='أرض زراعية','Type'] = 'agricultural land'
df.loc[df['Type'] =='قطعة أرض','Type'] = 'empty land'
df.loc[df['Type'] =='عمارة','Type'] = 'building'
df.loc[df['Type'] =='مركز تجاري','Type'] = 'shopping mall'
df.loc[df['Type'] =='إستراحة','Type'] = 'resort'
display(df.Type.unique())
array(['Residential', 'Commercial', 'Agricultural', 'Industrial'], dtype=object)
array(['empty land', 'agricultural land', 'house', 'apartment', 'showroom/store', 'villa', 'annex house', 'resort', 'shopping mall', 'building'], dtype=object)
# Now, we pull 10 random rows to check our df - الآن نقوم بسحب عشرة أعمدة بشكل عشوائي من أجل التحقق من إطار البيانات الحالي
df.sample(10)
| State | City | Date | Category | Type | Price_SAR | Land_Area | SM_Price |
---|---|---|---|---|---|---|---|---|
22049 | Makkah | الطائف | 2/24/2022 | Commercial | empty land | 500000 | 1168.53 | 427.8880 |
30733 | Hail | حائل | 3/6/2022 | Residential | empty land | 240000 | 400.00 | 600.0000 |
35651 | Riyadh | الخرج | 3/13/2022 | Residential | empty land | 450000 | 369.00 | 1219.5121 |
26971 | Riyadh | الرياض | 3/2/2022 | Residential | empty land | 1400000 | 500.00 | 2800.0000 |
40111 | Najran | نجران | 3/17/2022 | Residential | empty land | 20000 | 640.00 | 31.2500 |
43464 | Riyadh | الدرعيه | 3/23/2022 | Agricultural | agricultural land | 700000 | 10000.00 | 70.0000 |
20905 | Makkah | جده | 2/23/2022 | Agricultural | apartment | 990000 | 208.90 | 4739.1096 |
3227 | Al-Qassim | بريده | 2/3/2022 | Residential | empty land | 119048 | 400.00 | 297.6200 |
53602 | Al-Madinah | وادي الفرع | 4/5/2022 | Residential | empty land | 50000 | 939.68 | 53.2096 |
18348 | Aseer | خميس مشيط | 2/20/2022 | Residential | empty land | 850000 | 505.00 | 1683.1683 |
الخطوة السادسة: عمل تحليل بيانات استكشافي عن طريق الرسم
Step Six: EDA Analysis via Plottingأولا: فلنقم بالتحقق من عدد المبيعات بالنسبة للمناطق في السعودية. حيث أن كل صف في إطار البيانات يمثل عملية بيع/شراء لقطعة عقار في السعودية.
# We will use value_counts method to count the occurance of a state.
# سنقوم باستخدام كود (فاليو كاونتس) من أجل عد عدد المرات التي ذكرت فيه منطقة معينة
df.State.value_counts()
Riyadh 21592 Makkah 13592 Estern 7217 Al-Qassim 6351 Al-Madinah 2586 Aseer 2202 Hail 1778 Tabuk 973 Al-Jowf 933 Jazan 903 Najran 710 Northern Borders 684 Al-Bahah 325 Name: State, dtype: int64
نلاحظ التالي: تم بيع 21,592 عقار في الرياض خلال المدة الزمنية (شهر يناير إلى منتصف شهر إبريل) وهي المنطقة الأكثر مبيعا. يليها بالمرتبة الثانية منطقة مكة المكرمة بـــ 13,592 عقار وهكذا. نستطيع تمثيل العلاقة بين المناطق بالنسبة لعدد مرات بيع العقار عن طريق استخدام شريط الرسم البياني (بار شارت) كالتالي:
# First we difne a proper size for the figure - أولا نقوم بتعريف حجم مناسب للرسمة
plt.figure(figsize=(14,8))
# We add .plot(kind = 'bar') to plot the bars - نقول بتحويل البيانات إلى رسمة عن طريق الكود .بلوت
df.State.value_counts().plot(kind = 'bar', color = 'navy')
# We specify labels and ticks as follows - نقوم بحديد العنوانين للرسمة كالتالي
plt.title('Real Estate Sales per State (2022 - January to mid April)', fontsize=14) # Figure label - عنوان الرسمة
plt.xlabel('State', fontsize=14) # X-axis label - عنوان خط س
plt.ylabel('Number of Sales', fontsize=14) # Y-axis label - عنوان خط ص
plt.yticks(np.arange(0, 23000, 1000)) # Y-axis range - تحديد مدى خط ص
plt.show() # To show the plot - لإظهار الرسمة

لاحظ كيف أن تحويلنا للبيانات من مجرد أرقام إلى رسوم بيانية سهل علينا فهم ماذا حصل، حيث أن تمثيل عدد المبيعات خلال الفترة الزمنية بالنسبة للمنطقة عن طريق الأعمدة وضّح لنا ماهي المناطق الأكثر مبيعا، وماهي الأقل، وأصبح من السهل جدا المقارنة بين منطقتين في المملكة العربية السعودية.
ثانيا: سوف نقوم بعمل نفس الرسمة بالنسبة لعمودي النوع والصنف، ولكن هذه المرة سوف نجمعهم برسمة واحدة عن طريق استخدام كود (subplot)
plt.figure(figsize=(16,8))# Figure size - حجم الرسمة
plt.subplot(2,2,1) # initiate box 1 - نقوم بتهيئة الصندوق الأول
df.Category.value_counts().plot(kind = 'bar', color = 'teal') # Plot in the 1st box - نقوم بالرسم بالصندوق الأول
plt.title('Category')
plt.ylabel('Number of Sales')
plt.subplot(2,2,2) # Initiate box 2 - نقوم بتهيئة الصندوق الثاني
df.Type.value_counts().plot(kind = 'bar', color = 'indigo') # Plot in the 2nd box - نقوم بالرسم بالصندوق الثاني
plt.title('Type')
plt.ylabel('Number of Sales');

لقد قمنا بدمج رسمتين سويا في هذه الصورة. حيث أن الصورة الأولى توضح عدد المبيعات بالنسبة لتصنيف العقار(Category)، والرسمة الثانية تبين نوع العقار المباع (Type). نلاحظ من الرسمة الأولى أن صنف العقار السكني هو الأكثر مبيعا، يليه التجاري ثم الزراعي ,وأخيرا وبأعداد محدودة جدًا العقار الصناعي. ومن الناحية الأخرى، فإن نوع العقار المباع في أغلب الأحيان هو قطع أرض لم يتم البناء عليها بَعد، ثم يليها بالمرتبة الثانية نوع الشقة، وأقل نوع هو نوع الاستراحات.
ثالثا: ماهي أكثر المدن التي تمت فيها عمليات البيع؟
تذكر أننا في السابق وجدنا أنه هناك ١٠٦ مدينة تم بيع عقار فيها خلال المدة الزمنية. إن ترجمة ١٠٦ اسم مدينة يستغرق جهدا طويلا، بل إن وضعهم جميعا في رسمة واحدة قد يجعل الرسمة غير واضحة المعالم وغير مفهومة. ولذلك، نحن سوف نقوم بأخذ أعلى خمس مدن فقط وتمثيلها برسم بياني كالتالي:
df.City.value_counts().head() # To find out the top 5 cities - لإيجاد أعلى خمس مدن تم بيع العقار فيها
الرياض 13621 جده 8255 بريده 4067 مكة المكرمة 2891 المدينة المنورة 2003 Name: City, dtype: int64
# Now we create two lists, the first list encompasses cities names, the second list contains number of sales
# الآن سوف نقوم بعمل قائمتين، القائمة الآولى تحتوي على اسم المدن، والثانية تحتوي على أعداد عمليات البيع
Cities = ['Riyadh','Jeddah','Buraidah','Makkah','Medina']
Sales = [13621,8255,4067,2891,2003]
# This time, we will plot the pie plot to show the percentages of each city
# في هذه المرة، سنقوم برسم رسمة (الباي)من أجل إظهار نسبة كل مدينة من المدن
plt.figure(figsize =(12, 8))
plt.pie(Sales, labels = Cities, autopct =' %1.1f%%', startangle=90)
plt.title('Top 5 Cities 2022 - January to mid April')
plt.show()

لاحظ كيف أن الرسمة الدائرية مناسبة لمقارنة النسب بين أعلى خمس مدن في المملكة العربية السعودية.
رابعا: تحليل أسعار العقار
نلاحظ في إطار البيانات الموجود لدينا. أن هناك عمود يمثل سعر المتر المربع والمسمى بـــ SM_Price.
إن هذا العمود محط اهتمام لدينا، حيث أنه من خلاله، نستطيع معرفة طبيعة الأسعار في المناطق أو المدن كالتالي:
# We will use 'describe' code to find out the measures of central tendency
# نقوم باستخدام كود 'ديسكرايب' لاكتشاف كيفية توزيع القيم في العمود
df.SM_Price.describe()
count 59846.000000 mean 1302.610391 std 2185.538330 min 0.010000 25% 207.429475 50% 646.106700 75% 1600.000000 max 139854.706400 Name: SM_Price, dtype: float64
نلاحظ من النتيجة التي ظهرت لدينا ما يلي: أنه في المملكة العربية السعودية تمت 59,846 عملية بيع للعقار خلال الفترة الزمنية، ومتوسط السعر للمتر المربع هو 1,302.61 ريالا سعودي. وقد كانت أعلى قيمة للمتر المربع بــــ 139,854 ريالا سعوديا. إن هذه القيمة الكبيرة جدًا أمر مثير للاهتمام، فلنرى في أي منطقة تمت عملية البيع هذه.
df[df.SM_Price==df.SM_Price.max()]
State |
City |
Date |
Category |
Type |
Price_SAR |
Land_Area |
SM_Price |
50865
|
Makkah
|
مكة المكرمة
|
3/31/2022
|
Residential
|
empty land
|
180000000
|
1287.05
|
139854.7064
|
---|
لقد وجدنا أن العقار الذي بيع بأعلى قيمة للمتر المربع في الفترة الزمنية كان في منطقة مكة المكرمة في تاريخ 31/3/2022.
وأخيرا، فلنقم برسم توزيع بياني (هيستوجرام - Histogram) من أجل رؤية كيفية توزيع قيمة المتر المربع في المملكة العربية السعودية باستخدام الكود التالي:
sns.displot(df.SM_Price,bins = np.arange(0,2500,50))
plt.title('Real Estate - Square Meter Price Distribution - 2022 January to mid April');

خطوة إضافية: متوسط سعر العقار في منطقة الرياض
Bonus Step: Average SM_Price in Riyadh Stateلقد وجدنا متوسط سعر المتر المربع للعقار في المملكة العربية السعودية. ولكن ماذا لو أردنا معرفة المتوسط في منطقة الرياض فقط، وللنوع التجاري دون السكني أو الزراعي أو الصناعي؟ في الحقيقة نستطيع تصفية إطار البيانات (فلترة) من أجل الحصول على القيمة المطلوبة عن طريق التالي:
Riyadh_df = df[df.State=='Riyadh'] # We filter Riyadh state only - نقوم بأخذ صفوف منطقة الرياض فقط
Riyadh_Commercial = Riyadh_df[Riyadh_df.Category =='Commercial'] # Filter commercial only - نأخذ صفوف العقار التجاري فقط
display(Riyadh_Commercial.sample(3))
print('Average SM_Price for commercial estates in Riyadh state is',round(Riyadh_Commercial.SM_Price.mean(),2), 'SAR')
State |
City |
Date |
Category |
Type |
Price_SAR |
Land_Area |
SM_Price |
|
---|---|---|---|---|---|---|---|---|
28283
|
Riyadh
|
الرياض
|
3/3/2022
|
Commercial
|
empty land
|
2670478
|
4768.71
|
560.0000
|
17462
|
Riyadh
|
الخرج
|
2/20/2022
|
Commercial
|
empty land
|
200000
|
660.00
|
303.0303
|
37700
|
Riyadh
|
رماح
|
3/15/2022
|
Commercial
|
empty land
|
1198654
|
810.00
|
1479.8197
|
Average SM_Price for commercial estates in Riyadh state is 1994.07 SAR
ماذا تعلمنا؟
- إن هناك العديد من المصادر المجانية لبيانات عالية القيمة
- محلل البيانات الماهر يستطيع انتقاء الأعمدة المناسبة لأهدافه
- تبسيط البيانات عن طريق الرسوم المبينة يسهل عملية صناعة القرار
- رسم البيانات يكون الخطوة الأولى في تحليل البيانات