pandasを使い倒してみる

# とりあえず
 python使って機械学習をやってるけど、そもそもライブラリ使えこなせてないよね。。小慣れた感じで使えるようになりたいね！小慣れるには少しハンズオンやろうか。。。よしやろう！　Pandasやろう！

# 目的
 なんかのデータをこねくり回して、学習前のデータの整理”前処理”に対して**【こなれたマン】**になる。
(※だってユーザのデータなんて、Excelとか歯抜けとかバラバラだったりするよね。。。整理してくれる事なんて滅多にないし・・・。)

# やること
　とりあえず、データの整形とかクレンジング。データの結合とか学習前にやりそうな事を妄想して必要な関数を身に着ける。
#### トライする関数たち
- SeriesとDataFrameの基本
- CSVデータの読み込み
 - pd.read_csv
- データ操作（結合、抽出)
 - pd.merge
 - pd.query(Where句[合致,不一致条件,NULL, NOTNULL])
- データ構造の確認と要約統計量
 - pd.index
 - pd.columns
 - pd.describe()(loc, at)
- Excelデータの読み込み ※xlrdをインストールすると使える
 - pd.ExcelFile
 - pd.sheet_names
 - pd.parse


# 問題
## pandasの基礎をおさえる

Seriesの読み方　DataFrameの読み方
Seriesって何？
SeriesとDataFrameの関係
色々操作してみる。

```python:pandas_test.py
# pandasをpdとしてimport
import pandas as pd

# Series用のラベル作成（インデックス）
index = ["kokugo", "suugaku", "rika", "syakai", "eigo"]

# Series用のデータ値の代入
score = [47, 20, 32, 30, 2]

# Series作成
series = pd.Series(score, index=index)

# 辞書型を用いてDataFrame用のデータの作成
data = {"kamoku": ["kokugo", "suugaku", "rika", "syakai", "eigo"],
        "teacher": ["tanaka", "suzuki", "mizumachi", "teshima", "Emily"],
        "score": [40, 30, 20, 10, 11]}

# DataFrame作成
df = pd.DataFrame(data)

print("Seriesデータ")
print(series)
print("\n")
print("DataFrameデータ")
print(df)
```
とりあえず上記コードを実行してみて、SeriesとDataFrameがどんなものかみてみましょう。
Seriesは一次元配列っぽいけどnumpyのndArrayと違いますね！　だってキーに文字が設定できます！！

以下 Series,DataFrame両方でやってみる

- scoreが10以上30未満の要素を含む(Series,DataFrame)
- scoreでソートする(Series,DataFrame)
- 要素を追加する:(Series)
```(キー"taiiku","bijyutsu" 値 28,10)の２つの要素を追加してください```
- 要素を削除する:(Series)
```(キー"taiiku")の要素を削除してください```

- 行を追加する:(DataFrame)
```("kamoku":"taiiku" teacher:"umekita" "score":37)のデータを追加してください```
- 列を追加する:(DataFrame)
```"kbn"という名の新しい列に５教科の場合:1,それ以外は0となるデータを追加してください```

- 行を削除する:(DataFrame)
```上から2つ目と3つ目のデータを削除してください```

- 列を削除する:(DataFrame)
```"kbn"の列を削除してください```

## csv読み込んでみる
次は、CSVデータを読み込んでみます。
pandas_test.zip(バックログにあげてます）

- ZIPファイルを解凍し、nr.csvとss.csvをpandasのDataFrameに読み込んでみる

## 各種データをガチャガチャしてみる
読み込んだこのデータですが、人を数値化したデータです。能力データ（nr.csv)と検査データ(ss.csv)
このままでは扱い辛いのでデータを結合してみましょう。

※SQLっぽい話になります。(SQLのテーブル結合）

- 能力データを主にして、検査データを結合してみましょう。（Left Join :結合キー　user_id)

検査データは無受講の人もいるため、データが欠損しています。（"-"の入っているデータ)
欠損データは一旦邪魔なので、取り除いてみましょう。

- 欠損データのある行を除外する

## 統計量出してみる

ここまでで、一人の個人データに対して項目毎の数値が入っているため、N次元のデータができたと思います。
DataFrameにしてしまえば、列毎の以下のようなデータは関数一発で出ます。

```
            user_id        all    ...            score        flg
count  4.700000e+01  47.000000    ...        42.000000  42.000000
mean   1.051555e+07  44.531915    ...      4903.238095   1.000000
std    9.339442e+04   9.841905    ...      1018.064275   0.855399
min    1.037765e+07  24.000000    ...      2760.000000   0.000000
25%    1.047909e+07  38.000000    ...      4407.000000   0.000000
50%    1.047910e+07  42.000000    ...      4996.000000   1.000000
75%    1.051297e+07  51.500000    ...      5554.500000   2.000000
max    1.072897e+07  63.000000    ...      6996.000000   3.000000
```
- 上記の結果を得る方法を探してみましょう。
- 結果を絞り込む事もできます。```allのminだけ取り出してみましょう```

ここからは今後使うかも・・・・？（大幅な妄想・暴走です）

でもN次元って図式化し辛いですよね。。。　どんな具合にちらがってるかパッと見てみたい。と思ったのです。。。
色々調べたら、機械学習で、**次元削減(Dimensionality Reduction)**ってのがあって、N次元を3次元に変換できる事もできるんじゃ無いか？？と思いました。。。
**主成分分析**をやるとか色々書いてました。。とりあえずよーわからんでしたが参考になるサイトはいくつかありました。。

でもひとまずPandasでやれる事として
こんなのありました。
各列間の相関係数を出す。

- allとscoreの相関係数を出してみましょう。

とりあえず、やりたい事はあるがここまで。。。

## Excelファイルを読み込んでみる（おまけ）
Excelファイルも取り込めるっぽい
※　ライブラリにxlrdを追加インストール（必須)

- Excelファイルを読み込みシートを順々にDataFrameにしてみましょう。

## Pandasメモ

### フィルタリング
SeriesやDataFrameを使って条件式を作成するとbool型のシーケンスを取得することができる。 

- series[ ][ ]のように[ ]を複数並べることでAND条件を指定できる。
- series[(条件1)&(条件2)]のように指定することができる。
- OR条件を指定する場合は、series[(条件1]|(条件2)]のように(条件)を|（ストローク）でつなぐ。(DataFrameも基本は一緒)

例1)値が10以上の要素のみを得る。
  series[series >= 10]
例2)appleが５以上でkiwifruitが５以上のデータのみを得る。
　df[(df['apple'] >= 5) & (df['kiwifruit']>= 5)]

### Seriesの要素削除
　Seriesのインデックス参照を用いて、要素を削除することができます。
　Series型の変数がseriesの場合、series.drop("インデックス値")