社内で初心者向けPythonデータ分析の研修をやった話

# 概要

社内で未経験者向けにpythonを使ったデータ分析の研修をやったので、その時のあれこれをまとめました。
同じようなことをやろうとしている人の参考になれば。

# 勉強会の概要

## 参加者

プログラミング経験はあるが、python経験がない人が大半。

データサイエンス関係の知識もまばら。

## 到達目標

上記を受けて、**ぐぐりながら簡単なデータ加工してモデリングするプログラムを読み書きができるレベル**を目標とした。

具体的には以下のような感じ。

- **Python3エンジニア認定基礎試験**が取れる程度のpython力
 - 試験内容を真面目に網羅すると大変だが、合格自体は楽なので目標として設定
 - 短い研修時間で全てはカバーできないので、実践を主眼におき細かい仕様の話などはしない
 
- 簡単なデータ加工、集計、モデリングができる
 - ひとまずpandasとscikit-learnが使えるようになる
 - 機械学習知識を前提としないため、評価やチューニングはできないけど、とりあえずモデルができるようになる
 - 来年実施される**Python3エンジニア認定データ分析試験**がとれる？

## 環境

導入までのマニュアル作成やトラブル対応が大変なので、
無料でjupyterが使えるgoogle colabで即決。

googleアカウント作るだけで使えるので便利です。

## 研修計画

週1開催で全6回予定。

ちなみに、各回1時間の内容なので、超ハードなスケジュールです。

あまりちゃんと確認はしてないですが、自分が受験した時の主観では、Python3エンジニア認定基礎試験の4~5割位は取れる内容を網羅していると思います。

1. オリエンテーション
 - 研修のゴールの説明
 - pythonの特徴について
 - google colab環境の導入
1. pythonの基礎
 - 型(int, float, str, bool)
 - データ構造(list, dict, tuple)
 - 構文(if, for, try, assert, def)
 - 演習
1. pythonの基礎
 - ファイル入出力
 - モジュール
 - 演習
1. データ分析の基礎
 - pandasによるデータ加工と集計
 - 演習
1. モデリング基礎
 - scikit-learnを用いた決定木、ロジスティック回帰
 - 演習
1. 演習
 - データ加工、基礎集計、分析の演習課題


## 計画時に考慮したこと

- 基本的な内容を抑え、とにかくpandasやscikit-kearnのサンプルプログラムが読んで実践できることを目標に
 - ある程度自走できるレベルになれば、やってるうちに勝手に覚えるでしょ、と思ったため
 - numpyやmatplotlibは網羅しておきたかったが、時間の都合で省略
 - tryやassertは、データ分析においては、入力データの異常検出など有用だと判断し入れた

- 一方、クラスに関しては全く触れない
 - 分析においては必ずしもクラス定義する必要はなく、リファレンスを見て利用できればいいでしょという判断
 
- 基本的にネット上に情報が落ちているので、細かい点は調べてもらうように
 - 研修内で初出のモジュールや関数が必要な演習を作り、必ず自分で調べる工程を入れた
 - pythonは提供する機能が幅広いので、とにかく調べろのスタンス


# 結果

## 実績

見積もりが甘く、序盤の内容で1回延長 & 習熟度を重視して演習を１回追加しました。。。

ちなみに、延長したうえで、だいぶハードでした。ちゃんとした見積もり大事。

1. オリエンテーション
 - ゴールの説明
 - pythonの特徴について
 - google colab環境の導入
1. pythonの基礎
 - 型(int, float, str, bool)
 - データ構造(list, dict, tuple)
1. pythonの基礎
 - 構文(if, for, try, assert, def)
 - 演習
1. 追加演習回
 - 演習
1. pythonの基礎
 - ファイル入出力
 - モジュール
 - 演習
1. データ分析の基礎
 - pandasによるデータ加工と集計
 - 演習
1. モデリング基礎
 - scikit-learnの使い方の流れ説明(データ加工、学習、予測、評価)
 - 演習
1. 総合演習
 - データ加工、基礎集計、分析の演習課題

## やってみた所感

- 説明資料について
 - コード例を載せたJupyter notebookを資料に説明するという力技をしたが、人前で説明する資料としては使いづらかった
 - 次に機会があれば、RISEなどを使って資料を作成したい
 - 内容によってはやはりパワポで資料を作成した方が良さそう

