Lesson3_Data Analysis with R from Udacity_(1/2)

3장에서 배울 내용

  • 한 데이터 세트의 단일 변수 조사 방법
  • 히스토그램과 시각화와 관련 R 명령어
  • 데이터에 접근하는 방법



먼저 해야할 것은?

  • 탐색적 데이터 분석에 앞서, 연구의 목적을 돌이켜보고
  • 구하고자 하는 답에 대한 질문이 무엇인가? 상기
  • 연구에서 가장 중요한 변수를 이해하기 위해서
  • 그 변수들에 대한 요약과 시각화를 만드는 형태를 취할 것이다.



가상 페이스북 유저데이터

  • 이번 3장에서는 가상의 페이스북 유저 데이터를 이용한다.
  • 강의 노트에서 pseudo-facebook.tsv를 다운 받는다.
  • getwd() 명령어로 R에 설정된 현재 홈 디렉토리를 확인한다.
  • setwd("주소") 명령어로 홈 디렉토리를 설정할 수 있다.
  • 주의사항: 주소 경로는 '/' 로 구분한다.
setwd("C:/Users/Mingyu/workspace/3. R/Data Analysis with R_Udacity/data_analysis_with_r_udacity/")
getwd()
## [1] "C:/Users/Mingyu/workspace/3. R/Data Analysis with R_Udacity/data_analysis_with_r_udacity"
  • list.files() 명령어로 홈 디렉토리 내의 파일 목록을 확인한다.
list.files();
##  [1] "assets"                            
##  [2] "data_analysis_with_r_udacity.Rproj"
##  [3] "figure"                            
##  [4] "libraries"                         
##  [5] "problem_solve-lesson3.R"           
##  [6] "pseudo_facebook.tsv"               
##  [7] "Readme.txt"                        
##  [8] "summary_of_lesson3-1.html"         
##  [9] "summary_of_lesson3-1.Rhtml"        
## [10] "summary_of_lesson3.html"           
## [11] "summary_of_lesson3.md"             
## [12] "summary_of_lesson3.pdf"            
## [13] "summary_of_lesson3.Rmd"            
## [14] "summary_of_lesson3_cache"          
## [15] "summary_of_lesson3_files"          
## [16] "summary_of_lesson3_home.html"      
## [17] "summary_of_lesson3_home.Rmd"       
## [18] "test1.html"                        
## [19] "test1.Rhtml"
  • read.csv() 명령어로 pseudo-facebook.tsv를 불러온다.
pf <- read.csv('pseudo_facebook.tsv', sep ='\t')
  • \t 으로 구분하고, 불러온 데이터를 pf 변수에 담는다는 의미이다.



데이터세트 컬럼 확인하기

  • names(pf) 명령어로 pf 변수에 담긴 데이터세트의 컬럼 정보를 확인 할 수 있다.
names(pf)
##  [1] "userid"                "age"                  
##  [3] "dob_day"               "dob_year"             
##  [5] "dob_month"             "gender"               
##  [7] "tenure"                "friend_count"         
##  [9] "friendships_initiated" "likes"                
## [11] "likes_received"        "mobile_likes"         
## [13] "mobile_likes_received" "www_likes"            
## [15] "www_likes_received"



ggplot2을 이용한 히스토그램 작성

  • install.packages("ggplot2") 명령어로 ggplot2 패키지를 설치한다.
  • 설치가 완료되면 library(ggplot2) 명령어로 ggplot2 패키지를 로드한다.
  • 위에서 가상의 페이스북 데이터세트를 담고 있는 pf를 통해 히스토그램을 만들어보자.
  • qplot() 명령어를 사용한다
  • qplot()은 Quick plot의 약자로 ggplot2 패키지의 가장 기본적인 도표 작성 기능이다.
library(ggplot2)
qplot(x = dob_day, data = pf)
## stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.


  • qplot()의 인자 중 x는 dob_day 변수의 데이터를 가져오고, data는 pf 데이터 세트를 가져온다는 의미이다.



정확한 히스토그램 작성

  • 일수는 1~31일인데, 히스토그램은 10단위로 뭉뚱그려 표시되므로 직관적이지 못하고 에러메시지 발생.
  • 에러메시지: stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
  • x 축의 단위를 수정해보자
qplot(x = dob_day, data = pf) + scale_x_discrete(breaks = 1:31)





(번외)히스토그램 꾸미기: ggthemes

  • ggthemes() 패키지를 사용하여 ggplot 패키지로 생성하는 도표들을 간단하게 꾸밀 수 있다.
## CRAN에서 다운로드
install.packages('ggthemes', dependencies = TRUE)
## GitHub에서 다운로드
library("devtools")
install_github("jrnold/ggthemes")
library(ggthemes)
qplot(x = dob_day, data = pf) + geom_histogram() + theme_wsj() +ggtitle("Day of Birth of Facebook users") + scale_x_discrete(breaks = 1:31)






