[seaborn] J리그 2019년의 순위표를 여러가지 그래프화해 보았다~그 2~

소개



기사 개요



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

목적



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

코드와 해설



전제


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


  • 흐름



    1.전의 표(J리그의 랭킹과 승점 등의 표)를 작성
    2. 우선 총득점과 총실점의 관계를 그래프로
    3. 순위와 슛수, 득점의 관계
    4. 각 요소의 상관을 히트 맵으로 보기 쉽게 한다

    코드



    우선, 전회의 테이블을 작성.
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    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_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_all_ranking = j_ranking.merge(j_detail_ranking,on = 'チーム名')
    j_all_ranking.head()
    

    그러면 이전과 유사한 테이블이 작성됩니다.
    다음으로, 총실점·총득점의 관계를 표로 합니다.
    import seaborn as sns
    
    sns.set(font='Yu Gothic') #日本語表記に対応させます。
    sns.jointplot(x='得点', y='失点', data=j_all_ranking);
    
    

    단지 이것만으로, 아래의 표를 할 수 있습니다.
    matplotlib과 비교해도 적은 코드로 편하네요~
    ※그림 위에 문자를 플로팅하는 방법은 몰랐습니다. 알고 계신 분이 있으시면 말씀해 주셨으면 합니다.


    다음에, 순위와 득점·슛수의 관계를 그림으로 해 갑니다.
    f, ax = plt.subplots(figsize=(14, 8))
    
    sns.set_color_codes("pastel")
    sns.barplot(x="シュート", y="チーム名", data=j_all_ranking,
                label="シュート数", color="b")
    
    sns.set_color_codes("muted")
    sns.barplot(x="得点", y="チーム名", data=j_ranking,
                label="得点", color="b")
    
    ax.legend(ncol=2, loc="lower right", frameon=True)
    plt.xlabel('シュート数と得点数');
    

    적은 코드로 쓸 수 있고, 옆으로 할 수 있는 것도 좋네요.
    표는 이런 느낌.

    이 그림을 보면 오이타 트리니타의 특이성을 분명히 알 수 있네요. 슛수에서는 J1 최하위인데 이 순위에 있는 것은, 꽤 효율적으로 득점으로 하고 있는 것을 알 수 있습니다.

    다음으로 각 요소의 상관을 보고 싶습니다.
    상관표의 작성은 전회도 했습니다만, Seaborn에는 heatmap이라고 하는 편리한 기능이 있으므로 그것을 사용하고 싶습니다.
    
    plt.figure(figsize=(20, 10))
    #相関
    pd.options.display.float_format = '{:.2f}'.format #有効数字を指定
    
    j_rank_corr = j_all_ranking.corr()
    sns.heatmap(j_rank_corr);
    


    기본 설정에서는 조금 이해하기 어려우므로 설정을 괴롭혀 보겠습니다.
    plt.figure(figsize=(20, 10))
    sns.heatmap(j_rank_corr,  cmap='coolwarm', annot=True);
    


    이 그림을 보면 무엇이 강한 상관을 나타내고 있는지 일목요연하네요. 이해하기 쉽다!
    여러 열 사이의 산점도를 표시하는 것도 간단합니다.
    모든 요소를 ​​나타내면 무거워져 버리기 때문에 일부만…
    sns.pairplot(j_all_ranking[['順位', '勝点', '勝', '得点','得失点差']]);
    



    여기에서 득점과 승점의 관계를 자세하게 꺼내 봅니다.
    sns.regplot(data = j_all_ranking, x = '得点', y = '勝点');
    



    기본적으로 회귀 직선을 보여주는 것도 좋네요.

    감상·반성



    ・일단 최저한의 요소를 괴롭힌 느낌입니다만, seaborn은 코드가 비교적 알기 쉽고 좋네요.
    · 잘 다루기 위해서는 좀 더 익숙해질 필요가 ...

    참고



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

    좋은 웹페이지 즐겨찾기