はじめに
先日、Pythonもくもく会にて参加者の方と交流させていただいたのですが
rim「pandasって何ですか?」 参加者「そのうち出てくると思います」
とまあ、pandasすら知らなかったのですが
データ解析のライブラリとのことですが、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()
データの一部を見れます。
data.describe()
各カラムについての平均や最大、最小などを表示してくれます。
注目はAge。何と、maxに47! 47歳のサッカー選手がいるようです。
FIFA18ではJリーグの選手まで世界全国の選手を登録しているとはいえ、47歳の選手とは一体。
high_age = data[data.Age == 47] high_age.head()
47歳の選手をこんな感じに抽出できてしまうんです!
実にお手軽!
ちなみに47歳の選手は以下の選手でした。
Barry Richardson (English footballer) - Wikipedia
matplotlibというグラフ描画ライブラリを用いて、AgeとOverallの関係図を出してみます。
Overallは総合力を意味すると思うのですが、散布図にしてみると
サッカー選手のピークは30手前だと思っていたのですが、30をピークとする山なりの形状に。
35過ぎても能力の高い選手はいますね。
PandasのDataFrameで条件抽出する方法まとめ - DeepAge
veteran_data = data[(data.Age > 33) & (data.Overall > 80)] veteran_data.head()
データの整形 お買い得な選手は誰だ
このデータセット、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あたりをピークに市場価値のカーブが急に跳ね上がっていく様子。
それに対して、右下に位置する選手がいます。
これらの選手は能力は高いが、市場価値は低い。よって、お買い得な選手ということ。
bargain_data = data[(data.Value < 20000000) & (data.Overall > 84)] bargain_data.head()
守護神ブッフォンが。さらにチェフと、やはりキーパーは長生きできるポジションということでしょうか。
ぺぺはアレですが、ゲーム的には文句なしでしょう。
最後に
csvをこんなに自在に操れるpandasには驚かされました。まだまだpandasには紹介しきれないほどに機能があります。