【無料】家で簡単プログラミング ~その3 Rを使ってみよう2~
どうも、おはこんばんにちは、ぽんぽこりん(@ponpokorin_24)です。
前回(その2)で基本的なRの触り方が分かったと思います。そこで、今回は前回の知識を基に、もっと色んなことに挑戦できることを知りましょう。
今回も当然、Rをインストールしてある前提で書いていきます。
もし最初にこの記事を見に来てくれくれた方であれば、その1 その2 も見てみてください。
さて、
今回は具体的にはこんな流れにしていこうと思います。
25分ごとにというのは、ポモドーロテクニックという僕のおすすめの集中法です。簡単にいうと、まず25分間のタイマーをセットして、その間は目の前のことだけに集中します。そしてタイマーがピピっと鳴ったら5分休憩。ふぅ。また25分間集中して…と繰り返し、やることを終わらせていくというものです。
そうは言われても、その「集中」が難しいんだよーという方は、ぜひこの拙記事を読んでみてください。5分くらいで読めると思います。
では本題に入りましょう!
そんなわけで実際に試してみましょう。まず以下のコマンドをR Consoleに書き込んでみましょう。また新しいコマンドを使うので意味わからん状態だと思いますが、とりあえず写してみましょう。
fn <- function(x) {
a <- x[1]
b <- x[2]
ans <- c()
ans[1] <- a + b - 10
ans[2] <- a - b - 6
return(ans)
}
nleqslv(c(1, 1), fn)
どうでしょう?
nleqslv(c(1, 1), fn) でエラー:
関数 "nleqslv" を見つけることができませんでした
こんなエラーが出たと思います。そこで、以下のコマンドを打ってみましょう。パッケージをインストールするためのコマンドです。
install.packages("nleqslv")
すると、こんな画面になるので、好きなところを選んでもらえばいいのですが、基本的には「Japan (Tokyo) [https]」か「Japan (Yonezawa) [https]」を選ぶとダウンロードが早いと思います。
ちょっとすると、こんな感じの画面になります。
ここで、次のコマンドを打ってみましょう。
library(nleqslv)
nleqslv(c(1, 1), fn)
どうですか?先程ダメだった、nleqslv が使えますよね!
こんな感じで追加のコマンドを入手できました。ここで、一旦インストールしたパッケージ、今回でいえば nleqslv はあなたのパソコンの中にダウンロード・インストールされたので、次回からは install.packages("nleqslv") は要りません。
それでは、いま使った各コマンドの意味を確認して…みる前に、まず何をやっていたのかお話しようと思います。
a + b = 10
a - b = 6
Ans. a=8, b=2
簡単なやつですよね?これをコンピューターに解いてもらったというわけです。このくらいの連立方程式なら人間も簡単に解けますが、もっと式の数が増えたり、変数がa,b,c,d,…と増えるとめんどくさくなってきます。これもコンピューターなら割とサクッと計算してくれます。
(スマホでご覧になっていて、コマンドが折り返して分かりにくい場合は、画面横向きも試してみてください。)
# install.packages("nleqslv") # 初回インストール時のみ実行
library(nleqslv)
fn <- function(x) {
a <- x[1]
b <- x[2]
ans <- c()
ans[1] <- a + b - 10
ans[2] <- a - b - 6
return(ans)
}
nleqslv(c(1, 1), fn)
上から見ていきましょう。最初に前回の復習の、#によるコメントです。こうしておけば、2度目からは install.packages しませんね。このままコピーして、エディタに貼り付け、保存しておいてもいいですよ。
次に、"nleqslv" の " " についても説明しましょう。このようにダブルクォーテーションで囲まれた文字は文字列として扱われることになります。install.packages というコマンドは括弧の中に文字列をいれる前提で作られています。なので、nleqslvをダブルクォーテーションで囲ったんです。
ちなみに、コマンドの括弧の中に入るものを引数(ひきすう)といいます。なので、この場合は「install.packagesは引数に文字列を取る」とか言ったりします。
それでは各コマンドについて説明します。ちょっと難しいかもしれませんので、一旦休憩してからでもいいですよ?
library
パッケージをインストールしただけでは、まだ新しいコマンドは使えません。使うためには「このパッケージ使うよ」とコンピューターに教えます。この為にあるのが library というコマンドです。library は引数に文字列ではなく、素の文を取ります。
function
関数を定義するためのコマンドです。「関数」を簡単に言うと、「ある変数x(複数でも可)を使って、いろいろ計算をして結果を返す」というものです。「いろいろ計算をして結果を返す」の部分を{ }の中に書きます。分かりやすく画像に書き込んでみました。今回のxは要素が2つのベクトルです。
なんとなく分かった、でも十分です。今回大事なのはパッケージについて知ることなので。次のnleqslvも一応書きますが、ちょっと難しいので、( ´_ゝ`)フーン で十分です。
nleqslv
多元連立方程式を解くコマンドです。使い方としては、nleqslv(A, B) で、Aには初期値、Bには解きたい方程式を一定の書式に沿って書いたものを入れます。この時のAを第1引数、Bを第2引数と言ったりもします。Aはよっぽど解から離れたものでなければなんでもOKです。
上の例ではAに c(1, 1) を入れましたが、c(2, 1) でも c(3, 10) でもちゃんと答えがでます。試してみて下さいね。
一応 nleqslv のB(第2引数)の関数の書き方を言葉で説明すると、
前にお話しした通り、プログラムを書く目的の一つに、データを分析したいというものがあります。しかし、そういったデータはだいたいエクセル(Excel)ファイル、例えばsample.xlsxみたいなファイルか、csvファイル(カンマで区切られたテキストデータ)として保存されていることがほとんどです。
こういったファイルを読み込んで処理したい!と思うのですが、その時に大事になってくるのが作業ディレクトリです。それでは、実際にcsvファイルをダウンロードしてみましょう。
財務省貿易統計 - 輸出入額の推移(地域(国)別・主要商品別)
https://www.customs.go.jp/toukei/suii/html/time.htm
上のページにアクセスしたら、世界 年別 のところを、
Microsoft Edgeなら、右クリックして、「対象をファイルに保存」、
Google Chromeなら、左クリックして画面が変わった後に右クリックして「名前を付けて保存」
そのまま保存するとd41ca.csvという名前になっていると思います(2020/03/05時点では。変わるかもしれません)。
さて、これで準備完了です。
read.csv("C:/R_data/d41ca.csv")
ちゃんと読み込んでくれましたね!
それでは次のコマンドも打ってみてください。
setwd("C:/R_data")
read.csv("d41ca.csv")
違いが分かりましたか?そうです、おんなじことをやってはいるのですが、read.csv に渡す情報が、"C:/R_data/d41ca.csv" から "d41ca.csv" へと短くなっています。
これはコマンド setwd で作業ディレクトリを指定したからです(set working directoryでsetwdです)。さらにエディタを開いて好きなコマンドを書き、保存ボタンを押してみましょう(Ctrl+Sでも保存できます)。こんな画面になると思いますが、保存先に注目!
ちゃんとC(僕の場合はD):/R_dataに保存されそうになってます。
こういう感じで作業ディレクトリを指定しておくことで、セーブ先を何回もクリックして選ぶ手間が省けますし、ファイルを読み込むときも短めの文量で済みます。
今の例だと、かえって書く量が増えちゃいましたが、いくつもファイルを読み込みたいときなんかに、例えば、
read.csv("C:/aaa/bbb/ccc/aiueo.csv")
read.csv("C:/aaa/bbb/ccc/kakikukeko.csv")
read.csv("C:/aaa/bbb/ccc/sasisuseso.csv")
read.csv("C:/aaa/bbb/ccc/tatituteto.csv")
と書くよりも、
setwd("C:/aaa/bbb/ccc")
read.csv("aiueo.csv")
read.csv("kakikukeko.csv")
read.csv("sasisuseso.csv")
read.csv("tatituteto.csv")
の方がコンパクトで済みます。
これで作業ディレクトリの便利さについて分かってもらえたでしょうか?
ちょっと休憩したら、次で最後です!
mode(c(1,1))
mode("program")
上はnumeric(「数値」の意味)、下はcharacter(「文字」の意味)が返ってきたと思います。ここで mode について説明すると、効果は単純で「そのオブジェクトの型を返す」コマンドです。オブジェクトとはコマンドによって作られるもののことで、上の read.csv によって出力された結果(オブジェクト)も型を持っています。見てみましょう。
mode(read.csv("d41ca.csv"))
list(リスト)が返ってきたと思います。このように、それぞれのオブジェクトは型を持っています。なぜ型を持っているのか?それは次のコマンドを打ってもらうと分かると思います。
1+2
"1"+"2"
mode(1)
mode("1")
2行目でエラーがでたと思います。+は数値(numeric)どうしの計算しかできないようになっているので、このようにすぐにエラーがでます。型のおかげで、間違って文字(character)などを計算式の中に入れてもコンピューターが混乱しないようになっている、というわけです。
ただ、たまに型のせいで思うような結果を出しにくいという時もあります。一応コマンド例を下に書いてみました。これは無視してもらっても構いません。
# 目標:dataの1行目の上から4つ目の1979を10で割りたい
data <- read.csv("d41ca.csv")
mode(data) # listへのアクセスは基本的には[[ ]]を使う
data[[1]][4] # dataの1番目(1列目)の4個目の要素を抜き出す
data[4,1] # dataの4行1列目という書き方でも抜き出せます、data[,1]なら1列目全体を抜き出せます
# data[4,1]の方が簡単なのでこっちを使う
mode(data[4,1]) # numeric ということは10で割れそう
data[4,1]/10 # 割れない…どうも実はfactor型っぽい
as.numeric(data[4,1]) # as.numericは型をnumericにするためのコマンド。でも2になっちゃう
as.numeric(as.character(data[4,1])) # やった!
as.numeric(as.character(data[4,1])) / 10 # 目標達成!
これにて今回のその3は終了です。ここまで読んで頂き、ありがとうございます。
必要なコマンドや面白かったコマンドは、ぜひ、コメントを入れてエディタに書いて、保存してみてください。保存するときのファイル名も分かりやすい名前にしておくと、後で見つけやすくなりますよ。
大事な保存も終わったら、Rの画面に戻って、右上のバッテンを押して、作業スペースを保存しますか?で「いいえ」を選択すればRもきれいに終了します。お疲れ様でした。
もし、気に入った!ためになった!とか思ったら、ご自由にSNS等で宣伝してください…というかそうして頂けるとありがたいです。せっかく書いたので出来るだけ多くの方に見てもらいたいというのが本音です(笑)
それでは~
その4はこちら(書けたらリンク貼ります) 書けました(2019/03/07)
一個目は
a + b + c = 10
a + b - c = 8
a - b - c = - 4
の連立方程式で、
2個目は
a + b = 1
a² + b² = 13
の連立方程式です。
library(nleqslv)
fn2 <- function(x) {
a <- x[1]
b <- x[2]
c <- x[3]
ans <- c()
ans[1] <- a + b + c - 10
ans[2] <- a + b - c - 8
ans[3] <- a - b - c + 4
return(ans)
}
nleqslv(c(1, 1, 1), fn2)
fn3 <- function(x) {
a <- x[1]
b <- x[2]
ans <- c()
ans[1] <- a + b - 1
ans[2] <- a^2 + b^2 - 13
return(ans)
}
nleqslv(c(1, -1), fn3) # c(1, 1)だと上手くいきません
前回(その2)で基本的なRの触り方が分かったと思います。そこで、今回は前回の知識を基に、もっと色んなことに挑戦できることを知りましょう。
今回も当然、Rをインストールしてある前提で書いていきます。
もし最初にこの記事を見に来てくれくれた方であれば、その1 その2 も見てみてください。
さて、
今回は具体的にはこんな流れにしていこうと思います。
- パッケージの利用
- 作業ディレクトリを設定してみよう
- 型について色々試してみよう
25分ごとにというのは、ポモドーロテクニックという僕のおすすめの集中法です。簡単にいうと、まず25分間のタイマーをセットして、その間は目の前のことだけに集中します。そしてタイマーがピピっと鳴ったら5分休憩。ふぅ。また25分間集中して…と繰り返し、やることを終わらせていくというものです。
そうは言われても、その「集中」が難しいんだよーという方は、ぜひこの拙記事を読んでみてください。5分くらいで読めると思います。
では本題に入りましょう!
パッケージの利用
パッケージとは、デフォルトの状態では使えないコマンドの集まりみたいなものです。ゲームで例えれば、追加DLCとかMODとか、そんな感じです。パッケージは無料でインストールできるのでMODが一番近いですかね。そんなわけで実際に試してみましょう。まず以下のコマンドをR Consoleに書き込んでみましょう。また新しいコマンドを使うので意味わからん状態だと思いますが、とりあえず写してみましょう。
fn <- function(x) {
a <- x[1]
b <- x[2]
ans <- c()
ans[1] <- a + b - 10
ans[2] <- a - b - 6
return(ans)
}
nleqslv(c(1, 1), fn)
どうでしょう?
nleqslv(c(1, 1), fn) でエラー:
関数 "nleqslv" を見つけることができませんでした
こんなエラーが出たと思います。そこで、以下のコマンドを打ってみましょう。パッケージをインストールするためのコマンドです。
install.packages("nleqslv")
すると、こんな画面になるので、好きなところを選んでもらえばいいのですが、基本的には「Japan (Tokyo) [https]」か「Japan (Yonezawa) [https]」を選ぶとダウンロードが早いと思います。
ちょっとすると、こんな感じの画面になります。
ここで、次のコマンドを打ってみましょう。
library(nleqslv)
nleqslv(c(1, 1), fn)
どうですか?先程ダメだった、nleqslv が使えますよね!
こんな実行結果になると思います。このコマンドの解説はちょっと後で |
こんな感じで追加のコマンドを入手できました。ここで、一旦インストールしたパッケージ、今回でいえば nleqslv はあなたのパソコンの中にダウンロード・インストールされたので、次回からは install.packages("nleqslv") は要りません。
それでは、いま使った各コマンドの意味を確認して…みる前に、まず何をやっていたのかお話しようと思います。
コンピューターにやらせたのは…
上でやったことは、ズバリ「2元1次連立方程式を解く」ということでした!難しく書きましたが、実は簡単で、以下の簡単な連立方程式を解いただけです。a + b = 10
a - b = 6
Ans. a=8, b=2
簡単なやつですよね?これをコンピューターに解いてもらったというわけです。このくらいの連立方程式なら人間も簡単に解けますが、もっと式の数が増えたり、変数がa,b,c,d,…と増えるとめんどくさくなってきます。これもコンピューターなら割とサクッと計算してくれます。
コマンド解説
さて、なにをやったか分かったところで、今一度今回のコマンドを見てみましょう。まとめると…(スマホでご覧になっていて、コマンドが折り返して分かりにくい場合は、画面横向きも試してみてください。)
# install.packages("nleqslv") # 初回インストール時のみ実行
library(nleqslv)
fn <- function(x) {
a <- x[1]
b <- x[2]
ans <- c()
ans[1] <- a + b - 10
ans[2] <- a - b - 6
return(ans)
}
nleqslv(c(1, 1), fn)
上から見ていきましょう。最初に前回の復習の、#によるコメントです。こうしておけば、2度目からは install.packages しませんね。このままコピーして、エディタに貼り付け、保存しておいてもいいですよ。
次に、"nleqslv" の " " についても説明しましょう。このようにダブルクォーテーションで囲まれた文字は文字列として扱われることになります。install.packages というコマンドは括弧の中に文字列をいれる前提で作られています。なので、nleqslvをダブルクォーテーションで囲ったんです。
ちなみに、コマンドの括弧の中に入るものを引数(ひきすう)といいます。なので、この場合は「install.packagesは引数に文字列を取る」とか言ったりします。
それでは各コマンドについて説明します。ちょっと難しいかもしれませんので、一旦休憩してからでもいいですよ?
library
パッケージをインストールしただけでは、まだ新しいコマンドは使えません。使うためには「このパッケージ使うよ」とコンピューターに教えます。この為にあるのが library というコマンドです。library は引数に文字列ではなく、素の文を取ります。
function
関数を定義するためのコマンドです。「関数」を簡単に言うと、「ある変数x(複数でも可)を使って、いろいろ計算をして結果を返す」というものです。「いろいろ計算をして結果を返す」の部分を{ }の中に書きます。分かりやすく画像に書き込んでみました。今回のxは要素が2つのベクトルです。
なんとなく分かった、でも十分です。今回大事なのはパッケージについて知ることなので。次のnleqslvも一応書きますが、ちょっと難しいので、( ´_ゝ`)フーン で十分です。
nleqslv
多元連立方程式を解くコマンドです。使い方としては、nleqslv(A, B) で、Aには初期値、Bには解きたい方程式を一定の書式に沿って書いたものを入れます。この時のAを第1引数、Bを第2引数と言ったりもします。Aはよっぽど解から離れたものでなければなんでもOKです。
上の例ではAに c(1, 1) を入れましたが、c(2, 1) でも c(3, 10) でもちゃんと答えがでます。試してみて下さいね。
一応 nleqslv のB(第2引数)の関数の書き方を言葉で説明すると、
- 関数の形で書き始める
- 変数をxから用意する
- ansに空のベクトルをいれる
- 0 = (式) の形に与式を変形したものを、それぞれans[1], ans[2]…に代入する
- return(ans)する
- 関数を閉じる(さいごに }で閉じるということ)
これでもまだ分かりにくいので、この記事の最後に2つくらい別の例を載せておきます。もし、nleqslv をマスターしたいという方はぜひ。
作業ディレクトリを設定してみよう
パッケージの使い方が分かったところで、少しコンソールから離れて、作業ディレクトリについて知ってみましょう。もちろん手を動かしながらです。座学で聞いてるだけでは眠くなりますもんね。前にお話しした通り、プログラムを書く目的の一つに、データを分析したいというものがあります。しかし、そういったデータはだいたいエクセル(Excel)ファイル、例えばsample.xlsxみたいなファイルか、csvファイル(カンマで区切られたテキストデータ)として保存されていることがほとんどです。
こういったファイルを読み込んで処理したい!と思うのですが、その時に大事になってくるのが作業ディレクトリです。それでは、実際にcsvファイルをダウンロードしてみましょう。
統計データをダウンロードしてみる
変なファイルをダウンロードするのは不安だと思うので、財務省の統計データを使ってみましょう。財務省貿易統計 - 輸出入額の推移(地域(国)別・主要商品別)
https://www.customs.go.jp/toukei/suii/html/time.htm
上のページにアクセスしたら、世界 年別 のところを、
Microsoft Edgeなら、右クリックして、「対象をファイルに保存」、
Google Chromeなら、左クリックして画面が変わった後に右クリックして「名前を付けて保存」
そのまま保存するとd41ca.csvという名前になっていると思います(2020/03/05時点では。変わるかもしれません)。
フォルダを作成
そしたら次に、Cドライブ(パーテーションでDドライブなど作ってればそっちでもいいです。その場合は以下のコマンドでCをDに変えてください)にR_dataというフォルダを作りましょう。そのフォルダの中に今ダウンロードしたd41ca.csvを移動またはコピーしてください。もし、フォルダの作り方が分からない場合は「新規フォルダ 作成」で検索すればすぐに分かります。さて、これで準備完了です。
実践
ちょっとコンソールに戻って、以下のコマンドを打ってみましょう。read.csv("C:/R_data/d41ca.csv")
ちゃんと読み込んでくれましたね!
こんな感じになるはずです |
それでは次のコマンドも打ってみてください。
setwd("C:/R_data")
read.csv("d41ca.csv")
違いが分かりましたか?そうです、おんなじことをやってはいるのですが、read.csv に渡す情報が、"C:/R_data/d41ca.csv" から "d41ca.csv" へと短くなっています。
これはコマンド setwd で作業ディレクトリを指定したからです(set working directoryでsetwdです)。さらにエディタを開いて好きなコマンドを書き、保存ボタンを押してみましょう(Ctrl+Sでも保存できます)。こんな画面になると思いますが、保存先に注目!
ちゃんとC(僕の場合はD):/R_dataに保存されそうになってます。
こういう感じで作業ディレクトリを指定しておくことで、セーブ先を何回もクリックして選ぶ手間が省けますし、ファイルを読み込むときも短めの文量で済みます。
今の例だと、かえって書く量が増えちゃいましたが、いくつもファイルを読み込みたいときなんかに、例えば、
read.csv("C:/aaa/bbb/ccc/aiueo.csv")
read.csv("C:/aaa/bbb/ccc/kakikukeko.csv")
read.csv("C:/aaa/bbb/ccc/sasisuseso.csv")
read.csv("C:/aaa/bbb/ccc/tatituteto.csv")
と書くよりも、
setwd("C:/aaa/bbb/ccc")
read.csv("aiueo.csv")
read.csv("kakikukeko.csv")
read.csv("sasisuseso.csv")
read.csv("tatituteto.csv")
の方がコンパクトで済みます。
これで作業ディレクトリの便利さについて分かってもらえたでしょうか?
ちょっと休憩したら、次で最後です!
型について色々試してみよう
まず、型が何なのかよくわからないと思うので以下のコマンドを打ってみましょう。mode(c(1,1))
mode("program")
上はnumeric(「数値」の意味)、下はcharacter(「文字」の意味)が返ってきたと思います。ここで mode について説明すると、効果は単純で「そのオブジェクトの型を返す」コマンドです。オブジェクトとはコマンドによって作られるもののことで、上の read.csv によって出力された結果(オブジェクト)も型を持っています。見てみましょう。
mode(read.csv("d41ca.csv"))
list(リスト)が返ってきたと思います。このように、それぞれのオブジェクトは型を持っています。なぜ型を持っているのか?それは次のコマンドを打ってもらうと分かると思います。
1+2
"1"+"2"
mode(1)
mode("1")
2行目でエラーがでたと思います。+は数値(numeric)どうしの計算しかできないようになっているので、このようにすぐにエラーがでます。型のおかげで、間違って文字(character)などを計算式の中に入れてもコンピューターが混乱しないようになっている、というわけです。
ただ、たまに型のせいで思うような結果を出しにくいという時もあります。一応コマンド例を下に書いてみました。これは無視してもらっても構いません。
# 目標:dataの1行目の上から4つ目の1979を10で割りたい
data <- read.csv("d41ca.csv")
mode(data) # listへのアクセスは基本的には[[ ]]を使う
data[[1]][4] # dataの1番目(1列目)の4個目の要素を抜き出す
data[4,1] # dataの4行1列目という書き方でも抜き出せます、data[,1]なら1列目全体を抜き出せます
# data[4,1]の方が簡単なのでこっちを使う
mode(data[4,1]) # numeric ということは10で割れそう
data[4,1]/10 # 割れない…どうも実はfactor型っぽい
as.numeric(data[4,1]) # as.numericは型をnumericにするためのコマンド。でも2になっちゃう
as.numeric(as.character(data[4,1])) # やった!
as.numeric(as.character(data[4,1])) / 10 # 目標達成!
これにて今回のその3は終了です。ここまで読んで頂き、ありがとうございます。
必要なコマンドや面白かったコマンドは、ぜひ、コメントを入れてエディタに書いて、保存してみてください。保存するときのファイル名も分かりやすい名前にしておくと、後で見つけやすくなりますよ。
大事な保存も終わったら、Rの画面に戻って、右上のバッテンを押して、作業スペースを保存しますか?で「いいえ」を選択すればRもきれいに終了します。お疲れ様でした。
もし、気に入った!ためになった!とか思ったら、ご自由にSNS等で宣伝してください…というかそうして頂けるとありがたいです。せっかく書いたので出来るだけ多くの方に見てもらいたいというのが本音です(笑)
それでは~
その4はこちら
付録:
記事内でお話しした、nleqslv の例です。一個目は
a + b + c = 10
a + b - c = 8
a - b - c = - 4
の連立方程式で、
2個目は
a + b = 1
a² + b² = 13
の連立方程式です。
library(nleqslv)
fn2 <- function(x) {
a <- x[1]
b <- x[2]
c <- x[3]
ans <- c()
ans[1] <- a + b + c - 10
ans[2] <- a + b - c - 8
ans[3] <- a - b - c + 4
return(ans)
}
nleqslv(c(1, 1, 1), fn2)
fn3 <- function(x) {
a <- x[1]
b <- x[2]
ans <- c()
ans[1] <- a + b - 1
ans[2] <- a^2 + b^2 - 13
return(ans)
}
nleqslv(c(1, -1), fn3) # c(1, 1)だと上手くいきません
コメント
コメントを投稿