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:¶

  1. Ž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.
  2. Žaidimai aukštesniame raunde (pvz., pusfinalis, finalas) yra intensyvesni, o jų rezultatų skirtumas mažesnis (pvz., artimesni taškai tarp komandų) nei ankstesniuose raunduose.
  3. Ž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.

nuotrauka

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)
No description has been provided for this image
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")
No description has been provided for this image
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)
No description has been provided for this image

Išvados:
¶

  1. 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.
  1. 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.
  1. Ž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.