หา Football Data ที่ไหนดี?

“Whether the data is taken from training or from a match, has seen exponential growth”
“ไม่ว่า Data จะเก็บตอนซ้อมหรือตอนแข่ง มันเติบโตอย่างก้าวกระโดด

ในหนังสือ Jurgen Klopp The Biography ของ Elmar Neveling ได้แทรกเรื่องนี้ไว้ว่า Professional Football ยุคนี้ใช้ ‘Data’ กันเยอะแล้ว

“Data is the new oil”

ฟุตบอลยุคนี้เก็บ Data กันโหดมากๆเลย หลายๆการตัดสินใจจะวางแทคติก, ซื้อตัวผู้เล่นใหม่ มาจากข้อมูลเยอะมาก

มีตัวอย่างเคสนึงที่เกิดขึ้นที่ Liverpool ครับทุกคน พูดมาถึงนี่ไม่ต้องสืบเลยว่าผมเชียร์ทีมไหน 5555+
(ถ้าเพื่อนสนิทหน่อยจะบอกว่า “กูรู้ตั้งแต่หนังสือที่มึงอ่านแล้วววว~”)

ในตอนที่คล็อปป์ประกาศวางมือจากการคุมทีม แคนดิเดต ‘โค้ช’ คนใหม่มีหลายคน แต่สุดท้ายข้อมูลที่สโมสรมีได้ชี้ไปที Arne Slot

Arne Slot (อาร์เนอ สล็อต) ที่ตอนนั้นคุมทีม Feyenoord (เฟเยนูร์ด) ในลีกเนเธอร์แลนด์

Data ได้บอกกับสมโมสรว่าระบบการเล่นบอลของ Slot มีความคล้ายกับระบบของ Klopp ในทีมปัจจุบันมากทำให้ สโมสรได้มีกุนซือใหม่ที่ Data เข้ามามีส่วนกับการตัดสินใจเลย

เล่ามาซะยาว อยู่ด้วยกันก่อนคร้าบ 555+

โพสนี้จะพาทุกคนไปดึง Data ที่เกี่ยวกับฟุตบอลมาลองวิเคราะห์ง่ายๆกัน ไปลุยกันเลยคร้าบ

Table of Contents

  1. API-Football
  2. Sign-in & Get API key
  3. How to Get Data
  4. ตัวอย่างการถอด Nested data
  5. หา Data ที่สนใจ
  6. Free plan Limitation
  7. My project example
  8. No (one) magic prompt
  9. Find YOUR Projects

API-Football

จริงๆก่อนมาลงที่เว็บนี้ก็ลองหามาหลายที่เลย เจ้าที่ดังๆก็มี Statsbomb, Sportmonk

2 เจ้าบนถ้าเป็น Free plan จะดึงข้อมูลได้ทั่วๆไป ถ้าอยากดึงข้อมูลเชิงลึกเช่น สถิติส่วนตัวผู้เล่น (Player stats) จะต้องจ่ายเงินเป็น Paid plan

แต่ของ API-football ยังพอมีข้อมูลส่วนนี้ให้เราดึงฟรีอยู่บ้าง แถม Document กับ Dashboard ดูใช้งานง่าย จึงเลือกใช้เว็บนี้คร้าบ

เราเข้าไปที่ลิ้งค์นี้กันครับ
https://www.api-football.com/

Sign-in & Get API key

อันดับแรกเราต้องมีสิทธิ์เข้าถึงข้อมูลก่อนครับ เราจะใช้ API Key เหมือนเป็นกุญแจเปิดไปดึง Data นั้นออกมา

  1. Sign in: เข้าไปที่ api-football.com จะใช้ Email หรือ Google Account ก็ได้

2. Dashboard: พอเข้ามาแล้วจะเจอหน้า Dashboard แสดงภาพรวมของเรา

3. การรับ API Key: ไปที่เมนู Account -> Access -> API Key แล้ว Copy เก็บไว้นะครับ

