Windows上でJupyter Notebookを実行してみる


## `Jupyter Notebook`の特徴と利便性
### 1. **対話的なコーディング**

- **セルごとの実行**: コードをセル単位で実行できるため、プログラム全体を再実行する必要がない。エラーや結果をすぐに確認し、必要な箇所だけ修正・再実行が可能。
- **即時フィードバック**: コードを実行するとすぐに結果が表示されるため、デバッグや検証が非常に効率的。

### 2. **リッチな出力のサポート**

- **グラフや図表の表示**: `matplotlib` などのライブラリを使って、コードの結果をグラフや図表として表示できる。画像、ビデオ、HTMLコンテンツなどもインラインで表示可能。
- **Markdown サポート**: セル内で Markdown を使ってテキストや数式、リンクを記述できる。これにより、コードに注釈を付けたり、ドキュメントとしても活用できる。

### 3. **ドキュメントとコードの一体化**

- **ノートの共有**: コードとその結果、説明、注釈を一つのファイルで保存できる。データサイエンスや教育現場で、実行例とともに文書化されたノートブックを他人と簡単に共有できる。
- **プレゼンテーションの代用**: ノートブックは、コードの解説や結果のプレゼンテーションとしても使える。MarkdownやHTMLサポートにより、視覚的に見やすい形式で内容を伝えられる。

### 4. **再現性のある研究**

- **コードと結果の一貫性**: ノートブック内に実行したすべてのコードとその結果が残るため、後で再現可能。研究やデータ分析の結果を再現しやすく、他人に共有する際にも役立つ。
- **順番通りにコードを実行可能**: セルごとにコードを実行できるが、全セルを順に再実行する機能もあり、全体を通して再現性を持たせることができる。

### 5. **複数言語サポート**

- **Python以外の言語も対応**: Pythonだけでなく、RやJulia、Scalaなど他のプログラミング言語のカーネルも使える。複数の言語を組み合わせたデータ分析や実験に最適。

### 6. **データサイエンスや機械学習との親和性**

- **データの可視化と分析**: 大規模なデータセットを扱う際、データの可視化やリアルタイムでのデータ処理がしやすい。データサイエンスや機械学習のワークフローにおいて、コードと結果を逐一確認しながら進められる。
- **インタラクティブなウィジェット**: `ipywidgets` を使って、スライダーやボタンなどのウィジェットを作成し、インタラクティブなUIを追加できる。これにより、動的にパラメータを変更しながらコードの結果を確認することが可能。

### 7. **容易な拡張性**

- **プラグインや拡張機能**: Jupyterには様々な拡張機能があり、デバッグ、コーディング支援、セルの統合など、機能を拡張して使いやすくできる。

### 8. **クラウドでの実行**

- **Google Colab などのクラウド環境での実行**: Jupyter Notebook のフォーマットはクラウドサービスでもサポートされている。Google Colab などで、GPUを利用して機械学習モデルのトレーニングを行うことも簡単。

## WindowsにPythonをインストールして、仮想環境を作成し、`Jupyter Notebook` を実行する手順は以下の通り。
### 1. Python のインストール

1. [Python公式サイト](https://www.python.org/downloads/) から最新版の Python をダウンロード。
2. インストーラを起動し、以下の2つにチェックを入れる:
   - "Add Python to PATH"（これを忘れずにチェックする）
   - "Install Now" か "Customize installation"（Customizeで詳細な設定が可能）
3. インストールが完了したら、コマンドプロンプト（`cmd`）を開き、インストールが成功しているか確認する。

```
python --version
```

Pythonのバージョンが表示されればインストール成功。

### 2. 仮想環境の作成

次に、仮想環境を作成する。

1. コマンドプロンプト（`cmd`）を開く。
2. プロジェクトのディレクトリに移動するか、仮想環境を作成したい場所に移動する。
3. 仮想環境を作成するコマンドを実行する。

```
python -m venv myenv
```

`myenv` という名前の仮想環境が作成される。

### 3. 仮想環境の有効化

仮想環境を有効化する。

```
myenv\Scripts\activate
```

これで仮想環境がアクティブになり、以降の作業はこの仮想環境内で行われる。

### 4. 必要なパッケージのインストール

仮想環境内に `numpy`、`matplotlib`、そして `jupyter` をインストールする。

```
pip install numpy matplotlib jupyter
```

これで、`numpy` と `matplotlib` がインストールされ、Jupyter Notebook も使用できるようになる。

### 5. Jupyter Notebook の起動

次に、Jupyter Notebook を起動する。

```
jupyter notebook
```

コマンドを実行すると、ブラウザが自動的に開き、Jupyter Notebook のインターフェースが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340841/b87a21d8-8ab7-924f-08cc-9d196d216acd.png)

