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

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

F#でデータサイエンスする前にXPlotlyで寄り道

F# を知ってほしい - Qiita

この記事を見て、F#ってデータサイエンスできるんだ、やってみたいなと思ってましたが、具体的にどうすればいいのかわからずにいました。

そこで、下記のサイトを見つけました。

medium.com

ブログに紹介されている内容にしたがってAzure Notebooks上でコーディングすれば出来はしましたが、私には理解が追いつきませんでした。

f:id:rimever:20181231225725p:plain

関数型言語のF#の理解もそうなのですが、グラフ描画ライブラリであるXPlotlyについても理解が必要そうです。

fslab.org

AzureNotebooks上では、

#load "Paket.fsx"

Paket.Package
    ["XPlot.Plotly"]

#load "Paket.Generated.Refs.fsx"
#load "XPlot.Plotly.Paket.fsx"
#load "XPlot.Plotly.fsx"

open XPlot.Plotly

と宣言しておき、

let layout = Layout(title = "Basic Bar Chart")

let data = ["giraffes", 20; "orangutans", 14; "monkeys", 23]

data
|> Chart.Bar
|> Chart.WithLayout layout
|> Chart.WithHeight 500
|> Chart.WithWidth 700

サンプルコードを動かせば...

f:id:rimever:20181231230955p:plain

いけます。

XPlotlyはマウスオーバーでツールチップが出たりして、表示しているだけで楽しいです。

f:id:rimever:20181231231118p:plain

3Dだとマウスホイールで回転させたりも出来ます。

f:id:rimever:20181231231635p:plain

F#をAzure Notebooksで学ぶ

Azure NotebooksはPythonも書けますが、Google Colaboratoryに比べてF#やRに対応しているところが優れた点かなと思います。

f:id:rimever:20181231191940p:plain

C#erなのに、同じ#がつくF#を全くやったことがなかったので、これを機会に触れてみることにしました。

一通りの文法に触れられそうだなとチョイスしたのは英語ですが下記のサイトです。

F# Programming - Wikibooks, open books for an open world

F#でもPythonと変わらず、Jupyter Notebookですね。

f:id:rimever:20181231191528p:plain

let sumOfDivisors n =
    let rec loop current max acc =
        if current > max then
            acc
        else
            if n % current = 0 then
                loop (current + 1) max (acc + current)
            else
                loop (current + 1) max acc
    let start = 2
    let max = n / 2     (* largest factor, apart from n, cannot be > n / 2 *)
    let minSum = 1 + n  (* 1 and n are already factors of n *)
    loop start max minSum

