앞서 진행했던
2016년도 진료내역을 통한 상위 질병 확인해보기
처음부터 다시 진행했다고 봐도 무방하다.
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("가입자일련번호","주상병코드","부상병코드")]) |
이번에 진행했을 때는 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") |
이후로는 다음과 같은 코드를 통해 결과물을 생산할 수 있다.
진료내역정보 메뉴얼을 통해 성별코드가 의미하는 값을 확인했다.
성별코드가 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번 카운팅되어 누적된 값임을 인지하고 주의해야한다.
'R programming' 카테고리의 다른 글
R에서 ggmap 불러오기(Google API 등록과정) (6) | 2019.04.05 |
---|---|
로지스틱 회귀분석-환자들 생존예측 (예제 따라하기) (0) | 2019.04.04 |
2016년도 진료내역을 통한 상위 질병 확인해보기 (0) | 2019.03.06 |
학생 시험성적 t-test 및 아노바 (0) | 2019.02.14 |
공유자전거 데이터 분석(2) (0) | 2018.12.19 |