R言語による電子カルテデータの二次利用

~R言語初心者がデータ処理を楽しめるように基本的内容中心のサイトです~

Rで画像処理~magick package

最近、ホームページもRmarkdownで書くようになりました。凝ったものは必要ないし、修正するのも楽だし、Rstudioで全て済ませられるので満足してます。ただホームページに貼り付ける画像を編集するのに、他の画像ソフトを立ち上げるのはやや面倒だなとは感じていました。でも、もうほかのソフトは必要ないかもしれません、magick packageがあれば…

インストール

magickは、ImageMagick STLというものをラップしているみたいです。
まずはインストールしてみましょう。

install.packages("magick")

画像の入出力

パッケージを読み込んでから、画像を取り込みます。
先日頂いた、えび味噌ラーメン画像です。

library(magick)
ramen <- image_read('img/ebi_miso.jpg')

Rstudioのviewerに出力するには、ramenとそのまま打ち込むだけです。


f:id:r_beginner:20160911123202j:plain
f:id:r_beginner:20160911125853j:plain
コンソールには画像の情報も一緒に出力されます。

画像の情報だけ欲しい場合は、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)

f:id:r_beginner:20160911135847j:plain
画像のフィルター、効果は、image_blur,image_noiseで。

image_blur(ramen, 10, 5)
image_noise(ramen) 

f:id:r_beginner:20160911140655j:plain

画像のテキスト注釈

上の写真のようなテキストを付けるのは、image_annotateを使います。

ramen %>% 
  image_annotate(.,'text!!',size=70,gravity='northeast',color='green') 

f:id:r_beginner:20160911141542j:plain

画像の結合

ラーメン画像を3枚用意します(ramen1,ramen2,ramen3)。
3つの画像をcombineしてから、image_appendするのですが、画像の大きさが、まちまちかもしれないので、image_scaleで高さをそろえてからappendしてください。

img <- c(ramen1,ramen2,ramen3)
image_append(image_scale(img, "x200")) 

f:id:r_beginner:20160911143743j:plain

レイヤー

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)

f:id:r_beginner:20160911144328j:plain

アニメーション

先ほどのラーメン画像3枚でパラパラアニメです。image_animateを使用します。

img <- c(ramen1,ramen2,ramen3)
image_animate(image_scale(img, "200x200"), fps = 1, dispose = "previous") 

f:id:r_beginner:20160911145157g:plain

試してない機能もまだまだあります。
ラスター画像に変換し、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) 

f:id:r_beginner:20160824191848j:plain

get_mapの引数maptypeはいろいろ選択できます。
f:id:r_beginner:20160824194217j:plain

詳しくは、ここを参照。
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')

f:id:r_beginner:20160824204755j:plain

ここから一工夫。東京駅から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')

f:id:r_beginner:20160824210559j:plain

ここまでできれば、診療圏調査も簡単です。
クリニックからの距離毎に来院患者数を出したり、患者年齢層で色分けしたり、新患がどこから来ているか調べたり…
看板も効果的に設置できますね。

RでSQLデータベースへの接続1~MySQL編

電子カルテのデータベースは各施設で環境が違うため、今回は接続イメージを理解するためMySQLで練習してみます。

MySQLの準備
まずMySQLをダウンロード

MySQL

インストールはおまかせで。

f:id:r_beginner:20160207115540j:plain

デフォルトでconnectorも入るらしいのでそのまま

f:id:r_beginner:20160207115728j:plain

Port:3306で

f:id:r_beginner:20160207120246j:plain

rootパスワード設定して

f:id:r_beginner:20160207120019j:plain

接続テストして、Connection successful

f:id:r_beginner:20160207120114j:plain

次は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は切りましょう

簡単ですね~