يشغل سوق الإيجارات موقعًا حساسًا في الاقتصاد السعودي لأنه يقع عند تقاطع ثلاثة ملفات كبرى: تكلفة المعيشة، والحراك الحضري، والقدرة على السكن. وعندما ترتفع الإيجارات، فإن الأثر لا يبقى داخل القطاع العقاري فقط، بل ينتقل مباشرة إلى مؤشر أسعار المستهلك، وإلى سلوك الأسر، وإلى النقاشات المرتبطة بالتنمية الحضرية والتخطيط والإسكان.
ينطلق هذا التقرير من تجميع منظم لعدة مصادر رقمية متاحة، ثم يحاول الإجابة عن سؤال أكبر من مجرد: كم ارتفع الإيجار؟، وهو: كيف يبدو هيكل السوق الإيجاري في السعودية، وأين يتركز الضغط، وما الذي يمكن استنتاجه بشأن الاتجاه القصير الأجل؟
base_dir <- if (file.exists("rent_region_2024.csv")) "." else "saudi_rent_report"
rent_region <- read_csv(file.path(base_dir, "rent_region_2024.csv"), show_col_types = FALSE)
housing_type <- read_csv(file.path(base_dir, "housing_type_totals_2024.csv"), show_col_types = FALSE)
rent_band <- read_csv(file.path(base_dir, "rent_band_totals_2024.csv"), show_col_types = FALSE)
tenure <- read_csv(file.path(base_dir, "housing_tenure_totals_2024.csv"), show_col_types = FALSE)
cpi_rent <- read_csv(file.path(base_dir, "cpi_rent_pressures_2025_2026.csv"), show_col_types = FALSE)
transactions <- read_csv(file.path(base_dir, "monthly_rental_transactions_2023.csv"), show_col_types = FALSE)
national_rented_units <- sum(rent_band$units)
total_occupied_units <- sum(tenure$units)
rent_share <- tenure |> filter(tenure == "Rented") |> pull(share_pct)
owned_share <- tenure |> filter(grepl("Ownership", tenure)) |> summarise(s = sum(share_pct)) |> pull(s)
apartment_share <- housing_type |> filter(housing_type == "Apartment") |> pull(share_pct)
mid_band_share <- rent_band |> filter(rent_band == "10,001-20,000 SAR") |> pull(share_pct)
high_band_share <- rent_band |> filter(rent_band == ">30,000 SAR") |> pull(share_pct)
riyadh_makkah_share <- rent_region |>
filter(region_ar %in% c("الرياض", "مكة المكرمة")) |>
summarise(s = sum(share_of_national_rented_pct)) |>
pull(s)
rent_growth_latest <- cpi_rent |> filter(!is.na(actual_rent_yoy)) |> slice_tail(n = 1) |> pull(actual_rent_yoy)
rent_growth_peak <- cpi_rent |> filter(!is.na(actual_rent_yoy)) |> summarise(m = max(actual_rent_yoy)) |> pull(m)
tibble(
المصدر = c(
"Housing Statistics Bulletin 2024",
"CPI Bulletins 2025–2026",
"أخبار مؤشر الإيجار 2023"
),
نوع_البيانات = c(
"بنية السوق السكني: حيازة، نوع سكن، شرائح إيجارية، مناطق",
"تضخم عام، تضخم السكن، تغير الإيجارات الفعلية",
"حجم المعاملات الإيجارية في أشهر مختارة"
),
الاستخدام_في_التقرير = c(
"التحليل الوصفي والخرائط الحرارية والعنقدة",
"تحليل الضغط السعري والتوقع القصير الأجل",
"قياس النشاط السوقي وتفسير الحركية الشهرية"
)
) |>
kable(caption = "ملخص مصادر البيانات ودورها في التحليل")
| المصدر | نوع_البيانات | الاستخدام_في_التقرير |
|---|---|---|
| Housing Statistics Bulletin 2024 | بنية السوق السكني: حيازة، نوع سكن، شرائح إيجارية، مناطق | التحليل الوصفي والخرائط الحرارية والعنقدة |
| CPI Bulletins 2025–2026 | تضخم عام، تضخم السكن، تغير الإيجارات الفعلية | تحليل الضغط السعري والتوقع القصير الأجل |
| أخبار مؤشر الإيجار 2023 | حجم المعاملات الإيجارية في أشهر مختارة | قياس النشاط السوقي وتفسير الحركية الشهرية |
summary_board <- tibble(
المؤشر = c(
"إجمالي المساكن المشغولة بأسر سعودية",
"إجمالي المساكن المستأجرة",
"حصة الإيجار من السوق السكني",
"حصة الملكية من السوق السكني",
"حصة الشقق من السوق الإيجاري",
"حصة شريحة 10–20 ألف",
"حصة شريحة >30 ألف",
"أحدث نمو سنوي للإيجارات الرسمية"
),
القيمة = c(
comma(total_occupied_units),
comma(national_rented_units),
fmt_pct(rent_share, 1),
fmt_pct(owned_share, 1),
fmt_pct(apartment_share, 1),
fmt_pct(mid_band_share, 1),
fmt_pct(high_band_share, 1),
fmt_pct(rent_growth_latest, 1)
)
)
kable(summary_board, caption = "أهم المؤشرات الوصفية المختصرة")
| المؤشر | القيمة |
|---|---|
| إجمالي المساكن المشغولة بأسر سعودية | 4,387,231 |
| إجمالي المساكن المستأجرة | 1,409,053 |
| حصة الإيجار من السوق السكني | 32.1% |
| حصة الملكية من السوق السكني | 56.3% |
| حصة الشقق من السوق الإيجاري | 83.5% |
| حصة شريحة 10–20 ألف | 50.1% |
| حصة شريحة >30 ألف | 14.3% |
| أحدث نمو سنوي للإيجارات الرسمية | 5.2% |
region_desc <- rent_region |>
summarise(
`عدد المناطق` = n(),
`متوسط الوحدات المستأجرة` = mean(total_rented_units),
`الوسيط` = median(total_rented_units),
`الحد الأدنى` = min(total_rented_units),
`الحد الأعلى` = max(total_rented_units),
`متوسط حصة المنطقة من السوق %` = mean(share_of_national_rented_pct),
`متوسط نسبة >30 ألف داخل المنطقة %` = mean(pct_gt_30k_within_region)
) |>
pivot_longer(everything(), names_to = "المؤشر", values_to = "القيمة") |>
mutate(القيمة = ifelse(str_detect(المؤشر, "%"), fmt_num(as.numeric(القيمة), 2), fmt_num(as.numeric(القيمة), 0)))
kable(region_desc, caption = "إحصاءات وصفية لتوزيع السوق الإيجاري بين المناطق")
| المؤشر | القيمة |
|---|---|
| عدد المناطق | 13 |
| متوسط الوحدات المستأجرة | 108,389 |
| الوسيط | 43,615 |
| الحد الأدنى | 11,093 |
| الحد الأعلى | 381,925 |
| متوسط حصة المنطقة من السوق % | 7.69 |
| متوسط نسبة >30 ألف داخل المنطقة % | 6.00 |
تكشف الإحصاءات الوصفية للمناطق أن سوق الإيجار غير متوازن الحجم؛ فهناك فجوة واضحة بين المناطق الكبرى وبقية المناطق. كما أن الفرق بين المتوسط والوسيط في عدد الوحدات المستأجرة يوحي بوجود انحراف باتجاه المناطق الكبيرة، وهو ما يبرر لاحقًا استخدام التحليل المكاني والعنقودي بدلًا من الاكتفاء بالمتوسطات العامة.
tenure |>
mutate(
share_pct = round(share_pct, 2),
units = comma(units)
) |>
kable(
col.names = c("نوع الحيازة", "عدد الوحدات", "النسبة %"),
caption = "توزيع المساكن المشغولة بأسر سعودية حسب نوع الحيازة – 2024"
)
| نوع الحيازة | عدد الوحدات | النسبة % |
|---|---|---|
| Ownership without mortgage/loan | 1,632,581 | 37.21 |
| Ownership with mortgage/loan | 837,164 | 19.08 |
| Rented | 1,409,053 | 32.12 |
| Government work provided | 62,798 | 1.43 |
| Private work provided | 6,948 | 0.16 |
| Charitable organization provided | 20,779 | 0.47 |
| Benefactor provided | 8,270 | 0.19 |
| Family member provided | 409,064 | 9.32 |
| Other | 574 | 0.01 |
ggplot(tenure, aes(x = reorder(tenure, units), y = units)) +
geom_col(fill = "#2c7fb8") +
coord_flip() +
scale_y_continuous(labels = comma) +
labs(
title = "أنواع الحيازة السكنية في السعودية",
subtitle = "المساكن المشغولة بأسر سعودية – 2024",
x = NULL,
y = "عدد الوحدات"
)
توضح هذه النتائج أن الإيجار يمثل كتلة سكنية كبيرة داخل المملكة، إذ يشكل نحو ثلث المساكن المشغولة تقريبًا. وهذا يعني أن أي تغير في الإيجارات ليس تغيرًا طرفيًا، بل هو تغير يمس شريحة واسعة من الأسر. كما أن ارتفاع نسبة الملكية لا يلغي أهمية الإيجار، لأن السوقين يتعايشان داخل بنية سكنية واحدة، ويؤثر كل منهما في الآخر عبر الأسعار والطلب والتنقل السكني.
rent_band |>
mutate(
units = comma(units),
share_pct = round(share_pct, 2)
) |>
kable(
col.names = c("شريحة الإيجار", "عدد الوحدات", "النسبة %"),
caption = "توزيع الوحدات المستأجرة حسب شريحة الإيجار – 2024"
)
| شريحة الإيجار | عدد الوحدات | النسبة % |
|---|---|---|
| <=10k SAR | 66,807 | 4.74 |
| 10,001-20,000 SAR | 706,233 | 50.12 |
| 20,001-30,000 SAR | 434,475 | 30.83 |
| >30,000 SAR | 201,538 | 14.30 |
ggplot(rent_band, aes(x = rent_band, y = units)) +
geom_col(fill = "#41ab5d") +
scale_y_continuous(labels = comma) +
labs(
title = "توزيع الوحدات المستأجرة حسب شريحة الإيجار",
subtitle = "هيمنة واضحة للشريحة المتوسطة وطنيًا",
x = NULL,
y = "عدد الوحدات"
)
تظهر البيانات أن السوق الوطني يتمركز أساسًا في الشريحة المتوسطة، ولا سيما شريحة 10–20 ألف ريال سنويًا. هذه النتيجة مهمة لأنها تفصل بين الصورة الوطنية والانطباع العام المتأثر غالبًا بالأسواق الأعلى سعرًا. فوجود شريحة مرتفعة السعر لا يعني أن السوق كله مرتفع؛ بل يشير إلى أن الضغط السعري قد يكون متمركزًا في مناطق أو مدن بعينها، بينما يبقى الجسد الأكبر للسوق في مستويات أقل.
rent_region |>
arrange(desc(total_rented_units)) |>
mutate(
total_rented_units = comma(total_rented_units),
share_of_national_rented_pct = round(share_of_national_rented_pct, 2),
pct_gt_30k_within_region = round(pct_gt_30k_within_region, 2)
) |>
select(region_ar, total_rented_units, share_of_national_rented_pct, pct_gt_30k_within_region) |>
kable(
col.names = c("المنطقة", "عدد الوحدات المستأجرة", "حصة المنطقة من الإجمالي %", "نسبة >30 ألف داخل المنطقة %"),
caption = "أهم المناطق من حيث عدد المساكن المستأجرة – 2024"
)
| المنطقة | عدد الوحدات المستأجرة | حصة المنطقة من الإجمالي % | نسبة >30 ألف داخل المنطقة % |
|---|---|---|---|
| مكة المكرمة | 381,925 | 27.11 | 6.95 |
| الرياض | 345,002 | 24.48 | 39.85 |
| المنطقة الشرقية | 234,114 | 16.61 | 10.84 |
| المدينة المنورة | 128,475 | 9.12 | 4.23 |
| عسير | 102,120 | 7.25 | 3.40 |
| تبوك | 50,230 | 3.56 | 1.12 |
| القصيم | 43,615 | 3.10 | 1.89 |
| جازان | 36,847 | 2.62 | 0.00 |
| نجران | 22,048 | 1.56 | 1.62 |
| حائل | 20,823 | 1.48 | 4.69 |
| الجوف | 17,988 | 1.28 | 1.19 |
| الحدود الشمالية | 14,773 | 1.05 | 0.98 |
| الباحة | 11,093 | 0.79 | 1.28 |
rent_region |>
arrange(desc(total_rented_units)) |>
ggplot(aes(x = reorder(region_ar, total_rented_units), y = total_rented_units)) +
geom_col(fill = "#756bb1") +
coord_flip() +
scale_y_continuous(labels = comma) +
labs(
title = "عدد المساكن المستأجرة حسب المنطقة الإدارية",
subtitle = "مكة المكرمة والرياض في صدارة السوق",
x = NULL,
y = "عدد الوحدات"
)
rent_region |>
arrange(desc(pct_gt_30k_within_region)) |>
ggplot(aes(x = reorder(region_ar, pct_gt_30k_within_region), y = pct_gt_30k_within_region)) +
geom_col(fill = "#dd1c77") +
coord_flip() +
scale_y_continuous(labels = function(x) paste0(round(x, 1), "%")) +
labs(
title = "نسبة الوحدات ذات الإيجار الأعلى من 30 ألف ريال داخل كل منطقة",
subtitle = "مؤشر على تمركز الشريحة العليا سعريًا",
x = NULL,
y = "النسبة داخل المنطقة"
)
تكشف القراءة الجغرافية نتيجتين متوازيتين: الأولى أن السوق متمركز حجميًا في مناطق رئيسية مثل مكة المكرمة والرياض، والثانية أن التمركز السعري المرتفع لا يتوزع بنفس الطريقة. فبعض المناطق كبيرة الحجم لكنها ما تزال أقرب إلى الشرائح المتوسطة، بينما تبدو الرياض أقرب إلى سوق مرتفع السعر نسبيًا. وهذا يفسر لماذا قد يشعر المتابع بحدة الأزمة من خلال الرياض، في حين أن المتوسط الوطني لا يعكس دائمًا نفس الدرجة من السخونة.
housing_type |>
mutate(
units = comma(units),
share_pct = round(share_pct, 2)
) |>
kable(
col.names = c("نوع السكن", "عدد الوحدات", "النسبة %"),
caption = "الوحدات المستأجرة حسب نوع السكن – 2024"
)
| نوع السكن | عدد الوحدات | النسبة % |
|---|---|---|
| Traditional House | 44,896 | 3.19 |
| Villa | 66,700 | 4.73 |
| Floor | 109,747 | 7.79 |
| Apartment | 1,176,382 | 83.49 |
| Other | 11,328 | 0.80 |
ggplot(housing_type, aes(x = reorder(housing_type, units), y = units)) +
geom_col(fill = "#3182bd") +
coord_flip() +
scale_y_continuous(labels = comma) +
labs(
title = "الوحدات المستأجرة حسب نوع السكن",
subtitle = "هيمنة واضحة للشقق على هيكل السوق الإيجاري",
x = NULL,
y = "عدد الوحدات"
)
تؤكد البيانات أن الشقق هي القلب الحقيقي لسوق الإيجار في السعودية. وهذه النتيجة ليست شكلية، بل تحليلية؛ لأنها تعني أن أي خلل في المعروض من الشقق، أو أي زيادة في الطلب الحضري، سينعكس مباشرة على مؤشر الإيجار العام. لذلك فإن السياسات الموجهة إلى الشقق، من حيث المعروض والتنظيم والتمويل، غالبًا ما تكون أعلى أثرًا من التدخلات العامة غير المتخصصة.
cpi_rent |>
mutate(across(c(overall_cpi_yoy, housing_division_yoy, actual_rent_yoy), round, 2)) |>
kable(
col.names = c("الشهر", "التضخم العام %", "قسم السكن %", "الإيجارات الفعلية %", "إيجار السكن الأساسي %", "ملاحظة"),
caption = "مؤشرات الضغط الإيجاري في نشرات CPI الرسمية"
)
| الشهر | التضخم العام % | قسم السكن % | الإيجارات الفعلية % | إيجار السكن الأساسي % | ملاحظة |
|---|---|---|---|---|---|
| 2025-01 | 2.0 | 8.0 | 9.7 | NA | old methodology; includes villa rents |
| 2025-08 | 2.3 | 5.8 | 7.6 | 7.6 | new methodology |
| 2025-09 | 2.2 | 5.2 | 6.7 | 6.7 | new methodology |
| 2025-11 | 1.9 | 4.3 | 5.4 | 5.4 | new methodology |
| 2025-12 | 2.1 | 4.1 | 5.3 | 5.3 | new methodology |
| 2026-01 | 1.8 | 4.2 | 5.2 | 5.2 | new methodology |
cpi_rent |>
ggplot(aes(x = month, y = actual_rent_yoy, group = 1)) +
geom_line(linewidth = 1, color = "#e6550d") +
geom_point(size = 2, color = "#e6550d") +
scale_y_continuous(labels = function(x) paste0(x, "%")) +
labs(
title = "التغير السنوي في الإيجارات الفعلية في النشرات الرسمية",
subtitle = "ارتفاع قوي ثم تباطؤ نسبي في الزخم السعري",
x = NULL,
y = "النسبة السنوية"
)
تكشف بيانات مؤشر أسعار المستهلك أن الإيجارات لم تكن مجرد تفصيل فرعي في التضخم، بل كانت من أهم محركاته خلال الفترات المتاحة. واللافت أن التباطؤ اللاحق لا يعني هبوط الإيجارات، بل يعني أن سرعة الارتفاع نفسها بدأت تهدأ. وهذا فرق جوهري بين تباطؤ النمو وانخفاض المستوى السعري. كما أن تحديث المنهجية في بعض النشرات يستدعي الحذر عند المقارنة الصارمة، لكنه لا يغير الرسالة العامة: السكن، وبالأخص الإيجارات، كان في مركز التضخم السعودي.
transactions |>
mutate(across(where(is.numeric), ~ifelse(is.na(.x), NA, round(.x, 0)))) |>
kable(caption = "أرقام مختارة من أخبار مؤشر الإيجار في 2023")
| month | total_transactions | residential_transactions | commercial_transactions | riyadh_transactions | jeddah_transactions | makkah_transactions | madinah_transactions | dammam_transactions | riyadh_value_sar_mn |
|---|---|---|---|---|---|---|---|---|---|
| 2023-04 | 176000 | 152000 | 23000 | 50000 | 30000 | 8400 | 7900 | 9000 | NA |
| 2023-05 | 262000 | NA | 59000 | 58000 | 35000 | 12000 | 10000 | 12000 | NA |
| 2023-06 | 240000 | NA | 50000 | 54000 | 32000 | 11000 | 10500 | NA | NA |
| 2023-07 | 275000 | NA | NA | 58000 | 35000 | 13000 | 13000 | 12000 | 900 |
| 2023-08 | 340000 | 275000 | 65000 | 71000 | NA | NA | NA | NA | NA |
| 2023-09 | 294000 | NA | 61000 | 65000 | 37000 | 13000 | 13000 | 12900 | NA |
transactions |>
ggplot(aes(x = month, y = total_transactions, group = 1)) +
geom_line(linewidth = 1, color = "#238b45") +
geom_point(size = 2, color = "#238b45") +
scale_y_continuous(labels = comma) +
labs(
title = "إجمالي المعاملات الإيجارية المنشورة في الأخبار الحكومية المختارة",
subtitle = "نشاط مرتفع مع دفعات واضحة خلال بعض الأشهر",
x = NULL,
y = "عدد المعاملات"
)
رغم أن هذه السلسلة ليست كاملة إحصائيًا لكل الأشهر، فإنها تقدم إشارة مهمة عن الحركية التشغيلية في السوق. فارتفاع المعاملات في أشهر محددة، وتمركز النشاط في المدن الكبرى، يشيران إلى وجود مواسم أو محفزات تشغيلية مرتبطة بالانتقال السكني أو الدراسة أو العمل. وهذه البيانات مفيدة لأنها تضيف بُعدًا ثالثًا إلى التقرير: فلدينا هيكل السوق من جهة، والضغط السعري من جهة أخرى، وإيقاع النشاط من جهة ثالثة.
rent_region_long <- rent_region |>
select(region_ar, rent_le_10k, rent_10k_20k, rent_20k_30k, rent_gt_30k) |>
pivot_longer(
cols = -region_ar,
names_to = "band",
values_to = "units"
) |>
mutate(
band = recode(
band,
rent_le_10k = "≤ 10 آلاف",
rent_10k_20k = "10–20 ألف",
rent_20k_30k = "20–30 ألف",
rent_gt_30k = "> 30 ألف"
)
) |>
group_by(region_ar) |>
mutate(share_within_region = units / sum(units)) |>
ungroup()
rent_region_long |>
mutate(
region_ar = fct_reorder(region_ar, units, .fun = sum, .desc = TRUE),
band = factor(band, levels = c("≤ 10 آلاف", "10–20 ألف", "20–30 ألف", "> 30 ألف"))
) |>
ggplot(aes(x = band, y = region_ar, fill = share_within_region)) +
geom_tile(color = "white") +
geom_text(aes(label = percent(share_within_region, accuracy = 0.1)), size = 3) +
scale_fill_gradient(low = "#f7fbff", high = "#08306b", labels = percent) +
labs(
title = "Heatmap لتوزيع الشرائح الإيجارية داخل كل منطقة",
subtitle = "القيم تمثل نسبة كل شريحة من إجمالي الوحدات المستأجرة داخل المنطقة نفسها",
x = "شريحة الإيجار",
y = NULL,
fill = "النسبة"
)
يفيد الـ Heatmap في إظهار ما لا تظهره الجداول بسرعة: أين تتمركز كل شريحة داخل كل منطقة. وتبدو الرياض هنا أوضح من غيرها في الشريحتين الأعلى، بينما تظهر مناطق أخرى أكثر تمركزًا في الشريحة المتوسطة. هذه القراءة البصرية تعزز استنتاجًا مهمًا: سوق الإيجار السعودي متعدد البُنى، وليس مسطحًا أو متشابهًا بين المناطق.
rent_region |>
ggplot(aes(
x = share_of_national_rented_pct,
y = pct_gt_30k_within_region,
size = total_rented_units,
label = region_ar
)) +
geom_point(alpha = 0.7, color = "#54278f") +
geom_text(nudge_y = 1.2, size = 3, check_overlap = TRUE) +
scale_x_continuous(labels = function(x) paste0(round(x, 1), "%")) +
scale_y_continuous(labels = function(x) paste0(round(x, 1), "%")) +
scale_size_continuous(labels = comma) +
labs(
title = "حجم السوق الإيجاري مقابل تركّز الشريحة العليا",
subtitle = "كل فقاعة تمثل منطقة إدارية",
x = "حصة المنطقة من إجمالي السوق المستأجر",
y = "نسبة الإيجارات الأعلى من 30 ألف داخل المنطقة",
size = "عدد الوحدات"
)
هذا الرسم يفصل بين الحجم والسعر في وقت واحد. فالمنطقة قد تكون كبيرة الحجم لكنها ليست مرتفعة السعر بالضرورة، والعكس صحيح. وعندما تظهر منطقة بحجم كبير ونسبة مرتفعة من الشريحة العليا، فإنها تتحول إلى مركز ضغط سوقي يستحق قراءة منفصلة. وهذا ما يجعل المقارنة البسيطة بعدد الوحدات فقط مقارنة ناقصة.
cluster_data <- rent_region |>
transmute(
region_ar,
market_share = share_of_national_rented_pct,
high_rent_share = pct_gt_30k_within_region,
mid_high_share = pct_20k_plus_within_region,
mid_band_share = pct_10k_20k_within_region,
low_band_share = pct_le_10k_within_region,
total_rented_units
)
cluster_scaled <- cluster_data |>
select(-region_ar) |>
scale()
set.seed(123)
k3 <- kmeans(cluster_scaled, centers = 3, nstart = 50)
cluster_results <- cluster_data |>
mutate(cluster = factor(k3$cluster))
cluster_results |>
group_by(cluster) |>
summarise(
المناطق = paste(region_ar, collapse = "، "),
متوسط_حصة_السوق = round(mean(market_share), 2),
متوسط_الشريحة_العليا = round(mean(high_rent_share), 2),
متوسط_الشريحة_20_فأعلى = round(mean(mid_high_share), 2),
متوسط_الشريحة_المتوسطة = round(mean(mid_band_share), 2),
عدد_المناطق = n(),
.groups = "drop"
) |>
kable(caption = "ملخص عناقيد K-means للمناطق الإدارية")
| cluster | المناطق | متوسط_حصة_السوق | متوسط_الشريحة_العليا | متوسط_الشريحة_20_فأعلى | متوسط_الشريحة_المتوسطة | عدد_المناطق |
|---|---|---|---|---|---|---|
| 1 | الرياض، مكة المكرمة | 25.79 | 23.40 | 62.89 | 33.44 | 2 |
| 2 | القصيم، حائل، الحدود الشمالية، الباحة، الجوف | 1.54 | 2.01 | 10.40 | 78.91 | 5 |
| 3 | المدينة المنورة، المنطقة الشرقية، عسير، تبوك، جازان، نجران | 6.79 | 3.53 | 28.15 | 67.50 | 6 |
cluster_results |>
ggplot(aes(
x = market_share,
y = high_rent_share,
label = region_ar,
size = total_rented_units,
shape = cluster
)) +
geom_point(alpha = 0.8, color = "#08519c") +
geom_text(nudge_y = 1.4, size = 3, check_overlap = TRUE) +
scale_x_continuous(labels = function(x) paste0(round(x, 1), "%")) +
scale_y_continuous(labels = function(x) paste0(round(x, 1), "%")) +
scale_size_continuous(labels = comma) +
labs(
title = "تصنيف المناطق باستخدام K-means",
subtitle = "التموضع يعتمد على حجم السوق وتركيز الشريحة العليا مع خصائص سعرية أخرى",
x = "حصة المنطقة من إجمالي السوق",
y = "نسبة الإيجارات >30 ألف داخل المنطقة",
size = "عدد الوحدات",
shape = "العنقود"
)
يساعد K-means في الانتقال من القراءة الفردية لكل منطقة إلى قراءة أنماط سوقية. وعادة ما تظهر ثلاثة أنماط تقريبية: أسواق ضخمة مرتفعة الضغط، وأسواق ضخمة متوسطة السعر، وأسواق أصغر وأقل سعريًا. وتكمن فائدة هذه الخطوة في أنها تمنعنا من التعامل مع المناطق بوصفها وحدات منفصلة فقط، وتدفعنا إلى التفكير في منطق السوق الذي يجمع بينها.
cpi_model_data <- cpi_rent |>
filter(!is.na(actual_rent_yoy)) |>
mutate(
month_date = ym(month),
t = row_number()
)
lm_rent <- lm(actual_rent_yoy ~ t, data = cpi_model_data)
future_periods <- tibble(
month_date = seq(max(cpi_model_data$month_date) %m+% months(1), by = "1 month", length.out = 6)
) |>
mutate(
t = max(cpi_model_data$t) + row_number(),
fitted = predict(lm_rent, newdata = cur_data())
)
forecast_plot_data <- bind_rows(
cpi_model_data |>
transmute(month_date, value = actual_rent_yoy, type = "فعلي"),
future_periods |>
transmute(month_date, value = fitted, type = "متوقع")
)
forecast_plot_data |>
ggplot(aes(x = month_date, y = value, linetype = type, color = type)) +
geom_line(linewidth = 1) +
geom_point(data = subset(forecast_plot_data, type == "فعلي"), size = 2) +
scale_x_date(date_labels = "%Y-%m", date_breaks = "1 month") +
scale_y_continuous(labels = function(x) paste0(round(x, 1), "%")) +
labs(
title = "اتجاه متوقع قصير الأجل لمعدل نمو الإيجارات الرسمية",
subtitle = "توقع خطي استكشافي مبني على النقاط المتاحة فقط",
x = NULL,
y = "التغير السنوي في الإيجارات",
linetype = NULL,
color = NULL
) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
future_periods |>
transmute(
الشهر = format(month_date, "%Y-%m"),
`التغير المتوقع في الإيجارات %` = round(fitted, 2)
) |>
kable(caption = "توقعات استكشافية قصيرة الأجل لمعدل نمو الإيجارات")
| الشهر | التغير المتوقع في الإيجارات % |
|---|---|
| 2026-02 | 3.58 |
| 2026-03 | 2.70 |
| 2026-04 | 1.83 |
| 2026-05 | 0.95 |
| 2026-06 | 0.07 |
| 2026-07 | -0.81 |
يوحي الاتجاه الخطي البسيط بأن نمو الإيجارات الرسمية قد يواصل التراجع التدريجي في الزخم خلال الأجل القصير. لكن الأهم هنا هو التمييز بين تباطؤ النمو وانخفاض الأسعار؛ فالمؤشر قد ينخفض من 5% إلى 4% مثلًا، وهذا يعني أن الأسعار ما زالت ترتفع ولكن بسرعة أقل. كما أن هذا التوقع ينبغي التعامل معه بوصفه إشارة مرجعية لا نموذجًا تنبؤيًا حاسمًا، لأن السلسلة الزمنية المتاحة قصيرة ومركبة منهجيًا.
answers_tbl <- tibble(
`سؤال البحث` = c(
"ما حجم الإيجار داخل سوق السكن السعودي؟",
"ما الشريحة السعرية الأكثر انتشارًا؟",
"هل الضغط الإيجاري متجانس جغرافيًا؟",
"ما نوع السكن المهيمن على السوق؟",
"كيف انعكس الإيجار على التضخم الرسمي؟",
"هل تظهر أنماط سوقية مختلفة بين المناطق؟",
"ما الاتجاه القصير الأجل المتوقع؟"
),
`الإجابة المختصرة` = c(
paste0("يمثل الإيجار نحو ", fmt_pct(rent_share, 1), " من المساكن المشغولة بأسر سعودية."),
paste0("شريحة 10–20 ألف هي الأكبر بنسبة ", fmt_pct(mid_band_share, 1), "."),
"لا، بل يبدو الضغط أكثر تركّزًا في أسواق كبرى وعلى رأسها الرياض.",
paste0("الشقق هي النوع الغالب بنسبة ", fmt_pct(apartment_share, 1), "."),
"كان الإيجار من أهم محركات التضخم في النشرات الرسمية المتاحة.",
"نعم، وتُظهر العنقدة ثلاثة أنماط تقريبية من الأسواق.",
"تباطؤ تدريجي في معدل النمو، لا هبوط واسع في الأسعار الاسمية."
)
)
kable(answers_tbl, caption = "إجابات مختصرة عن أسئلة البحث")
| سؤال البحث | الإجابة المختصرة |
|---|---|
| ما حجم الإيجار داخل سوق السكن السعودي؟ | يمثل الإيجار نحو 32.1% من المساكن المشغولة بأسر سعودية. |
| ما الشريحة السعرية الأكثر انتشارًا؟ | شريحة 10–20 ألف هي الأكبر بنسبة 50.1%. |
| هل الضغط الإيجاري متجانس جغرافيًا؟ | لا، بل يبدو الضغط أكثر تركّزًا في أسواق كبرى وعلى رأسها الرياض. |
| ما نوع السكن المهيمن على السوق؟ | الشقق هي النوع الغالب بنسبة 83.5%. |
| كيف انعكس الإيجار على التضخم الرسمي؟ | كان الإيجار من أهم محركات التضخم في النشرات الرسمية المتاحة. |
| هل تظهر أنماط سوقية مختلفة بين المناطق؟ | نعم، وتُظهر العنقدة ثلاثة أنماط تقريبية من الأسواق. |
| ما الاتجاه القصير الأجل المتوقع؟ | تباطؤ تدريجي في معدل النمو، لا هبوط واسع في الأسعار الاسمية. |
GASTAT Housing Statistics Bulletin 2024 XLSX
https://www.stats.gov.sa/documents/20117/2435273/Housing%2BStatistics%2BBulletin%2B2024.xlsx/39b944ce-2ca4-1a62-a2bd-8c9a1f6852b1?t=1748513711415
GASTAT CPI January 2025
https://www.stats.gov.sa/documents/20117/2066979/CPI%2BJan%2B2025-EN.pdf/11bb62e5-0e26-2690-72b3-390bbfa9b861?t=1739612772051
GASTAT CPI August 2025
https://www.stats.gov.sa/documents/d/guest/cpi-aug-2025-en-pdf
GASTAT CPI September 2025
https://www.stats.gov.sa/documents/20117/2435267/CPI%2BSep%2B2025-EN.pdf/a25a00ef-5d09-28cc-7e2d-0345587d1130?t=1760427947697
GASTAT CPI November 2025
https://www.stats.gov.sa/documents/20117/2435267/CPI%2BNov%2B2025-EN.pdf/88386cb6-37cd-5b83-2b0f-eadc6a091b2c?t=1765773711103
GASTAT CPI December 2025
https://www.stats.gov.sa/documents/20117/2435267/CPI%2BDec%2B2025-EN.pdf/ad3d3392-a4b1-1bef-ecc2-1c69614f8ffa?t=1768384832462
GASTAT CPI January 2026
https://www.stats.gov.sa/documents/d/guest/cpi-jan-2026-en-pdf
April 2023
https://momah.gov.sa/en/news/rental-index-records-increase?pageNumber=19
May 2023
https://momah.gov.sa/en/news/rental-index-reports-record-high
June 2023
https://momah.gov.sa/en/news/rental-index-reports-record-over
July 2023
https://momah.gov.sa/en/news/over-275000-transactions
August 2023
https://momah.gov.sa/en/news/rental-index-sets-record
September 2023 / REGA coverage
https://rega.gov.sa/en/media-center/news-announcements/rental-index-over-294-000-transactions-recorded-in-september/
Reuters on Riyadh rent freeze (2025)
https://www.reuters.com/world/middle-east/saudi-arabia-freezes-rent-hikes-riyadh-five-years-amid-price-surge-2025-09-25/
CBRE Saudi residential market report 2024
https://www.cbre.sa/insights/figures/saudi-arabia-residential-market-report-2024