Mendengar apa yang saya lakukan, orang cenderung menanyakan pertanyaan yang sama kepada saya:Dapatkah Anda mengembangkan sistem yang memprediksi hasil pertandingan sepak bola? Atau hasil medali Olimpiade? Secara pribadi, saya tidak terlalu percaya pada prediksi. Namun, jika kami memiliki sejumlah besar data historis dan indikator yang relevan, kami pasti dapat merancang sistem untuk membantu kami menghasilkan asumsi yang lebih akurat. Dalam artikel ini, kami akan mempertimbangkan model yang dapat menyimpan hasil pertandingan dan turnamen.
Model ini terutama berfokus pada pertandingan, statistik, dan hasil sepak bola Eropa, tetapi dapat dengan mudah diubah untuk mengakomodasi banyak olahraga lainnya. Motivasi utama saya untuk artikel ini adalah dua acara sepak bola besar tahun ini:Kejuaraan UEFA Euro 2016 yang baru saja terjadi, dan Pertandingan Olimpiade Musim Panas 2016 yang sedang berlangsung saat ini.
Apa yang Kami Ketahui Sebelum Turnamen Dimulai?
Sebelum turnamen dimulai, kami mengetahui hampir semua hal tentangnya — kecuali yang paling penting:siapa yang akan menang. Mari kita nyatakan secara singkat apa yang sudah kita ketahui:
- Tanggal dimulai dan berakhirnya turnamen
- Lokasi di mana pertandingan akan berlangsung
- Waktu yang tepat untuk memulai pertandingan
- Tim mana saja yang lolos ke turnamen
- Para pemain di masing-masing tim ini
- Kinerja masing-masing pemain di masa lalu dan performa mereka saat ini
Detail Kecocokan Apa yang Ingin Kami Simpan?
Turnamen terdiri dari beberapa pertandingan. Sebelum kami menyimpan detail kecocokan, kami perlu:
- Hubungkan setiap pertandingan dengan turnamen
- Rekam babak turnamen saat pertandingan dimainkan (mis. penyisihan grup, semi-final)
Kami juga perlu menyimpan detail untuk pertandingan tunggal, termasuk:
- Tim yang terlibat dalam pertandingan
- Starting lineup dan pergantian pemain
- Acara pertandingan (dalam sepak bola ini adalah:gol, penalti, pelanggaran, kartu kuning, dll.)
- Skor akhir
- Tindakan pemain selama pertandingan
Kami akan menggunakan data ini untuk merekam semua peristiwa pertandingan penting. Membandingkan performa pemain sebelum dan selama pertandingan bisa membawa pada kesimpulan tertentu. Mungkin kami tidak dapat memprediksi hasil akhir dari kinerja mereka (yaitu menang atau kalah), tetapi statistik pasti dapat membantu kami membuat asumsi dengan tingkat keandalan.
Memperkenalkan Model
Model ini dibagi menjadi empat bidang utama:
Tournament details
Match details
Events
Indicators and Performance
Tabel di luar area ini adalah kamus (sport
, phase
, position
), katalog (sport_event
, team
, player
) dan satu relasi banyak-ke-banyak (plays
).
Kami akan menjelaskan tabel yang tidak dikategorikan terlebih dahulu, lalu mengamati setiap area dari dekat.
Tabel Tanpa Kategori
Tabel ini penting karena tabel dari keempat area menggunakannya sebagai kamus atau katalog.
sport
tabel mencantumkan semua olahraga yang akan kami simpan di database kami. Kami mungkin hanya memiliki satu olahraga di sini, sepak bola pria, tetapi tabel ini memberi kami fleksibilitas untuk menambahkan olahraga serupa (misalnya sepak bola wanita) jika diperlukan.
Dalam sport_event
meja, kami akan menyimpan acara yang terkait dengan olahraga kami. Salah satu contohnya adalah “Olimpiade 2016”.
phase
table adalah kamus yang menampung semua kemungkinan tahapan turnamen. Ini berisi nilai-nilai seperti “tahap grup” , “babak 16 besar” , “perempat final” , “semifinal” , “akhir” .
team
tabel adalah, seperti yang Anda duga, daftar sederhana dari semua tim. Nilai yang mungkin adalah “Kroasia” , “Polandia” , “AS” dll. Jika kami menggunakan database untuk menyimpan informasi tentang kompetisi klub atau liga, kami juga akan memiliki nilai seperti “Barcelona” , “Real Madrid” , “Bayern” , “Manchester United” dll.
Di player
tabel, kami akan menyimpan catatan untuk semua pemain yang tergabung dalam tim terkait.
plays
tabel adalah satu-satunya hubungan banyak-ke-banyak kami, dan ini menghubungkan pemain dan tim. Seorang pemain dapat menjadi bagian dari lebih dari satu tim pada saat yang sama (misalnya tim nasional dan klub), tetapi selama turnamen mereka jelas hanya akan bermain untuk satu tim.
Akhirnya, kami memiliki position
meja. Kamus sederhana ini akan menyimpan daftar semua posisi yang dibutuhkan. Dalam sepak bola, ini termasuk penjaga gawang, bek tengah, striker, dll.
Detail Turnamen
Catatan: Jika Anda hanya ingin menyimpan hasil pertandingan tunggal, Anda tidak perlu menggunakan bagian ini.
Sebuah turnamen terdiri dari lebih dari satu pertandingan; baik UEFA Euro 2016 dan acara sepak bola di Olimpiade Musim Panas 2016 adalah turnamen. Seperti yang kami katakan sebelumnya, kami dapat menyimpan satu pertandingan di database kami, tetapi kami juga dapat menghubungkan pertandingan dengan turnamen yang relevan. Tabel di bagian Turnamen adalah:
tournament
– Ini berisi semua data turnamen dasar:olahraga, tanggal mulai, tanggal akhir, dll. Kita juga perlu menyimpan nama turnamen dan deskripsi tempat berlangsungnya.sport_event_id
atribut ini opsional karena turnamen tidak harus dikaitkan dengan acara yang lebih besar (seperti Olimpiade).group
– Ini mencantumkan semua grup di turnamen itu. UEFA Euro 2016 memiliki enam grup, A hingga F.participant
– Ini adalah tim yang bermain di turnamen; setiap peserta dapat ditugaskan ke grup. Sebagian besar turnamen dimulai dengan babak penyisihan grup dan kemudian berlanjut ke babak sistem gugur (misalnya UEFA Euro, Piala Dunia UEFA, sepak bola Olimpiade). Beberapa turnamen hanya memiliki babak penyisihan grup (misalnya liga nasional), sementara turnamen lainnya hanya memiliki babak sistem gugur (misalnya piala nasional).in_team
– Tabel ini menyediakan relasi many-to-many yang menyimpan informasi tentang pemain yang terdaftar untuk turnamen tersebut dan posisi yang diharapkan.tournament_schedule
– Menurut saya, ini adalah tabel yang paling menarik di bagian ini. Daftar semua game yang dimainkan selama turnamen ini disimpan di sini.tournament_id
atribut menunjukkan turnamen mana yang dimiliki setiap pertandingan, danphase_id
atribut mendefinisikan fase di mana pertandingan akan berlangsung. Kami juga akan menyimpan lokasi pertandingan dan waktu dimulainya pertandingan. Kedua peserta akan dijelaskan oleh bidang teks. Ketika babak penyisihan grup selesai, kita akan tahu semua pertarungan untuk babak penyisihan. Sebagai contoh, pada awal UEFA Euro 2016, kami tahu bahwa pemenang Grup E (1E) akan bermain melawan runner-up Grup D (2D). Setelah ketiga babak fase grup dimainkan, pasangan ini adalah Italia vs. Spanyol.
Detail Pertandingan
Match details
area digunakan untuk menyimpan data untuk pertandingan tunggal. Kami akan menggunakan dua tabel:
match
– Ini berisi semua detail tentang satu pertandingan; pertandingan ini dapat dikaitkan dengan turnamen, tetapi juga dapat berupa permainan tunggal. Jaditournament_schedule_id
atribut adalah opsional, dan kami akan menyimpansport_id
,start_time
danlocation
atribut lagi di sini. Jika pertandingan adalah bagian dari turnamen, makatournament_schedule_id
akan diberi nilai.team_1_id
danteam_2_id
atribut adalah referensi ke tim yang terlibat dalam pertandingan.goals_team_1
dangoals_team_2
atribut berisi hasil pertandingan. Keduanya wajib dan harus memiliki “0” sebagai nilai default untuk keduanya.in_match
– Tabel ini adalah daftar semua pemain yang terdaftar untuk pertandingan itu; pemain yang tidak berpartisipasi akan mendapatkan NULL distarted_at
atribut, sedangkan pemain yang masuk sebagai pengganti akan memilikistarted_at
> 0 . Jika seorang pemain diganti, mereka akan memilikiended_at
atribut yang cocok denganstarted_at
atribut pemain yang menggantikannya. Jika pemain tetap di sepanjang pertandingan,ended_at
mereka atribut akan memiliki nilai yang sama denganend_time
atribut.
Acara Pertandingan
Bagian ini dimaksudkan untuk menyimpan semua detail atau peristiwa yang terjadi selama permainan. Dan tabelnya adalah:
event
– Ini adalah kamus yang mencantumkan semua acara yang ingin kami simpan. Dalam sepak bola, ini adalah nilai-nilai seperti “berkomitmen buruk” , “sangat menderita” , “kartu kuning” , “kartu merah” , “tendangan bebas” , “hukuman” , “tujuan” , “offside” , “substitusi” , “pemain dikeluarkan dari pertandingan” .match_event
– Ini menghubungkan acara dengan pertandingan. Kami akan menyimpanevent_time
serta informasi pemain yang terkait dengan acara tersebut (in_match_id
).related_event
– Inilah yang menyatukan informasi acara. Untuk menjelaskannya, mari kita lihat contoh ketika Pemain A melanggar Pemain B. Kami akan memasukkan catatan dimatch_event
tabel yang menunjukkan bahwa Pemain A melakukan pelanggaran dan tabel lain yang menunjukkan bahwa Pemain B melakukan pelanggaran. Kami juga akan menambahkan catatan kerelated_event
tabel, di mana 'pelanggaran yang dilakukan' akan menjadi orang tua dan 'pelanggaran yang diderita' akan menjadi anak. Kami juga akan mencatat hasil pelanggaran:kartu kuning, tendangan bebas atau tendangan penalti, dan mungkin gol.
Indikator dan Performa
Bagian ini akan membantu kami menganalisis pemain dan tim sebelum dan sesudah pertandingan.
indicator
tabel adalah kamus dengan seperangkat indikator yang telah ditentukan untuk setiap pemain sebelum setiap pertandingan. Indikator ini harus menggambarkan bentuk pemain saat ini. Daftar ini dapat berisi nilai seperti:“jumlah gol dalam 10 pertandingan terakhir” , “jarak rata-rata yang ditempuh dalam 10 pertandingan terakhir” , “jumlah penyelamatan GK dalam 10 pertandingan terakhir” .
performance
kamus sangat mirip dengan indicator
, tetapi kami akan menggunakannya untuk menyimpan hanya nilai yang terkait dengan satu kecocokan:“jarak yang ditempuh” , “pass akurat” , dll.
player_indicator
dan performance_indicator
tabel memiliki struktur yang hampir sama:
in_match_id
– mengacu pada pemain yang mengambil bagian dalam pertandingan tertentuindicator_id
/performance_id
– mereferensikanindicator
atau ”kamus kinerjavalue
– menyimpan nilai untuk indikator tersebut (mis. pemain menempuh jarak 10,72 km)description
– memiliki deskripsi tambahan, jika diperlukan
Apa yang Terjadi Selama Pertandingan?
Dengan memasukkan semua data ini, kami dapat dengan mudah mendapatkan detail pertandingan, acara, dan statistik untuk setiap pertandingan di database kami.
Kueri sederhana ini akan mengembalikan detail dasar untuk pertandingan mendatang:
SELECT team_1.`team_name`, team_2.`team_name`, `match`.`start_time`, `match`.`location` FROM `match`, `team` AS team_1, `team` AS team_2 WHERE `match`.`team_1_id` = team_1.`id` AND `match`.`team_2_id` = team_2.`id`
Untuk mendapatkan daftar semua acara dalam permainan selama pertandingan tertentu, kami akan menggunakan kueri di bawah ini:
SELECT `event`.`event_name`, `match_event`.`event_time`, `player`.`first_name`, `player`.`last_name` FROM `match`, `match_event`, `event`, `in_match`, `player` WHERE `match_event`.`match_id` = `match`.`id` AND `event`.`id` = `match_event`.`event_id` AND `in_match`.`id` = `match_event`.`in_match_id` AND `player`.`id` = `in_match`.`player_id` AND `match`.`id` = @match ORDER BY `match_event`.`event_time` ASC
Ada banyak pertanyaan tambahan yang dapat saya pikirkan; mudah untuk melakukan analisis ketika Anda memiliki data. Jika Anda telah mengukur dan menyimpan sejumlah besar indikator dan data performa pemain, Anda mungkin dapat menghubungkan parameter ini dengan hasil akhir. Saya pribadi tidak percaya dengan prediksi seperti itu; ada faktor keberuntungan selama pertandingan, ditambah banyak faktor lain yang tidak dapat Anda ketahui sampai permainan dimulai. Namun, jika Anda memiliki kumpulan data yang besar dan banyak parameter, peluang Anda untuk membuat prediksi yang lebih akurat akan meningkat.
Model yang disajikan dalam artikel ini memungkinkan kami untuk menyimpan pertandingan, detail pertandingan, dan riwayat kinerja setiap pemain. Kami juga dapat mengatur indikator formulir untuk setiap pemain sebelum pertandingan. Menyimpan detail yang cukup akan memberi kita lebih banyak parameter yang menjadi dasar asumsi kita. Saya tidak mengatakan bahwa kami dapat memprediksi hasil pertandingan, tetapi kami dapat bersenang-senang dengannya.
Kami juga dapat dengan mudah mengubah model ini untuk menyimpan data untuk olahraga lain. Perubahan ini tidak boleh terlalu rumit. Menambahkan sport_id
atribut ke kamus harus melakukan trik. Namun, saya pikir akan bijaksana untuk memiliki contoh baru untuk setiap olahraga yang berbeda.