FIFA 20のプレイヤーデータを使用して、プレイヤーの属性(年齢、身長、体重、能力など)から総合評価(overall)を予測
はじめに
このブログはAidemy Premiumのカリキュラムの一環で、受講修了条件を満たすために公開しています。
受講期間 23年11月6日〜24年5月5日
1、自己紹介
2、受講した理由
3、実行環境
4、今回のテーマ
5、分析の流れ
6、受講後の感想
1、自己紹介
文系大学出身の40代男性で、ドイツ系商社に勤務し、プライベートではスポーツと海をこよなく愛している。
2、受講した理由
現代社会において様々なデータが溢れているが、データをより使いこなせたら、見えていない新たな気づきになるのでは?と思ったから。
何となく人に説明している感覚的な部分をより具体的に人に説明できるようになりたいと思ったから。
ずっとデータの事について勉強したいと思っていながら躊躇っていたけど、Aidemyのフリーの講座を受講した際、わかりやすく、即決。
3、実行環境
Mac M1
Google Colaboratory
4、今回のテーマ
FIFA 20のプレイヤーデータを使用して、プレイヤーの属性(年齢、身長、体重、能力など)から総合評価(overall)を予測すること。
5、分析の流れ
5−1 Pandasの読み込み
import pandas as pd
5-2 CSVファイルの読み込み
今回は、KaggleのFIFA 22 complete player dataset 内に格納されている、players_20を使用。
df = pd.read_csv("/content/drive/My Drive/archive/players_20.csv")
5-3 Google Driveにマウント
from google.colab import drive
drive.mount('/content/drive')
5-4 FIFA 20のプレイヤーデータフレームから特定の列(属性)を抽出
df1 = df[['short_name','age','dob','height_cm','weight_kg','nationality_name','club_name','overall','potential',
'value_eur','wage_eur','player_positions','preferred_foot','international_reputation',
'skill_moves', 'work_rate', 'pace', 'shooting', 'passing', 'dribbling', 'defending', 'physic']]
5-5 新しいデータフレームの表示
df1
5−6モデルの特徴を定義し、モデルのトレーニングおよび評価に使用
attributes はモデルの特徴として使用する特徴を表す
attributeは変数で、モデルの特徴として使用する数値的な特徴の1つ
attributes = [
'age',
'height_cm',
'weight_kg',
'overall',
'value_eur',
'wage_eur',
'international_reputation',
'weak_foot',
'skill_moves',
'pace',
'shooting',
'passing',
'dribbling',
'defending',
'physic'
]
attribute = 'shooting'
5−7 元のDataFrameから指定された特徴(数値的な特徴)の列を選択し、欠損値を持つ行を削除して新しいDataFrameを作成
attributes_df = df[attributes].dropna()
attributes_df
5−8 選手の属性データ(数値的な特徴)を正規化
※正規化とは
選手の属性データ(数値的な特徴)を正規化
正規化とは異なるデータセット内の特徴量や変数の値を同じスケールにする事で、モデルの訓練や解釈をより容易にすること
normalized_df=(attributes_df-attributes_df.min())/(attributes_df.max()-attributes_df.min())
normalized_df
列のカテゴリーは下記の通り
age: プレイヤーの年齢
dob: プレイヤーの生年月日
height_cm: プレイヤーの身長(センチメートル)
weight_kg: プレイヤーの体重(キログラム)
nationality_name: プレイヤーの国籍名
club_name: プレイヤーの所属クラブ名
overall: プレイヤーの総合評価
potential: プレイヤーの潜在能力
value_eur: プレイヤーの市場価値(ユーロ)
wage_eur: プレイヤーの給与(週給、ユーロ)
player_positions: プレイヤーのポジション(複数のポジションがある場合があります)
preferred_foot: プレイヤーの利き足
international_reputation: プレイヤーの国際的な評価
skill_moves: プレイヤーのスキルムーブのレベル
work_rate: プレイヤーのワークレート(攻撃と守備のバランス)
pace: プレイヤーのペース(スピード)
shooting: プレイヤーのシューティング能力
passing: プレイヤーのパス能力
dribbling: プレイヤーのドリブル能力
defending: プレイヤーの守備能力
physic: プレイヤーの身体能力
5-9 トレーニングデータとテストデータに分割
from sklearn.model_selection import train_test_split
X = normalized_df.loc[:,normalized_df.columns != 'overall']
y = normalized_df.overall
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)
5-10 線形回帰モデルを使ってプレイヤーの属性から総合評価を予測し、その予測の精度を評価
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)
model.score(X_test, y_test)
0.8085983718727721
5-11 モデルの評価指標を確認
1、決定係数(R^2スコア)を使用して、モデルの性能を評価
2、決定係数は、モデルがデータの変動のうちどれだけを説明できるかを示す指標であり、1に近いほど良いモデルとされる
3、他にも平均二乗誤差(MSE)や平均絶対誤差(MAE)などの評価指標があるが、このコードでは決定係数を用いてモデルの性能を評価している
model.score(X_test, y_test)
0.8085983718727721
5-12 結論
線形回帰モデルを使用した結果、0.80〜という結果がもたらされているので、プレイヤーの属性から総合評価を予測するための一定の精度を持つことが示されました。
6、受講後の感想
最初は「やるぞ!!」という強い意気込みで臨んだものの、テキストに書いてある事すらチンプンカンプンで、
「お金を無駄にするかも、勉強するものを間違えたかも・・・」
「文系大学出身で、しかも40代になってから今更勉強なんて無謀だったかも・・・」
と絶望の淵に立っていましたが、先に受講された方のブログにもありましたが、とにかく、読み進め、繰り返す事が大事だと思いました。
ようやく少しずつ理解ができ、勉強が楽しくなって来たところで講座が終わってしまうのは残念ですが、自分で少しずつ進めていきたいと思います。
最後に、成果物の作成するにあたり、ちょうど仕事のビッグトラブルが発生し、1ヶ月程どうにもならなくなった際、チューターの皆さんのサポートに心より感謝します。
ありがとうございました。