تطبيق: كيف تتنبأ آلياً بنتيجة مباراة كرة قدم (2)؟


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

في هذا المقال، أطرح نموذج توقع لنتائج مباريات كرة القدم في دوري كأس ولي العهد الأمير محمد بن سلمان تم تطبيقه بناء على أحد أشهر الخوارزميات المستخدمة للتوقع في المجال الرياضي، توزيع بويسون (Poisson distribution)(1). توزيع بويسون يصنف كتوزيع احتمالات متفردة (discrete probability distribution) حيث تعبّر نتائجه عن احتمالية ظهور حدث ما خلال فترة زمنية محددة بناءً على أحداث سابقة. المميز في هذه الطريقة، أن نتيجة التوقع تبنى على ربط اسم كل فريق بقدرات الفريق في الهجوم والدفاع وادخال الأهداف. اسم الفريق بحد ذاته لا يحمل أي معلومة عن نتيجة المباراة، ولكن توزيع بويسون مبني على معلومات سابقة عن الفريق مربوطة باسمه بحيث يستطيع توقع ادائه بدون الحاجة لأي مدخلات أخرى غير الاسم. بعكس خوارزميات الانحدار (regression algorithms) على سبيل المثال، حيث أن توقع العلاقة بين عدد المرات التي يفوز فيها الفريق في الدوري وعدد الأهداف التي حققها يعتمد كلياً على توفير عدد الأهداف مباشرة للخوارزمية ولا يمكن توقع النتيجة عن طريق اسم الفريق. إضافة إلى ذلك، يمكن فقط توقع عدد مرات الفوز لفريق واحد، بينما يصعب توقع عدد الأهداف المسجلة من الفريق أ ضد الفريق ب.

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


البيانات
لبناء نموذج ذكي يتوقع نتائج مباريات كأس ولي العهد، نحتاج إلى البيانات المتاحة عن المباريات السابقة في الدوري. للمحافظة على بساطة المقال، نقتصر في بناء النموذج على استخدام عدد الأهداف المسجلة من كلا الفريقين في كل مباراة. لجمع المعلومات، يمكن تقشيرنتائج المباريات من موقع kooora.com. باستخدام مكتبة التقشير في بايثون (Beautifulsoup4) استطعت جمع معلومات جميع المباريات السابقة في الدوري ابتداءً من شهر أغسطس 2018 وحتى شهر مارس 2019. مناقشة طريقة التقشير خارج إطار المقال.
النتيجة ملف قيم معزولة بالفاصلة (comma separated values .csv) مرتب كالتالي:


البيانات تتلخص في نتائج 195 مباراة منذ بداية دوري كأس الأمير محمد بن سلمان وحتى المباراة السابقة لديربي الرياض (النصر vs الهلال). الخطوة التالية هي بناء النموذج وتدريبه على توقع نتائج المباريات.

الخوارزمية
بناء نموذج توقُع مُعتمِد على توزيع بويسون يتم باستيراد مكتبة الإحصاء (statsmodels) في لغة بايثون (Python).


1
2
3
# importing the tools required for the Poisson regression model
import statsmodels.api as sm
import statsmodels.formula.api as smf


تطبيق النموذج يمكن الرجوع فيه لتوثيق المكتبة (library documentation) أو مدونة عالم البيانات ديفيد شيهان حيث قام ببناء نموذج مشابه هنا (2). من مكتبة (statsmodel.formula.api) أو (smf) نستدعي المهمة (glm) اختصار لـ(generalized linear model) كما الكود التالي.


1
2
poisson_model = smf.glm(formula="goals ~ home + team + opponent", data=goal_model_data, 
                 family=sm.families.Poisson()).fit()


المتغير (formula) ترميز للبيانات المستخدمة. حيث يرمز الاسم (home) للفريق التي تجري المباراة على ارضه. بينما الاسمين (team, opponent) يرمزان للفريقين في المباراة. المتغير (data) يحتوي كل المعلومات السابق ذكرها عن جميع المباريات الـ 195 في دوري كأس ولي العهد. المتغير (family) يرمز إلى الخوارزمية المراد تدريب النموذج عليها، في حالتنا خوارزمية بويسون.
نستخدم الدالة (fit) ليتم تدريب نموذج بويسون الذي قمنا ببنائه على البيانات التي تم توفيرها. يتم حفظ النموذج الذكي في المتغير(poisson_model) لاستخدامه لاحقاً في توقع النتائج.


