이전 내용은 아래 글에서 확인 할 수 있습니다.
[기타 데이터] 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을 넣지 않는 것이 분석 결과에 더 좋다!
특정 선수의 행동 패턴 분석
'Data Analysis > 기타 데이터' 카테고리의 다른 글
[기타 데이터] Commerce 데이터 분석 2 (데이터 전처리) (0) | 2021.10.12 |
---|---|
[기타 데이터] Commerce 데이터 분석 1 (데이터 확인 / 질문하기) (0) | 2021.10.12 |
[기타 데이터] LA Lakers 경기 데이터 분석 2 (데이터 전처리) (0) | 2021.10.08 |
[기타 데이터] LA Lakers 경기 데이터 분석 1 (데이터 확인 / 질문) (0) | 2021.10.08 |
[기타 데이터] Starwars 케릭터 분석 3 (EDA / 시각화 / 리뷰) (0) | 2021.10.07 |