Python、R言語の書き換えメモ(データの可視化編)

2023年7月31日

PythonR言語の書き換え(変換)メモのデータの可視化編です。
データの可視化は、データ分析の重要なステップの一つです。ここではPythonR言語でよく使われるデータのグラフ化の方法をまとめました。

PythonとR言語で可視化を行うためのツール

Pythonmatplotlib
R言語:標準のグラフツール群、もしくはggplot

データサンプル(iris)の準備

ここでは統計、機械学習などでよく使われるirisデータセットを使ってデータの視覚化を行います。
irisデータセットR言語では標準で組み込まれています。
Pythonでは別途用意が必要となります。
seabornscikit-learnに付属するデータセットからインポートできますが、ここではR言語irisデータセットcsv形式で出力してそれを読み込む方法で行います。

irisデータセット

3種類アイリス(setosa, versicolor, virginica)が150サンプルで構成。

構成要素(カラム名)
Sepal.Length: がく片の長さ cm
Sepal.Width: がく片の幅 cm
Petal.Length: 花びらの長さ cm
Petal.Width: 花びらの幅 cm
Species: 種

R言語

> iris
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
4            4.6         3.1          1.5         0.2     setosa
5            5.0         3.6          1.4         0.2     setosa

R言語からirisデータサンプルをcsv形式で書き出す

write.csv(iris, “iris.csv")

Python
Python
からiris.csvファイルを読み込む

>>> import pandas as pd
>>> iris = pd.read_csv('iris.csv', index_col=0)

ヒストグラム

ヒストグラムの階級数を9、領域を要素の最小値、最大値で合わせた例

Python

>>> import numpy as np
>>> import matplotlib.pyplot as plt

>>> x = iris["Sepal.Length"]
>>> tmp = np.linspace(min(x),max(x),10)
>>> plt.hist(iris["Sepal.Length"],bins=tmp.round(2), color='lightgray', ec='black')
>>> plt.show()
# min~maxの要素数10の配列
# round(2) 小数点第2位まで取得

R言語

> x <- iris$Sepal.Length
> hist(x, breaks=seq(min(x),max(x),length.out=10), right=FALSE)

R言語

> library(ggplot2)
> x <- iris$Sepal.Length
> ggplot(iris, aes(x=Sepal.Length))+geom_histogram(breaks=seq(min(x),max(x),length.out=10), closed="left")

グラフをpng形式で書き出す

Python

>>> import numpy as np
>>> import matplotlib.pyplot as plt

>>> figsize_px = np.array([800, 600])
>>> dpi = 72
>>> figsize_inch = figsize_px / dpi
>>> fig, ax = plt.subplots(figsize=figsize_inch, dpi=dpi)
>>> x = iris["Sepal.Length"]
>>> tmp = np.linspace(min(x),max(x),10)
>>> ax.hist(iris["Sepal.Length"],bins=tmp.round(2),color='lightgray', ec='black')
>>> fig.savefig("hist_iris_py.png")

R言語

#標準のヒストグラムグラフを書き出す
> png("hist_iris_R.png", width=800, height=600)
> x <- iris$Sepal.Length
> hist(x, breaks=seq(min(x),max(x),length.out=10), right=FALSE)
> dev.off()

#ggplotのヒストグラムグラフを書き出す
> library(ggplot2)
> png("hist_iris_R_ggp.png", width=800, height=600)
> x <- iris$Sepal.Length
> ggplot(iris, aes(x=Sepal.Length))+geom_histogram(breaks=seq(min(x),max(x),length.out=10), closed="left")
> dev.off()

散布図

Python

>>> import matplotlib.pyplot as plt
>>> iris.plot('Sepal.Length','Sepal.Width',kind='scatter')
>>> plt.show()

R言語

> plot(iris$Sepal.Length, iris$Sepal.Width, pch=20, col=“blue")

#pch プロットの種類

R言語 (ggplot)

> library(ggplot2)
> ggplot(iris, aes(x=Sepal.Length,y=Sepal.Width))+geom_point()

箱ひげ図

Python

>>> import matplotlib.pyplot as plt
>>> iris.boxplot(by='Species',column='Sepal.Length')
>>> plt.show()

R言語

> boxplot(formula=Sepal.Length~Species, data=iris)

R言語 (ggplot)

> ggplot(iris,aes(x=Species, y=Sepal.Length))+geom_boxplot()

棒グラフ

Python

>>> import matplotlib.pyplot as plt
>>> pd.options.display.float_format=('{:.2f}'.format)
>>> df = (iris.describe().transpose()[['mean','std']])
>>> df.plot(y='mean', kind='bar', capsize=10)
>>> plt.show()

R言語

> library(tidyverse)
> df <- psych::describe(iris[,-5]) 
> tmp <- select(.data=df, mean) 
> x <- tmp[,1] > names(x) <- rownames(tmp) 
> barplot(x,ylim=c(0,round(max(x))))

R言語 (ggplot)

> library(tidyverse)
> df <- psych::describe(iris[,-5]) 
> df <- select(.data=df, mean) 
> tmp <- rownames(df) 
> df %>% ggplot(aes(x=factor(tmp, levels=tmp),y=mean))+geom_col()+xlab(NULL)

棒グラフ種類(Species)ごとの平均を棒グラフで表示

Python

>>> group=iris.groupby('Species')
>>> df=group.agg('mean')
>>> group.agg('mean').plot(kind='bar')
>>> plt.show()

R言語

> mygroup <- iris %>% group_by(Species)
> df <- mygroup %>%
summarize(across(everything(),mean)) %>%
pivot_longer(-Species)
> barplot(df$value,names=df$Species)

R言語 (ggplot)

> mygroup <- iris %>% group_by(Species)
> df <- mygroup %>%
summarize(across(everything(),mean)) %>%
pivot_longer(-Species)
> df %>% ggplot(aes(x=Species, y=value, fill=name))+
geom_col(position="dodge")