ML,DL,Bigdata/Data Mining

2. Data Visualization

주죵 2020. 7. 19. 18:47
728x90
반응형

오늘은 R을 이용한 데이터시각화 예제를 몇가지 다뤄볼 것이다.

 

데이터 분석을 크게 3가지로 나타내면 Data processing(데이터처리), Modeling(모델링), Visualization(시각화)로 나타낼 수 있다. 

 

기본 통계적 방법을 이용한 시각화(회귀분석 그래프, 산점도, 히스토그램 등)의 예제는 제외하고 오늘은 titanic 데이터를 이용해 시각화 예제를 다뤄보자.

1) Data, package load

#데이터 & 패키지 불러오기
library(data.table)
library(ggplot2)
titanic = read.csv('titanic.csv')

https://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.html

 

Introduction to data.table

a) What is data.table? data.table is an R package that provides an enhanced version of data.frames, which are the standard data structure for storing data in base R. In the Data section above, we already created a data.table using fread(). We can also crea

cran.r-project.org

https://cran.r-project.org/web/packages/ggplot2/ggplot2.pdf

각 데이터에 대한 Doument에 대한 링크이니 참조

data.table 패키지는 db형태의 자료구조를 다루는 R 패키지중 하나이다. 이전까지 R 데이터 처리를 할때 보통 데이터프레임 data.frame을 사용하였는데, data.table은 data.frame을 상속한 것으로 더욱 빠른 성능과 간단한 코딩이 가능하다.

ggplot2 패키지는 데이터프레임 형태의 데이터를 다양한 시각화 그래프로 나타낼 수 있게 해주는 시각화패키지이다.  요소를 하나씩 덧씌우는 방식으로 그래프를 그려나가는 방식이다.

 

2) Data processing

#데이터테이블 형태로 변환
>titanic.dt = as.data.table(titanic)
> head(titanic.dt)
   X pclass survived                            name    sex     age sibsp parch ticket     fare   cabin    embarked boat body                       home.dest
