SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Pythonによるデータ解析入門

Pythonでデータと向き合いながら価値を見出す「探索的データ解析」に挑戦しよう

Pythonによるデータ解析入門 第2回

はじめての探索的データ解析に挑戦(2)

データを絞り概観を確認する

 ここまで、データは全ての試合が対象でした。

 ここから注目したいプレーヤー、今回は錦織選手(Kei Nishikori)に注目してデータを絞りたいと思います。winner_nameとloser_nameにそれぞれ試合の勝者の名前、敗者の名前が入っています。どちらかに錦織選手の名前が現れる試合に絞りたいと思います。

player = 'Kei Nishikori'
df_nishikori = df_raw[(df_raw['winner_name'] == player) | ( df_raw['loser_name'] == player)]

 これでdf_nishikoriは錦織選手の試合データに絞られたDataFrameになりました。

 また、列は注目する項目のみに絞ります。特定の複数の列のみ絞る場合はその項目名を下記の通り指定します。

df = df_nishikori[['surface','tourney_date','winner_name','winner_ht','w_df','w_1stWon','w_2ndWon',
            'loser_name','loser_ht','l_df','l_1stWon','l_2ndWon','minutes']]
df.head()
絞られたデータ
絞られたデータ

データの加工

 試合に勝利したかどうかを表す論理値の列としてデータに追加します。

df['win'] = df['winner_name'] == player
df['win'].head()
win列の追加
win列の追加

 df['win'] はdfに新しく追加された列のデータになります。

 なおdf['win']はDataFrameオブジェクトではなくSeriesオブジェクトです。特定の列のスカラーデータになります。配列と似ていますが、各値はインデックス(この例では0、2、5など、試合を示す番号)を持つ点が異なります。

 いくつかの値が時間とともにどのように変化するかを確認できるようにします。df['tourney_date']にはトーナメントの開始日が文字列として格納されています。

df['tourney_date'].head()
turney_dateの情報
turney_dateの情報

 値が扱いにくい書式なので、標準的な時間のフォーマットに変換します。これにはto_datetimeメソッドが使えます。

date = pd.to_datetime(df['tourney_date'], format = '%Y%m%d')
date
to_datetimeメソッドの結果
to_datetimeメソッドの結果

データ分類の試行錯誤

 Pandasの非常に強力な機能の1つ、GroupByメソッドを使ってみます。このメソッドは列の中で同じ項目ごとにグループ化して総計を返します。例えばここでは勝率をコートの種類ごと(芝や土など)に勝率を算出します。

 gbはGroupByインスタンスです。DataFrameオブジェクトと似ていますが、グループごとの行(ここではコート種類)に分かれます。またmeanを使ってグループごとに平均値として集計しています。

gb = df.groupby('surface')['win'].mean()
gb
コート種類ごとの勝率
コート種類ごとの勝率

 錦織選手はハードコートが得意で、芝のコートが不得意なようです。コートの種類はトーナメントごとに決まっていることなので、試合のプレー内容の指標と勝率の関係を見ていきたいと思います。

 各試合でのミスの指標とも考えられるダブルフォルトに注目してみます。この数値に注目すればプレーヤーの心理状態、自信やリスクに対する姿勢などの情報を得られるはずです。

 ダブルフォルトの数だけと見ると、一般的には、試合の長さ(マッチ数、ゲーム数など)が長いければ多くなることが分かります。ダブルフォルトの割合を確認できるよう、試合の長さに関する何かしらのデータで正規化する必要があります。ここでは試合の時間(分)の数値で割ることにします。これで1分あたりのダブルフォルトの数が算出されます。

df['doublefaults'] = df['win']*(df['w_df'])/(df['minutes']) + ~df['win']*(df['l_df'])/(df['minutes'])

 ここでまたhead()とtail()メソッドやdescribeメソッドによりデータを概観しましょう。

df['doublefaults'].head()
ダブルフォルトのhead
ダブルフォルトのhead
df['dblfaults'].describe()
ダブルフォルトの統計情報
ダブルフォルトの統計情報

 matplotlibのPlot_date関数を使って可視化します。

fig, ax = plt.subplots(1, 1)
ax.plot_date(date.astype(datetime), df['doublefaults'],
             alpha=.25, lw=0)
ax.plot_date(gb['date'].max().astype(datetime),
             gb['doublefaults'].mean(), '-', lw=3)
ax2 = ax.twinx()  
ax2.plot_date(gb['date'].max().astype(datetime),
             gb['win'].mean(), '-', lw=3)
ax.set_xlabel('date')
ax.set_ylabel('Double faults per minutes')
ダブルフォルトの割合と勝率
ダブルフォルトの割合と勝率

 オレンジの折れ線がダブルフォルトの割合の遷移、青の線が勝率の遷移です。

 ダブルフォルトの割合が低いときに勝率が高いときもあれば、その逆もあります。これらの値は相関関係があまりないようです。

 次にセカンドサーブからの得点の割合に注目してみます。この値が高ければ、サーブの威力に頼らずに得点ができていると言えそうです。

df['2ndwon'] 
= df['win']*(df['w_2ndWon'])/(df['minutes']) + ~df['win']*(df['l_2ndWon'])/(df['minutes'])

 同じく勝率との比較をしてみます。matplotlibで可視化します。

fig, ax = plt.subplots(1, 1)
ax.plot_date(date.astype(datetime), df['2ndwon'],
             alpha=.25, lw=0)
ax.plot_date(gb['date'].max().astype(datetime),
             gb['2ndwon'].mean(), '-', lw=3)
ax2 = ax.twinx()  
ax2.plot_date(gb['date'].max().astype(datetime),
             gb['win'].mean(), '-', lw=3)
ax.set_xlabel('date')
ax.set_ylabel('2ndwon  per minutes')

 これで結論の項目で示していたグラフが表示されます。セカンドサーブからの得点の割合と勝率は比較的近い遷移をしており、これらの値は相関があると言えそうです。

まとめ

 今回はPythonを用いて探索的データ解析を行う方法を解説しました。特にJupyter Notebookの対話的な分析の流れ、またPandasを用いた加工や集計が効率を高めている点を体験できたのではないかと思います。次回は同様の環境・ツールを用いて統計手法を利用したデータ解析に挑戦します。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Pythonによるデータ解析入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 西 潤史郎(ニシ ジュンシロウ)

WINGSプロジェクト について>有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 山田...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11043 2018/09/06 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー