상세 컨텐츠

본문 제목

[DATA&R]버블플롯을 활용한 마약 의존도 및 위험도 시각화

DATA & WORLD

by 대학원생D군 2023. 3. 7. 06:05

본문

반응형

안녕하세요,

마약 관련 뉴스로 시끌시끌한 요즘입니다. 대마초로 세상이 시끄러워지면 항상 인터넷 커뮤니티에 등장하는 그래프가 있습니다. 위키피디아의 썸네일을 장식하는 약물별 약물의존 수준과 독성 수준 간의 관계를 보여주는 그래프입니다. 

 

약물의존증 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 약물의존증(藥物中毒, addiction substance dependency)은 사용된 약물에 심리적 또는 신체적 의존성을 보이는 증상을 말한다.[1] 정신질환 진단 및 통계 편람은 의존성

ko.wikipedia.org

해당 그림의 출처와 논문의 내용이 궁금해서 찾아봤더니 the Lancet라는 저널에 실린 논문입니다. 구글 스칼라 기준 인용 횟수가 1654회나 되는 논문입니다.

 

Nutt, D., King, L. A., Saulsbury, W., & Blakemore, C. (2007). Development of a rational scale to assess the harm of drugs of potential misuse. the Lancet369(9566), 1047-1053.

 

Development of a rational scale to assess the harm of drugs of potential misuse - PubMed

Drug misuse and abuse are major health problems. Harmful drugs are regulated according to classification systems that purport to relate to the harms and risks of each drug. However, the methodology and processes underlying classification systems are genera

pubmed.ncbi.nlm.nih.gov

감사하게도 논문에 위키피디아에 있는 약물별 의존도 및 독성 그림을 시각화하는데 필요한 데이터가 제시되어 있어서 활용해서 버블차트를 그려보았습니다. 우선 데이터셋을 만들어봅니다. 이름이 긴 약물들이 있어서 알코올(술)과 담배를 제외한 약물들은 3글자로 줄였습니다. 그리고 의존도, 신체적 위험성, 사회적 위험성 값은 소수점 한자리까지만 사용했습니다.

name <- c('Her','Coc','Bar','Str','Alc','Ket','Ben','Amp','Tob','Bup','Can','Sol','4-M','LSD','Met','Ana','GHB','Ecs','Alk','Kha')
phy <- c(2.8,2.3,2.2,1.9,1.4,2.0,1.6,1.8,1.2,1.6,1.0,1.3,1.4,1.1,1.3,1.5,0.9,1.1,0.9,0.5)
dep<-c(3.0,2.4,2.0,2.1,1.9,1.5,1.8,1.7,2.2,1.6,1.5,1.0,1.3,1.2,1.3,0.9,1.2,1.1,0.9,1.0)
soc<-c(2.5,2.2,2.0,1.9,2.2,1.7,1.7,1.5,1.4,1.5,1.5,1.5,1.1,1.3,1.0,1.1,1.3,1.1,1.0,0.9)

data<-data.frame(name,phy,dep,soc)
head(data)

이번 시각화에도 역시 R의 ggplot2 패키지를 사용하였고 우선 최소한의 코드로 버블차트를 시각화해보았습니다. x축은 phy(신체적 위험도), y축은 dep(의존도), 버블의 크기는 soc(사회적 위험도)로 하여 시각화한 결과입니다. 역시 옵션이 없어서 많이 아쉬운 그림입니다.

library(ggplot2)
ggplot(data,aes(x=phy,y=dep,size=soc)) +
  geom_point(alpha=0.5)

 

다음으로 여러 옵션을 추가해보았습니다. 버블의 크기와 색도 지정하고 (geom_point), x축과 y축의 이름도 넣었습니다(xlab, ylab), 그리고 한눈에 알아보기 쉽게 버블에 약물의 이름도 붙여보았습니다(geom_text). 사회적 위험도를 나타내는 버블 크기의 범위를 조금 더 늘리고 social harm이라는 이름도 추가하였습니다(scale_size).

ggplot(data,aes(x=phy,y=dep, size=soc, label=name)) +
  geom_point(alpha=0.5, aes(size=soc,color=soc)) + 
  xlab("Physical harm") +
  ylab("Dependence") +
  geom_text(size = 4, colour = "black", vjust = -1)  +
  scale_size(range=c(1,10), name="Social harm")

그럼에도 여전히 아쉬운 느낌입니다. 색이 진할수록 사회적 위험도가 높게 만드는 것이 더욱 직관적일 것 같습니다. 

이를 위해서 우선 노란색부터 빨간색까지의 팔레트를 저장한 후 그 중 20개를 my_colors에 저장하였습니다.

fun_color_range <- colorRampPalette(c("yellow", "red")) 
my_colors <- fun_color_range(20)  
my_colors

그리고 위의 데이터셋은 scale_color_gradientn()를 통하여 버블의 색을 지정하는 데 사용되었습니다. 본 예제에서는 버블의 크기와 버블의 색을 통하여 사회적 위험도를 나타냈으나 버블 차트의 경우 하나의 차트에 x축, y축, 버블의 크기, 버블의 색, 즉 4가지 정보를 담을 수 있으니 활용하실 때 참고하시면 됩니다.

ggplot(data,aes(x=phy,y=dep, size=soc, label=name)) +
  geom_point(alpha=0.5, aes(size=soc,color=soc)) +
  theme_set(theme_bw()+theme(legend.position="bottom")) +
  xlab("Physical harm") +
  ylab("Dependence") +
  geom_text(size = 4, colour = "black", vjust = -1)  +
  scale_size(range=c(1,10), name="Social harm") +
  scale_color_gradientn(colours=my_colors, name="Social harm")

앞선 그래프보다 훨씬 보기 좋은 그래프가 탄생했습니다. theme_set을 통해서 그래프의 디자인도 조금 수정했습니다.

이상으로 R을 사용해서 버블 플롯을 시각화하는 방법을 알아보았습니다.

궁금하신 점은 댓글로 남겨주세요:)

감사합니다!

 

☆ 제 코드는 정답이 아니며 틀린 부분이 있을 수 있으니 주의하여 활용하시기 바랍니다.

반응형

관련글 더보기

댓글 영역