In [105]:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.cm as cm
import matplotlib.pyplot as plt
Įvadas ¶
Hipotezės:¶
- Žaidėjų iš tam tikrų tautybių laimėjimo tikimybė yra didesnė dėl stiprių nacionalinių badmintono tradicijų. Pavyzdžiui, galimai žaidėjai iš Tailando ar Indonezijos dažniau laimi turnyrus, palyginti su kitų šalių žaidėjais.
- Žaidimai aukštesniame raunde (pvz., pusfinalis, finalas) yra intensyvesni, o jų rezultatų skirtumas mažesnis (pvz., artimesni taškai tarp komandų) nei ankstesniuose raunduose.
- Žaidėjai, kurie dalyvauja ilguose žaidimuose su daugiau setų (pvz., žaidimai, kuriuose reikalingi visi 3 setai), gali prarasti energiją ir prastesniame fiziniame pasirengime dalyvauti kitame raunde.
Duomenų importas:
In [9]:
ws = pd.read_csv("ws.csv", index_col=0)
ws.head(3)
Out[9]:
city | country | date | tournament_type | discipline | round | winner | nb_sets | retired | game_1_score | ... | team_one_most_consecutive_points_game_2 | team_two_most_consecutive_points_game_2 | team_one_game_points_game_2 | team_two_game_points_game_2 | game_2_scores | team_one_most_consecutive_points_game_3 | team_two_most_consecutive_points_game_3 | team_one_game_points_game_3 | team_two_game_points_game_3 | game_3_scores | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
tournament | |||||||||||||||||||||
PRINCESS SIRIVANNAVARI Thailand Masters 2018 | Bangkok | Thailand | 09-01-2018 | HSBC BWF World Tour Super 300 | WS | Qualification quarter final | 2 | 3 | False | 17-21 | ... | 8.0 | 5.0 | 1.0 | 0.0 | ['0-0', '1-0', '2-0', '2-1', '3-1', '3-2', '4-... | 2.0 | 7.0 | 0.0 | 3.0 | ['0-0', '1-0', '1-1', '2-1', '3-1', '3-2', '3-... |
PRINCESS SIRIVANNAVARI Thailand Masters 2018 | Bangkok | Thailand | 09-01-2018 | HSBC BWF World Tour Super 300 | WS | Qualification quarter final | 2 | 3 | False | 21-16 | ... | 2.0 | 9.0 | 0.0 | 1.0 | ['0-0', '0-1', '0-2', '0-3', '0-4', '0-5', '1-... | 2.0 | 11.0 | 0.0 | 3.0 | ['0-0', '0-1', '0-2', '0-3', '0-4', '0-5', '0-... |
PRINCESS SIRIVANNAVARI Thailand Masters 2018 | Bangkok | Thailand | 09-01-2018 | HSBC BWF World Tour Super 300 | WS | Qualification quarter final | 2 | 2 | False | 8-21 | ... | 3.0 | 7.0 | 0.0 | 1.0 | ['0-0', '0-1', '1-1', '2-1', '3-1', '3-2', '4-... | NaN | NaN | NaN | NaN | [] |
3 rows × 37 columns
In [11]:
ws.info()
<class 'pandas.core.frame.DataFrame'> Index: 2975 entries, PRINCESS SIRIVANNAVARI Thailand Masters 2018 to Orleans Masters 2021 (New Dates) Data columns (total 37 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 city 2975 non-null object 1 country 2975 non-null object 2 date 2975 non-null object 3 tournament_type 2975 non-null object 4 discipline 2975 non-null object 5 round 2975 non-null object 6 winner 2975 non-null int64 7 nb_sets 2975 non-null int64 8 retired 2975 non-null bool 9 game_1_score 2975 non-null object 10 game_2_score 2959 non-null object 11 game_3_score 877 non-null object 12 team_one_players 2975 non-null object 13 team_two_players 2975 non-null object 14 team_one_nationalities 2975 non-null object 15 team_two_nationalities 2975 non-null object 16 team_one_total_points 2975 non-null int64 17 team_two_total_points 2975 non-null int64 18 team_one_most_consecutive_points 2975 non-null int64 19 team_two_most_consecutive_points 2975 non-null int64 20 team_one_game_points 2975 non-null int64 21 team_two_game_points 2975 non-null int64 22 team_one_most_consecutive_points_game_1 2975 non-null int64 23 team_two_most_consecutive_points_game_1 2975 non-null int64 24 team_one_game_points_game_1 2975 non-null int64 25 team_two_game_points_game_1 2975 non-null int64 26 game_1_scores 2975 non-null object 27 team_one_most_consecutive_points_game_2 2959 non-null float64 28 team_two_most_consecutive_points_game_2 2959 non-null float64 29 team_one_game_points_game_2 2959 non-null float64 30 team_two_game_points_game_2 2959 non-null float64 31 game_2_scores 2962 non-null object 32 team_one_most_consecutive_points_game_3 870 non-null float64 33 team_two_most_consecutive_points_game_3 870 non-null float64 34 team_one_game_points_game_3 870 non-null float64 35 team_two_game_points_game_3 870 non-null float64 36 game_3_scores 2959 non-null object dtypes: bool(1), float64(8), int64(12), object(16) memory usage: 862.9+ KB
Duomenų analizė: ¶
In [75]:
def hipoteze1(ws):
# Filtruojame tik laimėtojų duomenis
laimėtojai = ws[ws["winner"] == 1]
# Skaičiuojame kiekvienos tautybės pergales (team_one)
pergales = laimėtojai["team_one_nationalities"].value_counts()
# Skaičiuojame kiekvienos tautybės visas rungtynes (team_one)
visos_rungtynės = ws["team_one_nationalities"].value_counts()
# Apskaičiuojame laimėjimų procentą kiekvienai tautybei
laimėjimų_procentai = (pergales / visos_rungtynės) * 100
# Pašaliname NaN reikšmes
laimėjimų_procentai = laimėjimų_procentai.dropna()
# Pateikiame rezultatus be indeksų
rezultatai = pd.DataFrame({
"Tautybė": laimėjimų_procentai.index.tolist(),
"Laimėjimų procentas (%)": laimėjimų_procentai.tolist()
}).sort_values(by="Laimėjimų procentas (%)", ascending=False)
# Atvaizduojame lentelę su rezultatais
print(rezultatai.to_string(index=False))
# Naudojimas
hipoteze1(ws)
Tautybė Laimėjimų procentas (%) CRO 100.000000 FIN 75.000000 ESP 72.222222 TUR 71.428571 JPN 65.122616 SCO 63.888889 CHN 63.544304 SGP 59.375000 KOR 58.602151 THA 53.376206 TPE 53.100775 CAN 52.083333 BEL 50.000000 EST 46.666667 IND 46.296296 DEN 46.218487 MAS 44.303797 SUI 44.000000 INA 42.647059 HKG 42.307692 GER 40.740741 SVK 40.000000 USA 39.316239 FRA 38.888889 ENG 37.500000 WAL 33.333333 MEX 33.333333 VIE 30.000000 BUL 28.571429 NED 27.777778 UKR 27.272727 RUS 25.423729 ISR 23.076923 AUS 23.076923 NZL 20.000000 HUN 20.000000 MRI 16.666667 IRL 16.666667
In [107]:
def hipoteze1_grafikas_su_intensyvumu(ws):
# Filtruojame tik laimėtojų duomenis
laimėtojai = ws[ws["winner"] == 1]
# Skaičiuojame kiekvienos tautybės pergales (team_one)
pergales = laimėtojai["team_one_nationalities"].value_counts()
# Skaičiuojame kiekvienos tautybės visas rungtynes (team_one)
visos_rungtynės = ws["team_one_nationalities"].value_counts()
# Apskaičiuojame laimėjimų procentą kiekvienai tautybei
laimėjimų_procentai = (pergales / visos_rungtynės) * 100
# Pašaliname NaN reikšmes
laimėjimų_procentai = laimėjimų_procentai.dropna()
# Pateikiame rezultatus į DataFrame formatą
rezultatai = pd.DataFrame({
"Tautybė": laimėjimų_procentai.index.tolist(),
"Laimėjimų procentas (%)": laimėjimų_procentai.tolist()
}).sort_values(by="Laimėjimų procentas (%)", ascending=False)
# Normalizuojame laimėjimų procentus spalvų intensyvumui
norm_procentai = np.array(rezultatai["Laimėjimų procentas (%)"])
spalvos = cm.Blues(norm_procentai / max(norm_procentai)) # Spalvų intensyvumui naudojame "Blues" paletę
# Piešiame grafiką
plt.figure(figsize=(12, 6))
plt.bar(rezultatai["Tautybė"], rezultatai["Laimėjimų procentas (%)"], color=spalvos)
plt.title("Laimėjimų procentas pagal tautybes (su spalvų intensyvumu)", fontsize=16)
plt.xlabel("Tautybė", fontsize=14)
plt.ylabel("Laimėjimų procentas (%)", fontsize=14)
plt.xticks(rotation=90, fontsize=10)
plt.tight_layout()
plt.show()
# Naudojimas
hipoteze1_grafikas_su_intensyvumu(ws)
In [85]:
def hipoteze2(ws):
# Grupavimas pagal žaidimo raundą
grupes = ws.groupby("round")
rezultatai = []
# Iteracija per grupes
for roundas, grupe in grupes:
# Apskaičiuojame vidutinį taškų skirtumą (tarp komandų taškų)
vidutinis_tasku_skirtumas = (grupe["team_one_total_points"] - grupe["team_two_total_points"]).abs().mean()
# Saugojame raundo informaciją ir vidutinį taškų skirtumą
rezultatai.append({
"Raundas": roundas,
"Vidutinis taškų skirtumas": vidutinis_tasku_skirtumas
})
# Paverčiame rezultatus į DataFrame
rezultatai_df = pd.DataFrame(rezultatai).sort_values(by="Vidutinis taškų skirtumas")
# Atvaizduojame rezultatus
print(rezultatai_df.to_string(index=False))
# Naudojimas
hipoteze2(ws)
Raundas Vidutinis taškų skirtumas Final 9.818182 Round 1 10.000000 Semi final 10.434286 Round 2 11.250000 Quarter final 11.321534 Round 3 11.416667 Round of 16 12.817109 Round of 32 13.075205 Qualification round of 16 13.109890 Qualification quarter final 13.235556
In [93]:
def hipoteze2_grafikas(ws):
# Grupavimas pagal žaidimo raundą
grupes = ws.groupby("round")
rezultatai = []
# Iteracija per grupes
for roundas, grupe in grupes:
# Apskaičiuojame vidutinį taškų skirtumą (tarp komandų taškų)
vidutinis_tasku_skirtumas = np.abs(grupe["team_one_total_points"] - grupe["team_two_total_points"]).mean()
# Saugojame raundo informaciją ir vidutinį taškų skirtumą
rezultatai.append({
"Raundas": roundas,
"Vidutinis taškų skirtumas": vidutinis_tasku_skirtumas
})
# Paverčiame rezultatus į DataFrame
rezultatai_df = pd.DataFrame(rezultatai).sort_values(by="Vidutinis taškų skirtumas")
# Piešiame grafiko vizualizaciją
plt.figure(figsize=(12, 6))
sns.barplot(data=rezultatai_df, x="Raundas", y="Vidutinis taškų skirtumas", palette="coolwarm")
plt.title("Vidutinis taškų skirtumas pagal raundą", fontsize=16)
plt.xlabel("Raundas", fontsize=14)
plt.ylabel("Vidutinis taškų skirtumas", fontsize=14)
plt.xticks(rotation=45, fontsize=12)
plt.tight_layout()
plt.show()
# Naudojimas
hipoteze2_grafikas(ws)
C:\Users\User\AppData\Local\Temp\ipykernel_12636\1421724265.py:23: FutureWarning: Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect. sns.barplot(data=rezultatai_df, x="Raundas", y="Vidutinis taškų skirtumas", palette="coolwarm")
In [83]:
def hipoteze3(ws):
# Filtruojame duomenis tik nepralaimėjusioms (nenutrauktoms) rungtynėms
zaidimai = ws[ws["retired"] == False]
# Grupavimas pagal žaidimų setų skaičių
grupes = zaidimai.groupby("nb_sets")
rezultatai = []
# Iteruojame per kiekvieną setų grupę
for nb_setu, grupe in grupes:
# Apskaičiuojame laimėjimų ir pralaimėjimų statistiką
pergales = grupe[grupe["winner"] == 1].shape[0]
pralaimejimai = grupe[grupe["winner"] == 2].shape[0]
viso = grupe.shape[0]
# Saugojame statistiką
rezultatai.append({
"Setų skaičius": nb_setu,
"Pergalės (%)": (pergales / viso) * 100 if viso > 0 else 0,
"Pralaimėjimai (%)": (pralaimejimai / viso) * 100 if viso > 0 else 0
})
# Konvertuojame rezultatus į DataFrame ir surūšiuojame pagal setų skaičių
rezultatai_df = pd.DataFrame(rezultatai).sort_values(by="Setų skaičius")
# Atvaizduojame rezultatus
print(rezultatai_df.to_string(index=False))
# Naudojimas
hipoteze3(ws)
Setų skaičius Pergalės (%) Pralaimėjimai (%) 2 52.787203 47.212797 3 52.528736 47.471264
In [95]:
def hipoteze3_grafikas(ws):
# Grupavimas pagal žaidimų setų skaičių
grupes = ws[ws["retired"] == False].groupby("nb_sets")
setu_skaicius = []
pergales_procentai = []
pralaimejimai_procentai = []
# Iteracija per kiekvieną grupę
for nb_setu, grupe in grupes:
pergales = grupe[grupe["winner"] == 1].shape[0]
pralaimejimai = grupe[grupe["winner"] == 2].shape[0]
viso = grupe.shape[0]
setu_skaicius.append(nb_setu)
pergales_procentai.append((pergales / viso) * 100 if viso > 0 else 0)
pralaimejimai_procentai.append((pralaimejimai / viso) * 100 if viso > 0 else 0)
# Grafiko braižymas
plt.figure(figsize=(10, 6))
plt.plot(setu_skaicius, pergales_procentai, marker='o', label="Pergalės (%)", color='green')
plt.plot(setu_skaicius, pralaimejimai_procentai, marker='o', label="Pralaimėjimai (%)", color='red')
plt.title("Setų skaičiaus poveikis pergalėms ir pralaimėjimams")
plt.xlabel("Setų skaičius")
plt.ylabel("Procentai (%)")
plt.legend()
plt.grid(True)
plt.show()
# Naudojimas
hipoteze3_grafikas(ws)
Išvados: ¶
- Tam tikrų tautybių, tokių kaip Kinija, Japonija, Tailandas, žaidėjai demonstruoja aukštą pergalės procentą, kas patvirtina hipotezę apie stiprių nacionalinių badmintono tradicijų poveikį rezultatams. Rezultatai taip pat atskleidžia, jog kai kuriose šalyse, pavyzdžiui, Rusijoje ir Australijoje, laimėjimų rodikliai yra palyginti žemi, galimai dėl mažiau išvystytos infrastruktūros ar tradicijų. Tendencijos rodo, kad tautybės ir kultūrinės tradicijos turi reikšmingą poveikį badmintono sėkmei.
- Aukštesniuose raunduose, tokiuose kaip finalas ir pusfinalis, žaidimų vidutinis taškų skirtumas mažesnis, o tai rodo intensyvesnę konkurenciją ir lygesnes komandų galimybes. Rezultatai patvirtina hipotezę, kad aukštesni raundai pasižymi didesniu intensyvumu ir mažesniais taškų skirtumais.
- Žaidimai, kuriuose žaidžiami 3 setai, turi šiek tiek mažesnį pergalių procentą (52.53%) ir didesnį pralaimėjimų procentą (47.47%) nei 2 setų rungtynės (52.79% ir 47.21%). Tai rodo, kad ilgesni žaidimai gali turėti įtakos žaidėjų fizinei būklei ir pasirodymui, nors skirtumai yra nežymūs.