72.3%
+18.4
3.2%
104B
8.7≈
+2.1%

1 المقدمة

تمثل السياحة الداخلية أحد المحركات الأساسية لتنويع الاقتصاد السعودي، حيث تعكس حركة التنقل بين المناطق أنماطًا مختلفة من الإنفاق، مدة الإقامة، وأغراض الزيارة. في هذا التحليل، نستخدم بيانات رسمية للسياحة الداخلية في المملكة العربية السعودية للفترة من يناير 2018 إلى ديسمبر 2023، مدمجة مع بيانات مناخية من وكالة NASA (POWER)، بهدف فهم العلاقة بين حركة السياحة، السلوك الاستهلاكي، والعوامل المناخية.

يعتمد التحليل على بيانات شهرية ثنائية الاتجاه (منطقة المنشأ – منطقة الوجهة)، مع تصنيف الزيارات حسب الغرض (ترفيه، أعمال، زيارة أقارب VFR، أخرى). يهدف هذا العمل إلى تقديم رؤى كمية داعمة لصنّاع القرار، وتمكين تطوير مؤشرات أداء تساعد في التخطيط السياحي المستدام.

2 أسئلة الدراسة

1- كيف تطورت حركة السياحة الداخلية بين مناطق المملكة خلال الفترة 2018–2023؟

2- ما الفروقات في عدد الرحلات، الإنفاق، وليالي المبيت حسب غرض الزيارة؟

3- هل توجد علاقة إحصائية بين درجة الحرارة وحركة السياحة أو مدة الإقامة؟ 4- ما المناطق الأكثر جذبًا للسياحة الداخلية من حيث: - عدد الرحلات؟ -متوسط الإنفاق؟ -متوسط الليالي؟

5- هل يمكن تصنيف السنوات (قبل/بعد الجائحة مثلًا) باستخدام خصائص السياحة والمناخ؟

6- إلى أي مدى يمكن التنبؤ بحركة السياحة المستقبلية باستخدام نماذج الانحدار؟

3 البيانات والمنهجية

3.1 مصادر البيانات

df = read.csv("tourism_with_temps.csv")

3.2 معالجة البيانات والتحقق من الجودة

df = df %>%
  mutate(
    date = as.Date(paste(year, month, "01", sep = "-")),
    visitPurposeEn = factor(visitPurposeEn),
    originProvinceNameEn = factor(originProvinceNameEn),
    destinationProvinceNameEn = factor(destinationProvinceNameEn)
  )

df$origin_temp[is.na(df$origin_temp)] =
  mean(df$origin_temp, na.rm = TRUE)

df$destination_temp [is.na(df$destination_temp )] =
  mean(df$destination_temp , na.rm = TRUE)

df = df %>%
  mutate(
    spend_per_trip = spendSAR / trips,
    nights_per_trip = nights / trips,
    temp_diff = abs(origin_temp - destination_temp)
  )

4 التحليل الزمني لحركة السياحة الداخلية

df %>%
  group_by(year) %>%
  summarise(
    total_trips = sum(trips),
    total_spend = sum(spendSAR),
    avg_nights = mean(nights_per_trip)
  ) %>%
  ggplot(aes(year, total_trips)) +
  geom_line() +
  labs(title = "تطور عدد الرحلات السياحية الداخلية")

تفسير:

يعكس هذا الشكل المسار الزمني لحركة السياحة الداخلية في المملكة خلال الفترة 2018–2023، حيث تظهر البيانات قصة قطاع مرّ بمرحلة اختبار حقيقية ثم عاد بقوة. فبعد نمو ملحوظ في عام 2019، شهدت السياحة الداخلية تراجعًا حادًا في عام 2020 نتيجة القيود الصحية العالمية، قبل أن تبدأ مرحلة تعافٍ واضحة اعتبارًا من عام 2021.

اللافت في البيانات ليس فقط العودة إلى مستويات ما قبل الجائحة، بل تجاوزها بشكل ملحوظ في عامي 2022 و2023، ما يشير إلى تحوّل السياحة الداخلية إلى خيار أساسي لدى السكان، وليس مجرد بديل مؤقت. هذا النمو يعكس نجاح السياسات الداعمة للقطاع، وتزايد الطلب على الوجهات المحلية، وتنوع الأنشطة السياحية داخل المملكة.