- 1対多形式の中でのフォロー実施が難しい
 - 1対1の指導は相手の様子に合わせて調整できるが、1対多の場合はとにかく全体を見る余裕がなくサポートが大変
 - 次に機会があれば、[Slackを使った進捗管理や質疑応答](https://qiita.com/tanabee/items/04a648cede43956c0e9d)をしたい

- 講義/演習の割合の塩梅について
 - 前半は、一方的に説明する講義スタイルが中心になってしまったが、どうしても定着してなさそうと感じた
 - 後半のpandasやscikit-learnの話は、基本機能を資料にまとめて配布するものの、その説明はあまりせず、7割位の時間を実践的な手順を行う演習を実施した
 - 一方で、演習ばかりになってしまうと、説明資料に沿った説明時間が少なくなってしまい、それはそれで定着率が下がっているように見えた

- 演習の難易度について
 - 最初に用意していた演習の難易度が難しく手が止まってしまっていた
 - 演習の難易度を下方修正し、上記にあるように演習実施とその解説を厚くするように変更した

- 研修時間見積もりの難しさ
 - 丁寧に説明しようとすると、思ったよりも説明に時間がかかる
 - 有志による勉強会だったので習熟度を重視していたが、計画的な社内研修や外部への研修であれば計画は超重要
 - 時間が厳密に定まってる場合は、研修時間を多めにとれば柔軟に対応できると思う

- 機械学習の説明について
 - 決定木などの手法自体の説明を必要がある
 - 他にもモデル評価指標、クロスバリデーションなども
 - 機械学習の前提知識をあまり説明せずに演習を実施してしまったが、定着率が低く感じた

- 準備の大変さ
 - 説明資料と演習内容を考えるのは、非常に大変
 - 特にデータ分析の演習内容は、colabで行う都合上、公開されているデータを扱う方が楽なので、それを基に内容を作る必要がある
 - 講義形式にして、説明資料を作るのが相対的には楽
 - もっと楽したいなら市販の適当な参考図書を基に講義を作るとよいかと

- 参加者からの意見の組み上げは難しい
 - アンケートを複数回実施していたが、基本的に参加者側から改善案は上がってこない
 - 一方で、一般的にアンケートの自由記述項目は回答率の低下につながるため、あまり盛り込みたくない
 - 問題点があると自覚しているのであれば、それが検証できるような選択式のアンケートを設計して実施することが重要
 - もし、積極的に改善意見を出してくれる参加者がいるのであれば、直接話を聞くべき
 
## (おまけ) 全内容終了後のアンケート結果

最終回の後のアンケート結果を掲載します。

基本的に4~5段階評価のアンケートで、基本的に1が悪い評価、4や5が良い評価です。

### 内容の分かりやすさ
<img width="683" alt="スクリーンショット 2018-10-16 20.33.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/221698/b68a83ea-3740-c8d4-3dc8-01c500e9b8de.png">

なるべく丁寧に教えるようにした甲斐あってか、全体的に好評価寄りです。

### 内容の理解度
<img width="666" alt="スクリーンショット 2018-10-16 20.33.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/221698/51f796fe-2fe0-f456-18df-99f87a6f62c8.png">

一方、理解度はまちまちでした。
もうちょっと長めに時間をとって手を動かしてもらうべきだったかと思います。

### 内容が役に立つか
<img width="678" alt="スクリーンショット 2018-10-16 20.34.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/221698/39cf8a6f-0387-9c29-7cb8-c328e451080f.png">

自由記述の感想欄で「難しかったけど参考になった」などの意見をもらったり、全体的に好評でした。

### 内容に対する時間配分
<img width="670" alt="スクリーンショット 2018-10-16 20.37.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/221698/1dd4531c-7c67-63e6-2b30-c360dde73308.png">

全体的に１(短い)寄りになっているあたり、ハードだったと思います。申し訳ありませぬ・・・。

### 演習の難しさ
<img width="666" alt="スクリーンショット 2018-10-16 20.35.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/221698/37b6ab54-4e3a-e356-31aa-a3ed1180e620.png">

終盤の機械学習の課題が、前述の通り、説明不足になってしまったこともあり、回答が4~5(難しい寄り)に集中していて、難しかったとの評価です。

### 総合的な満足度
<img width="666" alt="スクリーンショット 2018-10-16 20.38.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/221698/7ddffc2f-5a20-7900-57df-50b135aa94d6.png">

総合的には好評価でした。ありがたし。

# 最後に

発端は急でしたが、それなりに色々試行錯誤して2ヶ月ほど研修を実施したのは、色々学びがありました。
人に教える過程で知識を体系的に整理する必要があるので、そういった点での学びもありましたが、今回はどちらかというとティーチングのコツに関して実りが多かったです。

そのうち違う内容でまた多数の人に何か教える機会が来るかもしれないので、その際はもっと良い内容にできるようにしたいです。


# 参考
- 研修全般の参考にしたもの
 - [研修コースのつくりかた](https://qiita.com/sezemi_seplus/items/16c7557befe6365b96bb)
 - [有志の社内勉強会を1年で50回くらいやった結果 伝えたいこと](https://qiita.com/nh321/items/f7e20c7ba737ff5c0f60)
- 勉強会の内容に参考にしたもの
 - [pythonチュートリアル](https://docs.python.jp/3/tutorial/)
 - [pandasチュートリアル](https://pandas.pydata.org/pandas-docs/version/0.22.0/tutorials.html)
 - [scikit-learnチュートリアル](http://scikit-learn.org/stable/tutorial/index.html)