gorogoroyasu

福岡の開発会社で働いている。

Fusic Advent Calendar 2017 社内で行っているPandas等の勉強会の話

Fusic Advent Calendar 2017 記念すべき1日目の記事です。
昨年は、2日目に甘んじてしまいましたが、
今年は、初っ端からハードルを下げていく感じで行きたいと思います。

qiita.com

概要説明

最近、機械学習が大流行中ということで、
自分もついていこうと、踏ん張っています。

自分は、Deep Learning しか触っていないのですが、
それ以外の方法も、色々勉強していきたいと思い、
時間があったら知識をインプットしています。

ただ、機械学習を始めてすぐ、
もちろん手法は大事だけど、データを上手く扱うことも非常に大事だと気づきました。

データ扱うの難しい。。
pandas とか numpy とか、仲良くなったらいいんでしょうけど、
なかなかとっつきづらい。。。
あと、可視化重要。
可視化しないと、どんなデータかは基本分からない。。。

ということで、社内の興味ある人を集めて、
計4回の勉強会を開催しました。

今日は、 他に書くこともないし時間もないので どんな型式で、どのように勉強会を進めたかを書いていきます。

どんな勉強会?

事前にpandas, numpy 等を使った問題を出し、
週に1回1時間、皆で回答を解説をするという勉強会です。
問題の作成に1~2 時間、 回答に 1~2 時間かかるぐらいのボリュームになればいいなと思ってはじめました。

環境

環境構築の手間が省けるよう、
社内サーバーにjupyter notebook を立て、
誰でもアクセスできるようにしました。
参加者の約半数は、自分が用意した jupyter を使ってくれていたと思います。
ちなみに、そのjupyter は、 docker 上で動かしていたので、壊しても安心な感じにしていました。
(バックアップ とってないけどホストにマウントしてる。 ホストが死んだら終わり。)

第一回

第一回は、 numpyと pandas の入門を行いました。
これから始めようという人がいたら、やってみるといいと思います。

問題はこちら。

第一回 (numpy)

# 問題1
正規分布 に従う、10x10 の行列を作成し、ヒストグラムを描画してください。

# 問題2
平均値10, 標準偏差10 1000 個の値のヒストグラム、
平均値50, 標準偏差10 1000 個の値のヒストグラム を1枚の画像として重ねて出力してください。
ただし、各グラフは透過させてください。

# 問題3 
こんな図を書くこと。 (ヒント:np.sin(), np.cos() )  

問題3の図

f:id:adiboy:20171201230324p:plain

第一回 (pandas)

https://grouplens.org/datasets/movielens/1m/ から取得した zip を解凍し、  
rating.csv をpython で読みこんで、  
user_id 1 の人が評価した映画に対してつけた得点の数を円グラフに描画してください。  
(実際は、解凍したものを準備した)  

csv には、
- rating.csv
  user_id    :ユーザーID
  movie_id   : 映画ID
  rating     : 評価 (1 ~ 5)
  timestamp  : 時刻

のデータが入っています。

第二回

https://grouplens.org/datasets/movielens/1m/ から取得した zip を解凍し、  
users.csv, rating.csv, movies.csv を python で読み込んで、  
以下の課題を行ってください。  
csv にはそれぞれ、  
- users.csv
  user_id    : ユーザーID
  gender     : 性別
  age        : 年齢
  occupation : 職業
  zip        : ZIPコード (不明)

- movies.csv
  movie_id   : 映画ID
  title      : タイトル
  genres     : ジャンル

- rating.csv
  user_id    :ユーザーID
  movie_id   : 映画ID
  rating     : 評価 (1 ~ 5)
  timestamp  : 時刻

のデータが入っています。

問題1
最も男女で評価の平均値が分かれた映画の公開年 (title の横に括弧つきで書かれている4桁の数字)は?

問題2
最も男女で評価が分かれた映画 トップ100 について、公開年のヒストグラムを書いてください。

第三回

今回のデータは、実際に使われているサーバーにあったアクセスログです。
実データは、謎の値が入っていたり欠損があったりして、
今まで使っていた加工されたデータより取扱いが難しいです。

が、けっこう面白かったので、ぜひ挑戦してみてください。

問題1
{実際に動かしているApache のアクセスログ} のデータから、
下記の例を示すような条件で ip, datetime, method, code を抽出したDataFrame を作成してください。
なお、datetime カラムには、 datetime 型でデータを入れてください。

例) 0.0.0.0 - - [1/Dec/2017:00:00:00 +0900] "GET / HTTP/1.1" 302 - の場合、

ip: 0.0.0.0
time: 2017-12-01 00:00:00+09:00
method: GET
code: 302
となります。

問題2
method が 'GET' と 'POST' 以外のデータの件数を出力してください。

問題3
上記のDataFrame から、POST と GET の時間毎のアクセス数を表で表し、また、1時間区切りのヒストグラムで重ねて表示してください。  
なお、POST とGETの数の差が大きいので、  
左軸に GET のアクセス数、右軸に POST のアクセス数を記載した、  
2軸グラフが望ましいです。  

第四回 (Confusion Matrix)

問題1

適当に作ったCSV.csv を用いて、confusion matrix を作成してください。  

なお、confusion matrix は、以下の要領で作成することを想定しています。  

confuion matrix の使い方  

適当に作ったCSV.csv の labelカラムと、predict カラムに値が入っている。  
Confusion Matrix は、以下のように作成する。  

||predict 1|redict 0|
|::|::|::|
|label 1| TP|FN|
|label 0| FP|TN|

問題2

適当に作ったCSV.csv より、 accuracy, recall, precision を計算してください。

accuracy = (TP + TN) / (TP + FP + FN + TN)  
recall = TP / (TP + FN)  
precision = TP / (TP + FP)
また、accuracy, recall, precision の意味を調べておいてください。  

問題3

適当に作ったCSV.csv を読み込み、しきい値 0.5 の時のAccuracy を計算してください。  
しきい値が0.5 で、predict が 0.45の時、 predict は 0 と判定されます。  

shikii_chi = 0.5  
answer = 0 if predict >= shikii_chi else 1  
式はこんな感じです。  

上記のような問題を出題しました。
答えは、いつかブログに書きます。(もしくは gist に貼っておきます)
時間がある人は、是非やってみてください。

今後の予定

今は少し休止中 (1ヶ月ぐらい) ですが、
この勉強会自体は継続して行きたいと思います。
上述の通り、今は殆ど機械学習の知識がないので、
この勉強会で、機械学習の手法等のレクチャーもできるようになるといいなと思っています。

実は、問題作成がけっこうめんどくさいので、
こんな問題集的なのあるよ! という人がいたらコメント等でお知らせ頂けたら幸いです。
こんな案件有るよ!? とかでももちろん大丈夫です。

明日は、 @fantasista_21jp が書きます! (といってもあと1時間もない)
ワクワクして待っててくださいませ!!

P.S.

Fusic では、技術が大好きなエンジニアを募集しています。
一緒に、機械学習について勉強しませんか?
いや、機械学習教えてくれませんか?