より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

pandasを使ってFIFA18のcsvデータで遊ぶ

はじめに

先日、Pythonもくもく会にて参加者の方と交流させていただいたのですが

rim「pandasって何ですか?」 参加者「そのうち出てくると思います」

とまあ、pandasすら知らなかったのですが

データ分析で頻出のPandas基本操作 - Qiita

データ解析のライブラリとのことですが、csvを扱うだけでも十分なくらいの機能を提供してくれます。

Jupyter Notebookの使い勝手の高さがわかったので、Jupyter Notebook上でpandasを使ってあれこれ遊んでみることに。

FIFA 18 Complete Player Dataset | Kaggle

軽くお手並み拝見 〜 47歳の選手

import pandas as pd

data = pd.read_csv('CompleteDataset.csv')

これだけで読み込めます。ここからが面白いところで

data.head()

データの一部を見れます。

f:id:rimever:20181029233605p:plain

data.describe()

f:id:rimever:20181029221040p:plain

各カラムについての平均や最大、最小などを表示してくれます。

注目はAge。何と、maxに47! 47歳のサッカー選手がいるようです。

FIFA18ではJリーグの選手まで世界全国の選手を登録しているとはいえ、47歳の選手とは一体。

high_age = data[data.Age == 47]
high_age.head()

47歳の選手をこんな感じに抽出できてしまうんです!

f:id:rimever:20181029221440p:plain

実にお手軽!

ちなみに47歳の選手は以下の選手でした。

Barry Richardson (English footballer) - Wikipedia

matplotlibというグラフ描画ライブラリを用いて、AgeとOverallの関係図を出してみます。

Overallは総合力を意味すると思うのですが、散布図にしてみると

f:id:rimever:20181029224308p:plain

サッカー選手のピークは30手前だと思っていたのですが、30をピークとする山なりの形状に。

35過ぎても能力の高い選手はいますね。

PandasのDataFrameで条件抽出する方法まとめ - DeepAge

veteran_data = data[(data.Age > 33) & (data.Overall > 80)]
veteran_data.head()

f:id:rimever:20181029225329p:plain

データの整形 お買い得な選手は誰だ

このデータセットValueと選手の市場価値が取得できるのですが、

temp_data = data['Value']
print(temp_data)
0        €95.5M
1         €105M
2         €123M

Mなどがついており、数値化をする必要があります。

python - Convert the string 2.90K to 2900 or 5.2M to 5200000 in pandas dataframe - Stack Overflow

temp_data = data.Value.replace(r'[€KM]', '', regex=True).astype(float) * data.Value.str.extract(r'[\d\.]+([KM]+)', expand=False).fillna(1).replace(['K','M'], [10**3, 10**6])
data.Value = temp_data

ここまでくると正規表現など、難しくなってきます。

変換したデータを元のValueカラムに返してあげます。

overall_data = data['Overall']
value_data = data['Value']

plt.scatter(overall_data,value_data)

総合力と市場価値を比較した結果。一番上にいるのはネイマールです。

80あたりをピークに市場価値のカーブが急に跳ね上がっていく様子。

それに対して、右下に位置する選手がいます。

これらの選手は能力は高いが、市場価値は低い。よって、お買い得な選手ということ。

f:id:rimever:20181029231608p:plain

bargain_data = data[(data.Value < 20000000) & (data.Overall > 84)]
bargain_data.head()

f:id:rimever:20181029232236p:plain

守護神ブッフォンが。さらにチェフと、やはりキーパーは長生きできるポジションということでしょうか。

ぺぺはアレですが、ゲーム的には文句なしでしょう。

最後に

csvをこんなに自在に操れるpandasには驚かされました。まだまだpandasには紹介しきれないほどに機能があります。

Pythonと共に青春を生きた若者からは、Excelでガチャガチャやっている姿は失笑されてしまうのでしょうか。

Jupyter Notebookは、WindowsでもMacでも使えるので、仕事でも趣味でも駆使していきたいですね。