5 تحليل الارتباط بين المتغيرات السياحية والمناخية

num_vars = df %>%
  select(trips, spendSAR, nights, origin_temp, destination_temp)
colnames(num_vars) = c(
  "عدد الرحلات",
  "إجمالي الإنفاق (ريال)",
  "عدد الليالي",
  "درجة حرارة منطقة الانطلاق",
  "درجة حرارة منطقة الوجهة"
)

cor_mat = cor(num_vars, use = "complete.obs")

corrplot(
  cor_mat,
  method = "color",
  type = "upper",
  tl.col = "black",
  tl.srt = 45,
  title = "تحليل الارتباط بين المتغيرات السياحية والمناخية",
  mar = c(0,0,2,0)
)

تفسير:

تكشف مصفوفة الارتباط عن العلاقة الوثيقة بين النشاط السياحي والأثر الاقتصادي المصاحب له، حيث يظهر ارتباط قوي بين عدد الرحلات السياحية وحجم الإنفاق، إضافة إلى عدد ليالي المبيت. هذا يعني أن زيادة حركة السياحة لا ترفع عدد الزوار فقط، بل تعزز القيمة الاقتصادية للقطاع بشكل مباشر.

في المقابل، تبدو العلاقة بين درجات الحرارة والمتغيرات السياحية أقل وضوحًا، مما يشير إلى أن المناخ يلعب دورًا مساعدًا في تشكيل التجربة السياحية، دون أن يكون العامل الحاسم الوحيد في قرار السفر داخل المملكة.

6 تحليل المطابقة (Correspondence Analysis)

6.1 إعداد جدول التوافق بين مناطق الوجهة وأغراض الزيارة

ca_data = df %>%
  group_by(destinationProvinceNameEn, visitPurposeEn) %>%
  summarise(trips = sum(trips), .groups = "drop") %>%
  pivot_wider(
    names_from = visitPurposeEn,
    values_from = trips,
    values_fill = 0
  )

ca_matrix = ca_data %>%
  column_to_rownames("destinationProvinceNameEn") %>%
  as.matrix()
ca_matrix
##                   Business    Leisure      Other      VFR Religious
## Albaha            201020.8  3529107.0   79703.72  3610660         0
## Alqassim         1196696.7  3969137.1  330488.88 11444845         0
## Aseer            1558468.5 17055500.3  835741.08 13147003         0
## Eastern          2739838.5 24882822.0 1458681.09 17679294         0
## Hail              500685.6  1851328.9  122400.18  6283890         0
## Jazan             513583.2  7900949.8  174455.32  6743219         0
## Jouf              492182.6  1261658.1  110234.17  3071641         0
## Madinah           800659.7  7469023.5  215624.34  7450907  20057542
## Makkah           4817074.6 44383417.0 2324673.43 23475165  30180885
## Najran            640267.8   963446.1  192888.49  3134396         0
## Northern Borders  334270.9  1393750.2   39368.63  2524253         0
## Riyadh           7760563.7 23182624.9 7111595.75 23115175         0
## Tabuk            1114282.3  6619719.7  160941.63  4550472         0
ca_res = CA(ca_matrix, graph = FALSE)

6.2 تفسير الأبعاد ونسبة التباين المفسّر

eig_df = as.data.frame(ca_res$eig)

colnames(eig_df) = c(
  "Eigenvalue",
  "Percentage of Variance",
  "Cumulative Percentage"
)

eig_df$Dimension = paste0("Dim ", seq_len(nrow(eig_df)))

eig_df = eig_df %>%
  select(Dimension, everything())
knitr::kable(
  eig_df,
  digits = 2,
  caption = "Eigenvalues and Explained Variance of Correspondence Analysis"
)
Eigenvalues and Explained Variance of Correspondence Analysis
Dimension Eigenvalue Percentage of Variance Cumulative Percentage
dim 1 Dim 1 0.30 77.45 77.45
dim 2 Dim 2 0.04 11.24 88.69
dim 3 Dim 3 0.04 10.86 99.55
dim 4 Dim 4 0.00 0.45 100.00

