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.