### 6. 簡単なpythonスクリプトを実行してみる。
以下NewでPythonを選択しnotebookeを新規作成。以下の「モンテカルロ法で円周率を求めるスクリプト」をJupyter Notebookのセルに貼り付け、実行してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340841/68b42cd6-7e1b-17e5-7288-b7db22937e12.png)

```
import math
import numpy as np
from numpy import random
import matplotlib.pyplot as plt
%matplotlib inline

# 初期化
N_in = 0
N_out = 0
N = 1000000  # 試行回数
ran_x = random.rand(N)  # Xの乱数
ran_y = random.rand(N)  # Yの乱数
ran_point = np.hypot(ran_x, ran_y)  # X^2 + Y^2の平方根

# 点が円の内部か外部かをカウント
for i in ran_point:
    if i <= 1:
        N_in += 1
    else:
        N_out += 1

# パイの近似値
Pie = N_in / N * 4  # パイの近似式

# 結果の表示
print("IN: {} ".format(N_in))
print("OUT: {} ".format(N_out))
print("ALL: {} ".format(N))
print("Pi: {} ".format(Pie))

# グラフの描画
plt.scatter(ran_x, ran_y, marker=".", color="orange", label="POINT")

c1 = plt.Circle((0, 0), radius=1, fc="None", ec="blue", linewidth=2, color="black")
ax = plt.gca()
ax.add_patch(c1)
plt.axis("scaled")
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.xlabel("X")
plt.ylabel("Y")
plt.title("PLOT")

plt.show()
```
### 7. 実行結果
`N`は実行回数。値を大きくすることで円周率に近づいていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340841/0a905285-ddee-4782-9937-943c1702c95a.png)
### 8. ヒストグラム作成
```
import math
import numpy as np
from numpy import random
import matplotlib.pyplot as plt
%matplotlib inline
from statistics import mean, median,variance,stdev


N_in = 0
N_out = 0
N = 1000000 #試行回数
list_pi = []

def culculate():
    global N_in, N_out
    for i in range(1,100):

        ran_x = random.rand(N) #Xの乱数
        ran_y = random.rand(N) #Yの乱数
        ran_point = np.hypot(ran_x,ran_y) #X^2 + Y^2の平方根

        for i in ran_point:
            if i <= 1:
                N_in += 1
            else:
                N_out += 1

        Pie = N_in/N*4 
        list_pi.append(Pie)
        N_in = 0
        N_out = 0



def print_all():
    print("IN: {} ".format(N_in))
    print("OUT: {} ".format(N_out))
    print("ALL: {} ".format(N))
    print("Pi: {} ".format(Pie))


def draw_hist():
    kwargs = dict(histtype = "stepfilled", alpha = 0.7, density = True, bins = 20, color = "yellow", ec = "black")
    plt.hist(list_pi, **kwargs)
    plt.title("pi-list")
    plt.show()

culculate()
draw_hist()

stdev_pi = stdev(list_pi)
print(stdev_pi)
```
### . 実行結果（ヒストグラム）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340841/34e18039-02c7-f0fa-fb0b-acc6c4ebe45b.png)


### （参考）モンテカルロ法で円周率を求めるロジック
単位正方形内にランダムな点を打ち、その点が1/4円の内側にあるかを判定する。全点のうち、1/4円の内側にある点の割合を使って円周率を近似するという手法。