تفسير:

يُظهر جدول Eigenvalues أن البُعدين الأولين يفسِّران الجزء الأكبر من التباين في البيانات، مما يبرر الاعتماد عليهما في تمثيل وتحليل العلاقات بين مناطق الوجهة وأغراض الزيارة. ويعكس ذلك وجود أنماط سياحية واضحة يمكن تفسيرها بصريًا باستخدام مخطط تحليل المطابقة.

6.3 تحليل المطابقة بين مناطق الوجهة وأغراض الزيارة

fviz_ca_biplot(
  ca_res,
  repel = TRUE,
  col.row = "#1f77b4",
  col.col = "#d62728",
  alpha.row = 0.9,
  alpha.col = 1,
  label = "all",
  pointsize = 4,              
  labelsize = 5,              
  ggtheme = theme_minimal(base_size = 18)  
) +
  labs(
    title = "تحليل المطابقة بين مناطق الوجهة وأغراض الزيارة",
    subtitle = "تمثيل بصري للعلاقات والأنماط السياحية الداخلية",
    x = "البعد الأول",
    y = "البعد الثاني"
  ) +
  theme(
    plot.title = element_text(size = 22, face = "bold"),
    plot.subtitle = element_text(size = 16),
    axis.title = element_text(size = 16),
    axis.text = element_text(size = 13)
  )

تفسير: يوضح مخطط تحليل المطابقة العلاقات البصرية بين مناطق الوجهة وأغراض الزيارة في السياحة الداخلية، حيث يشير القرب المكاني بين النقاط إلى وجود ارتباط قوي بين المنطقة وغرض الزيارة المرتبط بها. ويُلاحظ بوضوح تمركز مكة المكرمة والمدينة المنورة بالقرب من غرض الزيارة الدينية، مما يؤكد طبيعتهما كوجهات دينية متخصصة داخل المملكة.

في المقابل، تظهر مدينة الرياض أقرب إلى غرض سياحة الأعمال، وهو ما يعكس دورها الاقتصادي والإداري كمركز للأعمال. أما غالبية المناطق الأخرى، مثل المناطق الشرقية والجنوبية، فتتجمع حول أغراض الترفيه وزيارة الأقارب (VFR)، ما يشير إلى نمط سياحي عام ومتعدد الاستخدامات.

كما تمثل الفئات البعيدة عن مركز الرسم أنماطًا سياحية أكثر تخصصًا أو أقل شيوعًا، في حين تعكس النقاط القريبة من المركز مناطق ذات تنوع في أغراض الزيارة دون هيمنة غرض واحد. وتساعد هذه النتائج في فهم الخصائص السياحية لكل منطقة، وتدعم توجيه السياسات والاستثمارات السياحية بناءً على طبيعة الطلب الفعلي.

6.4 تطور أنماط أغراض الزيارة عبر الزمن

ca_year = df %>%
  group_by(year, visitPurposeEn) %>%
  summarise(trips = sum(trips), .groups = "drop") %>%
  pivot_wider(
    names_from = visitPurposeEn,
    values_from = trips,
    values_fill = 0
  )

ca_year_matrix = ca_year %>%
  column_to_rownames("year") %>%
  as.matrix()

ca_year_res = CA(ca_year_matrix, graph = FALSE)

fviz_ca_biplot(
  ca_year_res,
  repel = TRUE,
  col.row = "#1f77b4",     
  col.col = "#d62728",    
  alpha.row = 0.9,
  alpha.col = 1,
  label = "all",
  pointsize = 4,          
  labelsize = 5,          
  ggtheme = theme_minimal(base_size = 18)
) +
  labs(
    title = "تحليل المطابقة بين السنوات وأغراض الزيارة السياحية",
    subtitle = "تطور أنماط أغراض الزيارة في السياحة الداخلية عبر الزمن",
    x = "البعد الأول",
    y = "البعد الثاني"
  ) +
  theme(
    plot.title = element_text(size = 22, face = "bold"),
    plot.subtitle = element_text(size = 16),
    axis.title = element_text(size = 16),
    axis.text = element_text(size = 13)
  )

تفسير:

