본문 바로가기

Data Analysis/기타 데이터

[기타 데이터] LA Lakers 경기 데이터 분석 3 (EDA / 시각화 / 리뷰)

728x90

이전 내용은 아래 글에서 확인 할 수 있습니다.

 

 

[기타 데이터] LA Lakers 경기 데이터 분석 1 (데이터 확인 / 질문)

LA Lakers 경기 데이터 분석 데이터 출처 :  http://www.basketballgeek.com/data/  1. 데이터 확인 # 기본 패키지 불러오기 import math import numpy as np import pandas as pd import matplotlib.pyplot as..

sks8410.tistory.com

 

 

[기타 데이터] LA Lakers 경기 데이터 분석 2 (데이터 전처리)

이전 내용은 아래 글에서 확인 부탁 드리겠습니다. [기타 데이터] LA Lakers 경기 데이터 분석 1 (데이터 확인 / 질문) LA Lakers 경기 데이터 분석 데이터 출처 :  http://www.basketballgeek.com/data/ 1. 데이..

sks8410.tistory.com

3. EDA & 데이터 시각화

3-1 홈 경기 대 원정 경기의 비율

# 날짜별 홈 경기인지 원정 경기인지 확인

lakers_home_away = lakers[["date", "game_type"]].groupby(["date", "game_type"]).sum().reset_index()

lakers_home_away

 

 

# 홈 / 원정 경기 비율 시각화

fig = go.Figure()

fig.add_trace(
    go.Pie( # 파이 그래프 그리기 
        labels = lakers_home_away["game_type"].value_counts().index,
        values = lakers_home_away["game_type"].value_counts(),
        textinfo = "label+percent", # 그래프 내 데이터 값 표시 방법
        insidetextorientation = "horizontal" # 그래프 내 데이터 값 표시 방향
    )
 
)

fig.update_layout( # 그래프 레이아웃 설정
    {
        "title": {
            "text": "<b> 홈 / 원정 경기 비율 Pie Graph </b>",
            "x" : 0.5, # x 축 기준 타이틀 위치
            "y" : 0.9, # y 축 기준 타이틀 위치
            "font": {             
                "size": 25 # 타이틀 폰트 크기
            }
        },
        "showlegend": True # 범례 표시 
    }
)

fig.show()

 

# 홈 / 원정 경기 수 시각화 

fig = go.Figure()

fig.add_trace(
    go.Bar( # 바 그래프 그리기
        x = lakers_home_away["game_type"].value_counts().index,
        y = lakers_home_away["game_type"].value_counts(),
        text = lakers_home_away["game_type"].value_counts(), # 그래프 내 데이터 값 표시
        textposition = "auto", # 그래프 내 데이터 값 위치
        textfont_size = 25, # 그래프 내 데이터 값 폰트 크기
        marker_color = px.colors.qualitative.Plotly
        # 그래프 색상 지정 (https://plotly.com/python/discrete-color/ 참조)
    )
)

fig.update_layout(
    {
        "title": {
            "text": "<b>홈 / 원정 경기 횟수 Count</b>",
            "x": 0.5,
            "y": 0.9,
            "font": {
                "size": 25
            }
        }
    }
)
            
fig.show()

홈 / 원정경기 비율은 5:5 인 것을 확인할 수 있습니다.

3-2 경기에서 발생한 행동 유형 확인

# 몇개의 행동 유형이 있는지 확인

print("행동유형 리스트: ", lakers["etype"].unique())
print("행동유형 종류의 갯수: ", lakers["etype"].nunique())

 

# 행동유형별 발생 횟수 확인

lakers["etype"].value_counts()

 

# 행동유형별 발생 횟수 시각화 

fig = go.Figure()

fig.add_trace(
    go.Bar(
        x = lakers["etype"].value_counts().index,
        y = lakers["etype"].value_counts(),        
        text = lakers["etype"].value_counts(),
        textposition = "auto",
        textfont_size = 15,        
        marker_color = px.colors.qualitative.Plotly
    )
)

fig.update_layout(
    {
        "title": {
            "text": "<b>행동유형별 발생 횟수 Count Graph</b>",
            "x": 0.5,
            "y": 0.9,
            "font": {
                "size": 25
            }
        }
    }
)
            
fig.show()

선수들은 경기에서 슛을 가장 많이 하며 리바운드, 프리 드로우 순으로 행동을 많이 하는 것을 알 수 있습니다.

 

 

# 각 쿼터별 행동유형 발생 수 확인

lakers_etype_period = lakers.groupby(["etype", "period"]).size().reset_index().pivot(index = "etype", columns = "period", values = 0)
lakers_etype_period

 

# 각 쿼터별 행동유형 시각화

lakers_etype_period.iplot(kind = "bar", barmode = "stack", title = "각 쿼터별 행동유형", theme = "white")

 3-3 LA Lakers 의 경기 결과

# 행동이 성공한 데이터만 변수로 지정

lakers_made = lakers[lakers["result"].isin(["made"])]

 

# 경기 날짜별 팀별 득점 합계를 그룹화

lakers_result = pd.pivot_table(data = lakers_made,
                              index = ["date", "team"],
                              values = ["points"],
                              aggfunc = "sum",
                              fill_value = 0)

lakers_result = lakers_result.reset_index()

lakers_result

 

# LA 레이커스와 상대편으로 나누기

lal = lakers_result[lakers_result["team"] == "LAL"] # LA 레이커스
opp = lakers_result[lakers_result["team"] != "LAL"] # 상대편

print(lal.shape)
print(opp.shape)

print(lal.head())
print(opp.head())

 

