プログラミング初心者が３ヶ月間Aidemyを受講してみた。

【はじめに】
データサイエンスの世界に興味を持ち、是非ともデータ分析を仕事にしたいと思い立ち、
データサイエンティストの素養の一つであるプログラミングの学習を行うべく、
Aidemyさんのデータ分析コースを受講してみました。

【本記事の概要】
この記事ではAidemyで実施したことや、そこから得られた学びなどについて書いて行きます。
本当に超初心者なので、技術的な面ではあまり有効な記事ではないかもしれません。
教育訓練給付金制度はあるものの、正直Aidemyのプログラムは高いので受講しようかどうか
迷われている方には参考になるかもしれません。

【アイデミーでの学習振り返り】
私が受講したデータ分析コースでは、pandasやnumpyといったライブラリの使い方から
ディープラーニングについてやtwitterを利用した感情分析まで１７個のコースがありました。

最初はpythonの基本操作、ライブラリの使い方などの学習から入っていきます。
これらのカリキュラムを終えてpythonの扱い方について理解するのに
１ヶ月くらいかかったと思います。
私は本当にイチからの受講だったので、このくらい時間がかかってしまいましたが、
できれば「pyhonとは」的なところや基本ライブラリについては事前にインターネットや
書籍などで目を通しておいてAidemyでは復習あるいは実践として進めて行くと
スムーズだと思います。

この辺の基礎カリキュラムが終わると、教師あり学習や、教師なし学習、
ディープラーニングなどについて学びを深めていくことになります。
私の理解力の問題でもあるのですが、この辺で詰まるものがいくつもありました。
そういった意味でも基礎のライブラリなどは受講前からある程度理解できてると、
進めるにもスムーズな上、これらのカリキュラムに時間的ゆとりをもって
取り組むことができます。
私のように詰まることが多くてもslackを利用していつでも質問ができるので
毎日のように質問を繰り返してできる限りわからないところは潰していくように
心がけました。

ラスト１ヶ月は応用篇といった感じで、タイタニック号のデータを
利用しての生存可能性についての分析やtwitterデータを使用しての
感情分析、株価予測などを行いました。
（正直かなり難しかったので100％理解できたか怪しいです。。。）
それでもほとんどのカリキュラムで添削課題がついており、
そのカリキュラムで学んだことをすぐにアウトプットに移せます。
そのおかげで自分が理解できてること、分かったつもりだったが理解できてなかったことなど
自分がどれくらい理解しているかを知ることができます。
もちろん添削課題もslackを通じて質問できますので、
自分でエラーの改善がうまくできなくてもアドバイスをもらいながら進めることができます。


【作成したもの】
ここでAidemyでの受講を通して学習した成果物の一つをご紹介します。
こういったこともできるようになる、と一つの参考にしていただければと思います。
紹介するのは、モンテカルロ法という手法を使った円周率の推定を行うプログラムです。

モンテカルロ法とは、「乱数を用いて何らかの値を見積もる方法」のことを指します。
乱数を用いるため解を正しく出力することもあれば、乱数に依存しているため望ましい出力が
得られないことがあります。

1×1の正方形内にランダムに点を打ちます。四分円内、すなわち原点(左下の頂点)からの距離が
1以下なら1ポイント追加し、1より大きいなら0ポイントが追加されます。
以上の操作をN回(何回繰り返すかは自分で設定する)繰り返します。

総獲得ポイントをXとするとき、四分円内に点が入った確率 𝑋𝑁 が四分円の面積 π4 となり、
4𝑋𝑁 が円周率の近似値となることがわかります。
試行回数Nを大きくするほど確率が理論値に収束し（大数の法則）、近似値が円周率に近づきます。

では実際に見ていきましょう。
まずは必要なライプラリをインポートします。
![スクリーンショット 2021-04-20 21.10.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333306/b9c4abe8-4950-6355-d6e2-b5a058f47fdd.png)

次に試行回数の設定や計算を行うためのコードを書いていきます。
まずは試行回数を１００回と設定してみます。
![スクリーンショット 2021-04-20 21.11.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333306/81fe883d-a1ca-88eb-6283-7ed805079772.png)

続いて試行の内容についてのコードを書いていきます。
![スクリーンショット 2021-04-20 21.12.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333306/d08685d9-8005-1c73-993f-64a2cb00349a.png)

円周率の近似値の計算とこの処理にかかる実行時間を記述します。
![スクリーンショット 2021-04-20 21.13.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333306/86cafef3-ee56-4565-cca3-8d088a851c38.png)

上記で計算した、円周率と実行時間を表示します。
![スクリーンショット 2021-04-20 21.13.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333306/3a811342-3a2e-87bf-f7fd-9379923a10fd.png)

円周率算出のためにプロットした点を散布図にして表示します。
![スクリーンショット 2021-04-20 21.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333306/ad1cedf8-2653-043f-b553-8e3ab91b2185.png)

表示できました。円周率は3.12と出ました。まずまずの結果のようです。
さすがに１００回だとスカスカなので、試行回数を増やしてみたいと思います。
![スクリーンショット 2021-04-20 21.14.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333306/27a5fceb-fcf8-f76c-10f3-d457f23b43cb.png)

ということで試行回数を1000回にしてみます。
![スクリーンショット 2021-04-20 21.15.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333306/54babc3f-3224-9f91-73f9-61d268f9c70e.png)

１０００個も点をプロットするとちょっとおぞましいですね。。。
それよりも、円周率が３．２５！？
なんと、精度が落ちているではありませんか！円周の境界線上に青い点がいくつもあるので
この辺が誤判定されたのかもしれません。このままでは終われませんね。
![スクリーンショット 2021-04-20 21.15.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333306/c8b20c73-006f-576b-a835-4387ad7549c5.png)

というわけで最後は一気に１００倍にして１０００００回の試行としてみます。
自分で１０万回もプロットするのは大変ですが、プログラムだと０を２つ足すだけです。
なんて楽チンなんでしょう。
![スクリーンショット 2021-04-20 21.16.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333306/fdcab015-c260-86c6-5d67-4627e6fc1588.png)

さすが１０万個笑。
もう全く点として認識できないですね。
そして、そして肝心の円周率ですが、、、3.143840 !!
かなり近づきました！ 実際の円周率は3.14159265...なので小数点３桁目からは違ってますが、
無事3.14までは算出できました。
![スクリーンショット 2021-04-20 21.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333306/97b76baa-f5a1-b6ae-8adf-569a9dfab057.png)
以上がモンテカルロ法による円周率算出のプログラムとなります。

【今後の活用】
ひとまずはプログラミングの基礎的なところは学ぶことができたので、
これからどんどん反復練習を繰り返して定着を図っていきたいと思います。
ゆくゆくはR言語も使用して本格的にデータサイエンティストとしてデータ分析を
専門とした業務に就けるようにしていきたいと思います。

【終わりに】
私の個人的な所感ですが、一人で独学でプログラミングを習得しようというのは
かなり厳しいと思います。（そんなことができるのは一部の天才な人のみ？？？）

コードと睨めっこし続けるのは正直しんどいですし、基本的なルールや表示の意味を
知ってないと、読み解くための取っ掛かりも作りにくいです。

実践練習や反復練習は独学で進められるとしても、本当にイチから始める場合や
独学で行き詰まった場合は一度Aidemyのようなところで体系的に学ぶのが
上達への近道のような気がします。

もしこれからプログラミングを始めようとしている方や今独学で行き詰まっているなら、
ぜひ一度受講を検討してみてください。