عند تحليل أغراض الزيارة عبر السنوات، تظهر تغيرات واضحة في سلوك السياح الداخليين، حيث تتأثر بعض الأغراض بالأحداث الخارجية بشكل أكبر، بينما تحافظ أغراض أخرى على استقرارها النسبي. ويعكس هذا التباين قدرة السياحة الداخلية على التكيّف مع المتغيرات الاقتصادية والاجتماعية.

تشير النتائج إلى أن مرونة أغراض الزيارة تمثل عنصر قوة للقطاع السياحي، وتفتح المجال أمام تصميم منتجات سياحية متنوعة تستهدف احتياجات مختلفة عبر الزمن.

7 نمذجة تعلم الآلة وتصنيف الفترات الزمنية

df_year = df %>%
  group_by(year) %>%
  summarise(
    trips = sum(trips),
    spend = sum(spendSAR),
    avg_temp = mean(destination_temp),
    .groups = "drop"
  )

cluster_data = df_year %>%
  select(trips, spend, avg_temp)

cluster_scaled = scale(cluster_data)

dist_mat = dist(cluster_scaled, method = "euclidean")
hc = hclust(dist_mat, method = "ward.D2")

plot(
  hc,
  labels = df_year$year,
  cex = 1.1,
  hang = -1,
  main = "التحليل العنقودي الهرمي للنشاط السياحي الداخلي (2018–2023)",
  xlab = "Year",
  ylab = "Distance"
)

rect.hclust(hc, k = 3, border = c("red", "blue"))

تفسير: يعكس التحليل العنقودي وجود ثلاث مراحل زمنية متميزة في السياحة الداخلية: مرحلة ما قبل الجائحة، سنة التحول (2020)، ومرحلة التعافي والنمو. ويبرز هذا التقسيم قدرة البيانات على التقاط التحولات الهيكلية في النشاط السياحي دون افتراضات مسبقة.

8 كيف تغيّر متوسط إنفاق السائح الداخلي بين مناطق المملكة بعد الجائحة؟

# =========================================
# Spatial Analysis: Change in Average Tourist Spending per Trip (2019–2023)
# =========================================

# Load Saudi Arabia administrative regions (ADM1 level)
shp = ne_states(
  country = "Saudi Arabia",
  returnclass = "sf"
)

# Create a standardized key from map region names
shp = shp %>%
  mutate(
    prov_key = str_to_lower(str_trim(name_en))
  )

