ウイイレの解析ソフトでデータベースを使えるように拡張してみた

## ウイイレのデータ解析自動化してくよ！Part7

## ■はじめに
* どうも **[ヤジュン](https://qiita.com/junya0001000/items/ccb673ba7c07a57e6d8a#%E8%87%AA%E5%B7%B1pr)** です。   
    また、ウイイレのイベント増えてきましたね！  
    **[イベント備忘録用に作ったツイッターBot](https://twitter.com/PESeventBOT)** のフォロワーも増えてきました♪（現在230名）
    * **Bot利用者からの嬉しい声**  
        こういう声をもらうと「作ってよかった！」ってなりますね♪  
        大会やイベントの主催者や企業に、利用してもらえるとこまで広まってほしいな～  
        ![](https://i.imgur.com/iL2YytH.png)

## ■本記事の内容
* 今回は、解析ソフトのデータ管理をCSVだけでなく、データベースでも出来るように機能拡張したので紹介します。

    本記事のソフトはpythonで作成しています。[■参考URL](https://qiita.com/junya0001000/items/4bba295baa6de47412e2#%E5%8F%82%E8%80%83url)

### ▼解析アプリの拡張機能一覧
* 前回記事から以下の機能拡張されました。
    1. プレイヤー認証機能
    1. データベースからのデータ読み込み機能
    1. 試合結果画像からメトリクスデータをCSVで出力する機能
    1. CSVのメトリクスデータをデータベースへ追加する機能

## ■データベース管理への背景
* 今まで、CSVファイルでデータ管理をしていました。
    CSVによる管理は、オフラインでもデータ解析できるというメリットはあります。
    しかし、今後マスターデータを育てるためには、各CSVファイルを **[マージ](https://wa3.i-3-i.info/word13441.html)** しなくてはいけません。
        
        めんどくさすぎる！

    そこでデータベース管理へ移行するのです！
    各プレイヤーの解析結果が、データベースに集約される仕組みを作ればマスターデータは、放置していても育っていきます。

## ■拡張機能毎の紹介
### ▼データべースどんな感じ？
* 用いるのは[SQL](https://hnavi.co.jp/knowledge/blog/sql/) です。
    [MySQL](https://www.kagoya.jp/howto/webhomepage/mysql/)環境を構築して、今までのCSVデータを移行します。
    
#### ●実際に移行するとこんな感じ↓
* [HeidiSQL](https://forest.watch.impress.co.jp/library/software/heidisql/)を使ってデータを確認してます。  
今までテスターから収集した150試合の結果を移行しました。
    ![](https://i.imgur.com/Ay5VUFm.gif)

### ▼データベースからデータ読み込み
* ユーザー認証機能を付けました。
    入力したユーザ名とパスワードがデータベースで管理されているものであれば、データを読み込めるようになってます。  

#### ●ユーザ認証からデータ操作はこんな感じ
* デモ操作なので、パスワードもデモ「Password」にしてます。  
    最初に私「Yajun」のデータを読み込んだ後、次に「Masataro」さんのデータを読み込んでいます。  
    ユーザが変わっているので、ゲージチャートとレーダーチャートの型が変わってます。
    ![](https://i.imgur.com/SlUeHtR.gif)

### ▼画像データからCSVファイル出力
* 試合結果画像からメトリクスデータを抽出して、CSVに出力するようにしました。  
この機能の実現が一番難しくて工数がかかってます笑


#### ●ユーザ認証からCSV出力までこんな感じ
* ユーザ名とパスワードを入力して、Startボタンを押すと、フォルダ選択画面が出てきます。  
    試合結果画像を入れているフォルダを選択します。  
    すると、試合結果画像が表示されるので、ユーザは自分がHome側かAway側だったか確認して、表示されるラジオボタンから自チームを選択します。  
    処理が完了すると、試合結果画像を入れているフォルダに「output.csv」が出力されて完了です。  
    ![](https://i.imgur.com/AQdhXDP.gif)

#### ●画像処理して指定しているフォルダの中身
* 本ソフトで必要な試合結果画像が６枚（１試合３枚セットで２試合分）入っています。  
    ３枚セットになっていれば、「チームスタッツ」「攻撃エリア」「ボール奪取エリア」の順番はぐちゃぐちゃで大丈夫です。  
    ![](https://i.imgur.com/fzA9g5F.png)

### ▼データベースへ追加
* CSVファイルが出力されていることを確認してから「Apped」ボタンを押すとデータベースに追加されます。

#### ●追加後のデータベース
* データベースを確認すると、最下段の行に「2対4」と「4対6」の試合結果が格納されています。  
    上の「●画像処理して指定しているフォルダの中身」で公開している画像と見比べていただくと、６枚の画像から抽出されたデータが入っているのを確認できます。
    ![](https://i.imgur.com/Fjs3aTQ.gif)


## ■残課題
* [前回記事で課題の棚卸し](https://qiita.com/junya0001000/items/4c90590bdd6b300a74b5#%E6%AE%8B%E8%AA%B2%E9%A1%8C)をしましたが、今回はそのうち２つを解消しました。 
    そろそろ、テスター向けにテスト版を配布したいとは思ってます。  
    
    めっちゃバグでるんだろうな。。 
    個人の意見ですが、バグfixが一番成長する経験だと思っているので、ポジティブに捉えていきたいと思います。  

## ■展望
* 1000試合分くらいのデータが集まれば機械学習も始めてもいいかなと思ってます。  
    今やっているのは、[データビジュアライゼーション](https://xtrend.nikkei.com/atcl/contents/skillup/00019/00001/)までで、そこからの傾向は人間が考察しなくてはなりません。  
    この傾向判断までもソフトにやらせたいですね♪  
    pythonには、[scikit-learn](https://scikit-learn.org/stable/)や[TensorFlow](https://www.tensorflow.org/overview)などの優秀なライブラリが揃っているので楽しみです。  
    
    個人的に、〇〇選手と〇〇選手を対戦させた場合どちらが勝つのか！？みたいのをソフトにやらせてみたい！笑  
    そのためにはデータを集める仕組みとして、この解析ソフトが必要なのです。  


## ■終わり
* アプリとして最低限の機能は実装できたかなと思います。
    解析のために、画像を集めるって面倒くさいとは思うのですが、 
    PS4で撮ったスクショを１つのフォルダにまとめてフォルダを指定すればいいので、
    思ったよりも面倒臭さは少なめなのかな？と思ってます。    
    
* 前回記事に対し、「データの収集はPS4から直接できるようにならないの？」というご質問を頂きました。
    [PS4のAPIを公開されている方](https://github.com/dhleong/ps4-waker)もいるので、技術検討してみようと思います！
    こういった声は貴重です！ご意見ありがとうございます。  
    

    今回の記事はここまで！また次回をお楽しみに♪
    
## ■参考URL
* [HeidiSQLの機能と使い方を徹底解説！HeidiSQL導入のメリットは？ダウンロードから設定手順・接続方法もご紹介](https://agency-star.co.jp/column/heidisql)  
[Matplotlib - Tcl_AsyncDelete: async handler deleted by the wrong thread?](https://stackoverflow.com/questions/27147300/matplotlib-tcl-asyncdelete-async-handler-deleted-by-the-wrong-thread)  
[サーバサイドにおけるmatplotlibによる作図Tips](https://qiita.com/TomokIshii/items/3a26ee4453f535a69e9e)  
[OpenCVが日本語パスを読み込まない ](http://solasyndrome.blog.fc2.com/blog-entry-16.html)  
[PythonでMySQLに接続する方法【初心者向け】](https://techacademy.jp/magazine/18691)  
[Windows 版 MySQL インストール手順](https://qiita.com/ryo-sato/items/bd026f5e627a746f1734)  
[MySQL基本コマンド一覧まとめ](https://qiita.com/yuzooho/items/5d608f3b84a2037cada0)  
[データベースの作成](https://www.dbonline.jp/mysql/database/)  
[【Python】MySQLにデータ追加 ](https://algorithm.joho.info/programming/python/mysql-connector-append-data/)  
[[Python] MySQLにアクセスしてデータベース操作を行う ](https://hibiki-press.tech/python/connector_python/2239)  
[MySQLでユーザー一覧を取得する方法 権限とパスワード一覧も取得！](https://www.sejuku.net/blog/81974)  
[Python で MySQLのテーブルに INSERT しても反映されない(丸２日無駄に!!)](https://qiita.com/mighty-n/items/19c737a4a140468409c1)  
[mysqldbを介してpandas dataframeをデータベースに挿入するには？](https://www.it-swarm.dev/ja/python/mysqldb%E3%82%92%E4%BB%8B%E3%81%97%E3%81%A6pandas-dataframe%E3%82%92%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E6%8C%BF%E5%85%A5%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%9F/1073748465/)  
[pandasのDataFrameがto_sqlで保存できないときの対処法](https://qiita.com/keigo_999/items/5c705836f18a2727b56d)  
[Importing data from a MySQL database into a Pandas data frame including column names [duplicate]](https://stackoverflow.com/questions/37730243/importing-data-from-a-mysql-database-into-a-pandas-data-frame-including-column-n/37730334)