概要
普段Pythonでデータ分析をしていると、「Rって何ができるの?」「Pythonとどう違うの?」と疑問に思うことがあるかもしれません。この記事では、そんな疑問に答えるため、Rの基本的な使い方を、具体的なデータ分析の流れに沿ってご紹介します。
今回は、Rに標準で搭載されているiris(アヤメ)データセットを使い、データの読み込みから可視化、簡単な機械学習(決定木分析)までを紹介します。
1. 実行環境の準備
まずは、分析の準備としてRと、Rを快適に使うための統合開発環境(IDE)であるRStudioをインストールします。
- R本体のインストール
- RStudio Desktopのインストール
インストールが面倒な場合や手軽に試したい場合は、Webブラウザで利用できるPosit Cloud(旧RStudio Cloud)もおすすめです。
RStudioの起動と画面構成
RStudioを起動すると、画面が4つのエリア(ペイン)に分割されています。
- ソース (Source) : Rスクリプト(.Rファイル)を編集するエリア。ここにコードを書いて保存します。
- コンソール (Console) : コードを1行ずつ実行し、結果をすぐに見ることができます。
- 環境 (Environment) / 履歴 (History) : 作成した変数やデータの中身を確認できます。
- ファイル (Files) / プロット (Plots) : 作成したグラフ(プロット)やファイル一覧が表示されます。
今回はコードを後から見返せるように、スクリプトファイルを作成します。メニューから [File] > [New File] > [R Script] を選択してください。ソースエリアに新しいタブが開きます。
2. データ分析の準備
必要なパッケージのインストールと読み込み
Rでは、install.packages()
関数で機能を追加(インストール)し、library()
関数でその機能を呼び出して(読み込んで)使えるようにします。
今回は、決定木分析とその可視化のために、rpartとpartykitという2つのパッケージを使います。
# パッケージのインストール(初回のみ)
install.packages("rpart") # 決定木モデルを作成するパッケージ
install.packages("partykit") # 決定木をきれいに可視化するパッケージ
# パッケージの読み込み(Rを起動するたびに必要)
library(rpart)
library(partykit)
irisデータセットについて
Rには、学習用にいくつかのデータセットが標準で組み込まれています。今回はその中から、統計学や機械学習で非常によく使われるiris(アヤメ)データセットを利用します。
このデータセットには、3種類のアヤメ(setosa, versicolor, virginica)について、それぞれ50個体、合計150個体分のデータが収められています。
列名 | 内容 |
---|---|
Sepal.Length | がくの長さ |
Sepal.Width | がくの幅 |
Petal.Length | 花びらの長さ |
Petal.Width | 花びらの幅 |
Species | アヤメの種類 |
3. データの観察(探索的データ分析)
まずはデータの中身について、基本的な関数を使って観察してみます。
データ全体を表示
データフレーム名をコンソールで実行すると、中身を確認できます。
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
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
今回は150行なので問題ありませんが、行数が多い巨大なデータの場合は、操作が重くなってしまう可能性があるため、次に紹介するhead()関数を使います。
データの最初の数行を確認
head()
関数を使うと、データセットの最初の数行(デフォルトでは6行)を表示できます。データ構造を素早く把握するのに便利です。
head(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
## 6 5.4 3.9 1.7 0.4 setosa
データの要約統計量を確認
summary()
関数は、データセットの各列の要約統計量をまとめて表示してくれる便利な関数です。
- 数値データ: 最小値 (Min.)、第1四分位数 (1st Qu.)、中央値 (Median)、平均値 (Mean)、第3四分位数 (3rd Qu.)、最大値 (Max.)
- カテゴリデータ: 各カテゴリの度数(データ数)
が表示され、データの全体像を数値で把握できます。
summary(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
## Median :5.800 Median :3.000 Median :4.350 Median :1.300
## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
データの構造を確認
str()
関数(structureの略)は、データセットの構造をコンパクトに表示します。各列のデータ型(numは数値、Factorはカテゴリ変数など)や、最初の数個のデータを確認できます。
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
4. データの可視化
次に、データをグラフにして視覚的に特徴を捉えてみます。
箱ひげ図で分布を比較
boxplot()関数は、データの分布を箱ひげ図で可視化します。各変数のばらつき具合を一度に比較したい場合に便利です。
# par()でグラフの余白を調整し、las=2で軸ラベルを縦書きにしています
par(mar = c(7, 5, 1, 1))
boxplot(iris, las = 2)
ヒストグラムで分布を確認
hist()
関数は、特定の変数がどのような値に集中しているかをヒストグラムで可視化します。
データフレーム名$列名
という形式で、特定の列のデータを指定できます。
# がくの長さ(Sepal.Length)の分布をヒストグラムで表示
hist(iris$Sepal.Length)
がく片の長さがどの値の範囲に集中しているかをヒストグラムで可視化できました。
散布図で変数間の関係を探る
plot()
関数を使うと、2つの変数がどのような関係にあるかを散布図で視覚的に確認できます。ここでは「がくの長さ」と「花びらの長さ」の関係を見ていきます。
品種ごとに色分けすると、データに隠れた特徴がより明確になります。
# plot()で散布図を描画。col引数で品種ごとに色分け
plot(iris$Sepal.Length, iris$Petal.Length, col = iris$Species)
# legend()で凡例を追加
legend(x = 4.5, y = 7, legend = levels(iris$Species), col = c(1:3), pch = 19)
このグラフから、がくの長さが長いほど、花びらの長さも長くなる傾向(正の相関)が見て取れます。
相関係数で関係の強さを数値化
散布図で確認した関係の強さを、cor()
関数を使って相関係数で数値化してみます。相関係数は-1から1の値をとり、1に近いほど強い正の相関、-1に近いほど強い負の相関があることを示します。
cor(iris$Sepal.Length,iris$Petal.Length)
## [1] 0.8717538
がく片の長さ(Sepal.Length)と花びらの長さ(Petal.Length)の間の相関係数は0.87となりました。
がく片の長さが長いほど、花びらの長さも長くなる傾向があることを意味します。この関係は、散布図でも確認できます。
5. 決定木による分類モデルの作成
最後に、これらのデータを使って、アヤメの種類を予測する決定木モデルを構築してみます。
rpart()
関数(Recursive Partitioning and Regression Treesの略)を使うと、簡単に決定木モデルを作成できます。
# 決定木モデルの作成
dtree <- rpart(Species ~ ., data = iris, method = "class")
-
Species ~ .
: モデルの形を指定するモデル式です。-
Species
が目的変数(予測したい変数)です。 -
~ .
は、「Species以外のすべての変数を使って予測する」という意味です。
-
-
data = iris
: 使用するデータセットを指定します。 -
method = "class"
: 今回は品種を予測する分類問題なので"class"を指定します。
作成したモデルをplot()関数で可視化します。rpartオブジェクトをas.party()関数で変換すると、より見やすいグラフを描くことができます。
# partykitパッケージの機能を使って決定木をプロット
plot(as.party(dtree))
plot関数によって構築した決定木モデルを可視化します。
この決定木を見ると、「花びらの長さ(Petal.Length)が2.45cm以下か?」という最初の質問だけで、setosa種を完全に見分けられることが分かります。
このように決定木は、人間が理解しやすいシンプルなルールをデータから自動的に見つけ出してくれます。
今回の分析では、「花びらの長さと幅」という2つの特徴量だけで、3種類のアヤメを高い精度で分類できることが示唆されました。
まとめ
この記事では、RとRStudioを使った基本的なデータ分析の流れを解説しました。Pythonに慣れている方でも、Rが持つ統計解析や可視化の機能を体験いただけたかと思います。
次の記事に続きます。