1: 1    1st        1   Allen, Miss. Elisabeth Walton female 29.0000     0     0  24160 211.3375      B5 Southampton    2   NA                    St Louis, MO
2: 2    1st        1  Allison, Master. Hudson Trevor   male  0.9167     1     2 113781 151.5500 C22 C26 Southampton   11   NA Montreal, PQ / Chesterville, ON
3: 3    1st        0    Allison, Miss. Helen Loraine female  2.0000     1     2 113781 151.5500 C22 C26 Southampton        NA Montreal, PQ / Chesterville, ON
4: 4    1st        0 Allison, Mr. Hudson Joshua Crei   male 30.0000     1     2 113781 151.5500 C22 C26 Southampton       135 Montreal, PQ / Chesterville, ON
5: 5    1st        0 Allison, Mrs. Hudson J C (Bessi female 25.0000     1     2 113781 151.5500 C22 C26 Southampton        NA Montreal, PQ / Chesterville, ON
6: 6    1st        1             Anderson, Mr. Harry   male 48.0000     0     0  19952  26.5500     E12 Southampton    3   NA                    New York, NY

 데이터의 구성을 보면 x(승객고유번호), 등급(pclass), 생존여부(survived), 이름, 나이, 성별 등으로 구성되어있다.

>titanic.dt$survived = as.factor(titanic.dt$isminor)

생존여부가 0,1 상태로 인코딩되어있다. 앞으로 우리는 factor별 생존률을 시각화해볼것이기 때문에 survived의 정보를 factor로 인코딩해준다.

#어린이, 어른 분류 (15세 미만은 어린이)
>titanic.dt[,isminor:='adult']
>titanic.dt[age<15,isminor:='child']
>titanic.dt$isminor = as.factor(titanic.dt$isminor)
>head(titanic.dt)
   X pclass survived                            name    sex     age sibsp parch ticket     fare   cabin    embarked boat body                       home.dest
1: 1    1st        1   Allen, Miss. Elisabeth Walton female 29.0000     0     0  24160 211.3375      B5 Southampton    2   NA                    St Louis, MO
2: 2    1st        1  Allison, Master. Hudson Trevor   male  0.9167     1     2 113781 151.5500 C22 C26 Southampton   11   NA Montreal, PQ / Chesterville, ON
3: 3    1st        0    Allison, Miss. Helen Loraine female  2.0000     1     2 113781 151.5500 C22 C26 Southampton        NA Montreal, PQ / Chesterville, ON
4: 4    1st        0 Allison, Mr. Hudson Joshua Crei   male 30.0000     1     2 113781 151.5500 C22 C26 Southampton       135 Montreal, PQ / Chesterville, ON
5: 5    1st        0 Allison, Mrs. Hudson J C (Bessi female 25.0000     1     2 113781 151.5500 C22 C26 Southampton        NA Montreal, PQ / Chesterville, ON
6: 6    1st        1             Anderson, Mr. Harry   male 48.0000     0     0  19952  26.5500     E12 Southampton    3   NA                    New York, NY
   isminor
1:   adult
2:   child
3:   child
4:   adult
5:   adult
6:   adult

isminor라는 column을 새로 추가하여 15세미만의 승객은 'child', 나머지는 'adult'라는 factor로 표현해준다.

 

#등급별 생존률
>titanic.dt[,length(which(survived==1))/nrow(.SD),by=pclass]
   pclass        V1
1:    1st 0.6191950
2:    2nd 0.4296029
3:    3rd 0.2552891

#성별에 따른 생존률
>titanic.dt[,length(which(survived==1)/nrow(.SD),by=sex]
      sex        V1
1: female 0.7274678
2:   male 0.1909846

#등급/성별에 따른 생존률
>survival_pclass_sex = titanic.dt[,list(cntsurv=length(which(survived==1)),cntdie=length(which(survived==0))),by=list(pclass,sex)][,list(psurvived=cntsurv/(cntsurv+cntdie)),by=list(pclass,sex)]
>survival_pclass_sex
   pclass    sex psurvived
1:    1st female 0.9652778
2:    1st   male 0.3407821
3:    2nd   male 0.1461988
4:    2nd female 0.8867925
5:    3rd   male 0.1521298
6:    3rd female 0.4907407

살아남은(survived==1)사람들의 수를 등급, 나이의 개수기반의 Subset Dataframe(SD) 나눠 생존률을 구해보았다.

또 등급과 성별 분류에 따른 생존자, 사망자수를 이용해 생존률을 계산해보았다.

 

3)Visualization

위에서 구한 생존률을 ggplot을 이용해 그래프(히트맵)형태로 나타내보자. 

> ggplot(survived_pclass_sex,aes(pclass,sex))+geom_tile(aes(fill=psurvived))+scale_fill_gradient2('survival rate')

ggplot에서 aes(aesthetic-미학요소)정의로 데이터 변수 맵핑,+geom_tile을 이용해서 히트맵 형성했다.

 

>survived_pclass_sex_isminor = titanic.dt[,list(cntsurv=length(which(survived==1)),cntdie=length(which(survived==0))),
                                         by=list(pclass,sex,isminor)][,list(psurvived=cntsurv/(cntsurv+cntdie)),by=list(pclass,sex,isminor)]
>survived_pclass_sex_isminor$sex_age = apply(survived_pclass_sex_isminor[,list(sex,isminor)],1,paste,collapse='_')
>ggplot(survived_pclass_sex_isminor,aes(pclass,sex_age))+
  geom_tile(aes(fill=psurvived))+scale_fill_gradient2('survivalrate',low=muted('white'),high=muted('blue'))

 위에서 계산했던 방법과 같은 방법으로 isminor(15세미만 어린이인지 아닌지) 요소를 추가하여 등급, 성별, 나이에 따른 생존률을 계산하였다. apply를 이용해 성별에 따른 어린이, 어른을 네가지로 구별하는 록 하였다. (ex)여자어린이,여자어른, 남자어린이, 남자어른.) 요소가 3개이기 때문에 2차원인 히트맵으로 표현하기 위해서 해준것!

히트맵으로 표현한 결과는 위와 같다!

 

 

Reference : Data mining class material, Hanyang univ

728x90