페이스북 직원 Moira의 연구

  • 최근에 페이스북에서 청중들에 대한 사람들의 인식이 현실과 부합하는지 연구하고 있다.
  • 사람들이 공유한 콘텐츠를 실제 보는 사람은 누구인가?
  • 최근에 포스팅을 한 사람들을 대상으로 얼마나 많은 사람들이 이 포스트를 본다고 생각하나?라고 질문을 했다.
  • 그리고 실제로 단 몇초간이라도 그들의 포스팅을 본 사람들의 숫자를 세어보았다
  • 그 결과 사람들이 인식하는 청중들의 크기와 실 청중들의 크기는 달랐다.
  • 사람들의 예상은 실제 청중들의 크기의 1/4이다.



Faceting(패싯기법)

  • 앞서 만들었던 가상의 페이스북 데이터세트 pf에서 추출한 유저들의 생일 히스토그램을 월별로 분류한다.
  • facet_wrap() 명령어를 사용한다.
qplot(x = dob_day, data = pf) + scale_x_discrete(breaks = 1:31) + facet_wrap(~dob_month, ncol=3)

facet_wrap(가로축 데이터)
facet_grid(가로축데이터~새로축 데이터)



Axes(축)의 조정

  • 가상의 페이스북 데이터의 아웃라이어 데이터를 제외하고 의미있는 데이터만 분석하고자 한다.
  • 지정한 변수의 값을 제한하기 위하여 qplot()명령어에 xlim인자를 추가하거나
  • scale_x_continuous(limits) 명령어를 연결하여 사용한다.
qplot(x = friend_count, data = pf, xlim = c(0, 1000))
## stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.


qplot(x= friend_count, data = pf) + scale_x_continuous(limits=c(0,1000))
## stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.



binwidth (빈 너비, 막대 저장 넓이)

  • 조금 더 정확하게 히스토그램을 분석하기 위해서 x축 값의 단위를 작게 지정한다.
  • 또, binwidth(막대 저장 넓이)를 조정하여 더 작은 단위로 데이터를 분석할 수 있다.
qplot(x = friend_count, data=pf, binwidth = 25) + scale_x_continuous(limits = c(0, 1000), breaks = seq(0, 1000, 50))


  • binwidth를 더 쉽게 이해하기 위해 binwidth 값을 100으로 설정한 도표를 보자.
qplot(x = friend_count, data=pf, binwidth = 100) + scale_x_continuous(limits = c(0, 1000), breaks = seq(0, 1000, 50))

  • 즉, 히스토그램의 막대가 포함하는 값들이 많아져 데이터가 뭉뚱그려 보여지게 된다.



성별로 구분하기

  • 가상의 페이스북 유저 데이터의 친구 숫자 히스토그램을 성별로 나누어 보자.
qplot(x = friend_count, data=pf, binwidth = 25) + scale_x_continuous(limits = c(0, 1000), breaks = seq(0, 1000, 50)) + facet_wrap(~gender)





NA 제외하기: subset() 사용

  • 성별 라벨에 체크를 하지 않은 유저들의 데이터는 NA로 저장되어있어 원치 않은 히스토그램이 생겨났다.
  • NA를 제외한 결과를 볼 수 있게 명령문을 조정하자
# subset 사용
subset(pf, !is.na(gender))
  • subset(데이터세트, 조건식): 데이터세트에서 조건식을 충족하는 값만 출력
  • 논리 부정 연산자 ! 사용하여, gender 컬럼에 na가 포함 되었으면 true를 반환하는 조건식을 부정하므로
  • pf 데이터에서 gender 컬럼에 na가 포함 안된 값들을 data를 가지게끔 데이터세트를 구분한다는 뜻
qplot(x = friend_count, data=subset(pf, !is.na(gender)), binwidth = 15) + scale_x_continuous(limits = c(0, 1000), breaks = seq(0, 1000, 50)) + facet_wrap(~gender)




NA 제외하기: na.omit() 사용

  • 앞서 살펴본 subset() 이외에도 na.omit() 명령문을 사용할 수 있다.
  • 모든 observations (데이터세트의 값들) 중에 NA를 가지는 값들을 제외하고 보여준다.
qplot(x = friend_count, data=na.omit(pf), binwidth = 15) + scale_x_continuous(limits = c(0, 1000), breaks = seq(0, 1000, 50)) + facet_wrap(~gender)

  • 주의사항: 무조건 NA값을 제외하므로 어떤 변수를 분석하냐에 따라 데이터 분석에 오류가 생길 수 있다.


+ Recent posts