読者です 読者をやめる 読者になる 読者になる

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

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

電子カルテデータの可視化~患者マスター

電子カルテ R言語

データベースには複数のテーブルがあり、中心となるのが患者マスターかと思います。カラムにはID、名前、年齢等があります。その他にも読み仮名カラムや、旧姓カラム等、メーカーによって差はあるかと思われますが、代表的なカラムによるテーブルは以下の様な感じではないでしょうか。

id name age gender birth
10001 山田花子 85 female 1930-01-30
10002 北海太郎 45 male 1970-07-01

人口ピラミッドの作成に使える情報は年齢、性別かと思いますので、今回はこのテーブルから作成してみます。

Rには、pyramid packageがありますが、いろいろggplot2でグラフを書いていく都合上、人口ピラミッドをggplot2で作っているサイト
ggplot2 で Google アナリティクスデータの人口ピラミッド - 廿TT
を参考にさせていただきました。

以下のデータは、estatのものです。
http://www.e-stat.go.jp/SG1/estat/List.do?lid=000001143002

ggplot2版
library(dplyr)
male <- c(266,
          272,
          285,
          307,
          321,
          332,
          370,
          419,
          495,
          441,
          404,
          375,
          411,
          477,
          356,
          282,
          204,
          109,
          35,
          7,
          1)
female <- c(252,
            259,
            272,
            292,
            302,
            315,
            358,
            408,
            483,
            434,
            403,
            379,
            426,
            511,
            410,
            354,
            302,
            210,
            106,
            33,
            6)
category <- c("0 ~  5歳",
              "5 ~  9",
              "10 ~ 14",
              "15 ~ 19",
              "20 ~ 24",
              "25 ~ 29",
              "30 ~ 34",
              "35 ~ 39",
              "40 ~ 44",
              "45 ~ 49",
              "50 ~ 54",
              "55 ~ 59",
              "60 ~ 64",
              "65 ~ 69",
              "70 ~ 74",
              "75 ~ 79",
              "80 ~ 84",
              "85 ~ 89",
              "90 ~ 94",
              "95 ~ 99",
              "100歳以上")
population <- data.frame(category=category,male=male,female=female)
population$category <- factor(population$category,level=c("0 ~  5歳",
                                                          "5 ~  9",
                                                          "10 ~ 14",
                                                          "15 ~ 19",
                                                          "20 ~ 24",
                                                          "25 ~ 29",
                                                          "30 ~ 34",
                                                          "35 ~ 39",
                                                          "40 ~ 44",
                                                          "45 ~ 49",
                                                          "50 ~ 54",
                                                          "55 ~ 59",
                                                          "60 ~ 64",
                                                          "65 ~ 69",
                                                          "70 ~ 74",
                                                          "75 ~ 79",
                                                          "80 ~ 84",
                                                          "85 ~ 89",
                                                          "90 ~ 94",
                                                          "95 ~ 99",
                                                          "100歳以上")) 

library(ggplot2)
theme_set(theme_bw(20))
g1 <- ggplot(population,aes(category,female)) +
  geom_bar(stat = "identity",fill="tomato") +
  scale_y_reverse(limits = c(max(population$female),0))+
  coord_flip()+
  xlab("") +
  ylab("female")
g2 <- ggplot(population,aes(category,male)) +
  geom_bar(stat = "identity",fill="royalblue") +
  coord_flip()+
  xlab("") +
  ylab("male")+
  theme(axis.ticks.y = element_blank(),axis.text.y=element_blank())
library(grid)
grid.newpage()
pushViewport(viewport(layout = grid.layout(1, 2)))
print(g1,  vp=viewport(layout.pos.row = 1, layout.pos.col = 1))
print(g2,  vp=viewport(layout.pos.row = 1, layout.pos.col = 2))

出来上がりは、このようになります。
f:id:r_beginner:20160211074428j:plain

Plotlyも、よさそう。

plot_ly版
library(plotly)
library(reshape2)
temp <- melt(population)
colnames(temp)[2:3] <- c("gender","population")
temp %>% filter(gender=="female") %>% mutate(pop=-population) ->temp_female
temp %>% filter(gender=="male")   %>% mutate(pop= population) ->temp_male
temp <- rbind(temp_male,temp_female)

plot_ly(temp, x = pop, y = category, color = gender, type = 'bar', orientation = 'h', 
         colors = c('navy','red')) %>% 
  layout( bargap = 0.3, barmode = 'overlay', 
          xaxis = list(title = "Population",
                       tickmode = 'array',
                       tickvals = c(-1000, -500, 0, 500, 1000)),          
          yaxis = list(title = ""))

f:id:r_beginner:20160211074444j:plain

実際のインタラクティブなグラフは、ここ
RPubs - Population_pyramid by Plotly
にあります。

参考