반응형

[2] 탐색적 데이터 분석(EDA : Exploratory Data Analysis)

  탐색적 분석은 데이터 분석의 초기 단계에서 데이터를 위해 실행되는 단계이다.

 

이 책은 데이터 사이언스 입문자를 위한 책이지만, R의 기초에 대해 자세하게 설명하고 있지는 않다. 조금씩 공부하며 예제를 통해 학습해야 할 것 같다.

 

연습문제 2.2.2) EDA

 

연습문제 사용 데이터 : 아래와 같이 2012년 5월 뉴욕타임즈 홈페이지의 접속하는 사람들의 나이, 성별, 광고 노출횟수, 클릭횟수, 로그인 횟수 5개의 변수로 구성되어 있다.

 

 

데이터 다운로드 : https://github.com/oreillymedia/doing_data_science 

 

Build software better, together

GitHub is where people build software. More than 36 million people use GitHub to discover, fork, and contribute to over 100 million projects.

github.com

위의 데이터를 R 데이터 폴더에 다운받아 바로 read.csv()함수를 사용할 수도 있지만, 다음과 같이 url을 통해 바로 다운받아 변수에 저장할 수도 있다.

 

data1 <- read.csv(url("http://stat.columbia.edu/~rachel/datasets/nyt1.csv"))

* nyt1은 5월 1일의 데이터를, nyt2는 5월 2일의 데이터를 의미한다. 

 

[ 문제 1 ]

 

사용자를 "<18", "18-24", "25-34", "35-44", "45-54", "55-64", "65+"로 범주화한 새로운 변수 age_group을 생성하라.

=> 데이터의 범주화는 다음과 같은 세가지 방법으로 가능하다. 

 

  1) cut() : vector를 breaks를 기준으로 범주화하여 쪼갠다. 아래와 같이 transform() 함수와 결합하여 기존 데이터에 벡터를 추가한다.

    data2 = transform(data1, age_group = cut(Age, breaks = c(0, 18, 25, 35, 45, 55, 65, 150),

                                                                   labels = c("<18", "18-24", "25-34", "35-44", "45-54", "55-64", "65+"),

                                                                   include.lowest = TRUE, right = FALSE))

  

  2) ifelse() : ifelse(조건, TRUE일때 실행, FALSE일 때 실행)의 조건문을 사용하여 age_group vector를 추가한다.

data3 = transform(data1, age_group = ifelse(Age < 18, "<18", 

                                                   ifelse(Age<25, "18-24", 

                                                   ifelse(Age<35, "25-34", 

                                                   ifelse(Age<45, "35-44", 

                                                   ifelse(Age<55, "45-54", 

                                                   ifelse(Age<65, "55-64", "65+")))))))

 

  3) within() : 주어진 데이터를 수정할 수 있는 함수이다. transform과 같은 역할을 하는 것 같다.

data4 = within(data1, {age_group = character(0)
+ age_group[Age < 18] = "<18"
+ age_group[Age >= 18 & Age < 25] = "18-24"
+ age_group[Age >= 25 & Age < 35] = "25-34"
+ age_group[Age >= 35 & Age < 45] = "35-44"
+ age_group[Age >= 45 & Age < 55] = "45-54"
+ age_group[Age >= 55 & Age < 65] = "55-64"
+ age_group[Age >= 65] = "65+"
+ age_group = factor(age_group, level = c("<18", "18-24", "25-34", "35-44", "45-54", "55-64", "65+"))})

 

 

 

 

 

 

 

[ 문제 2 ]

 

어느 특정한 날짜에 대해,( 여기서는 5월 1일 데이터에 대해 알아본다. nyt1.csv)

- 6개 나이 범주에 대한 노출횟수와 클릭률(Clicks/Impressions)의 분포를 도표로 나타내 보라.

(코드)

> ggplot(data = subset(data2, Impressions>0), aes(x = age_group, y = Clicks / Impressions))+
+ geom_col()

 

Impression(노출횟수)가 0인 경우는 나누는 의미가 없으므로(노출 횟수가 없는데 광고 클릭 횟수가 존재하는 경우는 오류 데이터이므로) subset()함수를 사용하여 제외한다.

 

(도표)

- 사용자들의 클릭 행동에 기반하여 그들을 분할하거나 범주화하는 새로운 변수를 정의하라.

 

- 데이터를 탐색하고, 사용자 세부 집단 혹은 인구통계적 집단(예를 들어 18세 미만의 남성 집단과 18세 미만의 여성 집단, 또는 로그인한 집단과 그렇지 않은 집단)을 시각적으로 그리고 양적으로 비교하라.

 

뉴욕 타임즈를 사용하는 성별별 연령대/로그인 여부를 비교한다.

남/녀 평균 연령 비교 : 여성은 20대 초반, 남성은 골고루 분포하지만 40대가 주를 이룬다.

남/녀 로그인 여부 비교 : 남자는 거의 대부분이 로그인 하는 반면, 여성은 반절정도 로그인한다.

로그인 연령대 분포는 남/녀가 비슷하며, 남자의 경우 모든 연령대에서 로그인하는 것을 확인할 수 있다.

이번엔 로그인 여부와 클릭 수와의 상관관계이다. 예상했던 것과 반대로 결과가 나왔다. 오히려 로그인 한 사람들의 평균 클릭 수가 로그인 안한 사람들의 클릭 수의 반절이었다. 로그인한 사람들과 더 관련이 높은 광고들에 노출되어 클릭 수가 많을 줄 알았는데...흠 오히려 많이 노출되어 둔감해진건가?

 

 이상 연습문제 풀이를 마친다.

 

Plot에 사용된 간단한 예제 코드도 첨부한다.

 

> library('gridExtra')
> p5 = ggplot(data = subset(data1, Signed_In == 1), aes(x = Clicks)) + 
+ geom_bar() # y축 지정 없이 x축만 지정하여 그래프를 나타낼 수 있다.
> p5
> p5 = p5 + labs(title = "Clickes of Signed_In", subtitle = paste('mean : ', mean(subset(data2, Signed_In == 1)$Clicks))) > p5 = p5 + theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust=0.5)) #중앙정렬
> p5
> grid.arrange(p4,p5,nrow=1)

 

* transform() : data.frame에 변수를 추가하거나 값을 수정 등을 위한 함수이다.

* hist() : 특정 데이터에 대한 히스토그램을 보여준다.

* summary() : 특정 데이터에 대해 요약해서 보여준다. 평균, 중앙값, 최소값 등을 포함한다.

* ggplot2() : 그래프를 그리는데 아주 유요한 라이브러리이다.

  ex)

  ggplot(data = "사용할 data.frame", aes(x = "x축에 넣을 데이터", y = "y축에 넣을 데이터"))+

  geom_col()

  과 같이 실행하면 막대그래프를 그릴 수 있다. 첫째 줄의 마지막 "+"는 직접 입력해줘야 한다. 라이브러리 이름은          ggplot2이지만 사용하는 함수 이름은 ggplot이다. 

* paste(a,b) : 문자열을 합치는 함수이다.

* ggplot2 설치 : install.packages(ggplot2)

* ggplot2 import : library("ggplot2")

 

# cut() 함수를 통해 변수의 범주화를 진행할 때, 범주는 vector를 사용해서 전달해줘야한다. c()를 통해 벡터를 생성할 수 있다.

반응형

+ Recent posts