⚠️ถ้าคนอื่นได้ API Key เราไปก็เหมือนเราเอากุญแจให้เขาเปิดเข้าบ้านของเรา ดังนั้นอย่าเอาไปแชร์ให้ใครเด็ดขาดด!

How to Get Data

เวลาเราเจอ Source ข้อมูลใหม่ที่ไม่คุ้นเคย สิ่งแรกที่ผมแนะนำให้ทำเสมอคือ “หา Documentation” ก่อนเลย

Documentation คือคัมภีร์ที่จะบอกเราว่าเราจะดึงอะไรได้บ้าง

เพื่อนๆ สามารถเข้าไปดูได้ที่ Apis → Football → Documentation ในนี้จะมีตัวอย่าง Code ให้เราลองเล่นเยอะเลย

โพสต์นี้ผมเลือกใช้ code เป็น Python คร้าบ

ไปที่ Sample Scripts แล้วเลือกหาตัวอย่าง code ตามภาษาที่เราใช้งาน เลือกใช้ Python

เลือกใช้ code สำหรับ Library Requests มาใช้งาน เพราะอ่านเข้าใจง่าย ใช้ง่ายกว่า http.client ที่เป็น built-in python ครับ

ให้ใส่ API Key ของเราตรง ‘YOUR_API_KEY’ เช่น ‘x-apisports-key’: ‘123abcxxx’

# Import library ที่จำเป็น
import requests #ใช้สำหรับ get data ผ่าน API
import pandas as pd #ใช้สำหรับ Transform data
url = "https://v3.football.api-sports.io/leagues"
payload={}
headers = {
'x-apisports-key': 'YOUR_API_KEY', # YOUR_API_KEY ได้มากจาก Account -> Access -> API Key
}
# Get data from API
response = requests.request("GET", url, headers=headers, data=payload)
# Display result
print(response.json())