printfn "%d" (sumOfDivisors 10)
(* prints 18, because the sum of 10's divisors is 1 + 2 + 5 + 10 = 18 *)

これはなかなか泣かせるサンプルですね。難しいです。

f:id:rimever:20181231204635p:plain

これは関数型言語がピッタリですね。ベースが関数ですからね。

やってみて

C#に似ているのは名前だけのようです。

関数の引数はスペース区切りで、()や,は使われません。

またインデントを用いて宣言され、{}も使われません。

自分の知る中ではPythonPowerShellを掛け合わせたような感じです。

ただ、System.Console.WriteLineのような関数を使えるあたりは、.NET一族なのだなと感じました。

.NETが使える関数型言語。それが自分の中での印象です。

Azure NotebooksもPreviewのせいかハイライトが最初のセルだけだったりとまだ未熟な印象です。

Dataloreで気づいたこと。日本語文字化けとかdatalore.plotとか

年末から年明けにかけて、Dataloreの記事が、はてなブックマークしていただいたので、あれからいくつか気づいたことを書きます。

以前の記事では日本語文字化けについて泥臭い対応方法しか案内出来ませんでした。

それについて気づいた点を。

Dataloreでは独自のdatalore.plotというモジュールがあります。

もしやとサインインした時に生成されていたサンプルプロジェクトにはdatalore.plotを用いたコードが入ってますので、ここで日本語を使ったところ、

f:id:rimever:20181231161234p:plain

これならば、行けそうですね。

datalore.plotのAPI仕様についてはドキュメントがないのですが、ggplotにインスパイアされたとあります。

ggplotはRのライブラリです。 R言語をやったことがある方ならば、とっつきやすいかもしれません。(実は、Pythonでもggplotを使うことは可能です)

私は、ありません。勉強しなければならないですね。

ggplotについては下記の記事を参考にしました。

ggplotの使い方 | Memo on the Web

RとPythonの違うため代入は<-ではなく=に置き換える必要はありますが、引数については同じっぽい気がします。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from datalore.plot import *
from sklearn.datasets import load_iris
import pandas as pd

iris_bunch = load_iris()
print(iris_bunch['DESCR'])
iris_df = pd.DataFrame(iris_bunch.data, columns=iris_bunch.feature_names)
iris_df['target'] = pd.Series(pd.Categorical.from_codes(iris_bunch.target, categories=iris_bunch.target_names))

p = ggplot(iris_df, aes(x='sepal length (cm)', y='sepal width (cm)'))
p + geom_point()

f:id:rimever:20190102093815p:plain

表示されました。

f:id:rimever:20190102094026p:plain

立て続けにこんな風にいけますね。

f:id:rimever:20190102094614p:plain

マウスオーバーでラベルが表示されるんですね。

なるほど。

ggPlotと同じノリでいけそうですね。

使用時間120時間ってどんなもん?

フリーだと月120時間までですが、私の現在使用状況は下記です。

f:id:rimever:20190102094303p:plain
0ドルです

12/21から10日間で21時間。30日間に換算すると63時間。

月120時間ならプライベートで使うならば十分そうですね。

フリーだから0ドルですね。問題ない。

その他、 Dataloreで気づいたこと

  • Safariだと入力出来なくないですか?

サンウルブズがなかなか勝てない理由はスタッツに見えてくるか

スーパーラグビーでは我が日本のチーム「サンウルブズ」も参加しています。

が、2018年は残念なことに開幕5連敗ということがありました。

sports.yahoo.co.jp

失礼な言い方になると、これだけ勝てないチームだと、全体の平均と比べれば何が足りないのか如実に出るのではないかということで比較してみました。

f:id:rimever:20181231082713p:plain

何かがはっきりと劣っているということはありませんね。

タックルミスが多いですが、その分、タックル数は多いというのがあると思います。

ラインブレイクも平均と同じ。全然勝てないチームのスタッツのようには見えません。

この記事を見ても数字は良くなっているが、失点する理由がはっきりしないとあります。

【ラグビーコラム】サンウルブズが勝てない理由 6月のテストマッチで結果出すため“産みの苦しみ”が続きそう - SANSPO.COM(サンスポ)

一発の突破とありました。

うーむ。そういうのはスタッツには出ませんね。

組し易いチームとなっている?

サンウルブズの平均と他のチームの平均で見ましたが、サンウルブズが組し易いために、サンウルブズ戦の時の他のチームのスタッツが良いのではないかと考えて、サンウルブズ戦での対戦相手のスタッツを比べてみることにしました。

f:id:rimever:20181231090046p:plain

サンウルブズが優れているのはハンドリングエラーの少なさと、タックル数の多さくらい。

何かが極端に悪いというよりは、全体的に相手に上を行かれてしまっているという状況なのかなと思いました。

それでも、ここまでの力の差が出ているとは思えないので、やはりスタッツではわからないということなのでしょう。

自作のポンコツのモデルで予測してみる

昨日、機械学習でモデルを生成してました。

せっかくなので、サンウルブズの勝利を予測してみることにします。

算出した平均値で分析してみます。

f:id:rimever:20181231183239p:plain

30%となりました。厳しいですね。これまでの1試合ごとのデータを当てはめた時は18.42%となり、さらに厳しい数字になってしまいました。

ですが、こんなデータがデタラメだったというくらいの大躍進サンウルブズに期待してます!

そして、2018年までの戦いぶりと2019年の戦いぶりをスタッツを比べたいですね。

試合日程・結果 - ヒトコム サンウルブズ公式サイト

スーパーラグビーのスタッツで分析するラグビーの勝因は?

ラグビーだけでなく、スポーツの試合を見終わった時に、振り返ることは、

勝因はなんだったのだろう?

でしょう。

実況が解説者に聞くこともあります。

この勝因がスタッツでわからないということで、スーパーラグビーのスタッツで分析していきたいと思います。

項目

英語なので、下記サイトを参考にしつつ整理しました。今回集められたスタッツの項目を紹介します。

“スタッツ”はプレーの成績表 | ラグビー初心者ドットコム

結構多いです。

全般

項目 説明
Posession ボール所持率
Territory 地域支配率

攻撃に関する項目

項目 説明
Runs 走った回数
Runs Metres 走った距離
Line Breaks ラインブレイク。相手のディフェンスラインを崩した回数
OffLoads オフロードパスの回数
Phase Seven Plus 7回以上連続して攻撃している回数
Kicks キックの回数
Kicks Metres キックの距離

防御に関する項目

項目 説明
Tackles タックルの回数
Missed Tackles タックスの失敗数
Handling Errors ハンドリングエラー
Penalties Conceded 反則
FreeKicks Conceded フリーキックを与えた
Sin Bins シンビン(一定時間退場)
Send Offs 退場

#### セットプレーに関する項目

項目 説明
Scrums Won スクラムに勝った
Line Outs Won ラインアウトに勝利した
Line Outs Won Against Throw 相手チームの投げるラインアウトに勝利?
Line Outs Not Straight ラインアウトでまっすぐ投げず、反則

分析

では、分析していくことにします。

相関図

まずは、相関図です。

f:id:rimever:20181230221702p:plain

細かい図になりましたが、勝利に相関が強い項目から並べていくと

  1. ラインブレイク
  2. ホームであるか
  3. キックの回数
  4. キックの距離
  5. 相手のタックル失敗
  6. 相手が投げるラインアウトで取った(? 自信ないですごめんなさい)
  7. スクラムで勝ったか
  8. 相手のハンドリング失敗
  9. 地域支配率

ホームアドバンテージについては以前の記事でも紹介した通り。

一番強い相関だったのがラインブレイクしたかとなりました。

攻撃に関するプレーのスタッツが良いのに越したことはないのでしょうが、上位に、走った回数や走った距離は来ていません。

そりゃ、トライするんだから走った回数とか走った距離は多いでしょという結論になるものだと思っていたのですが、そうではなかったというのが意外でした。

ラインブレイクは走った回数やオフロードパスの回数と相関しているため、局所的に考えて、この数値だけがよくなれば勝てるというのは安直な考えとなります。

ですが、キックも重要なのかなとか、新しい発見があり、客観的にこの相関を見ると面白いなとは思いました。

7回以上連続で攻撃しているかという項目については、攻め続けている=良いのではとも思われますが、逆で、攻めあぐねているから、打開できずに攻撃をし続けているということのようです。

機械学習

機械学習アルゴリズムを用いて、このスタッツだけ(もちろん得点は含みません)で勝利の判定を行ってみることにします。

ランダムフォレスト

f:id:rimever:20181230224813p:plain

74.8%となりました。4試合に3試合しか当てられない。うーん。80%に届いて欲しい!

LightGBM

f:id:rimever:20181230224928p:plain

77.7%

ラッキーセブンですが、80%には届きませんでした。

勝利を予測するには、このスタッツだけでは物足りない様子。

最後に

スタッツだけ見ても面白くないし、ゲームの展開はわからない。

やっぱり、実際のゲームを見ないと楽しめないですね。

スーパーラグビーで考える地域支配率

新年あけましておめでとうございます。

新年になりましたが、昨年の続きをやろうと思います。

ラグビーにはボール支配率だけではなく、地域支配率というスタッツがあります。

ラグビーにおいては、よりゴールに近い位置でプレーしていることが重要です。

サッカーでは、押し込まれたらボールを大きく蹴り出してクリアしますが、ラグビーでは押し込まれている時に、ボールを奪取して蹴り出します。

が、ボールを奪うのが難しく、なかなかそうもうまくいきません。

地域支配率は、どれくらいの時間にボールが敵陣にあったかを表す値です。

そりゃー、地域支配率が高くて押し込んでいる方が、強いはずでしょう。

と私は思ってました。

それが正しいかどうかをデータを用いて、スーパーラグビーのデータで押し込んでいる側(地域支配率が高いチーム)が勝った試合を算出してみます。

f:id:rimever:20181230135228p:plain

と思ったものの、押し込んでいる側が勝った試合は55%となりました。

押し込んでいる側が勝つことが多いとはいえますが、そこまで高くありませんでした。

f:id:rimever:20181230135340p:plain

勝ったチームの地域支配率の分布としては、50%を上回っているケースも多いとはいえ、これもまた少ない地域支配率で勝ったケースもありますね。

データは、自分のイメージに沿った結果になれば、そのイメージの裏付けにもなりますし、そうでなければ思い込みだったと気付かされますね。

Qiita Advent Calendar 2018に投稿してみて

今年は、Qiita Advent Calendar 2018にいくつか投稿させていただきました。

初めてQiita AdventCalenderに投稿したのですが、投稿してみて思ったことを書いていきます。

f:id:rimever:20181225210932p:plain

そもそもAdventCalenderってなに?

アドベントカレンダー - Wikipedia

クリスマスまでの期間の日数を数えるカレンダーです。細かい話になると降誕節といって、1〜24日とは限らないみたいです。

Qiita Advent Calenderでは1~25に特定のテーマに沿って記事を書いていくとなっています。

私はQiitaしか知らないのですが、知り合いがトリテ(トリックテイキング)アドベントカレンダーなるものをやっていて、色んなアドベントカレンダーがあるようです。

ブログで参加もOK

Qiitaの記事でなくて良いなら、既出だったらどうしようとか気にすることもないですし、いつものブログの延長で書くことができたのでハードルが下がって良かったです。

アクセス数が急激に上がる

最初は12/5のC#だけ書く予定でした。

f:id:rimever:20181208145320p:plain

すごい。一桁しか見てもらえない人が三桁。

あまり考えずに参加したけど、技術ブログ書くなら、Qiita Advent Calenderに参加登録した方がいいですね。

ということで、今だけなのだと言い聞かせて、色々なカテゴリーに参加させていただきました。

googleapis.comからのアクセスがあるけど、これって何のこと?

下記の記事で説明されていますが、Chromeのモバイル版のキュレーション機能のようです。

diary.tengai.work

豆知識的なこと

  • 12月になってからでも参加登録は可能。
  • すでに埋まっていても空きが出来る可能性がある。応援しているカレンダーは空きができたら自分で埋める。
  • 別に25日分全部埋める必要はない。
  • 参加登録するなら、なるべく最初の方の日から埋めていった方がいい。けど、締め切りに間に合わない方もちらほらいる。
  • 締め切り守るならば休日。
  • 過ぎた日にちでもxx日の分ですとブログに投稿しても良さそう。

読んでくださった皆様に感謝します。

f:id:rimever:20181231091136p:plain
おかげさまでこれだけのアクセスになりました

来年も地道に頑張ります。