3월 20일 드디어 기초 프로젝트 발제가 시작되었다...
많고 많은 주제들 중 우리 조는 농구 데이터를 선택하게 되었다.
소거법으로 주제를 선택하게 되었는데
농구 데이터는 데이터의 종류도 다양했고 여러 조합으로 만들어 낼 수 있는 방향성 다분해 보였다.
NBA 데이터 설명
- Game_Detail 테이블 컬럼 설명
FGM (Field Goals Made): 성공한 필드골 개수
FGA (Field Goals Attempted): 시도한 필드골 개수
FG_PCT (Field Goal Percentage): 필드골 성공률 (FGM/FGA)
FG3M (3-Point Field Goals Made): 성공한 3점슛 개수
FG3A (3-Point Field Goals Attempted): 시도한 3점슛 개수
FG3_PCT (3-Point Field Goal Percentage): 3점슛 성공률 (FG3M/FG3A)
FTM (Free Throws Made): 성공한 자유투 개수
FTA (Free Throws Attempted): 시도한 자유투 개수
FT_PCT (Free Throw Percentage): 자유투 성공률 (FTM/FTA)
OREB (Offensive Rebounds): 공격 리바운드 개수
DREB (Defensive Rebounds): 수비 리바운드 개수
REB (Total Rebounds): 전체 리바운드 개수 (OREB + DREB)
AST (Assists): 어시스트 개수
STL (Steals): 스틸 개수
BLK (Blocks): 블록 개수
TO (Turnovers): 턴오버 개수
PF (Personal Fouls): 개인 파울 개수
PTS (Points): 득점
PLUS_MINUS: 플러스/마이너스 (선수가 코트에 있는 동안 팀의 득실점 차이)
- TEAM 테이블 컬럼 설명
TEAM_ID: 팀의 고유 식별 번호
MIN_YEAR: 팀의 기록이 시작된 최초 연도
MAX_YEAR: 팀의 가장 최근 기록이 있는 연도
ABBREVIATION: 팀의 약자 (예: LAL for Los Angeles Lakers)
NICKNAME: 팀의 별명 (예: Lakers, Warriors, Celtics 등)
YEARFOUNDED: 팀이 창립된 연도
CITY: 팀의 연고지 도시
ARENA: 팀의 홈 경기장 이름
ARENACAPACITY: 경기장의 최대 수용 인원
OWNER: 팀의 소유주 또는 소유 그룹
GENERALMANAGER: 팀의 단장 (General Manager)
HEADCOACH: 팀의 감독 (Head Coach)
DLEAGUEAFFILIATION: NBA G 리그(이전의 D-리그) 제휴 팀 이름
- RANKING 테이블 컬럼 설명
TEAM_ID: 팀의 고유 식별 번호
LEAGUE_ID: 리그의 고유 식별 번호 (NBA의 경우 보통 00)
SEASON_ID: 해당 시즌의 식별자 (예: "2022-23")
STANDINGSDATE: 이 순위 정보가 기록된 날짜
CONFERENCE: 팀이 속한 컨퍼런스 (동부 또는 서부)
TEAM: 팀 이름
G (Games): 플레이한 경기 수
W (Wins): 승리 수
L (Losses): 패배 수
W_PCT (Win Percentage): 승률 (승리 수 / 경기 수)
HOME_RECORD: 홈경기 성적 (승-패)
ROAD_RECORD: 원정경기 성적 (승-패)
RETURNTOPLAY: 리그 중단 후 복귀 여부를 나타내는 지표 (주로 COVID-19 팬데믹 관련)
- GAME
GAME_DATE_EST: 경기 날짜 (동부 표준시 기준)
GAME_ID: 각 경기의 고유 식별 번호
GAME_STATUS_TEXT: 경기 상태 (예: 예정됨, 진행 중, 종료 등)
HOME_TEAM_ID: 홈 팀의 식별 번호
VISITOR_TEAM_ID: 원정 팀의 식별 번호
SEASON: 해당 시즌 (예: "2022-23")
TEAM_ID_home: 홈 팀의 식별 번호 (HOME_TEAM_ID와 동일)
PTS_home: 홈 팀 득점
FG_PCT_home: 홈 팀 필드골 성공률
FT_PCT_home: 홈 팀 자유투 성공률
FG3_PCT_home: 홈 팀 3점슛 성공률
AST_home: 홈 팀 어시스트 개수
REB_home: 홈 팀 리바운드 개수
TEAM_ID_away: 원정 팀의 식별 번호 (VISITOR_TEAM_ID와 동일)
PTS_away: 원정 팀 득점
FG_PCT_away: 원정 팀 필드골 성공률
FT_PCT_away: 원정 팀 자유투 성공률
FG3_PCT_away: 원정 팀 3점슛 성공률
AST_away: 원정 팀 어시스트 개수
REB_away: 원정 팀 리바운드 개수
HOME_TEAM_WINS: 홈 팀 승리 여부 (1은 홈 팀 승리, 0은 패배)
우리는 2022년 12월 Oklahoma City Thunder이라는 팀을 선택하였다.
NBA는 1월에 트레이드 시장이 열리는데 Oklahoma City Thunder가 플레이오프에 진출하기 위한 계획을 세우기로 했다.
커리가 농구의 트랜드를 바꾼 2014년 이후 부터 상위 5개 팀을 뽑아 Oklahoma City Thunder가 부족한 부분을 파악하기로 했다.
선수 데이터를 이용해 주전 선수들이 아닌 후보 선수들 중 Oklahoma City Thunder의 부족한 부분을 채울 수 있는 선수를 찾아 영업리스트를 작성하기로 했다.
1,2이 우리 조가 설정한 데이터 분석의 가장 큰 틀이다...
오늘은 우리가 설정한 틀을 바탕으로 각 시즌별 상위 5개 팀들을 뽑는 시도를 했다..
4시간만에 겨우 성공한게 너무나도 슬펐다...
df = pd.read_csv('ranking.csv')
df['STANDINGSDATE'] = pd.to_datetime(df['STANDINGSDATE'])
df_real_season = df[df['SEASON_ID'] >= 20000]
west = df_real_season[df_real_season['CONFERENCE'] == 'west']
east = df_real_season[df_real_season['CONFERENCE'] == 'east']
last_date = df_real_season.groupby('SEASON_ID')['STANDINGSDATE'].max()
data_last = df_real_season.merge(last_date,on=['SEASON_ID','STANDINGSDATE'])
def top_rank(data,conference):
team = (data[data['CONFERENCE'] == conference].groupby('SEASON_ID').apply(lambda x:
x.nlargest(5,'W_PCT')).reset_index(drop=True))
return team
df_east = top_rank(data_last,'East')
df_east.tail(20)
df_west = top_rank(data_last,'West')
df_west.tail(20)
데이터 로드 및 전처리
ranking.csv
파일을 읽어와 데이터프레임(df
)으로 변환STANDINGSDATE
(순위 업데이트 날짜)를 날짜 형식(datetime
)으로 변환SEASON_ID
가 20000 이상인 시즌 데이터(df_real_season
)만 필터링동부/서부 컨퍼런스 분리
CONFERENCE
가 'west'
인 데이터를 west
CONFERENCE
가 'east'
인 데이터를 east
로 저장시즌별 최신 날짜 찾기
SEASON_ID
별 가장 최신 STANDINGSDATE
(순위 업데이트 날짜) 추출(last_date
)최신 날짜 데이터 필터링
df_real_season
와 last_date
를 merge()
하여 각 시즌의 가장 최신 날짜에 해당하는 데이터만 남김 (data_last
)상위 5팀을 찾는 함수 top_rank()
정의
East
또는 West
)의 데이터를 필터링SEASON_ID
별 그룹화 후, W_PCT
(승률) 기준으로 상위 5개 팀을 선택 (nlargest(5, 'W_PCT')
).reset_index(drop=True)
로 인덱스 정리동부 및 서부 컨퍼런스별 상위 5팀 추출
df_east
→ 동부 컨퍼런스(East
)의 상위 5팀 저장df_west
→ 서부 컨퍼런스(West
)의 상위 5팀 저장출력
df_east.tail(20)
, df_west.tail(20)
을 실행하여 마지막 20개 행 출력 (최신 시즌 결과 확인)