ماذا يعني تدريب النموذج؟ ما الذي يحصل تحديداً؟
في هذه الخطوة يقوم البرنامج بحساب متوسط الأهداف في الدوري، متوسط الأهداف في حال كان الفريق مستضيف أو زائر، بالإضافة لمعلومات أخرى. يقوم بعدها بحساب قوة الهجوم وقوة الدفاع بناء على المعلومات المستخرجة سابقاً. أخيراً، يقوم باستخدام قوانين توزيع بويسون للتنبؤ باحتمالية فوز فريق على الآخر مع التنبؤ بعدد الأهداف المتوقع تسجيلها من كل فريق. المثال التالي كفيل بتوضيح الفكرة.
من أصل 195 مباراة في الدوري، بلغ عدد الأهداف المسجلة من قِبل فريق في أرضه 293 هدف، أي بمعدل 293 ÷ 195 ما يساوي 1.5 هدف في أرض الفريق.
بينما بلغ عدد الأهداف المسجلة من قِبل فريق في زائر 241 هدف، أي بمعدل 241 ÷ 195 ما يساوي 1.2 هدف في أرض الخصم. وهو مايتماشى مع نظرية أن الفريق يسجل أهداف أكثر عندما تكون المباراة على أرضه.
يقوم النموذج بعدها بتلقي الفريقين للمباراة المراد التنبؤ بنتيجتها ويبدأ بحساب قيمة لـ"قوة الهجوم" و"قوة الدفاع".
نختار توقع نتيجة مباراة بين نادي الفيحاء والتعاون، وهي المباراة التالية في الدوري (المباراة لم تحصل بعد أثناء كتابة المقال)
نبدأ بحساب "قوة الهجوم" لكلا الفريقين. قوة الهجوم تتلخص في نسبة معدل أهداف الفريق في أرضه إلى متوسط أهداف الفرق في أرضها في كامل الدوري (هذه القيمة هي القيمة 1.5 التي سبق حسابها).
قوة هجوم نادي الفيحاء: (20 ÷ 11) ÷ (1.5) = 1.21
قوة هجوم نادي التعاون: (16 ÷ 13) ÷ (1.5) = 0.82
وبنفس الطريقة، يتم حساب قيمة "قوة الدفاع" حيث نقسم معدل أهداف الفريق في أرض الخصوم على متوسط أهداف الفرق في أرض الخصوم في كامل الدوري (هذه القيمة هي القيمة 1.2 التي سبق حسابها).
قوة دفاع نادي الفيحاء: (22 ÷ 13) ÷ 1.2 = 1.41
قوة دفاع نادي التعاون:  (12 ÷ 12) ÷ 1.2 = 0.83
بالنظر للقيم يمكن توقع فوز الفيحاء على التعاون. بالنسبة لاحتماليات عدد الأهداف في المباراة، يتم حسابها باستخدام القيم السابقة عن طريق توزيع بويسون. الحسابات وراء التوزيع معقدة وخارج نطاق المقال.

التوقعات
الجزء الممتع من بناء أي نموذج هو رؤية توقّعات النظام ومدى صحتها. لنبدأ بديربي الرياض (مباراة النصر والهلال) ونرى توقعّات النظام ومدى صحتها.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from scipy.stats import poisson
def simulate_match(foot_model, homeTeam, awayTeam, max_goals=10):
    home_goals_avg = foot_model.predict(pd.DataFrame(data={'team': homeTeam, 
                                                            'opponent': awayTeam,'home':1},
                                                      index=[1])).values[0]
    away_goals_avg = foot_model.predict(pd.DataFrame(data={'team': awayTeam, 
                                                            'opponent': homeTeam,'home':0},
                                                      index=[1])).values[0]
    team_pred = [[poisson.pmf(i, team_avg) for i in range(0, max_goals+1)] for team_avg in [home_goals_avg, away_goals_avg]]
    predicted_results = np.outer(np.array(team_pred[0]), np.array(team_pred[1]))
    extract_knowledge(predicted_results, homeTeam, awayTeam)

1
simulate_match(poisson_model, 'Alnasr', 'Alhilal', max_goals=4)

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

النصر vs الهلال
2:3

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

في مباراة أحد والشباب، فاز الشباب بهدفين مقابل واحد. توقعات النظام كانت كالتالي:

أحد vs الشباب
2:1

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

المباراة التالية كانت بين الفيحاء والأهلي بنتيجة 0:2 لصالح الأهلي. نتيجة توقع النظام كالتالي:

الفيحاء vs الأهلي
2:0
فوز الأهلي متوقع بنسبة عالية. توقع النظام أن الفيحاء سينهي المباراة بهدف واحد أو أقل بينما الأهلي وبنسبة عالية جداً سيحصل على هدفين. توقّع ممتاز من النظام.

المباراة التالية وهي مباراة النصر والرائد كانت نتائجها غير متوقعة أبداً وبالتالي لم يصب النظام في توقع عدد الأهداف بينما توقّع فوز النصر.

كان التعادل نتيجة مباراة الفيصلي والفتح وكانت هذه نتائج النظام

الفيصلي vs الفتح
1:1

مع أن النظام يتوقع التعادل بنسبة %25 فقط، استطاع النظام توقع أعلى نسبة لنتيجة المباراة للنتيجة 1:1.

كل هذه التوقعات لمباريات انعقدت مسبقاً لكن لم يتم ادراجها في تدريب النظام. سأحاول الآن توقّع نتائج مباراتي يوم السبت (اليوم) عن طريق النموذج المبني. 

الفيحاء vs التعاون

الوحدة vs الإتفاق


ما رأيكم بالنتائج؟ هل هي منطقية أم تبدو غير واقعية؟

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

سماء قزاز
Twitter: @SamaTG

المراجع
(1) Frank A. Haight (1967). Handbook of the Poisson Distribution. New York: John Wiley & Sons

Comments

  1. كيف يمكننى استخدامه ؟

    ReplyDelete
  2. In 2017, NCAA President Mark Emmert talked about Las Vegas possibly internet hosting the NCAA Division I males's basketball tournament sooner or later. The United States National Football League was beforehand totally in opposition to any 우리카지노 type of legalization of sports betting previous to the late 2010s, strongly protesting it as to not bring corruption into the game. Online sports betting is a gray area and is not banned by any particular regulation in the Indian authorized system. That is as a result of|as a outcome of} specific provisions distinguish between games of likelihood and games of talent. One of these pieces recently witnessed a spike in engagement on the site throughout a shutdown in play.

    ReplyDelete

Post a Comment