2025.03.20 본_캠프 22일차

민동·2025년 3월 20일
1

본캠프

목록 보기
23/74
post-thumbnail

3월 20일 드디어 기초 프로젝트 발제가 시작되었다...

많고 많은 주제들 중 우리 조는 농구 데이터를 선택하게 되었다.

소거법으로 주제를 선택하게 되었는데

  • 헬스케어는 데이터도 적고 2016년 데이터라서 최신 트랜드를 파악하기 어려워 보였다.
  • 음식 배달 데이터는 2순위 였지만 전처리하는 과정이 많이 힘들어 보였다
  • 구내식당 데이터는 통계적 배경을 어느정도 알아야 할거 같아서 제외했다.
  • 부동산 데이터는 부동산 개념이 힘들어 보였다.
  • 게임 데이터는 롤토체스라는 게임을 저 데이터만으로는 파악하기 너무나 어려워 보였다.
  • 마케팅 투자 효율화는 뭔가 애매했다

농구 데이터는 데이터의 종류도 다양했고 여러 조합으로 만들어 낼 수 있는 방향성 다분해 보였다.

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가 플레이오프에 진출하기 위한 계획을 세우기로 했다.

  1. 커리가 농구의 트랜드를 바꾼 2014년 이후 부터 상위 5개 팀을 뽑아 Oklahoma City Thunder가 부족한 부분을 파악하기로 했다.

  2. 선수 데이터를 이용해 주전 선수들이 아닌 후보 선수들 중 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)

코드 설명

  1. 데이터 로드 및 전처리

    • ranking.csv 파일을 읽어와 데이터프레임(df)으로 변환
    • STANDINGSDATE(순위 업데이트 날짜)를 날짜 형식(datetime)으로 변환
    • SEASON_ID가 20000 이상인 시즌 데이터(df_real_season)만 필터링
  2. 동부/서부 컨퍼런스 분리

    • CONFERENCE'west'인 데이터를 west
    • CONFERENCE'east'인 데이터를 east로 저장
  3. 시즌별 최신 날짜 찾기

    • SEASON_ID별 가장 최신 STANDINGSDATE(순위 업데이트 날짜) 추출(last_date)
  4. 최신 날짜 데이터 필터링

    • df_real_seasonlast_datemerge()하여 각 시즌의 가장 최신 날짜에 해당하는 데이터만 남김 (data_last)
  5. 상위 5팀을 찾는 함수 top_rank() 정의

    • 특정 컨퍼런스(East 또는 West)의 데이터를 필터링
    • SEASON_ID별 그룹화 후, W_PCT(승률) 기준으로 상위 5개 팀을 선택 (nlargest(5, 'W_PCT'))
    • .reset_index(drop=True)로 인덱스 정리
  6. 동부 및 서부 컨퍼런스별 상위 5팀 추출

    • df_east → 동부 컨퍼런스(East)의 상위 5팀 저장
    • df_west → 서부 컨퍼런스(West)의 상위 5팀 저장
  7. 출력

    • df_east.tail(20), df_west.tail(20)을 실행하여 마지막 20개 행 출력 (최신 시즌 결과 확인)
profile
아자아자

0개의 댓글