본문 바로가기

R programming

2016년도 진료내역을 통한 상위 질병 확인해보기(2)

반응형

앞서 진행했던

2016년도 진료내역을 통한 상위 질병 확인해보기

에 이어 더 코드를 수정해서 진행해봤다. 요새 자소서 쓰느라 R공부할 틈이 없다(변명)


처음부터 다시 진행했다고 봐도 무방하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
nhis<-read.csv("nhis.csv")
 
head(nhis)
 
library(ggplot2)
library(dplyr)
total <- nhis %>%
  select(가입자일련번호, 성별코드,시도코드,주상병코드,부상병코드) 
 
#데이터전처리과정
install.packages("base")
library(base)
 
  #가입자일련번호, 주상병코드, 부상병코드 3조건이 모두 동일한 중복값을 제거
total_new<-unique(total[, c("가입자일련번호","주상병코드","부상병코드")])

cs


이번에 진행했을 때는 total이라는 변수에 성별코드를 추가하여 저장했다.


성별에 따른 상위질병종류의 빈도나 차이가 있는지 확인하고싶었다.


#를 통해 설명했듯이 unique함수는 base 패키지에 포함되어 있는 함수로서,

중복된 값을 제거하는데 쓰인다.


근데 여기서 중요한 점은 내 노트북이 unique함수를 쓰니 메모리 부족경고가 뜬다는 것이였다.


그래서 뒤에 이후로 나오는 값들은 중복값이 제거 안된 데이터를 기반으로 진행되었다.

따라서 15번째 코드는 없다 생각하고 봐주길 바란다.

1
2
3
4
5
6
7
8
9
#남성의 주된 질병코드 알아보기
men<-total_new %>%
  filter(성별코드==1) %>%
  group_by(주상병코드) %>%
  summarise(total=n()) %>%
  arrange(desc(total)) %>%
  head(20)
 
ggplot(data=men, aes(x=주상병코드, y=total))+geom_bar(stat="identity")+ggtitle("top 20 disease of men")

cs


이후로는 다음과 같은 코드를 통해 결과물을 생산할 수 있다.

진료내역정보 메뉴얼을 통해 성별코드가 의미하는 값을 확인했다.

성별코드가 1이면 남성, 2이면 여성을 뜻한다.


2~7번의 코드를 설명하자면 다음과 같다.

total_new 데이터에서 성별코드가 1(남성)이고, 주상별코드를 기준으로 상위 빈도 20개의 값을 추출해냄.


그렇다면

데이터 구조는 대략이렇게 된다.

A tibble: 6 x 2
  주상병코드  total
  <fct>       <int>
1 J209       521883
2 I109       290610
3 F_         119298
4 E119        98800
5 J0390       97390
6 J304        90281



2~7번의 줄에 따라 저장된 men을 ggplot을 이용해 9번처럼 입력하면 다음과 같은 그림을 확인할 수 있다.



남성의 경우 J209, I109순으로 진료를 많이 받은 것을 확인할 수 있다.



1
2
3
4
5
6
7
8
9
#여성의 주된 질병코드 알아보기
women<-total %>%
  filter(성별코드==2) %>%
  group_by(주상병코드) %>%
  summarise(total=n()) %>%
  arrange(desc(total)) %>%
  head(20)
 
ggplot(data=women, aes(x=주상병코드, y=total))+geom_bar(stat="identity")+ggtitle("top 20 disease of women")
cs



여성의 경우도 성별코드만 바꾸고 다른 것은 변한 것이 없다.


여성의 경우에도 데이터 구조는 이런 식이다.

# A tibble: 6 x 2
  주상병코드  total
  <fct>       <int>
1 J209       620097
2 I109       369530
3 N_         198538
4 F_         191791
5 J0390      120548
6 M170       120245



9번을 그림으로 나타내면


여성도 남성과 마찬가지로 J209가 가장많은 빈도수를 기록하고 있으며 I109가 그 뒤를 따른다.


나는 여기서 남성과 여성의 빈도수를 더 쉽게 비교하고 싶었다.

그래서 다음과 같은 코드를 작성할 수 있었다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#두개의 ggplot 합쳐서 비교하기 편한 시각화 만들기
 
people<-left_join(men, women, by="주상병코드")
 
head(people)
str(people)
colnames(people)<-c("주상병코드","남성","여성")
 
 
library(reshape2)
 
people_new<-melt(people, id(c("주상병코드")))
 
head(people_new)
cs


 left_join이라는 가로 합치기 함수를 이용하여

men과 women이라는 두 변수를 people 하나로 저장했다.


저렇게 저장된 상태의 데이터구조를 확인하면

 주상병코드   남성   여성
  <fct>       <int>  <int>
1 J209       521883 620097
2 I109       290610 369530
3 F_         119298 191791
4 E119        98800  90688
5 J0390       97390 120548
6 J304        90281  98383


이런 식이 완성된다.

하지만 이런 식의 데이터로는 그림을 이쁘게 그릴 수 없다.


그래서 reshape2패키지를 로드하고

melt라는 함수를 사용하여 주상병코드를 id로 지정하고 12번 째 코드를 입력하고

14번 째 코드에 나와있는대로 데이터를 확인하면

> head(people_new)
  주상병코드 variable  value
 1 J209 남성 521883

 2 I109 남성 290610

 3 F_ 남성 119298

 4 E119 남성 98800

 5 J0390 남성 97390

 6 J304 남성 90281

다음과 같이 성별이 새로운 칼럼으로 탄생했다.


melt에 관한 함수는 다른 블로그에 설명히 훌륭하게 되어있는 것을 찾아볼 수 있다.


이제 다음과 같이 막대그래프를 그리는 명령어를 통해 이쁜 막대그래프를 만들 수 있다.

1
2
ggplot(data=people_new, aes(x=주상병코드, y=value, fill=variable))+
  geom_bar(stat="identity", position = "dodge")
cs



그림과 같이 남성은 붉은색으로, 여성은 청록색으로 상위 주상병코드의 빈도수를 동시에 표현할 수 있다.

위와 같은 표현을 통해 더 쉽게 성별에 따른 차이를 비교할 수 있다. 시각화 굉장히 재밌다.


위의 결과값은 단순 병원방문횟수에 대한 누적데이터다.

A라는 사람이 J209(기관지염)으로 인해 병원에 10번 방문했다면

A라는 1번의 카운팅이 아니라 10번 카운팅되어 누적된 값임을 인지하고 주의해야한다.


반응형