[matplotlib] J리그 2019년의 순위표를 다양한 그래프화해 보았다~그 1~

소개



기사 개요



이 기사에서는 J리그의 2019년 순위표를 사용하여 matplotlib 사용법을 배우면서 축구에서 순위와 강하게 상관되는 것은 무엇인가를 고찰해 나갈 것입니다.
자신의 학습 메모 대신이기도 하므로, 읽기 어려울지도 모릅니다만 용서해 주세요.

목적



・matplotlib의 사용법에 익숙해진다.
· DataFrame을 다룰 수 있습니다.
· 축구 순위에서 중요한 요소를 찾습니다.

코드와 해설



전제


  • 개발 환경
  • Anaconda
  • Python3
  • Juptyer-notebook


  • 흐름



    1. J리그 데이터 사이트의 순위표를 체크
    2. 두 개의 테이블 결합
    3. 우선 승점을 플롯해 본다
    4. 총득점과 총실점의 관계를 그래프로
    5.승·분·패의 비율을 봐
    6. 각 요소의 상관을 살펴본다

    코드



    우선 j리그 사이트에서 표를 읽고 성형.
    import pandas as pd
    
    url_ranking = 'https://data.j-league.or.jp/SFRT01/?search=search&yearId=2019&yearIdLabel=2019%E5%B9%B4&competitionId=460&competitionIdLabel=%E6%98%8E%E6%B2%BB%E5%AE%89%E7%94%B0%E7%94%9F%E5%91%BD%EF%BC%AA%EF%BC%91%E3%83%AA%E3%83%BC%E3%82%B0&competitionSectionId=0&competitionSectionIdLabel=%E6%9C%80%E6%96%B0%E7%AF%80&homeAwayFlg=3'
    j_ranking = pd.read_html(url_ranking)
    j_ranking = pd.DataFrame(j_ranking[0])
    j_ranking = j_ranking.drop(['グラフ','試合','直近試合の勝敗','Unnamed: 12','Unnamed: 13'], axis=1) #不要なカラムの削除
    j_ranking = j_ranking.rename(columns={"チーム":"チーム名"}) #もう一つの表と結合するためカラム名の変更
    j_ranking.head()
    


    j_detail_ranking = 'https://data.j-league.or.jp/SFRT08/search?competitionYearEx=2019&competitionIdEx=1&selectedCompetitionName=%E6%98%8E%E6%B2%BB%E5%AE%89%E7%94%B0%E7%94%9F%E5%91%BD%EF%BC%AA%EF%BC%91%E3%83%AA%E3%83%BC%E3%82%B0&selectedCompetitionYear=2019%E5%B9%B4&competitionYear=2019&competitionId=1'
    j_detail_ranking = pd.read_html(j_detail_ranking)
    j_detail_ranking = pd.DataFrame(j_detail_ranking[0])
    j_detail_ranking = j_detail_ranking.drop(18) #不要な行の削除
    j_detail_ranking = j_detail_ranking.drop(['試合','試合時間','Unnamed: 19','退席','得点','失点','1試合平均得点','1試合平均失点'],axis=1) #不要なカラムの削除
    j_detail_ranking.head()
    



    두 가지 유형의 테이블을 통합합니다.
    j_all_ranking = j_ranking.merge(j_detail_ranking,on = 'チーム名')
    j_all_ranking.head()
    



    우선은 순위와 승점으로 그래프화하고 있습니다.
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    #日本語フォントに対応
    from matplotlib.font_manager import FontProperties
    fp = FontProperties(fname=r'C:\WINDOWS\Fonts\meiryob.ttc', size=14)
    
    x = j_all_ranking.loc[:,'順位'].values
    y = j_all_ranking.loc[:,'勝点'].values
    plt.plot(x,y, 'bo')
    plt.xlabel('順位', fontproperties=fp)
    plt.ylabel('勝ち点', fontproperties=fp);
    


    그래프를 보면 왠지 상위·중위·하위로 나뉘어져 있습니다만, 전체적으로 승점의 차이는 작습니다.

    그런 다음 총 실점과 총 점수로 산점도를 만듭니다.
    from adjustText import adjust_text #文字の重なりを防ぐ
    #総得点VS総失点
    
    plt.figure(figsize=(14, 8))
    
    teams = j_all_ranking.loc[:, 'チーム名'].values
    x = j_all_ranking.loc[:, '得点'].values
    y = j_all_ranking.loc[:, '失点'].values
    
    plt.scatter(x,y)
    plt.title('総得点 VS 総失点',fontproperties=fp)
    plt.xlabel('総得点',fontproperties=fp)
    plt.ylabel('総失点',fontproperties=fp)
    texts = [plt.text(x[i], y[i], team,fontproperties=fp) for i, team in enumerate(teams)]
    adjust_text(texts);
    




    그래프의 오른쪽 하단에 갈수록 순위가 오르고 있네요.
    점의 위치에서 그 팀의 과제도 왠지 보입니다.
    예를 들어, 비셀 고베는 득점력이 있지만 실점도 꽤 많습니다. 실점을 줄이면 추가 상위 진출 가능성도 있습니다.

    다음으로 승·분·패의 비율을 그래프로 합니다.
    #勝・引き・負の割合
    
    x = j_all_ranking.loc[:,'順位'].values
    y_1 = j_all_ranking.loc[:,'勝'].values
    y_2 = j_all_ranking.loc[:,'分'].values
    y_3 = j_all_ranking.loc[:,'敗'].values
    p1 = plt.bar(x,y_1)
    p2 = plt.bar(x,y_2,bottom=y_1)
    p3 = plt.bar(x,y_3,bottom=y_1+y_2)
    plt.legend((p1[0],p2[0],p3[0]),('Win','Draw','Lose'),);
    



    다음으로 각 요소의 상관 계수를 조사하고 있습니다.
    #相関
    pd.options.display.float_format = '{:.2f}'.format #有効数字を指定
    j_rank_corr = j_all_ranking.corr()
    j_rank_corr
    



    각 값을 보면, 「승점・승・득실점」은 당연히 순위와 강하게 상관하고 있군요.
    「득점・실점」에서는 「득점」이 약간 상관수가 크네요. 이것이 유의한 차이인지 아닌지, 가설 검정 등을 하지 않으면 뭐라고 말할 수 없습니다만, 공격보다 수비가 소중하다고 할 가능성도 있군요.
    「슛수・피슛수」는 그다지 순위와 상관하지 않는 것 같네요.
    ※이번은 가볍게 데이터에 접하는 것이 목적이므로, 가설 검정등은 실시하고 있지 않습니다.

    감상·반성



    ・기본적인 사용법은 마스터 할 수 있었을까.
    ・사용법 자체보다, 어느 요소를 추출할까라는 쪽이 고민한다.
    ・실제의 데이터를 사용하면 리얼하고 즐겁다!

    참고



    · Python을 사용하여 2019년도 J1 팀 데이터를 시각화해 보았다
    · 데이터 과학을 위한 Python 입문 강좌 전 33회 ~목차와 정리~

    좋은 웹페이지 즐겨찾기