# =========================================
# Calculate average spending per trip for selected years
# =========================================
avg_spend_year = df %>%
  filter(year %in% c(2019, 2023)) %>%
  group_by(year, destinationProvinceNameEn) %>%
  summarise(
    avg_spend = mean(spend_per_trip, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(
    prov_key = str_to_lower(str_trim(destinationProvinceNameEn))
  )

# =========================================
# Reshape data to wide format and compute difference
# =========================================
avg_spend_wide = avg_spend_year %>%
  pivot_wider(
    names_from = year,
    values_from = avg_spend,
    names_prefix = "avg_spend_"
  ) %>%
  mutate(
    diff_spend_23_19 = avg_spend_2023 - avg_spend_2019
  )

# =========================================
# Harmonize province names between datasets
# =========================================
name_fix = c(
  "eastern province" = "eastern",
  "ash sharqiyah"    = "eastern",
  "al jouf"          = "al-jowf",
  "jouf"             = "al-jowf",
  "asir"             = "asir",
  "aseer"            = "asir",
  "jazan"            = "jazan",
  "jizan"            = "jazan",
  "madinah"          = "al madinah",
  "al madinah"       = "al madinah",
  "makkah"           = "makkah",
  "makkah al mukarramah" = "makkah",
  "al qassim"        = "al-qassim",
  "qassim"           = "al-qassim",
  "hail"             = "ha'il",
  "ha'il"            = "ha'il",
  "al bahah"         = "al-baha",
  "albaha"           = "al-baha"
)

avg_spend_wide = avg_spend_wide %>%
  mutate(
    prov_key = str_to_lower(str_trim(destinationProvinceNameEn)),
    prov_key = ifelse(
      prov_key %in% names(name_fix),
      name_fix[prov_key],
      prov_key
    )
  )

# =========================================
# Join tourism data with spatial data
# =========================================
sa_map_df = shp %>%
  left_join(avg_spend_wide, by = "prov_key")

# =========================================
# Define diverging color palette (increase vs decrease)
# =========================================
pal = colorNumeric(
  palette = "RdYlGn",
  domain = sa_map_df$diff_spend_23_19,
  na.color = "grey90"
)

# =========================================
# Create interactive Leaflet map
# =========================================
leaflet(sa_map_df) %>%
  addProviderTiles("CartoDB.Positron") %>%
  addPolygons(
    fillColor = ~pal(diff_spend_23_19),
    color = "#444444",
    weight = 0.6,
    opacity = 1,
    fillOpacity = 0.8,
    popup = ~paste0(
      "<b>", name_en, "</b><br/>",
      "Average spending 2019: ",
      comma(round(avg_spend_2019, 1)), " SAR<br/>",
      "Average spending 2023: ",
      comma(round(avg_spend_2023, 1)), " SAR<br/>",
      "<b>Change (2023 − 2019): </b>",
      comma(round(diff_spend_23_19, 1)), " SAR"
    ),
    label = ~paste0(
      name_en, ": ",
      comma(round(diff_spend_23_19, 1)), " SAR"
    )
  ) %>%
  addLegend(
    position = "bottomright",
    pal = pal,
    values = ~diff_spend_23_19,
    title = "Change in Avg Spending (SAR)",
    labFormat = labelFormat(suffix = " SAR")
  )

توضيح: توضح الخريطة التفاعلية التغير في متوسط الإنفاق لكل رحلة سياحية بين عامي 2019 و2023 على مستوى مناطق المملكة العربية السعودية. وتشير القيم الموجبة إلى تحسن في القيمة الاقتصادية للسياحة الداخلية بعد الجائحة، بينما تعكس القيم السالبة تراجعًا نسبيًا في بعض المناطق. وتساعد هذه النتائج في تقييم التعافي السياحي مكانيًا، وتحديد المناطق التي شهدت أكبر تحسن في العائد الاقتصادي للرحلة السياحية.

9 مؤشرات الأداء السياحي الرئيسية

مؤشرات الأداء السياحي الرئيسية
ملخص سريع لأهم مؤشرات السياحة الداخلية
متوسط الإنفاق لكل رحلة (ريال) متوسط عدد الليالي إجمالي عدد الرحلات
1,808.8 5.6 356,758,221.8
المؤشر القيمة

متوسط الإنفاق لكل رحلة (ريال)

1,808.8

متوسط عدد الليالي

5.6

إجمالي عدد الرحلات

356,758,221.8
ارتباط الرحلات بدرجة الحرارة
0.06

تفسير:

تشير مؤشرات الأداء السياحي إلى أن السياحة الداخلية في المملكة تحقق قيمة اقتصادية مرتفعة على مستوى الرحلة الواحدة، حيث يعكس متوسط الإنفاق لكل رحلة مستوى إنفاق جيد مقارنة بمدة الإقامة. كما يظهر متوسط عدد الليالي أن السياحة الداخلية تميل في الغالب إلى الرحلات القصيرة إلى المتوسطة، وهو ما يتماشى مع طبيعة السفر الداخلي.

من جانب آخر، يعكس إجمالي عدد الرحلات الحجم الكبير للنشاط السياحي المحلي، مما يؤكد الدور المتنامي للسياحة الداخلية كأحد محركات الطلب السياحي. أما مؤشر حساسية السياحة للتغير المناخي، فيشير إلى وجود علاقة ضعيفة نسبيًا بين عدد الرحلات ودرجة الحرارة، ما يدل على أن العوامل الاقتصادية والاجتماعية تلعب دورًا أكبر من العوامل المناخية في قرارات السفر داخل المملكة.

10 النتائج الرئيسية والتوصيات

10.1 النتائج الرئيسية

تشير نتائج التحليل إلى أن السياحة الداخلية في المملكة العربية السعودية شهدت تحولًا واضحًا خلال الفترة 2018–2023، سواء من حيث حجم الحركة السياحية أو أنماطها الاقتصادية والسلوكية. فقد أظهر التحليل الزمني انخفاضًا حادًا في عدد الرحلات خلال عام 2020، تلاه تعافٍ سريع ونمو متسارع في السنوات اللاحقة، مما يعكس مرونة القطاع وقدرته على استعادة النشاط بعد الصدمات الخارجية.

كما أظهرت نتائج تحليل المطابقة (Correspondence Analysis) وجود تمايز واضح بين مناطق الوجهة من حيث أغراض الزيارة، حيث برزت بعض المناطق كوجهات متخصصة، مثل مكة المكرمة والمدينة المنورة المرتبطتين بالسياحة الدينية، في حين ارتبطت الرياض بشكل أكبر بسياحة الأعمال، بينما اتسمت بقية المناطق بأنماط سياحية عامة تتركز حول الترفيه وزيارة الأقارب.

وأكّد التحليل العنقودي الهرمي وجود ثلاث مراحل زمنية متميزة في السياحة الداخلية: مرحلة ما قبل الجائحة (2018–2019)، سنة التحول (2020)، ومرحلة التعافي والنمو (2021–2023). ويعكس هذا التقسيم حدوث تحول هيكلي في النشاط السياحي الداخلي، وليس مجرد تغيرات مؤقتة.

أما مؤشرات الأداء السياحي، فقد أوضحت أن السياحة الداخلية تحقق قيمة اقتصادية ملحوظة من حيث متوسط الإنفاق لكل رحلة، مع ميل عام نحو الإقامات القصيرة إلى المتوسطة. كما أظهرت النتائج أن العلاقة بين النشاط السياحي ودرجة الحرارة ضعيفة نسبيًا، مما يشير إلى أن العوامل الاقتصادية والسلوكية تلعب دورًا أكبر من العوامل المناخية في قرارات السفر داخل المملكة.

10.2 التوصيات

استنادًا إلى النتائج السابقة، يمكن تقديم مجموعة من التوصيات الداعمة لتطوير السياحة الداخلية وتعزيز أثرها الاقتصادي:

  1. تعزيز المنتجات السياحية قصيرة المدى:
    نظرًا لهيمنة الرحلات القصيرة نسبيًا، يُوصى بتطوير منتجات سياحية تستهدف عطلات نهاية الأسبوع والمواسم القصيرة، مع التركيز على التجارب المتكاملة التي تزيد من متوسط مدة الإقامة.

  2. تبني سياسات سياحية موجهة حسب طبيعة الوجهة:
    توضح النتائج أن المناطق السياحية تختلف في أدوارها، مما يستدعي تصميم سياسات واستثمارات سياحية متخصصة، مثل دعم السياحة الدينية في المناطق ذات الطابع الديني، وتعزيز سياحة الأعمال والفعاليات في المراكز الحضرية الكبرى.

  3. التركيز على رفع القيمة الاقتصادية للرحلة:
    بدلًا من التركيز فقط على زيادة عدد الرحلات، يُوصى بالعمل على رفع متوسط الإنفاق لكل رحلة من خلال تحسين جودة الخدمات، وتوسيع الأنشطة السياحية، وربط السياحة بالثقافة والترفيه.

  4. تعزيز استخدام البيانات في التخطيط السياحي:
    تُظهر هذه الدراسة أهمية التحليل الكمي في فهم أنماط السياحة الداخلية، ويوصى بتطوير لوحات مؤشرات دورية (Dashboards) تعتمد على البيانات الرسمية لدعم اتخاذ القرار وتقييم أثر المبادرات السياحية.

  5. مواصلة دعم السياحة الداخلية كركيزة للنمو المستدام:
    تعكس نتائج التعافي السريع بعد عام 2020 أهمية السياحة الداخلية كعنصر استراتيجي في تنويع الاقتصاد، مما يستدعي استمرار دعمها ضمن برامج التنمية السياحية على المدى المتوسط والطويل.

10.3 خاتمة

تؤكد نتائج هذا التحليل أن السياحة الداخلية في المملكة تشهد تحولًا نوعيًا في حجمها وأنماطها، مع فرص واضحة لتعظيم أثرها الاقتصادي والاجتماعي. ويبرز دور البيانات والتحليل الإحصائي كأدوات أساسية لفهم هذا التحول ودعم التخطيط السياحي القائم على الأدلة.