Amazon SageMaker で Python データサイエンス入門その1

# はじめに
今回は Udemy で Python のデータサイエンス入門をやったので、その内容を記事にまとめました。

- 受講した Udemy のコース  
[【ゼロから始めるデータ分析】 ビジネスケースで学ぶ Python データサイエンス入門 ](https://www.udemy.com/optworks_1/)

Udemy のコースの内容は、3つの記事に分けて投稿します（今回は、その１）。

その1. Amazon SageMaker の環境構築、事前準備、基礎分析と可視化について　←【本稿】
その2. [線形回帰を用いたお弁当の売り上げ予測](https://qiita.com/NendaiHiroki/items/4856ed40e638244ac816)
その3. [決定木を用いた銀行の顧客ターゲティング](https://qiita.com/NendaiHiroki/items/96606c17de2a864fd8ef)

※ Udemy では Anaconda を使用してますが、自分は Amazon SageMaker を使用しました。
※環境構築についても Amazon SageMaker を使用した手順を記載します。

# 本稿の内容
- Amazon SageMaker で Python を使うための環境構築
- 利用するデータのダウンロードと Jupyter にアップロード
- 使用する Python の基本コードについて紹介

本稿は Python 未経験の方でも、進められる内容となっております。

# 前提
- AWS のアカウントを用意します。   
※AWSアカウント作成の流れは[こちら](https://aws.amazon.com/jp/register-flow/)
- SIGNATE のアカウントを用意します。
※SIGNATEアカウントの作成は[こちら](https://signate.jp/register)
# 環境構築
#### Amazon SageMaker で環境構築
Amazon SageMaker でノートブックインスタンスを作成し、Jupyter を開いて、フォルダの作成をします。  

- AWS にログインし、Amazon SageMaker を検索。
  <img width="939" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/a8581531-d075-7d80-8e38-bdbbf8d1b3a9.png">  

- 左の一覧からノートブックインスタンスを選択。
<img width="937" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/9390cb35-82ec-f361-a353-b190ce473a3e.png">  

- 右上のノートブックインスタンスの作成を選択。
<img width="949" alt="03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/ace5e78d-f254-3774-8645-e2249346610e.png">  

- ノートブックインスタンス名を入力（インスタンス名は任意） 
<img width="916" alt="04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/01e9eed7-90c2-5ca3-0648-928bfd77ce80.png">  

- 下にスライドして、上の赤枠の部分を選択して、新しいロールの作成を選択。  
<img width="915" alt="05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/b51137c6-8778-562a-b3f6-3f50e7d2426a.png">  

- 任意の S3 バケットを選択し、ロールの作成を選択します。
※今回は任意の S3 バケットを選択していますが、実際に運用する際は適切な IAM ロールを設定して下さい。  
<img width="513" alt="06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/61c5db44-47cd-e465-b4f6-ee0ae8092711.png">  

- 赤枠のように表示されたら IAM ロールの作成は成功です。  
 <img width="909" alt="07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/b41dec27-393d-27df-09a9-8956e3392622.png">  

- 下にスライドして、ノートブックインスタンスの作成を選択。  
<img width="909" alt="08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/aaf23425-ea75-8d93-1501-81a4a6af2f4a.png">  

- 画像上部の赤枠のように表示されたらノートブックインスタンスの作成は完了です。
ステータスが「 Pending 」 → 「 InService 」 になるまで待ちます。  
<img width="950" alt="09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/27fecd7c-e779-1ec6-0bee-847ec01e1ac4.png">  

- ステータスが InService になったら、開く Jupyter を選択して Jupyter を開きます。  
<img width="949" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/38a2eaa4-3d55-7056-9c9e-ffffa2a846f4.png">  

- Jupyter が開けたら、この後ダウンロードしたデータを保存するフォルダを作成します。
Newを選択。  
<img width="764" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/2ea2a072-8545-ed1d-0b18-2338880af423.png">

- Folder を選択。  
<img width="729" alt="12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/461bc1d8-cddb-92e9-6b4d-c2adce71575c.png">  

- 作成したフォルダを選んで、Rename を選択。  
<img width="739" alt="13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/d29e25ef-e577-9b4f-8338-a4d6ed4e99db.png">

- 名前は case1 として、Rename を選択。　　
<img width="437" alt="14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/ddd7cb89-c279-9a2f-4620-8c738158a152.png">   

- これでフォルダができました。case2 のフォルダも同様に作っておきます。  
<img width="744" alt="15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/8d3bb883-1217-70ed-87b2-fdca25adee85.png">

# データの準備
データをダウンロードして Jupyter にアップロードします。  

#### データのダウンロード
- [SIGNATE](https://signate.jp/)にアクセスする。   
アクセスするとこのような画面が出るので、右上のConpetitionsを選択します。  
<img width="831" alt="16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/c82c5404-be3d-d4b6-d601-372f36ccf302.png">

- 練習問題を選択。  
<img width="835" alt="17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/4e22e272-3731-2795-200b-2948877c440c.png">

- 一番下までスクロールするとお弁当の需要予測と銀行の顧客ターゲティングが出てくるので、それらのデータをダウンロードします。  
まず、お弁当需要予測からデータをダウンロードするので、お弁当需要予測を選択。  
<img width="831" alt="18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/d9bc9bdf-5f47-be22-a1c3-497b19ed4a27.png">

- データを選択。  
<img width="837" alt="19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/e6eb4cf9-255c-9c6c-a35f-86822f143f92.png">

- 下にスライドして、赤枠で囲んだ中の3つのファイルをダウンロードしてください。  
<img width="839" alt="20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/e4192474-87fc-7a79-cb31-6af271fd9290.png">

- 銀行の顧客ターゲティングについても同様にデータをダウンロードしてください。  
<img width="832" alt="21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/b0c68a1f-32af-25d3-a26e-9ac221fc19ce.png">

<img width="837" alt="22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/a2add3fd-bdbc-a053-6423-834743cb2d7f.png">

#### Jupyter にデータをアップロード

- 先ほど Jupyter に作成した case1 フォルダにお弁当需要予測、case2 フォルダに銀行の顧客ターゲティングのデータをアップロードします。  
  
case1フォルダを選択。  
<img width="724" alt="23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/1ffed1de-8c37-c7f7-561d-3473c91ed893.png">

- Uploadからダウンロードしたデータをアップロードします。  
<img width="726" alt="24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/fa49d6eb-1956-2bbb-85fb-a2e214bcdc85.png">

- ファイルを開くとこのようになるので、それぞれUploadを選択します。  
<img width="728" alt="25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/feb6522e-e1b4-c1b9-c177-1003a426ffad.png">

- これで、Jupyterにデータをアップロードできました。  
case2のフォルダにも同様に銀行の顧客ターゲティングのデータをアップロードします。  
<img width="727" alt="26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/1cd0017e-f547-1feb-a0dd-06f0d8306638.png">


# Python コードの紹介

本コースで使用した主要な Python コードをまとめました。
この内容を実際に実行したい場合は、先ほど作成したcase1フォルダ内にnotebookをconda_python3で作成して実行してください。
#### モジュールのインポートと設定


- データ解析を支援する機能を提供するライブラリ。  

```Python
import pandas as pd 
```

- 数値計算を効率的に行うためのライブラリ。  

```Python
import numpy as np
```

- Python およびその科学計算用ライブラリNumPyのためのグラフ描画ライブラリ。  

```Python
from matplotlib import pyplot as plt
```

- Jupyterのnotebook上で画像や図を表示するためのおまじない。  

```Python
%matplotlib inline
```

#### データ(csvファイル)の読み込み


- train.csvを読み込んでtrainに格納する。

```Python
train = pd.read_csv("train.csv")
```

#### データの表示

- データの先頭を表示。  

```Pythom
train.head()
```

- データの末尾を表示。  

```Python
train.tail()
```

- データの行数と列数を表示。  

```Python
train.shape
```

- 基本統計量の表示。

```Python
train.describe()
```


- データの情報の確認。

```Python
train.info()
```

- 1つのカラム(列)だけ表示。  
trainのy列を表示。  

```Python
train["y"]
```

- 複数のカラムを表示。  
trainのy、week、temperature列を表示。

```Python  
train[["y","week","temperature"]]
```

- データの平均値を表示。  
trainのy列の平均を表示。

```Python
train["y"].mean()
```

- データの中央値を表示。  
trainのy列の中央値を表示。

```Python
train["y"].median()
```

- 指定した範囲の表示。  
trainのｙ列の値が150以上のデータを表示。

```Python
train[train["y"]>150]
```

- trainのweek列が月のデータを表示。

```Python
train[train["week"] == "月"]
```

- データを昇順、降順で表示。  
trainをy列で昇順、降順で表示。

```Python
train.sort_values(by="y")　#昇順
train.sort_values(by="y",ascending=False)　#降順
```

#### データをグラフで表示

- 折れ線グラフを表示。  
trainのy列を折れ線グラフで表示。

```Python
train["y"].plot()
```

- グラフの大きさを調節。  

```Python
train["y"].plot(figsize=(12,4))
```

- グラフにタイトルとx、y軸のラベルを追加。  
一度タイトルを付けたグラフを変数に格納し、その後ラベルを追加する。

```Python
ax = train["y"].plot(title="test")
ax.set_xlabel("time")
ax.set_ylabel("y")
```

- ヒストグラムを表示。  
trainのy列をヒストグラムで表示。

```Python
train["y"].plot.hist()
```

- ヒストグラムにグリッド線を追加。

```Python
train["y"].plot.hist(grid=True)
```

- ヒストグラムに平均値を表す赤の垂直線を表示。  
線を表示した後で、グラフを表示する。

```Python
plt.axvline(x=train["y"].mean(),color="red")
train["y"].plot.hist()
```

- ヒストグラムをpngファイルとして保存。  
- ヒストグラムをsample_fig.pngとして保存。

```Python
plt.axvline(x=train["y"].mean(),color="red")
train["y"].plot.hist(figsize=(12,4),title="histogram")
plt.savefig("sample_fig.png")
```

- 箱ひげ図を表示。  
yとweekを選択して、x軸にしたいカラムをboxplot(by="")で指定する。

```Python
train[["y","week"]].boxplot(by="week")
```

#### 欠損値の処理


- 欠損値があるか確認。  
欠損値の場合、Trueと表示される。

```Python
train.isnull()
```
- 各カラム(列)に欠損値があるかどうか確認。   
Trueなら欠損値があるということ。  

```Python
train.isnull().any()
```

- 各カラム(列)にいくつ欠損値があるか確認。

```Python
train.isnull().sum()
```

- 欠損値を0で補間。

```Python
train.fillna(0)
```

- 欠損値がある行を削除。

```Python
train.dropna()
```

- ある列に欠損値があった場合のみ、その行を削除するにはオプションのsubset=[]で列を指定できる。  
kcal列に欠損値がある行を削除。  

```Python
train.dropna(subset=["kcal"])
```

- 列の中の値がそれぞれいくつあるか表示。  
soldout列の中の値がいくつあるか表示する。  

```Python
train["soldout"].value_counts()
```

#### 相関関係を調べる

- 相関係数の表示。  
trainのy列とtemperature列の相関関係数を表示する。

```Python
train[["y","temperature"]].corr()
```

- 散布図で相関係数を調べる。  
trainのy列とtemperature列の散布図を表示。
オプションとしてx=、y=でグラフに出力するデータを指定。  figsize=(,)でグラフのサイズを指定

```Python
train.plot.scatter(x="temperature",y="y",figsize=(5,5))
```


# おわりに
本稿の内容は以上です。
[その2](https://qiita.com/NendaiHiroki/items/4856ed40e638244ac816)では実践編として、線形回帰を用いたお弁当の売り上げ予測についてまとめていきますので、よろしくお願いします。