“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
- API-Football
- Sign-in & Get API key
- How to Get Data
- ตัวอย่างการถอด Nested data
- หา Data ที่สนใจ
- Free plan Limitation
- My project example
- No (one) magic prompt
- 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 นั้นออกมา
- 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 ผ่าน APIimport 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 APIresponse = requests.request("GET", url, headers=headers, data=payload)# Display resultprint(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 Dataframedf = pd.DataFrame(response.json()['response'])# Preview datadf.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 นี้ครับ:
- Explode: กระจาย List ของ Seasons ออกมาให้เป็น Row ของ Dict
- 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 togetherdf_final = pd.concat([league_cols, country_cols, season_cols], axis=1)# Preview datadf_final.head()
เมื่อเราได้ Data ที่อยู่ในระดับเดียวกันหมดแล้ว (Flat) ทีนี้เราก็สามารถเอา Data นี้ไปวิเคราะห์เรื่องที่เราสนใจได้เลยคร้าบ
หา Data ที่สนใจ
Data ที่ ที่เราดึงได้จาก API-Football ยังมีอีกหลายเรื่องเลย แต่เราไม่สามารถดึงทุกอย่างได้ในทีเดียว (One shot) เนื่องจากข้อจำกัดเช่น Performance, Cost, …..
เราจึงต้องรู้จัก Endpoint หรือเปรียบเทียบง่ายๆคือชื่อ Folder ปลายทางที่เก็บข้อมูลที่เราสนใจ
ตัวอย่างเช่น:
- ถ้าต้องการข้อมูลเกี่ยวกับ Leagues ให้ไปที่: https://v3.football.api-sports.io/leagues
- ถ้าต้องการข้อมูลเกี่ยวกับ นักฟุตบอล ให้ไปที่: https://v3.football.api-sports.io/players
ใน 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 ตามนี้เลย
- Export data
- Get data [Loop Request + Append data]
- Prepare data
- Summarize data
Step get data มีเพิ่ม for loop เข้าไปเพื่อให้ดึงข้อมูลทุก season ที่มี ของ player ทั้งสองคน
# import librariesimport requestsimport pandas as pd# Set your API keyapi_key = 'YOUR_API_KEY' # get api key from your account# set players idplayers_id = [203224, 174565, 2864, 306, 2489, 12339]# set empty dataall_data = []# set API parameterpayload={}headers = {'x-apisports-key': api_key,}# Get data processfor 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 concatenationall_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 csvdf_final.to_csv('player_statistics.csv', index=False)print("DataFrame 'df_final' successfully exported to 'player_statistics.csv'")# import csvdf_stats = pd.read_csv('player_statistics.csv')df_stats.head()# Prepare data# select columnsdf_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 datadf_prep.head()# Summarize datadf_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 datadf_summarized# Export datadf_summarized.to_csv('player_stats_summary.csv', index=False)
และนี่คือ Result ที่ได้ของ project นี้ครับ

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