RユーザーのためのPython対応表 [tidyr, ggplot2]

## 概要

Rユーザーが、Pythonを使う際に、

「Rのアレ、Pythonではどうやるんだっけ？」

というのをまとめてみた感じです。

Pythonユーザーで、「Pythonのアレ、Rでどうやるんだっけ？」って人にも役立つかもしれません。

(dplyr, stringrの対応はこちらも参考にしてみてください)
> [Rユーザー向け Pythonデータ処理入門](https://qiita.com/takaiyuk/items/4cb1708a3f886b3d2043)

### ライブラリ

- tidyr => pandas
- ggplot2 => seaborn

データはirisのデータセットを利用。（R標準のデータセット、列名を一部変更）

| Sepal_Length | Sepal_Width | Petal_Length | Petal_Width | Species |
|:---:|:---:|:---:|:---:|:---:|
| 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 4.9 | 3.0 | 1.4 | 0.2 | setosa
| 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 5.0 | 3.6 | 1.4 | 0.2 | setosa |
| 5.4 | 3.9 | 1.7 | 0.4 | setosa |
|...|...|...|...|...|


<br>


## tidyr

### gather

DataFrameをWideからLongにする

```{r:R}
iris %>% gather(key, value, -Species) %>% head()
```

```{python:py}
pd.melt(iris, id_vars=['Species'], var_name='key', value_name='value').head()
```

```
　　　　Species          key value
1  setosa Sepal_Length   5.1
2  setosa Sepal_Length   4.9
3  setosa Sepal_Length   4.7
4  setosa Sepal_Length   4.6
5  setosa Sepal_Length   5.0
6  setosa Sepal_Length   5.4
```

### spread

DataFrameをLongからWideにする

```{r:R}
iris %>% 
    rownames_to_column('id') %>%  # idとなる列がないと "Duplicate identifiers for rows" というエラーが生じる
    gather(key, value, -id, -Species) %>%
    spread(key, value) %>% 
    arrange(as.integer(id)) %>% 
    head()
```

```{python:py}
iris_index = iris.reset_index()  # df.pivot()で列(columns)にする値と行(index)にする値がユニークでないと、 "ValueError: Index contains duplicate entries, cannot reshape" というエラーが生じる
iris_melt2 = pd.melt(iris_index, id_vars=['index', 'Species'], var_name='key', value_name='value')
iris_melt2.pivot(index='index', columns='key', values='value').head()
```

```
id Species Petal_Length Petal_Width Sepal_Length Sepal_Width
1  1  setosa          1.4         0.2          5.1         3.5
2  2  setosa          1.4         0.2          4.9         3.0
3  3  setosa          1.3         0.2          4.7         3.2
4  4  setosa          1.5         0.2          4.6         3.1
5  5  setosa          1.4         0.2          5.0         3.6
6  6  setosa          1.7         0.4          5.4         3.9
```


<br>


## ggplot2

### Histgram

```{r:R}
iris %>% ggplot(aes(x=Sepal_Length)) + geom_histogram(fill="blue", alpha=0.5) + theme_bw()
```
![r1.png](https://qiita-image-store.s3.amazonaws.com/0/204489/25ca622b-17a1-5545-7484-95eeeb6c5b78.png)

```{python:py}
sns.distplot(iris.Sepal_Length, kde=False)  # kde=True で密度曲線
```
![p1.png](https://qiita-image-store.s3.amazonaws.com/0/204489/d4d8ff44-c30d-455c-af7b-0244e2f2bfd5.png)


### Point Plot

```{r:R}
iris %>% ggplot(aes(x=Petal_Width, y=Petal_Length, color=Species)) + geom_point()
```
![r2.png](https://qiita-image-store.s3.amazonaws.com/0/204489/02e9ec89-6332-df69-f97f-555d5b0bd3a6.png)

```{python:py}
sns.jointplot(x="Sepal_Length", y="Petal_Length", data=iris)
```
![p2.png](https://qiita-image-store.s3.amazonaws.com/0/204489/70dd2e06-548f-667e-37fd-e47cbc8d16e0.png)


### Bar Plot

```{r:R}
iris %>% ggplot(aes(x=Species, y=Petal_Length, fill=Species)) + stat_summary(fun.y=mean, geom="bar", alpha=0.5) + theme_bw()
```
![r3.png](https://qiita-image-store.s3.amazonaws.com/0/204489/fb99793d-2795-2640-d391-c33825dc3c5f.png)


```{python:py}
sns.barplot(x="Species", y="Petal_Length", data=iris)  # 平均値
```
![p3.png](https://qiita-image-store.s3.amazonaws.com/0/204489/d3b57823-ddf2-b799-6950-f507ca3e1bb0.png)


### Count Plot

```{r:R}
iris %>% ggplot(aes(x=Species, fill=Species)) + geom_bar(stat="count", alpha=0.5)
```
![r4.png](https://qiita-image-store.s3.amazonaws.com/0/204489/791b738f-f4df-2686-0240-9ca1705d91d7.png)

```{python:py}
sns.countplot(x="Species", y="Petal_Length", data=iris)  # 個数
```
![p4.png](https://qiita-image-store.s3.amazonaws.com/0/204489/4e49451c-32a1-c1dc-51c8-22e3aba5eb91.png)


### Box Plot

```{r:R}
iris %>% ggplot(aes(x=Species, y=Sepal_Length, fill=Species)) + geom_boxplot(alpha=0.5)
```
![r5.png](https://qiita-image-store.s3.amazonaws.com/0/204489/1d9abba1-3e1c-a4f2-9c40-e51f57f8db99.png)

```{python:py}
sns.boxplot(x="Species", y="Sepal_Length", data=iris)
```
![p5.png](https://qiita-image-store.s3.amazonaws.com/0/204489/36929daa-9f14-09f9-9ee6-22a2c77b29a0.png)


<br>


## 参考

- [Python pandas でのグルーピング/集約/変換処理まとめ](http://sinhrks.hatenablog.com/entry/2014/10/13/005327)
- [Seaborn で件数や平均値を棒グラフで可視化する](https://pythondatascience.plavox.info/seaborn/%E6%A3%92%E3%82%B0%E3%83%A9%E3%83%95)
- [pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る その1](https://qiita.com/hik0107/items/3dc541158fceb3156ee0)
- [pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る その2](https://qiita.com/hik0107/items/7233ca334b2a5e1ca924)
- [Python でデータ可視化 - "Facet"で属性別グラフを一気に描く方法が便利すぎる](https://qiita.com/hik0107/items/865b75ae486728cb0006)