# LA 레이커스와 상대편 데이터 합치기


lakers_point = pd.merge(lal, opp, on = "date")
lakers_point

 

# LA 레이커스가 이긴 경기와 진 경기로 나누기

win = lakers_point[lakers_point["points_x"] > lakers_point["points_y"] ] # LA 레이커스가 이긴 경기 
lose = lakers_point[lakers_point["points_x"] < lakers_point["points_y"] ] # LA 레이커스가 진 경기

print(win.shape)
print(lose.shape)

print("LA 레이커스는 총 {} 회의 경기 중, {} 번 승리했다.".format(lakers_point.shape[0], win.shape[0]))

 

# 날짜별 LA 레이커스 경기 결과 시각화

fig = go.Figure()

fig.add_trace(
    go.Scatter( # 라인 그래프 그리기
        x = lakers_point["date"],
        y = lakers_point["points_x"],
        name = "LA Lakers", 
        mode = "lines" # 라인으로 표현         
    )
)

fig.add_trace(
    go.Scatter(
        x = win["date"],
        y = win["points_x"],
        name = "Lakers Win",
        mode = "markers", # 도트로 표현
        marker = dict(color = "#FD3216", size = 8) # 도트 색상, 크기 설정
    )
)

fig.add_trace(
    go.Scatter(
        x = lakers_point["date"],
        y = lakers_point["points_y"],
        name = "Opponent",
        mode = "lines",
        line = dict(dash = "dash") # 점선으로 표현
    )
)

fig.add_trace(
    go.Scatter(
        x = lose["date"],
        y = lose["points_x"],
        name = "Lakers lose",
        mode = "markers",
        marker = dict(color = "#D626FF", size = 8)
    )
)


fig.update_layout(
    {
        "title": {
            "text": "<b>LA Lakers 경기 결과</b>",
            "x": 0.45, # x 축 기준 타이틀 위치
            "y": 0.93, # y 축 기준 타이틀 위치
            "font": {
                "size": 20 # 타이틀 글씨 크기
            }
        },
        "showlegend": True, # 범례 표시 
        "xaxis": {
            "title": "Date", # x 축 타이틀 이름
            "showticklabels": True, # x 축 간격 표시
            "dtick": "M1" # x 축 간격 범위
            
        },
        "yaxis": {
            "title": "Score" # y 축 타이틀 이름
        },  
        "template":'plotly_white' # 배경 설정
    }
)

fig.show()

3-4 LA레이커스 선수들은 코트의 어느 위치에서 어떤 동작을 했는가?

# team 이 LA 레이커스 인 데이터만 가져오기

lakers_2 = lakers[lakers["team"] == "LAL"]

print(lakers.shape)
print(lakers_2.shape)

lakers_2.head()

 

# LAL 선수가 득점한 위치 시각화

f, ax = plt.subplots(1, 2, figsize = (12, 7))

# 득점 성공 / 실패 분포

g1 = sns.scatterplot(data = lakers_2, x = "x", y = "y", hue = "result", alpha = 0.3, palette = "Paired", ax = ax[0])
g2 = sns.kdeplot(data = lakers_2, x = "x", y = "y", hue = "result", palette = "Paired", ax = ax[0])

# 득점 점수 별 분포

g3 = sns.scatterplot(data = lakers_2, x = "x", y = "y", hue = "points", alpha = 0.3, palette = "Set3", ax = ax[1])
g3 = sns.kdeplot(data = lakers_2, x = "x", y = "y", hue = "points", palette = "Set3", ax = ax[1])

plt.show()

 x, y 컬럼의 nan 값이 0으로 처리되어 0 근처에 쏠림이 많이 보이고 있습니다.

 

 

# 가장 많이 한 세부 행동 10가지 선정

lakers_type_top10 = lakers_2[lakers_2["type"].isin(lakers_2["type"].value_counts().head(10).index)]
lakers_type_top10.head()

 

# 세부 행동 별 위치 시각화

fig = px.scatter(lakers_type_top10,x = "x", y = "y",
                 color = "type",
                 title = "<b>LA 레이커스 세부 행동별 위치</b>")

fig.update_layout(title_font_size = 20)

fig.show()

대부분 점프 슛과 3점슛을 시도했고, 간간히 먼 곳에서 3점 슛을 한 경우도 나타나고 있습니다.

골대 근처에서는 레이업과 드라이빙 레이업을 시도한 경우도 보입니다.

4. Review

- LA레이커스 데이터는
: 총 데이터 개수:  450112
  총 결측치 수: 76625 = 전체 데이터의 17.02% 
  LA레이커스와 경기한 팀 수:  28
  경기에 등장하는 행동 수:  10
  경기에 등장하는 세부행동 수:  73

- LA레이커스의 홈 경기 vs. 원정경기 비율은?  
: 홈 경기와 원정경기를 1:1 비율로 치렀다.

 

- 경기에서 선수들이 가장 많이 하는 행동유형(etype)은?

: 슛을 가장 많이 하고 그 다음으로는 리바운드를 많이 했다.

 

- 이번 시즌에서 LA레이커스의 경기 결과는?  
: 08 - 09 시즌에 LA 레이커스는 총 78회의 경기 중, 63번 승리 하였다.

 

- LA레이커스 선수들은 코트의 어느 위치에서 어떤 동작을 했는가?
: 상대편 골대 기준으로 왼쪽에서 슛 했을 때 더 많이 성공했다

- 더 분석해볼 점은? 

: x, y 좌표의 NaN에 0을 넣지 않는 것이 분석 결과에 더 좋다!  
 특정 선수의 행동 패턴 분석

728x90