(備忘録)Python & Pandasで基礎統計 on IBM DSX

###  Python & Pandasにトライしてみた
今後、Pythonでデータ分析するときに必ず実行すると思われたスクリプトをメモ。
IBM のData Science Experience 環境で Python2 with Spark 2.0で実行。（今回はSparkである必要は全くないw）
実際の分析作業ではフィールド数がかなり多いので、効率よく分析できるようにスクリプト中でフィールド名（列名）をできるだけコーディングしなくていい方法を考えながらやってみました。
機械学習のデータ準備で必要になるSPSS Modelerの「フィールド再編成」相当の機能となるカテゴリーデータの列展開＆フラグ化についてもトライ！
欠損値関連は今回は試しませんでしたので、次の機会に。
（本記事で使用しているdf_wiskeyには、予めデータを入力済み）

```
# まずはDataFrameの中身を確認
df_wiskey.head(10)
```
<img width="733" alt="Screen Shot 2016-11-15 at 18.17.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/452f6602-5578-ccf9-6e83-aa6cf3f401b9.png">

```
# 続いて列（フィールド）の属性を確認　（今回はかなり適当なまま進めるw)
df_wiskey.dtypes
```
<img width="231" alt="Screen Shot 2016-11-15 at 18.17.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/1e8bff22-c86b-79ee-8d15-1fa4a9ce764a.png">

```
#　数値データの基礎統計
df_wiskey.describe()
```
<img width="403" alt="Screen Shot 2016-11-15 at 18.17.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/297e82e0-6865-759c-66af-a988c3de62e4.png">

```
# 数値データについて分布をグラフ化

# matplotを inlineモードにする
%matplotlib inline

import matplotlib
import matplotlib.pyplot as plt

for x in df_wiskey.columns[df_wiskey.dtypes == 'float64']:
    xdesc = df_wiskey[x].describe()
    plt.hist(df_wiskey[x] , range=(xdesc['min'], xdesc['max']) )
    plt.title( x )
    plt.show()
```
<img width="406" alt="Screen Shot 2016-11-15 at 18.18.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/88e40f36-645f-8d40-6e1f-7831f8d43df2.png">
<img width="393" alt="Screen Shot 2016-11-15 at 18.18.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/cb4141fe-9fc6-1761-9523-10c4001a381d.png">
<img width="393" alt="Screen Shot 2016-11-15 at 18.18.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/47813b0f-1693-3a53-395f-c4df4ac83f9d.png">

```
#数値データ,２変数間の相関関係
df_wiskey.corr()
```
<img width="355" alt="Screen Shot 2016-11-15 at 18.18.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/ab26a2cb-ff97-10ec-f164-b87e98146d20.png">

```
#数値データ以外のデータ
df_wiskey[df_wiskey.columns[df_wiskey.dtypes == 'object']].head(5) 
```
<img width="554" alt="Screen Shot 2016-11-15 at 18.18.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/71374f96-6e95-00e2-2d12-5a00f6f6b335.png">

```
# 数値データ以外（カテゴリー値と仮定）についてデータ出現頻度を集計
for x in df_wiskey.columns[df_wiskey.dtypes == 'object']:
    valcal = df_wiskey[x].value_counts();
    print '-- '+x+' -----------------------------------'
    print valcal.head(10)
    print '--------------------------------------------'
```
<img width="649" alt="Screen Shot 2016-11-15 at 18.18.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/524ce5e3-d53f-5482-3b3f-d47d44b1b357.png">
<img width="570" alt="Screen Shot 2016-11-15 at 18.18.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/0f5f8902-de3d-a723-8af1-79b52f58c554.png">
<img width="501" alt="Screen Shot 2016-11-15 at 18.19.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/8967cfce-6485-24c0-6335-53e94b7ea423.png">

```
# カテゴリーデータ間のクロス集計 -- シンプルだけど表示は違和感あり
crosstab( df_wiskey.Country , df_wiskey.Category)
```
<img width="1066" alt="Screen Shot 2016-11-15 at 18.19.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/1a822195-6bfa-fb59-0459-94ca47c6b0d4.png">

```
# Country vs Categoryでのヒートマップ  ( BourbonはUSAに集中、SingleMaltはほとんどの国を網羅)
df_wiskey_pd = pivot_table( data=df_wiskey , columns='Country' , index='Category' , values='Name' , aggfunc='count')
plt.imshow(df_wiskey_pd , aspect= 'auto' ,interpolation='nearest')
plt.colorbar()
plt.xticks(range(df_wiskey_pd.shape[1]), df_wiskey_pd.columns , rotation='vertical')
plt.yticks(range(df_wiskey_pd.shape[0]), df_wiskey_pd.index)
plt.show()
```
<img width="462" alt="Screen Shot 2016-11-15 at 18.19.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/a4f5213a-9ab0-d68d-7d61-1a6733ebe6a8.png">

```
# モデリング手法に入力するために、Country列のデータをフィールド化して、T/Fを設定する　
# ( 列名はCountry_XXXXXXXX とする) 
for x in df_wiskey.groupby('Country').count().index : 
    x1 = 'Country_' + x  
    df_wiskey[x1]  = 'F'
    # Country列に設定されている国がxxxxxだったら、 Country_XXXXXXXXXにTに変更 
    df_wiskey.loc[df_wiskey[x1][df_wiskey.Country == x].index , x1] = 'T'
```
```
#先頭３行だけ表示
df_wiskey.head(3)
```
<img width="1597" alt="Screen Shot 2016-11-15 at 18.20.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/149522/104b7c32-df7a-e6ea-47b4-a5025a84d56e.png">

#### 追記
Data Scientist Experienceのノートブックはなかなか使いやすいかもしれない:grinning:
　　<スクリーンショット>

![Notebook_Python2 copy.png](https://qiita-image-store.s3.amazonaws.com/0/149522/35d81719-dafb-c2d2-6fd1-335a77286eee.png)