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

1 المقدمة

تُعد مواجهات الهلال والنصر من أعرق وأهم الديربيات في كرة القدم السعودية، لما تحمله من قيمة تاريخية وجماهيرية عالية.

يهدف هذا التقرير إلى تحليل بيانات المواجهات التاريخية بين الفريقين خلال الفترة (1958–2025) باستخدام الأساليب الوصفية والتحليل الإحصائي البسيط، من أجل تقديم قراءة رقمية دقيقة يمكن الاستفادة منها إعلاميًا أو بحثيًا.

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

  1. من الفريق الأكثر فوزًا في تاريخ مواجهات الهلال والنصر؟
  2. كيف توزّعت نتائج المباريات بين فوز وتعادل؟
  3. ما متوسط عدد الأهداف في مباريات الديربي؟
  4. ما أكبر النتائج من حيث فارق الأهداف؟
  5. هل تؤثر أفضلية الأرض (الاستضافة) على احتمالية الفوز؟

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

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

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

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

df_clean = df %>%
  filter(الفايز %in% c("الهلال", "النصر", "تعادل")) %>%
  mutate(
    goals_home = as.numeric(str_extract(النتيجة, "^\\d+")),
    goals_away = as.numeric(str_extract(النتيجة, "\\d+$")),

    hilal_goals = case_when(
      المستضيف == "الهلال" ~ goals_home,
      المستضيف == "النصر"  ~ goals_away
    ),
    nasr_goals = case_when(
      المستضيف == "النصر"  ~ goals_home,
      المستضيف == "الهلال" ~ goals_away
    ),

    total_goals = hilal_goals + nasr_goals
  )

4 التحليل الوصفي

4.1 عدد نتائج المواجهات

df_clean %>%
  count(الفايز) %>%
  kable(col.names = c("النتيجة", "عدد المباريات"))
النتيجة عدد المباريات
النصر 64
الهلال 80
تعادل 49
ggplot(df_clean, aes(x = الفايز, fill = الفايز)) +
  geom_bar(show.legend = FALSE) +
  labs(
    title = "توزيع نتائج مواجهات الهلال والنصر عبر التاريخ",
    x = "نتيجة المباراة",
    y = "عدد المباريات"
  ) +
  theme_minimal()

تفسير:

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

4.2 تحليل الأهداف المتوقعة

4.2.1 متوسط أهداف الهلال حسب نتيجة المباراة

goals_analysis = df_clean %>%
  mutate(
    result_hilal = case_when(
      hilal_goals > nasr_goals ~ "فوز",
      hilal_goals < nasr_goals ~ "خسارة",
      TRUE ~ "تعادل"
    )
  )
hilal_goal_profile = goals_analysis %>%
  group_by(result_hilal) %>%
  summarise(
    متوسط_أهداف_الهلال = mean(hilal_goals, na.rm = TRUE),
    متوسط_أهداف_النصر = mean(nasr_goals, na.rm = TRUE),
    متوسط_إجمالي_الأهداف = mean(total_goals, na.rm = TRUE),
    عدد_المباريات = n(),
    .groups = "drop"
  )

hilal_goal_profile %>% kable()
result_hilal متوسط_أهداف_الهلال متوسط_أهداف_النصر متوسط_إجمالي_الأهداف عدد_المباريات
تعادل 1.3773585 1.3584906 2.489796 57
خسارة 0.6166667 2.0166667 2.633333 60
فوز 2.2631579 0.5921053 2.855263 76

4.2.2 متوسط أهداف النصر حسب نتيجة المباراة

nasr_goal_profile = goals_analysis %>%
  mutate(
    result_nasr = case_when(
      nasr_goals > hilal_goals ~ "فوز",
      nasr_goals < hilal_goals ~ "خسارة",
      TRUE ~ "تعادل"
    )
  ) %>%
  group_by(result_nasr) %>%
  summarise(
    متوسط_أهداف_النصر = mean(nasr_goals, na.rm = TRUE),
    متوسط_أهداف_الهلال = mean(hilal_goals, na.rm = TRUE),
    متوسط_إجمالي_الأهداف = mean(total_goals, na.rm = TRUE),
    عدد_المباريات = n(),
    .groups = "drop"
  )

تفسير:

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

4.2.3 توزيع فارق الأهداف (كيف تُحسم المباريات؟)