Python นี้ผม run code บน Google Colab (https://colab.google/) ครับ ถ้ามี account google อยู่แล้วสามารถเข้าไปใช้งานได้ฟรีเลย

run แล้ว ผลจะแสดงตาม response.json() ออกมาเป็น รูปแบบ JSON หรือก็คือ Dictionary ที่เป็น Data type หนึ่งของ Python

การดึงข้อมูลผ่าน API ข้อมูลที่ได้มามักจะเป็นรูปแบบ JSON ที่ซ้อนกันหลายชั้น (Nested JSON)

เราต้องทำการ แปลงให้อยู่ในรูปแบบตาราง (Dataframe) เพื่อเอาไปใช้งานต่อได้ง่าย

ให้ใช้ code นี้แปลงเป็น Dataframe ก่อนครับ

# Convert JSON to Dataframe
df = pd.DataFrame(response.json()['response'])
# Preview data
df.head()

Run แล้วจะได้ตารางแบบในรูปด้านล่างที่เป็น Nested data

ใครเวลาเจอ Nested data แบบนี้แล้วปวดหัวเหมือนผมบ้าง? อย่ากังวลไปครับ

“Nested data เป็นส่วนหนึ่งของการทำงานสาย Data”

(ข้าคือชะตาที่ไม่อาจเลี่ยง คุ้นๆ)

ฟังแบบนี้ค่อยสบายใจขึ้นหน่อย… เดี๋ยวๆ 555+

ที่จะบอกคือเรื่องนี้ยังไงเราก็ต้องเจอแน่ๆ ฝึกไว้ให้ชำนาญดีกว่าครับ เราสามารถ copy data ไปให้ AI ช่วยสอนเราได้ว่าจะต้อง code ยังไงเช่น

prompt: ”ช่วยสอนเขียน code python ถอด nested json ให้หน่อย”

ตัวอย่างการถอด Nested data

เมื่อเราได้ Data มาแล้ว เราจะเห็นว่าโครงสร้างบาง Column อย่าง league, country หรือ seasons จะมีความซับซ้อนต่างกัน:

  • League/Country: เป็น Dictionary ชั้นเดียว
  • Seasons: เป็น List ที่เก็บ Dictionary ไว้อีกที (Nested)

ให้ทุกคนทำตาม Step นี้ครับ:

  1. Explode: กระจาย List ของ Seasons ออกมาให้เป็น Row ของ Dict
  2. Normalize: ถอด Dict ออกมาเป็น Column ใหม่ๆ
# 1. expand list using '.explode()' [list -> dict]
df_exploded = df.explode('seasons').reset_index(drop=True)
# 2. expand dict using 'pd.json_normalize()' [dict -> columns]
league_cols = pd.json_normalize(df_exploded['league']).add_prefix('league_')
country_cols = pd.json_normalize(df_exploded['country']).add_prefix('country_')
season_cols = pd.json_normalize(df_exploded['seasons']).add_prefix('season_')
# 3. Concatenate everything together
df_final = pd.concat([league_cols, country_cols, season_cols], axis=1)
# Preview data
df_final.head()

เมื่อเราได้ Data ที่อยู่ในระดับเดียวกันหมดแล้ว (Flat) ทีนี้เราก็สามารถเอา Data นี้ไปวิเคราะห์เรื่องที่เราสนใจได้เลยคร้าบ

หา Data ที่สนใจ

Data ที่ ที่เราดึงได้จาก API-Football ยังมีอีกหลายเรื่องเลย แต่เราไม่สามารถดึงทุกอย่างได้ในทีเดียว (One shot) เนื่องจากข้อจำกัดเช่น Performance, Cost, …..

เราจึงต้องรู้จัก Endpoint หรือเปรียบเทียบง่ายๆคือชื่อ Folder ปลายทางที่เก็บข้อมูลที่เราสนใจ

ตัวอย่างเช่น:

ใน API-Football เราสามารถใช้ Data Architecture เพื่อ ‘นำทาง’ ให้เราได้ตามรูปด้านล่างนี้

ลิ้งค์: https://www.api-football.com/documentation-v3#section/Architecture

เมื่อเช็คแล้ว ให้เราไปดูรายละเอียดของข้อมูลที่ต้องการได้ในหัวข้อ ENDPOINTS ใน Documentation แล้วเลือก url ที่ตรงกับเรื่องนั้นมาใช้ get data ครับ

Free plan Limitation

ทางเว็บให้เราดึงข้อมูลได้ฟรีก็จริงแต่ Free plan ก็มีข้อจำกัดบางส่วนทำเราไม่ได้สามารถมีข้อมูลได้เท่ากับ Paid plan เช่น

  • จำนวนการ Request ต่อวัน: 100 requests per day
  • Data Freshness: ข้อมูลบางอย่างจะไม่ได้เป็นข้อมูลล่าสุด

ยกตัวอย่างข้อมูล Player Statistics ถ้าไม่ใช่ แบบ Paid plan จะเรียกข้อมูลได้ถึงแค่ปี 2024 (ตอนเขียนโพสนี้คือ Jan 2026)

สามารถดูรายละเอียดเพิ่มเติมได้ที่ https://www.api-football.com/pricing

My project example

อันนี้คือตัวอย่างที่ดึง Player statistics ขอนักเตะ Liverpool 2 คนมาดูคือ Florian Wirtz และ Hugo Ekitike โดนต้องรู้ Player id มาก่อน Get data

Project Workflow ตามนี้เลย

  1. Export data
  2. Get data [Loop Request + Append data]
  3. Prepare data
  4. Summarize data

Step get data มีเพิ่ม for loop เข้าไปเพื่อให้ดึงข้อมูลทุก season ที่มี ของ player ทั้งสองคน

# import libraries
import requests
import pandas as pd
# Set your API key
api_key = 'YOUR_API_KEY' # get api key from your account
# set players id
players_id = [203224, 174565, 2864, 306, 2489, 12339]
# set empty data
all_data = []
# set API parameter
payload={}
headers = {'x-apisports-key': api_key,}
# Get data process
for player_id in players_id:
url_ss = f"https://v3.football.api-sports.io/players/seasons?player={player_id}"
response = requests.request("GET", url_ss, headers=headers, data=payload)
# Check if 'response' key exists and is not empty
if 'response' in response.json() and response.json()['response']:
df_ss = pd.DataFrame(response.json()['response']).rename(columns={0 : 'season'})
else:
print(f"No seasons data found for player {player_id}")
continue # Skip to the next player if no seasons data
for season in df_ss['season']:
url = f"https://v3.football.api-sports.io/players?id={player_id}&season={season}"
response = requests.request("GET", url, headers=headers, data=payload)
data_json = response.json()
if data_json['response']:
# 1. expand list using '.explode()' [list -> dict]
df_exploded = pd.DataFrame(data_json['response']).explode('statistics').reset_index(drop=True)
# 2. expand dict using 'pd.json_normalize()' [dict -> columns]
player_cols = pd.json_normalize(df_exploded['player']).add_prefix('player_')
stat_cols = pd.json_normalize(df_exploded['statistics']).add_prefix('stat_')
# 3. Concatenate everything together
df_season = pd.concat([player_cols, stat_cols], axis=1)
all_data.append(df_season)
else:
print(f"No data for season {season} for player {player_id}")
# Filter out empty DataFrames before concatenation
all_data_filtered = [df for df in all_data if not df.empty]
df_final = pd.concat(all_data_filtered, ignore_index=True)
print(df_final.shape)
df_final.head()
# export to csv
df_final.to_csv('player_statistics.csv', index=False)
print("DataFrame 'df_final' successfully exported to 'player_statistics.csv'")
# import csv
df_stats = pd.read_csv('player_statistics.csv')
df_stats.head()
# Prepare data
# select columns
df_prep = df_stats[['player_id', 'player_name', 'player_age', 'stat_team.id', 'stat_team.name', 'stat_league.id', 'stat_league.name','stat_league.season',
'stat_games.appearences', 'stat_games.lineups',
'stat_games.minutes', 'stat_games.number',
'stat_games.position', 'stat_games.rating', 'stat_substitutes.in',
'stat_substitutes.out', 'stat_substitutes.bench',
'stat_shots.total', 'stat_shots.on', 'stat_goals.total',
'stat_goals.conceded', 'stat_goals.assists', 'stat_passes.total',
'stat_passes.key', 'stat_passes.accuracy',
'stat_tackles.total', 'stat_tackles.blocks',
'stat_tackles.interceptions', 'stat_duels.total',
'stat_duels.won', 'stat_dribbles.attempts',
'stat_dribbles.success', 'stat_dribbles.past']]
# preview data
df_prep.head()
# Summarize data
df_summarized = (df_prep
# group by data
.groupby(['player_id', 'player_name', 'stat_league.season'])
# summarize data
.agg(appearences=('stat_games.appearences', 'sum'),
line_up=('stat_games.lineups', 'sum'),
substitude=('stat_substitutes.in', 'sum'),
shots=('stat_shots.total', 'sum'),
goals=('stat_goals.total', 'sum'),
assists=('stat_goals.assists', 'sum'),
passes=('stat_passes.total', 'sum'),
key_passes=('stat_passes.key', 'sum'),
pass_acc=('stat_passes.accuracy', 'mean'),
duels=('stat_duels.total', 'sum'),
won_duels=('stat_duels.won', 'sum')
)
# calculate ratio
.assign(goal_per_app = lambda x: x['goals'] / x['appearences'] ,
ast_per_app = lambda x: x['assists'] / x['appearences'] ,
GA_per_app = lambda x: (x['goals'] + x['assists']) / x['appearences'])
# reset index
.reset_index()
# rename columns
.rename(columns={'stat_league.season' : 'season'})
)
# View data
df_summarized
# Export data
df_summarized.to_csv('player_stats_summary.csv', index=False)

และนี่คือ Result ที่ได้ของ project นี้ครับ

https://docs.google.com/spreadsheets/d/1Vyhng-e0Gxc30VCqkUETBDYV4LoJk2HUnI24wvmTOP0/edit?gid=1618439681#gid=1618439681

PS. ข้อมูลที่ได้ Base on Free plan account ของ API-Football

ปลายผมทาง Data Visualize แบบง่ายๆบน Looker Studio เข้าไปดูได้ในลิ้งค์ข้างล่างนี้เล้ยย
https://lookerstudio.google.com/reporting/ccb47901-576f-4017-8f36-d1db34a8d287

ถ้าใครเริ่มใช้งาน Google Looker Studio ครั้งแรกสามารถเข้าไปเรียนเพิ่มเติมได้ในโพสก่อน
https://datatrippu.com/2023/09/14/looker-studio-google-data-studio-beginner/

หรือเรียนใน YouTube channel DataTrippu ได้เช่นกัน
https://www.youtube.com/live/eIQwOZj2774?si=18Nb1vOWf5rLY0LL

No (one) magic prompt

การใช้ AI ช่วยเขียน code ช่วยให้เราทำงานได้เยอะมากก็จริง แต่ก็ยังไม่มีสิ่งไหนที่เราสามารถทำงานนั้นสำเร็จได้โดย prompt เพียง ‘ครั้งเดียว’

ถ้าวันนี้ทุกคน prompt ให้ AI ช่วย “ออกแบบการใช้ชีวิตให้มีความสุขจนวันสุดท้ายของชีวิต” คำถามคือเรา ’มั่นใจแค่ไหน’ ที่จะใช้ชีวิตตามนั้นโดยศึกษาเพิ่มเติมเลย?

ความรู้พื้นฐานเรื่องการเขียน Prompt และ เรื่อง Data (หรือ skill ที่เกี่ยวข้องกับงานนั้น) ยังเป็นสิ่งจำเป็นที่เราต้องเรียนรู้แล้วขัดเกลาตัวอย่างอยู่เสมอ

Find YOUR Projects

ช่วงนี้เห็นเพื่อนๆ น้องๆหลายคนมองหาไอเดียทำ Data project ทั้งเพื่อฝึกฝน และเก็บ Portfolio ไว้สมัครงานหลายคนเลย

อาจมีบางคนที่ยังไม่ตัดสินใจเลือก project เพราะยังไม่เจอ project ที่ใช่

สิ่งที่ผมอยากบอกคือ “ไอเดียที่ใช่มักจะมาเมื่อเรา ‘ลงมือทำ’ “ ถ้าเราพอมีไอเดียสัก 5-10% ก็ลุยได้เลย แล้วแล้วเราจะพบคำตอบระหว่างทางเองคร้าบ

สารภาพว่าตอนเริ่มเขียนโพสนี้ ลังเลอยู่ Quote ที่บอกว่า “Data is the new oil” ยังใช้ได้อยู่ไหมในปี 2026 และหลังจากนี้

มีข่าวมาว่า Data ที่ใช้ Train AI กำลังจะหมดโลกจึงมีแนวคิดเรื่องการสังเคราะห์ข้อมูลใหม่ขึ้นมาใช้ (Synthetic Data)

แต่ตอนเขียนโพสนี้ใกล้เสร็จผมได้คำตอบอย่างนึงว่า ‘มนุษย์’ เรานี่แหละที่เป็นคนสร้าง Data ใหม่ๆขึ้นมา แถมเป็น Organic Data และมันจะยิ่งมีค่ามากขึ้นเรื่อยๆ

Data is the new oil? (as 2026++) no, Organic data is the new oil.

“Your Ideas is Organic”

ขอบคุณทุกคนที่อ่านมาถึงตรงนี้ หวังว่าจะได้ไอเดียที่เป็นประโยชน์เอาไปใช้ในการหา Data Project เพื่อฝึกฝนเก็บเป็น Portfolio ของตัวเองนะครับ

ชอบหรือสนใจตรงไหนเม้นบอกกันได้เลยคร้าบบบ

Be Better Together

มาเก่งขึ้นไปพร้อมกันกับเรา สมัครรับ Content ใหม่ๆ ส่งตรงถึง inbox ฟรี!

Leave a comment