DockerでRとMySQLの環境構築(Ubuntu16.04LTS仮想マシン編)
RとMySQLをDockerで動かす練習です。
今回はUbuntu 16.04 LTSで環境作ります。
まずVMwareでUbuntu64bit16.04LTSの仮想マシンを作っておきます。
端末から、
$ sudo apt-get update $ sudo apt-get install apt-transport-https ca-certificates $ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
パッケージでDockerインストールするときは
$ sudo apt-get install docker.io
では、次に以前も紹介したHadley packageの入ったrocker/hadleyverse(Docker image)を入れます。
$ sudo docker run -d -p 8787:8787 -v ~:/home/rstudio rocker/hadleyverse
データベースはMySQLにします。
$ sudo docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql
ちゃんとうごいているか確認
$ sudo docker ps
大丈夫みたいです。STATUSはUPになってます。
Dockerコンテナのip addressを確認して。
$ ifconfig
さてRstudioをブラウザから動かして見ましょう。
ブラウザのアドレスバーに[ip address]:8787と入力します。
Rstudio serverが立ち上がりましたね。
Username,Passwordはどちらも"rstudio"で。
Consoleからでも、PackagesタブのInstallボタンでも良いので
install.packages("RMySQL")
まずはMySQLに接続するためのパッケージをインストール。
実際データベースを操作してみましょう。
Rstudioに新規ファイルを作り、下記コードをコピペしてください。
library(RMySQL) con <- dbConnect(MySQL(), host="[ip address]", port=3306, dbname="mysql", user="root", password="mysql") dbGetQuery(con,"SHOW DATABASES;") dbGetQuery(con,"CREATE DATABASE rbeginner;") dbGetQuery(con,"SHOW DATABASES;") dbDisconnect(con) # 終わったらconnectionは切りましょう
順番にRUNボタンで実行すると。最初の"SHOW DATABASES;"ではなかったものが、2回めにできていますね。
本当にMySQLにrbegginerのデータベースができているでしょうか?
もういちどUbuntu端末に戻ります。
$ sudo docker exec -it mysql bash
mysqlコンテナに入ります。
# mysql -u root -pmysql
mysql> show databases;
できていますね。Dockerは環境構築が簡単なので良いですね。
Rで画像処理~magick package
最近、ホームページもRmarkdownで書くようになりました。凝ったものは必要ないし、修正するのも楽だし、Rstudioで全て済ませられるので満足してます。ただホームページに貼り付ける画像を編集するのに、他の画像ソフトを立ち上げるのはやや面倒だなとは感じていました。でも、もうほかのソフトは必要ないかもしれません、magick packageがあれば…
画像の入出力
パッケージを読み込んでから、画像を取り込みます。
先日頂いた、えび味噌ラーメン画像です。
library(magick) ramen <- image_read('img/ebi_miso.jpg')
Rstudioのviewerに出力するには、ramenとそのまま打ち込むだけです。
コンソールには画像の情報も一緒に出力されます。
画像の情報だけ欲しい場合は、image_infoを使います。
image_info(ramen)
ちなみに画像の出力は、image_writeを使います。
image_write(ramen,path='img/ebi_miso.png',format='png')
画像の処理
画像のサイズ変更は、image_scaleで。
library(dplyr) image_scale(ramen, "200") %>% image_browse() # width: 300px image_scale(ramen, "x200") %>% image_browse() # height: 300px
画像の回転、鏡像はimage_rotate,image_flip,image_flopで。
image_rotate(ramen, 45) image_flip(ramen) image_flop(ramen)
画像のフィルター、効果は、image_blur,image_noiseで。
image_blur(ramen, 10, 5) image_noise(ramen)
画像のテキスト注釈
上の写真のようなテキストを付けるのは、image_annotateを使います。
ramen %>% image_annotate(.,'text!!',size=70,gravity='northeast',color='green')
画像の結合
ラーメン画像を3枚用意します(ramen1,ramen2,ramen3)。
3つの画像をcombineしてから、image_appendするのですが、画像の大きさが、まちまちかもしれないので、image_scaleで高さをそろえてからappendしてください。
img <- c(ramen1,ramen2,ramen3) image_append(image_scale(img, "x200"))
レイヤー
Photoshopみたいにレイヤーを重ねたりできます。
logo <- image_read("https://www.r-project.org/logo/Rlogo.png") image_scale(ramen, "500") ->ramen500 image_scale(logo, "300") ->logo300 img <- c(ramen500 ,logo300) image_mosaic(img)
アニメーション
先ほどのラーメン画像3枚でパラパラアニメです。image_animateを使用します。
img <- c(ramen1,ramen2,ramen3) image_animate(image_scale(img, "200x200"), fps = 1, dispose = "previous")
試してない機能もまだまだあります。
ラスター画像に変換し、ggplotに貼り付けたりもできるようです。
まとめ
簡単な画像処理は、Rでできそうです。
たくさんの画像に同じ処理するような場合には、効率よいですね。
繰り返し作業は画像ソフトより、可能な限りRで済ませたいものです。
ggmapで位置情報を可視化
電子カルテ用のPCはインターネットに接続されていないものが多いです。セキュリティーの問題もありやむを得ないのですが…。ただ折角の患者位置情報を可視化できないのはもったいないことです。Rでは、leaflet packageでインタラクティブな地図にプロットもできますがインターネット接続が必要となりますので、今回は静的な地図へのプロットをggmap packageで練習します。
練習用のデータ(コンビニ位置情報)は、下記から入手しました。
http://www.sinfonica.or.jp/kanko/estrela/refer/s29/index.html
あらかじめtokyo3.csvというファイル名で保存しておきます。
df<- read.csv("tokyo3.csv",header = F) colnames(df) <- c("name","address","lon","lat")
こんなデータフレームになります。
address | name | lon | lat |
---|---|---|---|
ファミリーマート練馬駅西口店 | 東京都練馬区練馬1丁目15-1 | 139.6525 | 35.73847 |
セブンイレブン練馬3丁目店 | 東京都練馬区練馬3-1-10 | 139.6504 | 35.73736 |
ローソンストア100練馬3丁目店 | 東京都練馬区練馬3-1-7 | 139.6504 | 35.73736 |
まずは背景となる地図をget_map関数でゲットします。地図の中心は東京駅(lat=35.6813023,lon=139.7640529)とします。
library(ggmap) lon_tokyo <- 139.7640529 lat_tokyo <- 35.6813023 map <- get_map(location=c(lon_tokyo,lat_tokyo), zoom=10,maptype = "terrain",source = c("google"))
地図の表示はggmap関数です。
ggmap(map)
get_mapの引数maptypeはいろいろ選択できます。
詳しくは、ここを参照。
https://github.com/dkahle/ggmap/blob/master/R/get_map.R
先ほどのコンビニ位置データ(df)をプロットします。geom_pointで点を載せてみましょう。
ggmap(map) + geom_point(aes(x=lon, y=lat), data=df, size=1, colour='red')
ここから一工夫。東京駅から10キロ圏内のコンビニをプロットしてみましょう。
二点間の距離が分かればいいのですが、どうすれば良いのでしょう。
ちゃんと緯度経度から距離を計算するヒュベニの公式がというものがあるのですね…
関数を作るのが面倒であれば下記サイトを参考にしてください。ちゃんとRの関数が載っています(MIT Licenseとのことです)
二地点の緯度・経度からその距離を計算する(日本は山だらけ〜)
東京駅からの距離カラム(dist)を追加します。
address | name | lon | lat | dist |
---|---|---|---|---|
ファミリーマート練馬駅西口店 | 東京都練馬区練馬1丁目15-1 | 139.6525 | 35.73847 | 11923.65 |
セブンイレブン練馬3丁目店 | 東京都練馬区練馬3-1-10 | 139.6504 | 35.73736 | 12020.09 |
ローソンストア100練馬3丁目店 | 東京都練馬区練馬3-1-7 | 139.6504 | 35.73736 | 12020.09 |
10キロ以内のデータを抽出すると
ggmap(map) + geom_point(aes(x=lon, y=lat), data=df[df$dist <=10000,], size=1, colour='red')
ここまでできれば、診療圏調査も簡単です。
クリニックからの距離毎に来院患者数を出したり、患者年齢層で色分けしたり、新患がどこから来ているか調べたり…
看板も効果的に設置できますね。
RでSQLデータベースへの接続1~MySQL編
電子カルテのデータベースは各施設で環境が違うため、今回は接続イメージを理解するためMySQLで練習してみます。
インストールはおまかせで。
デフォルトでconnectorも入るらしいのでそのまま
Port:3306で
rootパスワード設定して
接続テストして、Connection successful
次はRの準備
今回はMySQLなので、RMySQLパッケージを使って
library(RMySQL)
library(dplyr)
con <- dbConnect(MySQL(), host="localhost", port=3306, dbname="world", user="root", password="****")
dbGetQuery(con,"SELECT * FROM country") %>% tail()
dbDisconnect(con) # 終わったらconnectionは切りましょう
簡単ですね~