nasr_goal_profile %>% kable()
result_nasr متوسط_أهداف_النصر متوسط_أهداف_الهلال متوسط_إجمالي_الأهداف عدد_المباريات
تعادل 1.3584906 1.3773585 2.489796 57
خسارة 0.5921053 2.2631579 2.855263 76
فوز 2.0166667 0.6166667 2.633333 60
df_clean %>%
  mutate(goal_diff = abs(hilal_goals - nasr_goals)) %>%
  ggplot(aes(x = goal_diff)) +
  geom_bar(fill = "#1f77b4") +
  labs(
    title = "توزيع فارق الأهداف في مباريات ديربي الهلال والنصر",
    x = "فارق الأهداف",
    y = "عدد المباريات"
  ) +
  theme_minimal()
## Warning: Removed 8 rows containing non-finite outside the scale range
## (`stat_count()`).

تفسير

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

4.3 أكبر النتائج

df_clean %>%
  mutate(goal_diff = abs(hilal_goals - nasr_goals)) %>%
  arrange(desc(goal_diff)) %>%
  select(الموسم, البطولة, النتيجة, الفايز, goal_diff) %>%
  head(5) %>%
  kable(col.names = c("الموسم", "البطولة", "النتيجة", "الفائز", "فارق الأهداف"))
الموسم البطولة النتيجة الفائز فارق الأهداف
2017 دوري جميل للمحترفين 1-5 الهلال 4
2022 دوري الأمير محمد 4-0 الهلال 4
1964 كأس ولي العهد دور16 3-0 الهلال 3
1966 كأس الملك دور16 0-3 الهلال 3
1967 دوري المناطق 3-0 النصر 3
total_matches = nrow(df_clean)
wins = df_clean %>% count(الفايز)

hilal_tot_goals = sum(df_clean$hilal_goals, na.rm = TRUE)
nasr_tot_goals  = sum(df_clean$nasr_goals, na.rm = TRUE)
mean_total_goals = mean(df_clean$total_goals, na.rm = TRUE)

tibble(
  "عدد المباريات" = total_matches,
  "انتصارات النصر" = wins %>% filter(الفايز == "النصر") %>% pull(n) %>% replace_na(0),
  "انتصارات الهلال" = wins %>% filter(الفايز == "الهلال") %>% pull(n) %>% replace_na(0),
  "تعادلات" = wins %>% filter(الفايز == "تعادل") %>% pull(n) %>% replace_na(0),
  "إجمالي أهداف الهلال" = hilal_tot_goals,
  "إجمالي أهداف النصر" = nasr_tot_goals,
  "متوسط الأهداف لكل مباراة" = round(mean_total_goals, 3)
) %>% kable()
عدد المباريات انتصارات النصر انتصارات الهلال تعادلات إجمالي أهداف الهلال إجمالي أهداف النصر متوسط الأهداف لكل مباراة
193 64 80 49 282 238 2.686

تفسير:

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

تفسير

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

4.4 نموذج التنبؤ بالفائز

df_model = df %>%
  filter(الفايز %in% c("الهلال", "النصر")) %>%   # استبعاد التعادلات
  mutate(
    winner = if_else(الفايز == "الهلال", 1, 0),  # 1 = الهلال ، 0 = النصر
    host = if_else(المستضيف == "الهلال", 1, 0)
  )


model = glm(
  winner ~ host,
  data = df_model,
  family = binomial
)


new_match = tibble(host = 1)
prob = predict(model, new_match, type = "response")
new_match = tibble(host = 0)
prob = predict(model, new_match, type = "response")
df_model = df_model %>%
  mutate(
    pred_prob = predict(model, type = "response"),
    pred_class = if_else(pred_prob > 0.5, 1, 0)
  )

tibble(
  "نتيجة التنبؤ" = ifelse(
    mean(df_model$pred_class == df_model$winner) > 0.5,
    "🔵 فوز الهلال",
    "🟡 فوز النصر"
  ),
  "دقة النموذج" = round(mean(df_model$pred_class == df_model$winner), 3)
) %>%
  gt() %>%
  tab_header(
    title = md("**نتيجة نموذج التنبؤ**"),
    subtitle = "بناءً على نموذج الانحدار اللوجستي"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold", size = px(20)),
    locations = cells_body()
  )
نتيجة نموذج التنبؤ
بناءً على نموذج الانحدار اللوجستي
نتيجة التنبؤ دقة النموذج

🔵 فوز الهلال

0.604

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