flexdashboard 사용법

 

마크다운 파일 생성

 

flexdashboard 기본

---
title: "Dashboard Example"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns 
    vertical_layout: fill  
---

```{r setup, include=FALSE} 
library(flexdashboard)
library(ggplot2)
```

Column {data-width=650} #px로 정의 해놓음
-----------------------------------------------------------------------

### Chart A

```{r}
#간단한 시각화 작업
ggplot(data=mtcars,aes(x=hp, y=mpg,color=as.factor(cyl)))+
geom_point()

```

Column {data-width=350} #시각화 자료를 컬럼에서 실행 할 수 있다.
-----------------------------------------------------------------------

### Chart B

```{r}
ggplot(data = mtcars)+
  geom_bar(mapping = aes(x=cyl, fill=as.factor(am)))
```

### Chart C

```{r}
ggplot(data=mtcars)+
  geom_bar(mapping = aes(x=cyl, fill=as.factor(cyl)), position="dodge")+
  coord_polar() # 나이팅게일 함수 같은 방사형 차트 표시해주는 함수
```

 

   vertical_layout: fill  때문에 열이 무시될 수있다(화면 창의 크기를 조절할 경우) 반응형 웹에서 자주 사용되는 것

title: "Dashboard Example"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns #컬럼기준
    vertical_layout: fill  #창사이즈에 맞춰서 줄이거나 커지게 만들어라
```{r setup, include=FALSE} #이름은 셋업이고 인클루드 시키지 않겠다) 
library(flexdashboard)
library(ggplot2)
```

flexdashboard 응용

 

---
title: "Dashboard Example"
output: 
  flexdashboard::flex_dashboard:
    orientation: rows
    vertical_layout: fill  
---

```{r setup, include=FALSE} 
library(flexdashboard)
library(ggplot2)
```

Column {data-width=650} #px로 정의 해놓음
-----------------------------------------------------------------------

### Chart A

```{r}
#간단한 시각화 작업
ggplot(data=mtcars,aes(x=hp, y=mpg,color=as.factor(cyl)))+
geom_point()

```

Column {data-width=350} #시각화 자료를 컬럼에서 실행 할 수 있다.
-----------------------------------------------------------------------

### Chart B

```{r}
ggplot(data = mtcars)+
  geom_bar(mapping = aes(x=cyl, fill=as.factor(am)))
```

### Chart C

```{r}
ggplot(data=mtcars)+
  geom_bar(mapping = aes(x=cyl, fill=as.factor(cyl)), position="dodge")+
  coord_polar() # 나이팅게일 함수 같은 방사형 차트 표시해주는 함수
```

orientation: rows 로 변경 후 이미지

 

---
title: "Dashboard Example"
output: # 출력 결과에 대한 환경 설정(아랫줄들을 붙여쓰면 안된다, 전체적인 위치는 columns 구조 )
  flexdashboard::flex_dashboard:
    orientation: columns # 기본위치값이 열단위로 만들어진다는 의미(columns, rows 선택 가능)
    vertical_layout: scroll # 가로 사이즈를 flexdashboard 사이즈에 맞춰서 꽉 채우라는 의미
---

```{r setup, include=FALSE}
# 청크코드의 이름은 setup으로 지정, include는 안시키겠다.(문서 만들때만 잠깐 사용)
library(flexdashboard) 
library(ggplot2) #해당 라이브러리를 계속 사용하면 여기에 써놓고, 한번만 사용할거면 청크코드에 쓰면 된다.
```

Column {data-width=650}
-----------------------------------------------------------------------
<!-- 첫 번째 컬럼 가로크기를 650(이 내부에 들어가는 것은 컬럼으로 만들겠다.라고 선언(Column 대소문자 구분)) -->
### Chart A

```{r}
ggplot(data=mtcars, aes(x=hp, y=mpg, color=as.factor(cyl)))+
  geom_point()
```

Column {data-width=350} 
-----------------------------------------------------------------------
<!-- 두 번째 컬럼 가로크기를 350 -->
### Chart B

```{r}
ggplot(data=mtcars)+
  geom_bar(mapping=aes(x=cyl, fill=as.factor(am)))
```

### Chart C

```{r}
ggplot(data=mtcars)+
  geom_bar(mapping = aes(x=cyl, fill=as.factor(cyl)), position="dodge")+
  coord_polar() # 나이팅게일 함수 같은 방사형 차트 표시해주는 함수
```

orientation: columns vertical_layout: scroll 변경 후

 

flexshboatd에서 tabset 사용하기

---
title: "Dashboard Example"
output: # 출력 결과에 대한 환경 설정(아랫줄들을 붙여쓰면 안된다, 전체적인 위치는 columns 구조 )
  flexdashboard::flex_dashboard:
    orientation: columns # 기본위치값이 열단위로 만들어진다는 의미(columns, rows 선택 가능)
    vertical_layout: scroll # 가로 사이즈를 flexdashboard 사이즈에 맞춰서 꽉 채우라는 의미
---

```{r setup, include=FALSE}
# 청크코드의 이름은 setup으로 지정, include는 안시키겠다.(문서 만들때만 잠깐 사용)
library(flexdashboard) 
library(ggplot2) #해당 라이브러리를 계속 사용하면 여기에 써놓고, 한번만 사용할거면 청크코드에 쓰면 된다.
```

Column {data-width=650}
-----------------------------------------------------------------------
<!-- 첫 번째 컬럼 가로크기를 650(이 내부에 들어가는 것은 컬럼으로 만들겠다.라고 선언(Column 대소문자 구분)) -->
### Chart A

```{r}
ggplot(data=mtcars, aes(x=hp, y=mpg, color=as.factor(cyl)))+
  geom_point()
```

Column {.tabset} 
-----------------------------------------------------------------------
<!-- 두 번째 컬럼 가로크기를 350 -->
### Chart B

```{r}
ggplot(data=mtcars)+
  geom_bar(mapping=aes(x=cyl, fill=as.factor(am)))
```

### Chart C

```{r}
ggplot(data=mtcars)+
  geom_bar(mapping = aes(x=cyl, fill=as.factor(cyl)), position="dodge")+
  coord_polar() # 나이팅게일 함수 같은 방사형 차트 표시해주는 함수
```

 

Column {.tabset}

---
title: "Dashboard Example"
output: # 출력 결과에 대한 환경 설정(아랫줄들을 붙여쓰면 안된다, 전체적인 위치는 columns 구조 )
  flexdashboard::flex_dashboard:
    orientation: columns # 기본위치값이 열단위로 만들어진다는 의미(columns, rows 선택 가능)
    vertical_layout: scroll # 가로 사이즈를 flexdashboard 사이즈에 맞춰서 꽉 채우라는 의미
---

```{r setup, include=FALSE}
# 청크코드의 이름은 setup으로 지정, include는 안시키겠다.(문서 만들때만 잠깐 사용)
library(flexdashboard) 
library(ggplot2) #해당 라이브러리를 계속 사용하면 여기에 써놓고, 한번만 사용할거면 청크코드에 쓰면 된다.
```

Column {data-width=650}
-----------------------------------------------------------------------
<!-- 첫 번째 컬럼 가로크기를 650(이 내부에 들어가는 것은 컬럼으로 만들겠다.라고 선언(Column 대소문자 구분)) -->
### Chart A

```{r}
ggplot(data=mtcars, aes(x=hp, y=mpg, color=as.factor(cyl)))+
  geom_point()
```

Column {.tabset .tabset-fade} 
-----------------------------------------------------------------------
<!-- 두 번째 컬럼 가로크기를 350 -->
### Chart B

```{r}
ggplot(data=mtcars)+
  geom_bar(mapping=aes(x=cyl, fill=as.factor(am)))
```

### Chart C

```{r}
ggplot(data=mtcars)+
  geom_bar(mapping = aes(x=cyl, fill=as.factor(cyl)), position="dodge")+
  coord_polar() # 나이팅게일 함수 같은 방사형 차트 표시해주는 함수
```

Column {.tabset .tabset-fade} 부드럽게 넘어감

 

flexshboatd에서 dygraphs 사용법

---
title: "Untitled"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
---

```{r setup, include=FALSE}
library(flexdashboard)
library(dygraphs) # 시계열 자료에 대한 시각화 그래프 구현할 때, 하이라이트, 줌 등의 기능을 제공한다.
```

### Lung Deaths (All)

```{r}
dygraph(ldeaths)
```

### Lung Deaths (male)

```{r}
dygraph(mdeaths)
```

### Lung Deaths (female)

```{r}
dygraph(fdeaths)
```

flexedashboard plotly 사용하기

 

---
title: "Untitled"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
---

```{r setup, include=FALSE}
library(flexdashboard)
library(dygraphs) # 시계열 자료에 대한 시각화 그래프 구현할 때, 하이라이트, 줌 등의 기능을 제공한다.
library(plotly)

#install.packages("highcharter")
library(highcharter)
```

### Lung Deaths (All)

```{r}
plot_ly(mtcars, x=~hp,y=~mpg, type = 'scatter',
        mode='markers', color = ~as.factor(cyl))
        
```

### Lung Deaths (male)

```{r}
hchart(mtcars,"scatter", hcaes(x=hp, y=mpg, group=as.factor(cyl)))
```

### Lung Deaths (female)

```{r}
hchart(diamonds$price, color="#B71C1C", name="Price") %>% 
  hc_title(text = "You can Zoom me")
```

https://rmarkdown.rstudio.com/flexdashboard/using.html#compenents

 

Using flexdashboard

You can form links directly to dashboard pages using markdown link syntax: [Page 2]. To use custom link text you can also create a link via the page’s anchor: [Page Two](#page-2). Both styles of page linking are demonstrated in this example: Hiding Pages T

rmarkdown.rstudio.com

레이어 아웃의 사이즈(figure Sizes)

---
title: "figure Sizes"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
---

```{r setup, include=FALSE}
library(flexdashboard)
```

Column
-----------------------------------------------------------------------

### Chart A(12,7)

```{r, fig.width=12,fig.height=7}
plot(cars)
```

Column 
-----------------------------------------------------------------------

### Chart B(5,5)

```{r,fig.width=5,fig.height=5}
plot(pressure)

```

### Chart C(10,7)

```{r,fig.width=10,fig.height=7}
plot(airmiles)

```

shiny 패키지

---
title: "figure Sizes"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
runtime: shiny
---

```{r setup, include=FALSE}
library(flexdashboard)

```

Column
-----------------------------------------------------------------------

### Chart A(12,7)

```{r, fig.width=12,fig.height=7}
plot(cars)
```

Column 
-----------------------------------------------------------------------

### Chart B(5,5)

```{r,fig.width=5,fig.height=5}
plot(pressure)

```

### Chart C(10,7)

```{r,fig.width=10,fig.height=7}
library(shiny)
renderTable({head(mtcars,10)})

```

 

---
title: "figure Sizes"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
runtime: shiny
---

```{r setup, include=FALSE}
library(flexdashboard)

```

Column
-----------------------------------------------------------------------

### Chart A(12,7)

```{r, fig.width=12,fig.height=7}
plot(cars)
```

Column 
-----------------------------------------------------------------------

### Chart B(5,5)

```{r,fig.width=5,fig.height=5}
plot(pressure)

```

### Chart C(10,7)

```{r,fig.width=10,fig.height=7}
library(shiny)
renderTable({head(mtcars,10)})

```


```{r}
DT::datatable(mtcars,
              options = list(pageLength=25,
                             bPaginate=T),
              fillContainer = "top")

```

 

 

flexdashboard에서 valueBox()아이콘 설정

---
title: "Untitled"
output: 
  flexdashboard::flex_dashboard:
    orientation: rows
    vertical_layout: fill
---

```{r setup, include=FALSE}
library(flexdashboard)
library(ggplot2)
library(knitr)
```

### valuebox Example1

```{r}
valueBox(42, 
         icon = "fa-github")

```

### # of Bit Coin

```{r}
num=8
valueBox(num, 
         icon = "fa-bitcoin",
         color = "info")

```

### valuebox Example3

```{r}
num=50
valueBox(num,
         caption="APPLE PAY",
         icon = "fa-bluetooth",
         color = ifelse(num>10, "warning", "primary")) # 워닝,프라이머리는 내장 상수

```

### valuebox Example4

```{r}
valueBox(107,
         caption="AWS",
         icon = "fa-cannabis",
         color = "success")
```

 

 

---
title: "Untitled"
output: 
  flexdashboard::flex_dashboard:
    orientation: rows
    vertical_layout: fill
---

```{r setup, include=FALSE}
library(flexdashboard)
library(ggplot2)
library(knitr)
```

Row1
----------------------------------------

### valuebox Example1

```{r}
valueBox(42, 
         icon = "fa-github")

```

### # of Bit Coin

```{r}
num=8
valueBox(num, 
         icon = "fa-bitcoin",
         color = "info")

```

### valuebox Example3

```{r}
num=50
valueBox(num,
         caption="APPLE PAY",
         icon = "fa-bluetooth",
         color = ifelse(num>10, "warning", "primary")) # 워닝,프라이머리는 내장 상수

```

### valuebox Example4

```{r}
valueBox(107,
         caption="AWS",
         icon = "fa-cannabis",
         color = "success")
```

Row2
----------------------------------------

### ggpolt2 graph

```{r}
ggplot(data=mtcars)+
  geom_bar(mapping = aes(x=cyl, fill=as.factor(am)),
           position="dodge")+
  theme(legend.position = "blank")
```

### Tabular data

```{r}
kable(mtcars)
```

 

 

 

 

---
title: "Multiple Pages"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    source_code : embed
    navbar:
      - { title: "About", href: "https://www.naver.com/about", align: right }
      - { icon: "fa-pencil", href: "https://www.github.com", align: right}
---

  Pag1 1
==========================================
  
  This is an example. As you can see, flexdashboard can have text annotations.

```{r setup, include=FALSE}
library(flexdashboard)
library(ggplot2)
library(knitr)
```

Column 1 {data-width=300}
-----------------------------------------------------------------------
  
### Gauge ex1. Contact Rate
  
```{r}
gauge(45, min=0, max=100, symbol = '%',              #전달되는 값에 따라서 색상을 변경시키라는 의미
      sectors = gaugeSectors(success = c(80, 100),
                             warning = c(40, 79),
                             danger = c(0, 39)))

```

### Gauge ex2. Average Rating

```{r}
rating=42
gauge(rating, 0, 50, label = 'Test', gaugeSectors(
  success = c(41, 50), warning = c(21, 40), danger = c(0, 20)))

```

### Text Annotation

One of the dashboard section can be as a text area.

Markdown Grammers can be helpful here.

It is not that difficult.

Just have a try

Column 2 {data-width=300}
-----------------------------------------------------------------------
  
  Pag1 2
==========================================

### ggplot2 chart1

```{r}

ggplot(data= mtcars,aes(x=hp, y=mpg,color=as.factor(cyl)))+
  geom_point()+
  theme(legend.position = "blank")

```
  

about,연필모양 눌렀을 때 이동하는 코드

 - { title: "About", href: "https://www.naver.com/about", align: right }
      - { icon: "fa-pencil", href: "https://www.github.com", align: right}

 

 

########################################################
# 서점의 고객 데이터에 대한 가상 사례
#http://blog.daum.net/revisioncrm/405
# (탐색적인 분석과 고객세분화 응용 사례)
########################################################
# 작업 파일 : cust_seg_smpl_280122.csv
# --------------------------------------------------------
# 작업 내용
#--------------------------------------------------------
# 최종구매후기간 recency와 구매한 서적의 수간의 관계 확인
# 동일 좌표에 다수의 고객 존재 가능성이 있으므로 이를 처리

# 가설 1
# 보조선인 회귀선을 본다면 최근성이 낮을수록, 
# 즉 구매한지 오래되었을 수록 구매한 서적의 수가 많음
#---------------------------------------------------------

# 가설 2
# 구매한 책의 수가 많을수록 구매금액이 큼
# 주로 비싼 책을 샀는지를 파악하기 위해 평균금액을 계산


# 수행 내용
#---------------------------------------------------------
# 성별을 구분해서 특성 차이 비교
#---------------------------------------------------------
# 서적과 서적이외 구매액 비교

# 1차 결론
# 서적 구매는 많으나 기타 상품 구매가 약한 집단을 선정해
# 집중적 cross-selling 노력 기울이는 것이 필요해 보임


#---------------------------------------------------------
# 대상 집단 조건 - 
# 시각적으로 설정했던 기준선 영역에 해당하는 고객리스트 추출


#---------------------------------------------------------
# 선정된 집단의 프로파일 시각적으로 확인
# 서적 구매수량과 성별 분포 확인 (여성은 pink)


#---------------------------------------------------------
# 전체고객의 평균/중위수 서적구매수량과 비교

# 프로파일 확인 결과 중위수에 비해 서적구매수량이 많고, 
# 평균에 비해서도 많은 편인 여성 고객들임

# 2차 결론
# 기타 상품 중 여성 선호 상품을 찾아 제안하는 방식으로 cross-sell
# 캠페인 진행 필요해 보임


#---------------------------------------------------------
# 군집분석을 활용한 고객세분화

# 고객집단을 표시할 색상을 임의로 지정
# 번호순의 색상 이름 벡터 생성

# 각 고객의 소속 집단이 어디인가에 따라 색상 표시


#---------------------------------------------------------
# 3차 결론
# 서적 구매 장르의 수가 많다면 
# 서적 구매 수량이 많을 가능성 높으므로
# 비율을 새로 계산 (=구매한 서적 수량 대비 쟝르의 수)
######################################################

#고객을 세분화해서 분석하는 문제
#앞으로 타겟 마케팅을 누구를 잡을 건지 마케팅 방식을 어떻게 집중적으로 해야 할 것인 지에 대해 조사
#동일 좌표안에 고객들이 쌓여잇어서 별도 함수를 이용하여 푼다 jitter()

# 구매한 서적의 개수가 정말 많은지 비싼 책을 많이 샀는지 저렴한 금액의 책을 많이 삿는지 조사
# 성별을 분리하여 기타 상품을 삿는지 책을 삿는지 구분

#1.데이터 파일 불러오기
cs0<-read.csv("cust_seg_smpl_280122.csv")
head(cs0)
names(cs0) #컬럼명만 꺼내오기 get 방식

cs1<-cs0

names(cs1) <- c("cust_name", "sex", "age", "location", "days_purchase",#set 방식
                "recency", "num_books", "amt_books", "amt_non_book",
                "amt_total", "interest_genre", "num_genre",
                "membership_period", "sms_optin" )
#xls는 예전 버전 xlsx 는 뉴버전

#최종 구매 후 기간recency 와 구매한 서적의 수간의 관계 확인
plot(cs1$recency,cs1$num_books)

#동일 좌표에 다수의 고객 존재 가능성이 있으므로 jitter 활용
# --------------------------------------------------------
# jitter()
# jitter는 데이터 값을 조금씩 움직여서 같은 점에 데이터가 여러번 겹쳐서 표시되는 현상을 막는다.
# 숫자로 이뤄진 벡터 타입
# --------------------------------------------------------
# Description
#숫자 벡터에 소량의 노이즈를 추가하는 함수

#Usage
# jitter(x, factor=1, amount=NULL)

#Arguments
# x: 지터를 추가 할 숫자 형 벡터.
#
# factor : numeric(숫자).

# amount : numeric(숫자).
#양수이면 양으로 사용되며
#그렇지 않으면 =0
#기본값은 facor * z /50 입니다.

# amount의 기본값은 NULL
# factor * d /5 여기서 d는 x값 사이의 가장 작은 차이

#Examples
#z <- max(x)-min(x) 라고 하자(일반적인 경우를 가정).

#추가 될 양 a는
#다음과 같이 양의 인수 양으로 제공되거나 z에서 계산된다.
#만약 amount == 0 이면 a <- factor * z/50 을 설정.

round(jitter(c(rep(1,3),rep(1.2,4),rep(3,3))),3) #겹쳐진 좌표의 거리를 멀게 한다.
# [1] 0.997 1.040 0.975 1.174 1.190 1.177 1.187 2.970 2.998 3.022

# rep(1,3)
# [1] 1 1 1
# rep(1.2,4)
# [1] 1.2 1.2 1.2 1.2
# rep(3,3)
# [1] 3 3 3

# jitter(c(rep(1,3),rep(1.2,4),rep(3,3)))
# [1] 0.9854338 0.9838435 0.9848714 1.1701283 1.1712497 1.2084189 1.1942649 3.0360655 3.0260686 2.9635534

#변동 된 값을 보여주는 그래프
plot(jitter(cs1$recency),jitter(cs1$num_books))

#선그래프
abline(lm(cs1$num_books~cs1$recency),col="blue")

View(cs1)

#엑셀에서 천단위 comma가 포함된 것을 gsub 함수로 제거
cs1$amt_books <- as.numeric(gsub(",",
                                 "",
                                 as.character(cs1$amt_books))
)

cs1$amt_non_book <- as.numeric(gsub(",",
                                    "",
                                    as.character(cs1$amt_non_book))
)

plot(jitter(cs1$num_books), jitter(cs1$amt_books))

abline(lm(cs1$amt_books~cs1$num_books),
       col="blue")

#주로 비싼 책을 삿는지를 파악하기 위해 평균금액을 계산
cs1$unitprice_book <- cs1$amt_books / cs1$num_books

plot(jitter(cs1$num_books),
     jitter(cs1$unitprice_book),
     pch=19,
     col="blue",
     cex=0.7,
     ylim=c(0, max(cs1$unitprice_book)*1.05)
)

abline(lm(cs1$unitprice_book~cs1$num_books),
       col="blue",
       lwd=2, lty=2)

abline(h=median(cs1$unitprice_book), #median:중간값 만들어주는 것
       col="darkgrey")

#성별을 구분해서 특성 차이 비교
plot(jitter(cs1$num_books),
     jitter(cs1$unitprice_book),
     pch=19,
     cex=0.7,
     col=ifelse(cs1$sex=='여', "pink", "blue"),
     ylim=c(0, max(cs1$unitprice_book)*1.05),
     sub="pink: female blue:male")

abline(lm(cs1$unitprice_book~cs1$num_books),
       col="blue",
       lwd=2, lty=2)



abline(h=median(cs1$unitprice_book), #median:중간값 만들어주는 것
       col="darkgrey")

#동그라미 크기 비율 조정하기
plot(jitter(cs1$num_books),
     jitter(cs1$unitprice_book),
     pch=19,
     cex=4*cs1$amt_non_book/max(cs1$amt_non_book),
     col=ifelse(cs1$sex=='여', "pink", "blue"),
     ylim=c(0, max(cs1$unitprice_book)*1.05),
     sub="size: 서적이외 상품구매액액")


abline(lm(cs1$unitprice_book~cs1$num_books),
       col="blue",
       lwd=2, lty=2)

abline(h=median(cs1$unitprice_book),
       col="darkgrey")

## 이상치를 제외하고 확인했을 때, 책을 많이 살 수록 서적 외 다른 상품들도 많이 구매함을 알 수 있다.
## --> 서적에 대한 구매력을 올려야 한다. or 기타 주력상품을 카테고리화 하여 판매량에 대한 분석을 할 수 있다.(캐시카우 확인, 문제아 확인)

########################################################### 4단계 : 서적구매액과 서적 이외 구매액 분포 및 관계 확인

#서적과 서적이외 구매액 비교

plot(jitter(cs1$amt_books),
     jitter(cs1$amt_non_book),
     pch=19,
     col="khaki",
     cex=1.5,
     ylim=c(0, max(cs1$amt_non_book)*1.05)
)

abline(lm(cs1$amt_non_book~cs1$amt_books),
       col="blue",
       lwd=2, lty=2)

abline(h=median(cs1$amt_non_book)*1.5, col="darkgrey")
abline(v=median(cs1$amt_books)*1.5, col="darkgrey")

text(median(cs1$amt_books)*1.5*2,
     median(cs1$amt_non_book)*1.5*0.7,"cross-sell target")

## 책의 구매수량이 적을 수록 기타상품 또한 구매력이 떨어지는 것을 확인할 수 있다.(우상향 확인 가능)
## Selling point 확인 가능
## --> 구매력이 약한 집단을 주 타겟층으로 잡아 전략 수립 필요

########################################################### 5단계 : 고객 리스트 추출
# 대상 집단 조건 -
# 시각적으로 설정했던 기준선 영여겡 해당하는 고객리스트 추출

tgtgridseg <- cs1[cs1$amt_books > median(cs1$amt_books)*1.5 &
                    cs1$amt_non_book < median(cs1$amt_non_book)*1.5,]

nrow(tgtgridseg) # 2명 확인

paste("size of target =",
      as.character(100*nrow(tgtgridseg) / nrow(cs1)),
      "% of customer base") # 결과 : "size of target = 10 % of customer base"

########################################################### 6단계 : 집단 시각화
# 선정된 집단의 프로파일 시각적으로 확인
# 서적 구매수량과 성별 분포 확인(여성은 pink)

barplot(tgtgridseg$num_books,
        names.arg = tgtgridseg$cust_name,
        col=ifelse(tgtgridseg$sex=='여',"pink","blue"),
        ylab="서적 구매수량")

# 전체 고객의 평균과 서적구매수량 중위수를 비교
abline(h=mean(cs1$num_books), lty=2)
abline(h=median(cs1$num_books), lty=2)


#세분화 작업
#군집분석을 활용한 고객 세분화
cs2 <- cs1[,names(cs1) %in% c("days_purchase",
                       
                       "recency", "num_books", "amt_books", "unitprice_book", 
                       
                       "amt_non_book", "num_genre", "membership_period")]
cs2

kmm1<-kmeans(cs2,3)#kmeans : 군집 분석 함수

table(kmm1$cluster)

#고객 집단을 표시할 색상을 임의로 지정
#번호 순의 색상 이름 백터 생성
cols<-c("red","green","blue")

barplot(table(kmm1$cluster),
        names.arg=names(table(kmm1$cluster)),
        col=cols,
        main="군집별 고객 수 분포")

#고객집단을 프로파일 하는데 장르부분
#각 고객의 소속 집단이 어디인가에 따라 색상표시
plot(jitter(cs2$days_purchase),
     jitter(cs2$num_genre),
     col=cols[kmm1$cluster],
     pch=19,
     main="고객세분집단 프로파일 : 구매 빈도와 서적구매 장르 다양성 분포",
     sub="cl#1:red, cl#2:green, cl#3:blue")


#1.데이터 파일 불러오기
bank0<-read.csv("bnk05.csv")
head(bank0)
names(bank0) #컬럼명만 꺼내오기 get 방식
View(bank0)


###20대 30대만 구하기
library(dplyr)

#필더가 적용된 값을 넣기
bank1<-bank0 %>% filter(bank0$age < 40 & bank0$age > 19)
View(bank1)

###연령과 잔고의 분포를 보여주는 플롯 작성
plot(bank1$age)
plot(bank1$balance)
plot(bank1$duration)

hist(bank1$age)
hist(bank1$balance)

#산점도(scatterplot)
###연령과 잔고의 산점도를 작성하라
plot(bank1$age,bank1$balance)

table(bank1$age)

#변동 된 값을 보여주는 그래프
###동일한 연령이 많이 존재하므로 ijtter를 활용한 플롯을 작성하고 플롯의 point를 반투명한 blue로 변경하라
plot(jitter(bank1$age), jitter(bank1$balance), pch=19, col=rgb(0,0,1,0.2))

###결혼상태별 고객 수를 막대챠트로 작성하고 <20대의 결혼 상태 분포>라는 제목을 추가하라

#목록 확인하기
plot(bank1$marital)

#바차트 만들기
barplot(table(bank1$marital),
        main ="20대 결혼 상태 분포")

# - 잔고와 duration간의 분포를 보여주는 scatterplot을 작성하고, 선형회귀선을 추가하라.
plot(bank1$balance,bank1$duration)

abline(lm(bank1$balance~bank1$duration),
       col="blue",
       lwd=2, lty=2)

abline(h=median(cs1$unitprice_book), #median:중간값 만들어주는 것
       col="darkgrey")

# - 결혼상태가 single인 경우는 blue, 아니라면 red인 반투명 point로 색상을 변경하라.
plot(jitter(bank1$age), jitter(bank1$balance), pch=19, 
     col=ifelse(bank1$marital=="single", rgb(0,0,1,0.2), rgb(1,0,0,0.2)),
     sub="blue: single")
abline(lm(balance~age, data=bank1), col="darkgrey", lwd=2, lty=2)


# - duration과 balance 각각에 대한 중위수를 기준으로 수직,수평의 보조 구분선을 추가하라.
plot(jitter(bank1$balance), jitter(bank1$duration), pch=19, 
     col=ifelse(bank1$loan=="yes", rgb(1,0,0,0.2), rgb(0,0,1,0.2)),
     sub="blue: loan")

abline(lm(duration~balance, data=bank1), col="darkgrey", lwd=2, lty=2)
abline(h=median(bank1$duration), lty=2)
abline(v=median(bank1$balance), lty=2)
# 
# 
# - 개인대출여부 (loan) 별 잔고 분포를 box plot을 사용하여 나타내라.
boxplot(balance~loan,data=bank1, main="개인대출여부별 잔고", 
        ylab="잔고", ylim=c(-1000,4000))
grid()
# 
# - 직업별 잔고의 중위수를 집계 산출하고, 막대 플롯을 작성하라.
gg1 <-aggregate(bank1$balance, by=list(bank1$job), 
                FUN=median)

#- 직업이 학생이면 blue로 아니면 grey로 색상을 지정하라.
names(agg1) <- c("job","mdn_bal")
barplot(agg1$mdn_bal, names.arg=agg1$job,
        col=ifelse(agg1$job=="student","blue","grey"))

#- 20대 전체의 잔고 중위수 값을 기준으로 수평 보조선을 추가하라.
abline(h=median(bank1$balance), lty=2)

agg2 <-aggregate(bank1$age, by=list(bank1$job), 
                 FUN=mean)

names(agg2) <- c("job","avg_age")

rloan01 <- table(bank1$job, bank1$loan)[,3]/table(bank1$job, bank1$loan)[,1]

rloan02 <- rloan01[!is.nan(rloan01)]



barplot(agg2$avg_age, names.arg=agg2$job,
        col=rgb(rloan02,0,rloan02,0.8), 
        ylab="age", xlab="job")

abline(h=median(bank1$age), col="grey", lty=2)


# 
# - 20대의 직업별 고객수 비율을 table 명령을 활용하여 구하고
# 
# 20대 뿐 아닌 전체 고객의 직업별 비율을 역시 같은 방식으로 구한후
# 
# 두 가지를 하나의 데이터프레임으로 결합해서 생성하라
# 
# 
# 
# -20대와 전체의 각 직업별 구성비 차이를 비교해 함께 보여주는 막대플롯을 작성하라
# # 
# 
# 
# - 30대 고객의 연령과 잔고간 scatterplot과 
# 
# 20대에 대한 그 것을 각각이 플롯으로 비교해 보여주는 한 장의 그림을 작성하라 (par mfrow 활용)
# 


차트 만드는 것에 도움이 되는 사이트

https://www.originlab.com/doc/ 

 

https://www.originlab.com/doc/

 

www.originlab.com

https://www.originlab.com/doc/Tutorials

https://www.rdaramining.com/resources/onlinedocs

 

https://www.originlab.com/doc/

 

www.originlab.com

# 나이팅게일 차트로 표현
# 주요선수별성적-2013년.csv

data<-read.csv("주요선수별성적-2013년.csv",header=T)
data

row.names(data)<-data$선수명

data2<-data[,c(7,8,11,12,13,14,17,19)]
stars(data2,
      filp.labels=FALSE,
      draw.segments = TRUE,
      frame.plot = TRUE,
      full = TRUE,
      key.loc = c(1.5,0),
      main = "야구 선수별 주요 성적 분석-2013년")

#F12에서 설정 에서 자바스크립트 클릭 stars(x, full = TRUE, scale = TRUE, radius = TRUE,
# labels = dimnames(x)[[1]], locations = NULL,
# nrow = NULL, ncol = NULL, len = 1,
# key.loc = NULL, key.labels = dimnames(x)[[2]],
# key.xpd = TRUE,
# xlim = NULL, ylim = NULL, flip.labels = NULL,
# draw.segments = FALSE,
# col.segments = 1:n.seg, col.stars = NA, col.lines = NA,
# axes = FALSE, frame.plot = axes,
# main = NULL, sub = NULL, xlab = "", ylab = "",
# cex = 0.8, lwd = 0.25, lty = par("lty"), xpd = FALSE,
# mar = pmin(par("mar"),
#            1.1+ c(2*axes+ (xlab != ""),
#                   2*axes+ (ylab != ""), 1, 0)),
# add = FALSE, plot = TRUE, ...)
# Arguments
# x 
# 행렬 또는 데이터 프레임. x의 각 행에 대해 하나의 스타 또는 세그먼트 플롯이 생성됩니다. 결 측값 (NA)은 허용되지만 값이 0 인 것처럼 처리됩니다 (확장 후, 관련이있는 경우).
# 
# full 
# 논리 플래그 : 참이면 세그먼트 도표가 완전한 원을 차지합니다. 그렇지 않으면 (위) 반원 만 차지합니다.
# 
# scale 
# 논리 플래그 : TRUE 인 경우 데이터 행렬의 열은 각 열의 최대 값이 1이고 최소값이 0이되도록 독립적으로 크기가 조정됩니다. FALSE 인 경우 데이터는 다른 알고리즘에 의해 범위가 조정 된 것으로 추정됩니다. [0, 1].
# 
# radius 
# 논리 플래그 : TRUE에서는 데이터의 각 변수에 해당하는 반지름이 그려집니다.
# 
# labels 
# 플롯에 레이블을 지정하기위한 문자열로 구성된 벡터 S 함수 별과 달리 labels = NULL 인 경우 레이블을 구성하려고 시도하지 않습니다.
# 
# locations 
# 각 세그먼트 도표를 배치하는 데 사용되는 x 및 y 좌표를 가진 두 개의 열 행렬. 또는 모든 플롯을 겹쳐 야하는 경우 길이가 2 인 숫자 ( '스파이더 플롯'의 경우). 기본적으로 위치 = NULL 인 경우 세그먼트 플롯이 직사각형 그리드에 배치됩니다.
# 
# nrow, ncol 
# 위치가 NULL 인 경우 사용할 행 및 열 수를 제공하는 정수 기본적으로 nrow == ncol이며 정사각형 레이아웃이 사용됩니다.
# 
# len 
# 반지름 또는 세그먼트 길이에 대한 배율.
# 
# key.loc 
# 단위 키의 x 및 y 좌표를 가진 벡터
# 
# key.labels 
# 단위 키의 세그먼트에 레이블을 지정하기위한 문자열 벡터 생략하면 dimnames (x)의 두 번째 구성 요소가 사용됩니다 (사용 가능한 경우).
# 
# key.xpd 
# 단위 키의 클리핑 스위치 (도면 및 레이블)는 par ( "xpd")를 참조하십시오.
# 
# xlim 
# x 좌표 범위를 가진 벡터.
# 
# ylim 
# y 좌표 범위를 가진 벡터.
# 
# flip.labels 
# 라벨 위치를 다이어그램에서 다이어그램으로 위아래로 뒤집어 야하는지 여부를 나타내는 논리. 다소 똑똑한 휴리스틱으로 기본 설정됩니다.
# 
# draw.segments 
# l논리적. 참이면 세그먼트 다이어그램을 그립니다.
# 
# col.segments 
# 색상 벡터 (정수 또는 문자, par 참조). 각각 세그먼트 (변수) 중 하나의 색상을 지정합니다. draw.segments = FALSE이면 무시됩니다.
# 
# col.stars 
# 별표 (케이스) 중 하나의 색상을 지정하는 색상 벡터 (정수 또는 문자, 파 참조). draw.segments = TRUE이면 무시됩니다.
# 
# col.lines 
# 색 벡터 (정수 또는 문자, par 참조). 각각은 선 (케이스) 중 하나의 색을 지정합니다. draw.segments = TRUE이면 무시됩니다.
# 
# axes 
# 논리 플래그 : TRUE이면 플롯에 축이 추가됩니다 .
# 
# frame.plot 
# 논리 플래그 : TRUE이면 플롯 영역이 프레임됩니다.
# 
# main 
# 주요 제목
# 
# sub 
# 부제목.
# 
# xlab 
# x 축의 라벨.
# 
# ylab 
# y 축의 라벨.
# 
# cex 
# 라벨의 문자 확장 요소.
# 
# lwd 
# 그리기에 사용되는 선 너비.
# 
# lty 
# 그리기에 사용되는 선 종류.
# 
# xpd 
# 클리핑을 수행해야하는지 여부를 나타내는 논리 또는 NA. par (xpd =.)를 참조.
# 
# mar 
# par (mar = *)에 대한 인수로 일반적으로 기본보다 작은 여백을 선택합니다..
# 
# ... 
# plot ()의 첫 번째 호출에 전달 된 추가 인수는 frame.plot이 true 인 경우 plot.default 및 box ()를 참조.
# 
# add 
# 참이면 현재 플롯에 별표를 추가t.
# 
# plot 
# 논리적 인 경우 FALSE이면 아무것도 표시되지 않습니다.
# 
# 
# 
# 예)

stars(mtcars[, 1:7], key.loc = c(14, 2),
      main = "Motor Trend Cars : stars(*, full = F)", full = FALSE)
stars(mtcars[, 1:7], key.loc = c(14, 1.5),
      main = "Motor Trend Cars : full stars()", flip.labels = FALSE)

## 'Spider' or 'Radar' plot:
stars(mtcars[, 1:7], locations = c(0, 0), radius = FALSE,
      key.loc = c(0, 0), main = "Motor Trend Cars", lty = 2)

## Segment Diagrams:
palette(rainbow(12, s = 0.6, v = 0.75))
stars(mtcars[, 1:7], len = 0.8, key.loc = c(12, 1.5),
      main = "Motor Trend Cars", draw.segments = TRUE)
stars(mtcars[, 1:7], len = 0.6, key.loc = c(1.5, 0),
      main = "Motor Trend Cars", draw.segments = TRUE,
      frame.plot = TRUE, nrow = 4, cex = .7)

## scale linearly (not affinely) to [0, 1]
USJudge <- apply(USJudgeRatings, 2, function(x) x/max(x))
Jnam <- row.names(USJudgeRatings)
Snam <- abbreviate(substring(Jnam, 1, regexpr("[,.]",Jnam) - 1), 7)
stars(USJudge, labels = Jnam, scale = FALSE,
      key.loc = c(13, 1.5), main = "Judge not ...", len = 0.8)
stars(USJudge, labels = Snam, scale = FALSE,
      key.loc = c(13, 1.5), radius = FALSE)

loc <- stars(USJudge, labels = NULL, scale = FALSE,
             radius = FALSE, frame.plot = TRUE,
             key.loc = c(13, 1.5), main = "Judge not ...", len = 1.2)
text(loc, Snam, col = "blue", cex = 0.8, xpd = TRUE)

## 'Segments':
stars(USJudge, draw.segments = TRUE, scale = FALSE, key.loc = c(13,1.5))

## 'Spider':
stars(USJudgeRatings, locations = c(0, 0), scale = FALSE, radius  =  FALSE,
      col.stars = 1:10, key.loc = c(0, 0), main = "US Judges rated")

## Same as above, but with colored lines instead of filled polygons.
stars(USJudgeRatings, locations = c(0, 0), scale = FALSE, radius  =  FALSE,
      col.lines = 1:10, key.loc = c(0, 0), main = "US Judges rated")

## 'Radar-Segments'
stars(USJudgeRatings[1:10,], locations = 0:1, scale = FALSE,
      draw.segments = TRUE, col.segments = 0, col.stars = 1:10, key.loc =  0:1,
      main = "US Judges 1-10 ")

palette("default")
stars(cbind(1:16, 10*(16:1)), draw.segments = TRUE,
      main = "A Joke -- do *not* use symbols on 2D data!")

##########################
# 한국프로야구선수별 기록분석 - 2013년
# 주요선수별성적-2013년.csv
dev.new()#창열어서 그래프를 보여줌줌

data <- read.csv("주요선수별성적-2013년.csv", header=T)
data # 원래 데이터는 행 값이 숫자

data4 <- data[,c(2,21,22)]
data4

line1 <- data$연봉대비출루율
line2 <- data$연봉대비타점율

# par() : 그래픽 매개 변수를 설정하거나 쿼리하는 데
#         사용할 수 있다.
# 매개변수는 tag = value 형식의 par 인수로 지정하거나
# 태그 값의 목록으로 전달하여 설정할 수 있다.

# 매개 변수 mar :
# 플롯의 네 면에 지정된 마진선 수를 나타내는
# c(아래쪽, 왼쪽 위, 오른쪽) 형태의 숫자 벡터.
# 기본값은 c(5,4,4,2) +0.1

# 매개 변수 new:
# 논리적이며 기본값은 FALSE.
# TRUE로 설정하면 다음 높은 레벨의 플로팅 명령(실제로 plot.new)은
# 새 장치에 있는 것 처럼 그리기 전에 프레임을 정리해서는 안된다.
# 현재 고수준 플롯이 없는 장치에서
# new=TRUE 를 사용하려고 하면 오류(경고와 함께 무시 됨)가 발생

par(mar=c(5,4,4,4)+0.1)

plot(line1,
     type="o",
     axes=F,
     ylab="",
     xlab="",
     ylim=c(0,50),
     lty=2,
     col="blue",
     main="한국프로야구선수별 기록 분석-2013년",
     lwd=2)

#축설정
axis(1,
     at=1:25,
     lab=data4$선수명,
     las=2)

axis(2, las=1)

#타점율그래프 덧그리기(꺾은선)
par(new=T) # par함수를 이용해서 새롭게 덧그린다.

#덧그릴 그래프는 타점율을 이용한 선형 점선그래프 그리기
plot(line2,
     type="o",
     axes=F,
     ylab="",
     xlab="",
     ylim=c(0,50),
     lty=2,
     col="red")

axis(4, las=1)#오른 쪽에 생성


mtext(side = 4,line = 2.5,"연봉대비 타점율")# 오른쪽
mtext(side = 2,line = 2.5,"연봉대비 출루율")# 왼쪽

abline(h=seq(0,50,5),
        v=seq(1,25,1),
        col="grey",
        lty=2)

#상단 선색 알림창
legend(18,
       50,
       names(data[21:22]),
       cex=0.8,
       col=c("red","blue"),
       lty = 1,
       lwd = 2,
       bg="white")

savePlot("baseball_4.png",type="png")

# #####################
# 프로야구KBO 차자 성적과 나이의 관계(hit20180727.csv)
# 
# 루타(TB)/추정득점(XR)/타석(PA)값을 이용하여
# 추정특점(XR)/타석(PA) 값이 .18 보다 큰 선수들만
# 별도로 시각화하여 성적과 기여도의 관계를 시각화
# 추정득점(XR): 팀 득짐에 얼마나 기여했는지 정도

hit5<-read.csv("hit20180927.csv")
hit5

hit5$age <- c(30, 20, 28, 31, 30, 32, 37, 32,
              37, 34, 36, 30,
              30, 30, 28, 25, 28, 32, 28,
              25, 28, 33, 32, 28,
              29, 29, 28, 33, 34, 31, 39,
              30, 29, 35, 29, 28,
              26, 34,  31, 33, 28, 31, 22,
              29, 29, 28, 29, 19,
              31, 33, 33, 28, 19, 31, 34,
              28, 28, 31, 27, 24,
              31)
# 루타(TB) 값을 이용한 기본 차트
plot(hit5$age,
     hit5$TB,
     pch=19,
     col="steelblue",
     cex=1.5,
     main="나이와 타자 성적",
     xlab="AGE",
     ylab="TB")

#추정득점(XR) /타석(PA)값이 .18 보다 큰 데이터만 추출
hit51<-hit5[hit5$XR/hit5$PA>0.18,]

points(hit51$age,
       hit51$TB,
       pch=19,
       col="red",
       cex=1.5)

text(hit51$age,
     hit51$TB,
     pos=3,
     labels=hit51$name)

# lowess()
# 이 함수는 국소 가중 다항 회귀를 사용하는 LOWESS smmther에 대한 계산을 수행한다(References 참조)
# lowess는 복잡한 알고리즘에 의해 정의되며, Ratfor 오리지널(W.S. Cleveland)은
# R 소스에서 파일 'src / appl / lowess.doc' 로 찾을 수 있다.
# 일반적으로 로컬 선형 다항식 피팅이 사용되지만
# 경우에 따라 (파일참조) 로컬 상수 피팅을 사용할 수 있다
# '로컬'은 가장 가까운 이웃 (f*n)까지의 거리로 정의되며, 이웃에 속하는 x에 대해 삼중 가중이 사용된다

# Arguments
# x, y : 산점도에서 점의 좌표를 제공하는 벡터.
# 또는 단일 플로팅 구조를 지정할 수 있습니다. (xy.coords 참조.)

# f : 부드러운 스팬.
# 이는 각 값에서 평활도에 영향을 주는 플롯의 점 비율을 제공.
# 값이 더 클수록 더 부드러워 진다.

# iter
# 수행해야 할 "강화'반복 횟수가 더 작은 iter 값을 사용하면 lowess 실행 속도가 빨라진다.

# delta : 기본값은 x 범위읜 1/100.

#윗 함수를 이용해 직선을 그린다.
lines(lowess(hit5$TB~hit5$age),
      lwd=2,
      lty=3)
###############################################
plot(hit5$age,
     hit5$TB,
     pch=19,
     col="steelblue",
     cex=1.5,
     main="프로야구 타자- 나이와 성적",
     sub="red: XR/PA>0.18",
     xlab="AGE",
     ylab="TB")

hit51 <- hit5[hit$XR/hit5$PA>0.18,]

points(hit51$age, hit51$TB, pch=19, col="red", cex=1.5)

text(hit5$age, hit5$TB, pos=3, labels=hit5$name)

lines(lowess(hit5$TB~hit5$age), lwd=2, lty=3)
#############
# KBO 프로야구 가을야구 예상 분석
# 플레이오프와 코리아 시리즈
# hit20180919.csv
# 
# 미리보는 KBO 2018 가을 야구
# 플레이오프: 한화-sk
# 코리아 시리즈 : SK-두산
# 순서대로 진행된다 했을 때 벌어질 타격전의 예상 시나리오?
#   9.19일까지의 KBO타격 통계를 바탕으로 예상해본다면??
#-----[EDA] KBO가을 야구 미리보기 연습-----

# [1]scatter.plot을 통한 타자들 구성 분포 탐색
# [2]barplot()을 활용한 팀별 성향 비교
# 
# 데이터 불러오기
# KBO 데이터 타자순위로 60명 2018.9.19일 까지 통계 반영

hit0<-read.csv("hit20180919.csv")
hit0

#타석당 타점

hit0$pparbi <- hit0$RBI/hit0$PA

hit1 <- hit0[order(hit0$pparbi, decreasing=T),]

head(hit1,5)

#전반적인 상관관계 확인
pairs(hit1[,4:7])
#타석이 많다고 타율이 자동적으로 높지는 않다.

#주요 관심 특정 변수를 활용한 scatterplot으로 대세 파악하기
plot(hit1$AVG, hit1$ISOP,
     cex=0.9, pch=19,
     col=ifelse(hit1$team=="두산","navy",
                ifelse(hit1$team=="SK", "red",
                       ifelse(hit1$team=="한화", "orange", "lightblue")
                )
     ),
     main="가을야구 Preview - stat a.o. 20180919",
     xlab="AVG",
     ylab="ISOP",
     sub="only high XR/PA hitters labeled")

# 선수 이름을 표시
# 타석 대비 득점 생산력이 높은 소수의 선수만 이름 표시
text(hit1$AVG,
     hit1$ISOP,
     labels=ifelse((hit1$XR/hit1$PA)>.17 & hit1$team %in% c("두산","SK","한화"),
                   as.character(hit1$name), ""),
     pos=3,
     cex=0.7)
abline(h=.28, lty=3)
abline(v=.32, lty=3)
#############################
# R 에서 오라클 데이터 읽어오기
#############################
# R에서 데이터베이스에 접속해서 데이터를 가져오는 방법은 2가지 정도.
# 1.자바의 기능을 이용한 것.
# 2.다른 언어의 기능을 사용하지 않고 순수 R의 패키지를 이용하는 방법.

# R에서는 Select 구문을 실행하는 경우 바로 data.frame으로 리턴.
# 관계형 데이터베이스의 데이터를 사용하는 것이
# 일반적인 프로그래밍 언어보다 편리.
############################################

#패키지 설치 및 드라이버 로딩

#자바의 JDBC룰 이용하기 위한 패키지 설정
install.packages("RJDBC")
install.packages("igraph")
#라이브러리 등록
library(RJDBC)
library(rJava)
library(igraph)

# 작업 디렉토리 안에 data 디렉토리에 ojdbc6.jar 파일이 존재
jdbcDriver <- JDBC(driverClass="oracle.jdbc.OracleDriver",
                   classPath="C:/Rwork/ojdbc6.jar")

#데이터베이스 연결
con<-dbConnect(jdbcDriver,
               "jdbc:oracle:thin:@localhost:1521:XE",
               "ohj",
               "920424")

# 데이터베이스 연결 종료
# dbDisconnect(con)

# dbGetQuery나 dbSendQuery를 이용해서
# 첫 번째 매개변수로는 데이터베이스 연결변수를 주고
# 두 번째 매개변수로는 select 구문을 주면 데이터를 가져온다.

# dbGetQuery는 data.frame을 리턴하고
# dbGetQuerty는 무조건 모든 데이터를 가져와서
# data.frame을 만들기 때문에 많은 양의 데이터가 검색된 경우
# 메모리 부족 현상을 일으킬 수 있다.

# 이런 경우에는 dbSendQuery를 이용해서
# 데이터에 대한 포인터만 가져온 후
# fetch(커서, n=1)을 이용해서

# 이런 경우에는 dbSendQuery를 이용해서 데이터에 대한 포인터만 가져온 후
# fetch(커서, n=1)을 이용해서
# n값으로 데이터 개수를 대입해서 필요한 만큼 데이터만 가져와서
# data.frame을 만들 수 있다.

# cursor는
# 데이터를 주고 다음으로 자동으로 넘어가는 특징을 가지고 있다.
# 하지만 전진만 하기 때문에 한 번 읽은 데이터를 다시 읽지 못한다.

# select 구문을 실행하고 저장하기
tablelists <- dbGetQuery(con,"select * from tab")

result <- dbGetQuery(con,"select * from DEPARTMENT")

result

#유형확인
class(result)

#실행 결과를 가지고 그래프를 그릴 수 있는 프레임으로 변환
g<-graph.data.frame(result, directed = T)

#관계도 작성
plot(g,
     layout=layout.fruchterman.reingold,
     vertex.size=8,
     edge.array.size=0.5)

#오라클 쿼리 실행(sqldf 패키지 )###########################
# 오라클 sql쿼리문을 이용하기 위한 패키지 설정
install.packages("sqldf")
#오라클 sql쿼리문을 이용하기 위한 라이브러리 등록
library(sqldf)
head(iris) #iris : 데이터 기본 제공 세트(예시)
sqldf("select Species from iris")

#head
head(iris)
sqldf("select * from iris limit 4")

#subset
subset(iris, Species %in% c("setosa"))
sqldf("select * from iris where Species in ('setosa')")

subset(iris, Sepal.Length >= 5 & Sepal.Length <= 5.2)
sqldf('select * from iris where "Sepal.Length" between 5 and 6')

 

#xml다루는 방법 json 다루는 방법
# 금일 날씨 xml
# http://www.kma.go.kr/weather/forecast/mid-term-xml.jsp?stnld=109

#json 샘플 데이터
#https://api.github.com/users/hadley/repos

###################
#XML 파싱
##################
# html 파싱과 동일
# XML은 엄격한 HTML이고 태그의 해석을 브라우저가 하지 않고
# 클라ㅣ언트가 직접 한다는 점이 HTML 과 다른 점
# 모든 HTML 파싱방법은 XML에 적용 가능
# XML 파싱 방법으로는 파싱하지 못하는 HTML이 있을 수 있다
# 
# 1. 태그 내용 가져오기
# 문자열을 가지고 올 주소를 생성
url <- 'http://www.weather.go.kr/weather/forecast/mid-term-xml.jsp?stnld=109'
url

#rvest 패키지 실행하기
#문자열 다운로드
weather<-read_html(url)
weather

tmn<-weather%>% html_nodes("tmn")%>%html_text()
tmn

# JSON 파싱
######################################
#jsonlite 패키지와 httr 패키지를 이용.
#frameJSON() 함수에 URL을 대입하면 data.frame으로 리턴

#즉, https://api.github.com/users/hadley/repos 데이터를
#data.frame으로 변환

#1.필요한 패키지 설치
install.packages("jsonlite")
install.packages("httr")

#2. 필요한 패키지 로드
rm(list=ls())

library(jsonlite)
library(httr)

#3.json데이터 가져오기
df<-fromJSON("https://api.github.com/users/hadley/repos")

head(df)

 

 

Markdown

# 09-6. 직업별 월급 차이
# - " 어떤 직업이 월급을 가장 많이 받을까 ?"
# 분석 절차
# 1. 변수 검토 및 전처리
# - 직업
# - 월급
# 2. 변수 간 관계 분석

class(welfare$code_job) # numeric 확인
table(welfare$code_job) # 각 빈도수 확인

# 2. 전처리
# 
# --> 직업 분류코드 목록 불러오기

library(readxl)

list_job <- read_excel("C:\\rStudy\\20200402\\Koweps_Codebook.xlsx", col_names =T, sheet=2)

# 컬럼이름을 헤더값으로 불러온다 # sheet 2번을 불러온다.

head(list_job)
dim(list_job)

welfare <- left_join(welfare, list_job, id="code_job")

# id가 code_job을 기준으로 원래 welfare 파일과 list_job 파일을 join 시키라는 의미
# welfare라는 DF 에도 code_job 이라는 컬럼이 있고, list_job도 code_job 컬럼이 있다.
# 공통적인 기준 필드가 되어서 이 컬럼을 기준으로 합친다.
# welfare의 code_job 컬럼 중 첫 번쨰 값이 942면, list_job의 942와 일치하는 것을
# 찾아서 맞는 값을 넣어준다. 만약 값이 없다면 Na값이 들어가고
# 반대로 welfare에는 없는데 list_job 에는있다면 값이 삽입되지 않는다.
# (left_join 이므로) - 왼쪽 파일을 기준으로 잡는다.
welfare %>% 
  filter(!is.na(code_job)) %>% 
  select(code_job, job) %>% 
  head(10)

# 1. 직업별 월급 평균표 만들기

job_income <- welfare %>% 
  filter(!is.na(job) & !is.na(income)) %>% 
  group_by(job) %>% 
  summarise(mean_income = mean(income))

# 2. 상위 10개 추출

top10 <- job_income %>% 
  arrange(desc(mean_income)) %>% 
  head(10)

# 3. 그래프 만들기

ggplot(data=top10, aes(x = reorder(job, mean_income), y=mean_income)) +
    geom_col() +
  coord_flip() # 이걸 빼면 막대가 세로로 그려진다

# 4. 하위 10 추출
bottom10 <- job_income %>% 
   arrange(mean_income) %>%
  head(10)

# 5. 그래프 만들기

ggplot(data=bottom10, aes(x = reorder(job, -mean_income), y=mean_income)) +
    geom_col() +
  coord_flip() + # 이걸 빼면 막대가 세로로 그려진다
  ylim(0, 850) # 상위 10개 직업의 연봉과 축을 동일시하기 위해서 맞춤

# 09-7. 성별 직업 빈도
# 
# - "성별로 어떤 직업이 가장 많을까?"
# 
# ​
# 
# 분석 절차
# 
# 1. 변수 검토 및 전처리
# 
# - 성별
# 
# - 직업
# 
# 2. 변수 간 관계 분석
# 
# - 성별 직업 빈도표 만들기
# 
# - 그래프 만들기
# 
# ​
# 
# 1. 성별 직업 빈도표 만들기

#남성 직업 빈도 상위 10개 추출

job_male <- welfare %>% 
  filter(!is.na(job) & sex == "male") %>% # 전체중에 직업 컬럼에서 na가 없는 애들& 성별이 남자인 애들
  group_by(job) %>% # 직업별로 그룹을 지정(직업군에 따른 남자의 합산 결과)
  summarise(n = n()) %>% 
  arrange(desc(n)) %>%
  head(10)

# 여성 직업 빈도 상위 10개 추출

job_female <- welfare %>% 
  
  filter(!is.na(job) & sex == "female") %>% 
  
  group_by(job) %>% # 직업별로 그룹을 지정(직업군에 따른 여자의 합산 결과)
  
  summarise(n = n()) %>% 
  
  arrange(desc(n)) %>% 
  
  head(10)
# 2. 그래프 그리기

# 남자 그래프

ggplot(data = job_male, aes(x = reorder(job, n), y=n)) +
  
  geom_col() +
  
  coord_flip()

#여성 그래프

ggplot(data = job_female, aes(x = reorder(job, n), y=n)) +
  
  geom_col() +
  
  coord_flip()

# 09-8. 종교 유무에 따른 이혼율
# 
# -"종교가 있는 사람들이 이혼을 덜 할까?"
# 
# 분석 절차
# 
# 1. 변수 검토 및 전처리
# 
# - 종교
# 
# - 혼인 상태
# 
# 2. 변수 간 관계 분석
# 
# - 종교 유무에 따른 이혼율 표 만들기
# 
# - 그래프 만들기
# 
# ​
# 
# 1. 변수 검토하기

class(welfare$religion) # numeric

table(welfare$religion) # 1 : 8047, 2 : 8617



# 2. 전처리

# 종교 유무 이름 부여

welfare$religion <- ifelse(welfare$religion == 1, "yes", "no")

table(welfare$religion) # no : 8617, yes : 8047


# 
# 혼인 상태 변수 검토 및 전처리하기
# 
# 1. 변수 검토하기

class(welfare$marrige) # numeric


# 2. 전처리

# 이혼 여부 변수 만들기

welfare$group_marriage <- ifelse(welfare$marrige == 1, "marriage",
                                 
                                 ifelse(welfare$marrige == 3, "divorce", NA))


# 3. 그래프 그리기

qplot(welfare$group_marriage)
# 
# 종교 유무에 따른 이혼율 분석하기
# 
# 1. 종교 유무에 따른 이혼율 표 만들기

religion_marriage <- welfare %>% 
  
  filter(!is.na(group_marriage)) %>% 
  
  summarise(n = n()) %>%  # 개수 뽑기
  
  mutate(tot_group = sum(n)) %>% 
  
  mutate(pct = round(n/tot_group*100, 1))

#count() 활용

religion_marriage <- welfare %>% 
  
  filter(!is.na(group_marriage)) %>% 
  
  count(religion, group_marriage) %>% 
  
  group_by(religion) %>% 
  
  mutate(pct=round(n/sum(n)*100,1))

# 2. 이혼율 표 만들기

#이혼 추출

divorce <-religion_marriage %>% 
  
  filter(group_marriage == "divorce") %>% 
  
  select(religion, pct)

# 3. 그래프 만들기 

ggplot(data = divorce, aes(x=religion, y=pct)) + geom_col()
# 
# 연령대 및 종교 유무에 따른 이혼율 분석하기
# 
# 1. 연령대별 이혼율 표 만들기

ageg_marriage <- welfare %>% 
  
  filter(!is.na(group_marriage)) %>% 
  
  group_by(ageg, group_marriage) %>% 
  
  summarise(n = n()) %>% 
  
  mutate(tot_group = sum(n)) %>% 
  
  mutate(pct = round(n/tot_group*100, 1))

#count() 활용

ageg_marriage <- welfare %>% 
  
  filter(!is.na(group_marriage)) %>% 
  
  count(ageg, group_marriage) %>% 
  
  group_by(ageg) %>% 
  
  mutate(pct = round(n/sum(n)*100, 1))
# 2. 연령대별 이혼율 그래프 만들기

# 초년 제외, 이혼 추출

ageg_divorce <- ageg_marriage %>% 
  
  filter(ageg != "young" & group_marriage == "divorce") %>% 
  
  select(ageg, pct)
# 그래프 만들기

ggplot(data = ageg_divorce, aes(x=ageg, y=pct)) +geom_col()


# 3. 연령대 및 종교 유무에 따른 이혼율 표 만들기

# 연령대, 종교유무, 결혼상태별 비율표 만들기

ageg_religion_marriage <- welfare %>% 
  
  filter(!is.na(group_marriage) & ageg != "young") %>% 
  
  group_by(ageg, religion, group_marriage) %>% 
  
  summarise(n = n()) %>% 
  
  mutate(tot_group = sum(n)) %>% 
  
  mutate(pct = round(n/tot_group*100,1)) # pct 는 % 약자
# count() 활용

ageg_religion_marriage <- welfare %>% 
  
  filter(!is.na(group_marriage) & ageg != "young") %>% 
  
  count(ageg, religion, group_marriage) %>% 
  
  group_by(ageg, religion) %>% 
  
  mutate(pct = round(n/sum(n)*100, 1))

# 연령대 및 종교 유무별 이혼율 표 만들기

df_divorce <- ageg_religion_marriage %>% 
  
  filter(group_marriage == "divorce") %>% 
  
  select(ageg, religion, pct)

# 4. 연령대 및 종교 유무에 따른 이혼율 그래프 만들기

ggplot(data = df_divorce, aes(x=ageg, y=pct, fill = religion)) +
  
  geom_col(position = "dodge")

# 09-9. 지역별 연령대 비율
# 
# - " 노년층이 많은 지역은 어디일까?"
# 
# 1. 변수 검토 및 전처리
# 
# - 지역
# 
# - 연령대
# 
# 2. 변수 간 관계 분석
# 
# - 지역별 연령대 비율
# 
# - 그래프 만들기
# 
# ​
# 
# [지역(code_region) 별 연령대 비율 분석하기]
# 
# 1 "서울",
# 
# 2 "수도권(인천/경기",
# 
# 3 "부산/경남/울산",
# 
# 4 "대구/경북",
# 
# 5 "대전/충남",
# 
# 6 "강원/충북",
# 
# 7 "광주/전남/전북/제주도"

​

# 1. 지역 변수 검토하기

table(welfare$code_region) # 1, 2, 3, 4번 등 각 지역 빈도수 확인

class(welfare$code_region) # character

table(welfare$age) # 나이 빈도수 확인

​

# 2. 전처리

list_region <- data.frame(code_region=c(1:7),
                          
                          region = c("서울",
                                     
                                     "수도권(인천/경기",
                                     
                                     "부산/경남/울산",
                                     
                                     "대구/경북",
                                     
                                     "대전/충남",
                                     
                                     "강원/충북",
                                     
                                     "광주/전남/전북/제주도"))


welfare <- left_join(welfare, list_region, id="code_region")

​

welfare %>% 
  
  select(code_region, region) %>% 
  
  head # 잘 실행 되었는지 확인하는 코드

# 1. 지역별 연령대 비율 표 만들기

region_ageg <- welfare %>% 
  
  group_by(region, ageg) %>% 
  
  summarise(n=n()) %>% 
  
  mutate(tot_group = sum(n)) %>% 
  
  mutate(pct=round(n/tot_group*100,2))

​

head(region_ageg)

# fct 의 의미는 factor 의 약자.(팩터형을 의미함)

​

#count() 활용

region_ageg <- welfare %>% 
  
  count(region, ageg) %>% 
  
  group_by(region) %>% 
  
  mutate(pct = round(n/sum(n)*100,2))

# 2. 그래프 만들기

ggplot(data = region_ageg, aes(x=region, y=pct, fill=ageg))+
  
  geom_col()+
  
  coord_flip()

# 3. 막대 정렬하기 : 노년층 비율 높은 순

#노년층 비율 내림차순 정렬

list_order_old <- region_ageg %>% 
  
  filter(ageg == "old") %>% 
  
  arrange(pct)

# 지역명 순서 변수 만들기

order <- list_order_old$region

​

# 4. 그래프 그리기

ggplot(data = region_ageg, aes(x = region, y=pct, fill=ageg)) +
  
  geom_col()+
  
  coord_flip()+
  
  scale_x_discrete(limits=order)



#####################################################
# 주제 : 지하철역 주변 아파트 가격 알아보기

#-------------------------------------------------------
# 내용 :
# 지하철 주변의 아파트 시세를 알아보고
# 지하철역에서 아파트까지의 거리에 따라
# 가격분포가 어떻게 다른 지를 비교.

#-------------------------------------------------------
# 결과 시각화 :
# 구글 지도를 활용하여 서울시 지도에 
# 지하철역과 주변 아파트 실거래가 표시

#-------------------------------------------------------
# 주의 사항
# Google Map Platform 출시로 인해 ggmap 패키지 변경됨

# 구글 API 키가 반드시 필요.
# googleAPIkey = "본인의 API 키 입력"

#-------------------------------------------------------
# 활용 데이터 

# 지하철역 주소 정보 : 서울 열린 데이터 광장
# URL : http://data.seoul.go.kr
# URL2 : http://data.seoul.go.kr/dataList/datasetView.do?infId=OA-12035&srvType=S&serviceKind=1

# 국토교통부 실거래가 공개 시스템
# URL : http://rtdown.molit.go.kr

# Google Maps Platform
# URL : https://cloud.google.com/maps-platform




#####################################################
# 1. 공공데이터 다운로드
# 1-1. 지하철역 정보 다운로드 및 전처리
# 1-2. 아파트 실거래가
# 1-3. 구글 지도 정보

# 2. 지하철역 데이터 가공하기
# 2-1. 원시 데이터 가져오기
# 2-2. 지하철역 좌표 정보 구하기

# 3. 아파트 실거래가 데이터 가공하기
# 3-1. 전용면적별 거래 가격
# 3-2. 아파트 단지별 평균 거래 금액
# 3-3. 시군구와 번지를 하나로 합치기
# 3-4. 좌표 정보 추가 후, 최종 데이터 만들기

# 4. 아파트 실거래가 데이터 가공하기
# 4-1. 마포구 지도 가져오기
# 4-2. 지하철역 위치 및 아파트 가격 정보 표시하기

##########################################################

#install_github() 사용을 위한 devtools 설치 및 로드 
install.packages("devtools") #깃헙에 올라온 패키지들을 받으려면 devtools 라는 패키지가 필요하기 때문에 먼저 설치해준다.
library(devtools)

# github에서 ggmap 패키지 설치 및 로드 
install.github("dkahle/ggmap") # devtools 가 있어야 이 패키지를 다운받을 수 있다.

# 또는 install.packages("ggmap") : 이 의미는 미러사이트를 통해서 설치하겠다는 의미
library(ggmap)

# dplyr 패키지 설치 및 로드 
install.packages("dplyr")
library(dplyr) 

#####################################################
# 2. 지하철역 데이터 가공하기

#-------------------------------------------------------
# 2-1. 원시 데이터 가져오기
# csv 파일을 가져와서 station_data 변수에 할당

#실시간 금액은 국민은행에서 공시지가를 다운받아서 넣어야 함
station_data <- read.csv("C:\\Rwork\\역별_주소_및_전화번호.csv")

# station_data의 "구주소"컬럼 속성 : Factor
# station_data 속성 확인

str(station_data) # factor 타입

#-------------------------------------------------------
# 2-2. 지하철역 좌표 정보 구하기

# as.character() 함수로 문자형으로 변환한 후 station_code에 할당
station_code <- as.character(station_data$"구주소")

# google api key 등록
googleAPIkey <- "AIzaSyC8BVOCtGMXacY8URBfmH1SWiYIErRWJ5M"
register_google(googleAPIkey)

# geocode() 함수로 station_code 값을 위도와 경도로 변환
station_code <- geocode(station_code) # 여기가 5분정도 시간 걸리는 부분

# station_code 데이터 앞부분 확인
head(station_code) # 여기까지가 2-2번 작업 완료

#------------------------------------------------------------------
# 일부 데이터가 NA 값으로 나올 경우에는
# 아래처럼 인코딩을 변경하여 다시 좌표정보를 구한다.

# 2-3. 지하철역 좌표 정보 구하기

# 문자형으로 변환하고 utf8로 변환한 후 위도와 경도로 변환
# 51개의 주소값을 utf8로 변환하고 geocode() 로 전달한다.
# geocode() 함수에 의해서 위도, 경도에 의한 값이 다시 모두 꺼내진다.
station_code <- as.character(station_data$"구주소") %>% enc2utf8() %>% geocode()

# station_code 데이터 앞부분 확인
head(station_code)

#------------------------------------------------------------------
# 기존 station_data 에 위도/경도 정보를 추가.
# station_data와 station_code를 합친 후 station_code_final 에 할당
station_code_final <- cbind(station_data, station_code)

# station_code_final 의 앞부분 확인
head(station_code_final)


####################################
# 3. 아파트 실거래가 데이터 가공하기
#--------------------------------------------
# 3-1. 전용 면적별 거래 가격

# csv 파일을 가져와서 apart_data변수에 할당
apart_data <- read.csv("C:\\rwork\\아파트_실거래가.csv")

#apart_data 앞부분 데이터 확인
head(apart_data)

#ceiling() / floor()
# 전용면적의 값을 반올림하여 정수로 표현
apart_data$전용면적 = round(apart_data$전용면적)

# 데이터 앞부분 확인
head(apart_data)


#count() : 지정한 집단별 행의 갯수
# count(데이터셋, 컬럼명)
# arrange() : 기본형(오름차순) / arrange(desc()) 를 이용하면 내림차순 정렬 가능

# 전용면적을 기준으로 빈도를 구한 후 빈도에 따라 내림차순 정렬
count(apart_data, 전용면적) %>% arrange(desc(n))

# 전용면적이 85인 데이터만 추출하여 apart_data_85에 할당
apart_data_85 <- subset(apart_data, 전용면적="85") #subset은 ifelse 가 필요없다. 딱 맞는 값만 꺼내주기 때문.

#----------------------------------------------
# 3-2. 아파트 단지별 평균 거래 금액

# 쉼표를 공백("")으로 대체하여 제거
apart_data_85$거래금액 <- gsub(",", "", apart_data_85$거래금액)

# 결과 확인하기
head(apart_data_85)

# 거래 금액을 정수형으로 변환하여 : as.integer(거래금액)
# 단지명별 평균을 구한 후, mean(as.integer(거래금액)~단지명) # 평균 거래값
# apart_data_85_cost 변수에 할당.
# aggregate() : R 내장 함수. 그룹별로 묶어서 연산할 때 사용. # group_by 라는 함수는 필요없게 된다.
# aggregate(집계할 내용, 데이터셋, 집계함수)
# 집계할 내용 : 연산컬럼명~기준컬럼명
apart_data_85_cost <- aggregate(as.integer(거래금액)~단지명,
                                apart_data_85,
                                mean)

# "as.integer(거래금액)"을
# "거래금액"으로 변경하여 저장
# rename(데이터 셋, "변경 후 이름" = "변경 전 이름")
apart_data_85_cost <- rename(apart_data_85_cost,
                             "거래금액" = "as.integer(거래금액)")

# 단지명이 중복된 행을 제거하고, duplicated(apart_data_85$단지명)
# apart_data_85 에 저장
# duplicated() : 중복 행 제거 함수
#                           중복 된 값(TRUE) / 처음 나오는 값(FALSE)
#                            FALSE 에 해당하는 값들을 배열로 반환
apart_data_85 <- apart_data_85[!duplicated(apart_data_85$단지명),]

#결과 확인하기
head(apart_data_85)

# "단지명"을 기준으로
# 중복 제거한 데이터셋(apart_data_85)에
# 평균 거래 금액 데이터 셋(apart_data_85_cost) 합치기
# 이 때 left_join() 함수를 사용.
# left_join(데이터 셋, 데이터 셋, 기준컬럼)
# 합한 후, 동일한 컬럼명이 존재할 경우,
# 컬럼명_x, 컬럼명_y 형태로 자동 구분.
# head(apart_data_85_cost) : 컬럼명 확인
# 
# head(apart_data_85) : 컬럼명 확인 

apart_data_85 <- left_join(apart_data_85,
                           apart_data_85_cost,
                           by="단지명")

#결과 확인하기
head(apart_data_85)

# 평균 거래금액("거래금액.y")을 이용하여 시각화 작업을 할 예정.
# "단지명", "시군구", "번지", "전용면적", "거래금액.y" 만 추출하고 저장

apart_data_85 <- apart_data_85 %>% select("단지명",
                                         "시군구",
                                          "번지",
                                          "전용면적",
                                          "거래금액.y")

#-------------------------------------------------------------

# 3-3. 시군구와 번지를 하나로 합치기

# 테스트 코드
# "시군구"와 "번지"열을 합친 후, : paste(컬럼명, 컬럼명)
# apart_address에 저장
# 주의 사항 : paste() 함수를 이용하면 컬럼과 컬럼 사이에 공백 발생.
# 공백 없이 합할 경우 : paste0() 함수를 사용.
#시군구와 번지를 합친 것을 데이터프레임 형태로 생성하고 그 값을 apart_address 로 할당
apart_address <- paste(apart_data_85$시군구,
                       apart_data_85$번지) %>% data.frame()

#"," 을 "주소"로 변경하여 저장
apart_address <- rename(apart_address, "주소"=".")


# 결과 확인하기
head(apart_address)

#------------------------------------------------------------

# 3-4. 좌표 정보 추가 후, 최종 데이터 만들
# 아파트 주소를 위/경도로 변환하여
# apart_address_code 에 저장

apart_address_code <- as.character(apart_address$"주소") %>% enc2utf8() %>% geocode()

View(apart_address_code)

# 데이터 세트를 합친 후,
# apart_data_85 : 단지명, 전용면적, 거래금액(평균거래금액) 추출
# apart_address : 주소 추출
# apart_address_code : 위도, 경도 추출
# 일부 열만 apart_code_final에 저장


apart_code_final <- cbind(apart_data_85,
                          apart_address,
                          apart_address_code) %>% select("단지명",
                                                         "전용면적",
                                                         "거래금액",
                                                        "주소",
                                                         lon, lat)
head(apart_code_final)


######################################
# 4. 구글 지도에 지하철역과 아파트 가격 표시하기
#--------------------------------------------------------
# 4-1. 마포구 지도 가져오기
# 마포구 지도 정보를 가져와 mapo_map에 저장

mapo_map <- get_googlemap("mapogu", #마포구를 검색
                          maptype = "roadmap", # 도로지도를 요청
                          zoom=12) # zoom=12 를 안쓰면 완전히 축소해서 출력함(12배 확대한다고 설정)

# 구글 지도 호출
ggmap(mapo_map)

# 4-2. 지하철역 위치 및 아파트 가격 정보 표시하기

# ggplot2 패키지 설치

install.packages("ggplot2")

# ggplot2 패키지 로드

library(ggplot2)

# 지하철역 위치 표시 및 역명 표시
ggmap(mapo_map) +                                      # 지도를 먼저 그리고
  geom_point(data = station_code_final,    # 빨간 점으로 위도경도값을 찍어주고
             aes(x=lon, y=lat),
             colour = "red",
             size=3) +
  geom_text(data = station_code_final,       # 그 위에다가 글씨를 쓰라는 의미
            aes(label = 역명, vjust = -1))
# -1이 역명이 위에 찍힐지 아래에 찍힐지를 정하는 기능임.(geom_text 함수를 help로 찾아서 옵션값이 어느 것을 허용하는지 찾아봐야 함)
# v(버티컬) hjust(호리즌탈), 0으로 하면 빨간색 위치, 1로하면 반대로
# 홍대입구역 지도 정보를 가져와 hongdae_map 변수에 저장

hongdae_map <- get_googlemap("hongdae station",
                             
                             maptype = "roadmap",
                             
                             zoom=15)

ggmap(hongdae_map) # 그냥 단순 맵 출력

#홍대입구역 지도에 지하철 정보 및 아파트 정보 일괄 표시
ggmap(hongdae_map) +
  
  geom_point(data = station_code_final,
             aes(x = lon, y=lat),
             colour = "blue",
             size=6) +
  
  geom_text(data = station_code_final,
            aes(label = 역명, vjust = -1), colour = "red")+
  
  geom_point(data = apart_code_final,
             aes(x = lon, y=lat)) +
  
  geom_text(data = apart_code_final,
            aes(label=단지명, vjust=-1), colour = "red")+
  
  geom_text(data = apart_code_final,
            aes(label = 거래금액, vjust=1), colour="red")

텍스트 마이닝

-문자로된 데이터에서 가치 있는 정보를 얻어내는 분석 기법

-SNS나 웹 사이트에 올라온 글을 분석해 사람들이 어떤 이야기를 나누고 있는지 파악할 때 활용

-형태소 분석 : 문장을 구성하는 어절들이 어떤 품사로 되어있는지 분석

 

분석절차

형태소 분석 

-명사, 동사 형용사등을 의미를 지닌 품사 단어 추출

-빈도표 만들기

-시각화

 

힙합 가사 텍스트 마이닝

텍스트 마이닝 준비하기

텍스트 다운로드 및 설치

 

install.packages("KoNLP") 인스톨이 안될 때

#스칼라 파일 

https://www.facebook.com/notes/r-korea-krugkorean-r-user-group/konlp-%EC%84%A4%EC%B9%98-%EC%9D%B4%EC%8A%88-%EA%B3%B5%EC%9C%A0/1847510068715020/

 

KoNLP 설치 이슈 공유 | Facebook

안녕하세요, 현재 코드 내부적인 이슈로 KoNLP 패키지가 cran에서 내려져 있습니다. github 버전으로 설치해야 해서 해당 내용을 공유합니다. (최초 아카이브 버전을 공유했었는데, 설치가 제대로 진행되지 않는 이슈가 있어서 수정합니다.) 아래 코드에서 의존성 패키지들이 설치 되지 않고 에러가 발생할 수도 있습니다만, 아래와 같이 에러 메세지에서 출력되는 의존성 패키지들을 먼저 설치후에 실행하시면 됩니다. rJava를 설치하는 방법과 함께 공유합니다

www.facebook.com

C:\R\R-3.6.3\library\KoNLP\java

scala-library-2.11.8.jar
5.48MB

 

https://github.com/cardiomoon/kormaps2014/blob/master/kormaps2014.Rmd

install.packages('rJava')
install.packages('stringr')
install.packages('hash')
install.packages('Sejong')
install.packages('RSQLite')
install.packages('devtools')
install.packages('dplyr')

install.packages('tau')

install.packages("multilinguer")
library(multilinguer)
install_jdk()
install.packages(c('stringr', 'hash', 'tau', 'Sejong', 'RSQLite', 'devtools'), type = "binary")
install.packages("remotes")
remotes::install_github('haven-jeon/KoNLP', upgrade = "never", INSTALL_opts=c("--no-multiarch"))

install.packages("https://cran.r-project.org/src/contrib/Archive/KoNLP/KoNLP_0.80.2.tar.gz", repos = NULL, type="source")
#패키지 설치
install.packages("rJava")
install.packages("memoise")
install.packages("KoNLP")
#########라이브러리 로드 해보고 없으면 인스톨

#패키지 로드
library(KoNLP)
library(dplyr)

#패키지 로드 에러 발생할 경우 - java 설치 경로 확인 후 경로 설정
# java 폴더 경로 설정
Sys.setenv(JAVA_HOME="C:/Program Files/Java/jdk1.8.0_171")

#사전 설정하기
useNIADic()

#데이터 준비
#데이터 불러오기
txt <- readLines("hiphop.txt")

head(txt)

#특수문자 제거
install.packages("stringr")

#일단 먼저 로드 해보고 없으면 인스톨 하기
library(stringr)

#특수문자 제거
txt <- str_replace_all(txt, "\\W", " ") # 모든 특수기호를 찾아서 공백 처리
head(txt)
class(txt)
dim(txt)
View(txt)

#명사 추출하기
extractNoun("대한민국의 영토는 한반도와 그 부속 도시로 한다.")
#가사에서 명사 추출
nouns<-extractNoun(txt)
#추출한 명사 리스트를 문자열 백터로 변환, 단어별 빈도표 생성
wordcount<-table(unlist(nouns))

#자주 사용된 단어 빈도표 만들기
#데이터 프레임으로 변환
df_word<-as.data.frame(wordcount,stringsAsFactors = F)

#변수명 수정
df_word<-rename(df_word,
                word=Var1,
                freq=Freq)
#두 글자 이상 단어 추출
df_word<-filter(df_word,nchar(word)>=2)
top_20<-df_word%>%
        arrange(desc(freq))%>%
        head(20)

#워드 클라우드 만들기
#패키지 패키지 설치
#패키지 설치
install.packages("wordcloud")
#패키지 로드
library(wordcloud)
library(RColorBrewer)
#단어 색상 목록 만들기
pal<-brewer.pal(8,"Dark2") #다크2 색상 목록에 8개 색상 추출

#워드 클라우드 생성
set.seed(1234)#난수 고정
wordcloud(words = df_word$word,#단어
          freq = df_word$freq,#빈도 freq
          min.freq = 2,#최소 단어 빈도
          max.words = 200,#표현단어 수
          random.order = F,#고빈도 단어 중앙배치
          rot.per=.1,#회전 단어 비율
          scale = c(4,0.3),#단어 크기 범위
          colors = pal) #색상 목록

#상위 20개만 가져오기
wordcloud(words = top_20$word,#단어
          freq = top_20$freq,#빈도 freq
          min.freq = 2,#최소 단어 빈도
          max.words = 200,#표현단어 수
          random.order = F,#고빈도 단어 중앙배치
          rot.per=.1,#회전 단어 비율
          scale = c(4,0.3),#단어 크기 범위
          colors = pal) #색상 목록

#여고생을 고민거리로 만드시오(호지수씨 왈)
#패키지 설치
install.packages("rJava")
install.packages("memoise")
install.packages("KoNLP")
#########라이브러리 로드 해보고 없으면 인스톨

#패키지 로드
library(KoNLP)
library(dplyr)

#패키지 로드 에러 발생할 경우 - java 설치 경로 확인 후 경로 설정
# java 폴더 경로 설정
Sys.setenv(JAVA_HOME="C:/Program Files/Java/jdk1.8.0_171")

#사전 설정하기
useNIADic()

#데이터 준비
#데이터 불러오기
txt <- readLines("C:/rStudy/20200403/remake.txt")

head(txt)

#특수문자 제거
install.packages("stringr")

#일단 먼저 로드 해보고 없으면 인스톨 하기
library(stringr)

#특수문자 제거
txt <- str_replace_all(txt, "\\W", " ") # 모든 특수기호를 찾아서 공백 처리 # gsub 함수와 동일한 역할을 해준다.
head(txt)

class(txt) # character 문자열 확인
dim(txt) # NULL 확인

View(txt) # 4261 번 행까지 만들어진다.


#가장 많이 사용된 단어 알아보기

#고민글에서 명사추출
nouns <- extractNoun(txt)
class(nouns) # list
dim(nouns) # NULL
View(nouns)

# 추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성
# 리스트타입은 테이블 함수 사용 못한다. 그래서 리스트를 풀어줘야 한다. 이 때, 사용하는 함수가 [unlist] 함수
wordcount <- table(unlist(nouns))
class(wordcount) # table

# 자주 사용된 단어 빈도표 만들기
df_word <- as.data.frame(wordcount, stringsAsFactors = F) # wordcount(스트링)의 팩터값을 없앤다, 데이터프레임으로 변환한다.
class(df_word) # data.frame
dim(df_word) # 3008 , 2
summary(df_word)

# 변수명 수정
df_word <- rename(df_word,
                  word = Var1,
                  freq = Freq)

# 두 글자 이상 단어 추출
df_word <- filter(df_word, nchar(word) >= 2) # df_word 에서 word 컬럼 데이터 중에 글자의 개수가 2개 이상인 것만 filter로 걸러낸다.
class(df_word) # data.frame
dim(df_word) # 2508, 2
summary(df_word)


#빈도수를 기준으로 빈도수가 높은 상위 20개만 꺼내온다.(freq 컬럼을 이용해서 내림차순으로 정렬)
top_50 <- df_word %>% 
  arrange(desc(freq)) %>% 
  head(50)
class(top_50)
dim(top_50)
summary(top_50)
str(top_50)

# 패키지 준비하기
# 패키지 설치(로드 먼저 해보고 설치)
install.packages("wordcloud")

#패키지 로드
library(wordcloud)
library(RColorBrewer)

# 단어 색상 목록 만들기
pal <- brewer.pal(8, "Dark2") # Dar2 색상 목록에서 8개 색상 추출

set.seed(1234)                  #난수 고정
wordcloud(words= top_50$word,   # 단어
          freq = top_50$freq,  # 빈도
          min.freq = 2,         # 최소 단어 빈도
          max.words = 200,      # 표현 단어 수
          random.order = F,     # 고빈도 단어 중앙 배치
          rot.per = .1,         # 회전 단어 비율
          scale = c(4, 0.3),    # 단어 크기 범위
          colors = pal)         # 색상 목록

#국정원 트윗 텍스트 마이닝
#국정원계정 트윗 데이터
# 국정원 대선 개입 사실이 밝혀져 논란이 됐던 2013년 6월, 독립 언론 뉴스타파가 인터넷을 통해
# 국정원 계정으로 작성된 3744개 트윗

#데이터 로드
twitter<-read.csv("twitter.csv",
                  header = T,
                  stringsAsFactors = F,
                  fileEncoding = "UTF-8")
#변수명 수정
twitter<-rename(twitter,
                no=번호,
                id=계정이름,
                date=작성일,
                tw=내용)

#특수 문자 제거
twitter$tw <- str_replace_all(twitter$tw, "\\W", " ")
head(twitter$tw)

#단어 빈도표 만들기
#트윗에서 명사 추출
nouns<-extractNoun(twitter$tw)

#추출한 명사 list를 문자열 백터로 변환, 단어별 빈도표 생성
wordcount<-table(unlist(nouns))

#데이터 프레임으로 변환
df_word<-as.data.frame(wordcount,stringsAsFactors = F)

#변수명 수정
df_word<-rename(df_word,
                word=Var1,
                freq=Freq)

# 두 글자 이상 단어 추출
df_word <- filter(df_word, nchar(word) >= 3) # df_word 에서 word 컬럼 데이터 중에 글자의 개수가 3개 이상인 것만 filter로 걸러낸다.
class(df_word) # data.frame
dim(df_word)  # 4921 2
summary(df_word)

top_40<-df_word%>%
  arrange(desc(freq))%>%
  head(40)

# 단어 색상 목록 만들기
pal <- brewer.pal(8, "Dark2") # Dar2 색상 목록에서 8개 색상 추출

set.seed(1234)                  #난수 고정
#상위 40개만 가져오기
wordcloud(words = top_40$word,#단어
          freq = top_40$freq,#빈도 freq
          min.freq = 2,#최소 단어 빈도
          max.words = 200,#표현단어 수
          random.order = F,#고빈도 단어 중앙배치
          rot.per=.1,#회전 단어 비율
          scale = c(4,0.4),#단어 크기 범위
          colors = pal) #색상 목록


#
install.packages("wordcloud2")
install.packages("tm")
library(devtools)
library(htmlwidgets)
library(htmltools)
library(jsonlite)
library(yaml)
library(base64enc)
library(tm)
library(wordcloud2)


#워드 클라우드 그리기(기본)
wordcloud2(top_40)

#3.1 클라우드 2 크기 , 색변경
wordcloud2(top_40, size=0.5, col="random-dark")

#3.2키워드 회전 정도 조절
wordcloud2(top_40, size=0.5, col="random-dark", rotateRatio=0)

#3.3배경 색 검정
wordcloud2(top_40, size=0.5, col="random-dark", backgroundColor="black")

# 특정 개수 이상 추출되는 글자만 색깔을 변경하여 나타나도록
# https://html-color-codes.info/Korean/

#사이값 지정시 : (weight > 800 && weight <1000)
# 100개 이상 검색될 시 노랑, 아니면 초록으로 표현
In_out_colors = "function(word, weight){
                    return(weight > 100) ? '#F3EF12':'#1EC612'}"

#워드클라우드2 그리기
library(wordcloud2)
#기존 모형으로 워드클라우드 2 생성
#모양 선택 : shape= 'circle','cardioid',diamond,triangle-forward,triangle,pentagon,star

wordcloud2(df_word,
           shape = 'star',
           size = 0.8,
           color = htmlwidgets::JS(In_out_colors),
           backgroundColor = "black")

########################################

#단계 구분도
#-지역별 통계치를 색깔의 차이로 표현한 지도
#-인구나 소득같은 특성이 지역별로 얼마나 다른지쉽게 이해할 수 있음

#패키지 준비하기
install.packages("ggiraphExtra")
library(ggiraphExtra)
#구조 확인
str(USArrests)
head(USArrests)

library(tibble)

#행 이름을 state 변수로 바꿔 데이터 프레임 생성
crime<-rownames_to_column(USArrests, var="state")

View(crime)

#지도 데이터와 동일하게 맞추기 위해 state의 값을 소문자로 수정
crime$state <- tolower(crime$state)

#tibble(티블)은 행 이름을 가질 수 있지만(예:일반 데이터 프레임에서 변환할 때)
#연산자로 서브 셋팅할 때 제거됩니다
#null이 아닌 행 이름을 티블에 지정하려고 하면 경고가 발생합니다
#일반적으로 행 이름은 기본적으로 다른 모든 열과 의미가 다른 문자 열이므로 행 이름을
#사용하지 않는 것이 가장 좋습니다
#이러한 함수를 사용하면
#데이터프레임에 행이름(has_rownames())이 있는지 감지하거나,
#제거하거나(remove_rownames())
#명시적 열(rownames_to_column()및 column_to_rownames())사이에서 앞뒤로 변환 할 수 있습니다.
#rowid_to_column()도 포함되어 있습니다
#이것은 1부터 시작하여 순차적인 행 id를 오름차순으로 하는 데이터 프레임의 시작 부분에
# 열을 추가합니다. 기존 행 이름이 제거됩니다.

#미국 주 지도 데이터 준비하기
install.packages("maps")
library(ggplot2)
states_map<-map_data("state")
str(states_map)

install.packages("mapproj")
#단계 구분도 만들기
ggChoropleth(data= crime, # 지도에 표현할 데이터
             aes(fill=Murder, #색깔로 표현할 변수
                 map_id=state),#지역기준변수
                  map=states_map)#지도데이터

#인터랙티브 단계 구분도 만들기
ggChoropleth(data= crime, # 지도에 표현할 데이터
             aes(fill=Murder, #색깔로 표현할 변수
                 map_id=state),#지역기준변수
             map=states_map,#지도데이터
             interactive = T)#인터렉티브

# 대한민국 시도별 인구 단계 구분도 만들기
#패키지 준비하기
install.packages("stringi")
install.packages("devtools")
#https://github.com/cardiomoon/kormaps2014/blob/master/kormaps2014.Rmd
devtools::install_github("cardiomoon/kormaps2014")
library(kormaps2014)

#대한민국 시도별 인구 데이터 준비하기
str(changeCode(korpop1))

library(dplyr)
korpop1<-rename(korpop1,
                pop=총인구_명,
                name=행정구역별_읍면동)
str(changeCode(kormap1))


library(mapproj)
#인터랙티브 단계 구분도 만들기
ggChoropleth(data= korpop1, # 지도에 표현할 데이터
             aes(fill=pop, #색깔로 표현할 변수
                 map_id=code,#지역기준 변수
                 tooltip=name),#지도위에 표시할 지역명
             map=kormap1,#지도데이터
             interactive = T)#인터렉티브
#대한민국 시도별 결핵 환자 수 단계 구분도 만들기
str(changeCode(tbc))
#인터랙티브 단계 구분도 만들기
ggChoropleth(data= tbc, # 지도에 표현할 데이터
             aes(fill=NewPts, #색깔로 표현할 변수
                 map_id=code,#지역기준 변수
                 tooltip=name),#지도위에 표시할 지역명
             map=kormap1,#지도데이터
             interactive = T)#인터렉티브

# 패키지 설치 : 인터랙티브 그래프 만들기
install.packages("plotly")
library(plotly)

# ggplot 으로 그래프 만들기
library(ggplot2)
p <- ggplot(data = mpg, aes(x = displ, y = hwy, col = drv)) + geom_point()

# 인터랙티브 그래프 만들기
ggplotly(p)
# https://plotly.com/ : 패키지 설명 사이트

# 인터랙티브 막대 그래프 만들기
p <- ggplot(data = diamonds, aes(x=cut, fill = clarity))+
  geom_bar(position = "dodge")

ggplotly(p)


install.packages("dygraphs")
library(dygraphs)

# 데이터 준비하기 ( 인구대비 실업률 )
economics <- ggplot2::economics
head(economics)


library(xts)
eco <- xts(economics$unemploy, order.by = economics$date)  # 실업자수를 정렬시키겠다. 날짜컬럼을 기준으로
head(eco)

#그래프 생성
dygraph(eco)

#날짜 범위 선택가능
dygraph(eco)%>%dyRangeSelector()

#여러 값 표현하기
#저축률
eco_a<-xts(economics$psavert, order.by = economics$date)

#실업자 수
eco_b<-xts(economics$unemploy/1000,order.by = economics$date)

# 합치기
eco2 <- cbind(eco_a, eco_b)                   # 데이터 결합합
colnames(eco2) <- c("psavert", "unemploy")    # 변수명 바꾸기
head(eco2)

# 그래프 만들기
dygraph(eco2) %>% dyRangeSelector()

#http://dygraphs.com/


# 통계 분석 기법을 이용한 가설 검정
# 
# 13-1. 통계적 가설 검정이란?
#   
#   기술 통계와 추론 통계
# 
# - 기술 통계(Descriptive statistics)
# 
# -> 데이터를 요약해 설명하는 통계 기법
# 
# -> ex) 사람들이 받는 월급을 집계해 전체 월급 평균 구하기
# 
# - 추론 통계(Inferential statistics)
# 
# -> 단순히 숫자를 요약하는 것을 넘어 어떤 값이 발생할 확률을 계산하는 통계 기법
# 
# -> ex) 수집된 데이터에서 성별에 따라 월급에 차이가 있는 것으로 나타났을 때, 이런 차이가 우연히 발생할 확률을 계산

# 추론통계
#   - 이런 차이가 우연히 나타날 확률이 작다
#  -> 성별에 따른 월급차이가 통계적으로 유의 하다고 결론
#   - 이런 차이가 우연히 나타날 확률이 크다.
#   -> 성별에 따른 월급차이가 통계적으로 유의하지 않다고 결론
# - 기술 통계분석에서 집단간 차이가 있는 것으로 나타났더러도 이는 우연에 의한 차이일 수 있음
#   -> 데이터를 이용해 신뢰 할 수 있는 결론을 내리려면 유의확률을 계산하는 통계적 가설 점정 절차를 거쳐야함

# 통계적 가설 검정
# 
# 1) 통계적 가설 검정(Statistical hypothesis test)
# 
# - 유의 확률을 이용해 가설을 검정하는 방법
# 
# 2) 유의 확률(Significance probability, p-value)
# 
# - 실제로는 집단 간 차이가 없는데 우연히 차이가 있는 데이터가 추출될 확률
# 
# - 분석 결과 유의확률이 크게 나타났다면
# 
# --> 집단 간 차이가 통계적으로 유의하지 않다고 해석
# 
# --> 실제로 차이가 없더라도 우연에 의해 이 정도의 차이가 관찰될 가능성이 크다는 의미
# 
# - 분석 결과 유의확률이 작게 나타났다면
# 
# --> 집단 간 차이가 통계적으로 유의하다고 해석


# --> 실제로 차이가 없는데 우연히 이 정도의 차이가 관찰될 가능성이 작다, 우연이라고 보기 힘들다는 의미

# 13-2 검정 - 두 집단의 평균 비교
# T검정 t-test
# -두집단의 평균에 통계적으로 유의한 차이가 있는지 알아 볼 때 사용하는 통계 분석 기법
# 
# 3데이터 준비
mpg <- as.data.frame(ggplot2::mpg)
str(mpg)

library(dplyr)

mpg_diff <- mpg %>%
  select(class, cty) %>% #전체 데이터를 갖고 있는 mpg를 이용하여 두가지 컬럼 값을 선택
  filter(class %in% c("compact","suv")) #filter : 행 선택 // %in% : 값 매칭 추출해주는 연산


head(mpg_diff)
table(mpg_diff$class)
t.test(data=mpg_diff,cty~class, var.equal=T)
#p-value: 유의 확률값 

#일반 휘발류와 고급 휘발류의 도시 연비 t 검정
#데이처준비
mpg_diff2<-mpg%>%
  select(fl,cty)%>%
  filter(fl %in% c("r","p")) # r:regular, p:premium

table(mpg_diff2$fl)

t.test(data=mpg_diff2,cty~fl,var.equal=T)

#상관분석 - 두 변수의 관계성 분석
# # - 두연속 변수가 서로 관련이 있는지 검정하는 통계 분석 기법
# 상관계수
# -두 변수 가 얼마나 관련되어있는지, 관련성의 정도를 나타내는 값
# -0~1 사이의 값을 지니고 1에 가까울 수록 연관설이 크다는 의미
# - 상관계수가 양수면 정비례 , 음수면 반비례 관계

#실업자 수와 개인 소비 지출의 상관 관계
#데이터 준비
economics<-as.data.frame(ggplot2::economics)

#상관 분석
cor.test(economics$unemploy, economics$pce)

#상관 행렬
# - 여러 변수 간 상관계수를 행렬로 나타낸 표
# - 어떤 변수끼리 관련이 크고 적은지 파악할 수 있음

#데이터 준비
head(mtcars)

#상관 행렬 만들기
car_cor<-cor(mtcars) #상관 행렬 생성
round(car_cor,2)# 소수점 셋째 자리에서 반올림하여 출력

#상관행렬 히트맵 만들기
#- 히트맵(heat map): 값의 크기를 색깔로 표현한 그래프
install.packages("corrplot")
library(corrplot)

corrplot(car_cor)

corrplot(car_cor,method = "number")

#다양한 파라미터 지정하기
col<-colorRampPalette(c("#BB4444","#EE9988","#FFFFFF","#77AADD","#4477AA"))

#색상 팔레트로 색상 직접 지정 / 색상 팔레트 만들시 색상 하나는 있어야함
#얘네가 만들어낸 다섯가지 색상을 지정해주고 그 사이사이는 200가지 색상이 들어감

corrplot(car_cor,
         method="color",      #색깔로 표현
         col = col(200),      #색상 200개 선정
         type="lower",        #왼쪽 아래 행렬만 표시
         order = "hclust",    #유사한 상관계수끼리 군집화
         addCoef.col="black", #상관계수 색깔
         tl.col="black",      #변수명 색깔
         tl.srt=45,           #변수명 45도 기울임
         diag=F)              #대각 행렬 제외

데이터프레임 기초

##데이터 프레임 만들기

english <- c(90, 80, 60, 70)  # 영어 점수 변수 생성
 english 
## [1] 90 80 60 70 
math <- c(50, 60, 100, 20)    # 수학 점수 변수 생성
 math 
## [1]  50  60 100  20 
# english, math 로 데이터 프레임 생성해서 df_midterm 에 할당
 df_midterm <- data.frame(english, math) df_midterm 

##   english math 
## 1      90   50 
## 2      80   60 
## 3      60  100 
## 4      70   20 

class <- c(1, 1, 2, 2) class 
## [1] 1 1 2 2 

df_midterm <- data.frame(english, math, class) df_midterm 
##   english math class 
## 1      90   50     1 
## 2      80   60     1 
## 3      60  100     2
## 4      70   20     2 

mean(df_midterm$english)  # df_midterm 의 english 로 평균 산출
## [1] 75 

mean(df_midterm$math)     # df_midterm 의 math 로 평균 산술
## [1] 57.5 


##데이터 프레임 한 번에 만들기

df_midterm <- data.frame(english = c(90, 80, 60, 70),                          
						math = c(50, 60, 100, 20),                          
						class = c(1, 1, 2, 2)) 

df_midterm 
##   english math class 
## 1      90   50     1 
## 2      80   60     1 
## 3      60  100     2 
## 4      70   20     2 

 

외부 데이터 이용하기

## 엑셀 파일 불러오기
# readxl 패키지 설치
 install.packages("readxl") 
 
# readxl 패키지 로드
 library(readxl) 
 
 df_exam <- read_excel("excel_exam.xlsx")  # 엑셀 파일을 불러와서 df_exam 에 할당
 df_exam                                   # 출력
 
## # A tibble: 20 x 5 
##       id class  math english science 
##    <dbl> <dbl> <dbl>   <dbl>   <dbl> 
##  1     1     1    50      98      50 
##  2     2     1    60      97      60 
##  3     3     1    45      86      78 
##  4     4     1    30      98      58 
##  5     5     2    25      80      65 

##직접 경로를 지정하여 불러오기
df_exam <- read_excel("d:/easy_r/excel_exam.xlsx"
## 워크디렉토리에 불러올 파일이 있어야 한다.

#엑셀 파일 첫번째 행이 변수명이 아닐 때
df_exam_novar <- read_excel("excel_exam_novar.xlsx", col_names = F) 

#엑셀 파일에 시트가 여러개 있을 때
df_exam_sheet <- read_excel("excel_exam_sheet.xlsx", sheet = 3)

#csv 파일 불러오기
#csv?
#범용 데이터 형식 
#값 사이를 쉼표(,)로 구분 
#용량 작음, 다양한 소프트웨어에서 사용 
df_csv_exam <- read.csv("csv_exam.csv")
write.csv(df_midterm, file = "df_midterm.csv")  # CSV 파일로 저장하기

# Rda 파일
 load("df_midterm.rda")                          # Rda 파일 불러오기
 save(df_midterm, file = "df_midterm.rda")       # Rda 파일로 저장하기

#문자가 들어 있는 파일을 불러올 때는 stringsAsFactors = F
df_csv_exam <- read.csv("csv_exam.csv", stringsAsFactors = F) 

 

데이터 파악하기

exam <- read.csv("csv_exam.csv")  #데이터 불러오기

head(exam)      # 앞에서부터 6 행까지 출력
head(exam, 10)  # 앞에서부터 10 행까지 출력
 
tail(exam)      # 뒤에서부터 6 행까지 출력
tail(exam, 10)  # 뒤에서부터 10 행까지 출력

View(exam) #뷰 창에서 데이터 확인하기

dim(exam)  # 행 , 열 출력 /몇 행 몇 열로 구성 되어 있는지 알아보기

 str(exam)  # 데이터 속성 확인
## 'data.frame':    20 obs. of  5 variables: 
##  $ id     : int  1 2 3 4 5 6 7 8 9 10 ... 
##  $ class  : int  1 1 1 1 2 2 2 2 3 3 ... 
##  $ math   : int  50 60 45 30 25 50 80 90 20 50 ... 
##  $ english: int  98 97 86 98 80 89 90 78 98 98 ... 
##  $ science: int  50 60 78 58 65 98 45 25 15 45 ... 

summary(exam)  # 요약통계량 출력
 
##        id            class        math          english     
##  Min.   : 1.00   Min.   :1   Min.   :20.00   Min.   :56.0   
##  1st Qu.: 5.75   1st Qu.:2   1st Qu.:45.75   1st Qu.:78.0   
##  Median :10.50   Median :3   Median :54.00   Median :86.5   
##  Mean   :10.50   Mean   :3   Mean   :57.45   Mean   :84.9   
##  3rd Qu.:15.25   3rd Qu.:4   3rd Qu.:75.75   3rd Qu.:98.0   
##  Max.   :20.00   Max.   :5   Max.   :90.00   Max.   :98.0   
##     science      
##  Min.   :12.00   
##  1st Qu.:45.00   
##  Median :62.50   
##  Mean   :59.45   
##  3rd Qu.:78.00   
##  Max.   :98.00 

 

데이터 수정하기

# 수정하기

install.packages("dplyr")  # dplyr 설치
library(dplyr)             # dplyr 로드
 
 df_raw <- data.frame(var1 = c(1, 2, 1),                      
 var2 = c(2, 3, 2)) 
 
 #데이터 프레임 복사본 만들기
 df_new <- df_raw  # 복사본 생성
 df_new            # 출력
 ##   var1 var2 
 ## 1    1    2 
 ## 2    2    3 
 ## 3    1    2 
 
 #변수명 바꾸기
 df_new <- rename(df_new, v2 = var2)  # var2 를 v2 로 수정
 df_new
 
 ##   var1 v2 
 ## 1    1  2 
 ## 2    2  3 
 ## 3    1  2 
 
 #rename()에 '새 변수명 = 기존 변수명' 순서로 입력 

 

파생변수 만들기

#데이터 프레임 생성
df <- data.frame(var1 = c(4, 3, 8),                  
				var2 = c(2, 6, 1)) 
##   var1 var2 
## 1    4    2 
## 2    3    6 
## 3    8    1   

df$var_sum <- df$var1 + df$var2  # var_sum 파생변수 생성
 ##   var1 var2 var_sum 
 ## 1    4    2       6 
 ## 2    3    6       9 
 ## 3    8    1       9 

df$var_mean <- (df$var1 + df$var2)/2  # var_mean 파생변수 생성
##   var1 var2 var_sum var_mean 
## 1    4    2       6      3.0 
## 2    3    6       9      4.5 
## 3    8    1       9      4.5 

 

조건문 활용

mpg 통합 연비 변수 만들기

mpg$total <- (mpg$cty + mpg$hwy)/2  # 통합 연비 변수 생성
head(mpg) 
##   manufacturer model displ year cyl      trans drv cty hwy fl   class 
## 1         audi    a4   1.8 1999   4   auto(l5)   f  18  29  p compact 
## 2         audi    a4   1.8 1999   4 manual(m5)   f  21  29  p compact 
## 3         audi    a4   2.0 2008   4 manual(m6)   f  20  31  p compact 
## 4         audi    a4   2.0 2008   4   auto(av)   f  21  30  p compact 
## 5         audi    a4   2.8 1999   6   auto(l5)   f  16  26  p compact 
## 6         audi    a4   2.8 1999   6 manual(m5)   f  18  26  p compact 
##   total 
## 1  23.5 
## 2  25.0 
## 3  25.5 
## 4  25.5 
## 5  21.0 
## 6  22.0 

mean(mpg$total) 
## [1] 20.14957 

#조건문을 활용해 파생변수 만들기
#1.기준값 정하기
summary(mpg$total)  # 요약 통계량 산출
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.  
##   10.50   15.50   20.50   20.15   23.50   39.50 

hist(mpg$total)     # 히스토그램 생성

#2.조건문으로 합격 판정 변수 만들기
# 20 이상이면 pass, 그렇지 않으면 fail 부여
mpg$test <- ifelse(mpg$total >= 20, "pass", "fail") 

head(mpg, 20) # 데이터 확인
 
 #3.빈도표로 합격 판정 자동차 수 살펴보기
 table(mpg$test)  # 연비 합격 빈도표 생성
 ## fail pass 
 ##  106  128 
 
 #4.막대 그래프빈 빈도 표현하기
 library(ggplot2)  # ggplot2 로드
 qplot(mpg$test)   # 연비 합격 빈도 막대 그래프 생성
 
 #중첩 조건문
 연비 등급 변수 만들기
 # total 을 기준으로 A, B, C 등급 부여
 mpg$grade <- ifelse(mpg$total >= 30, "A", ifelse(mpg$total >= 20, "B", "C")) 
 
head(mpg, 20)  # 데이터 확인

table(mpg$grade) # 등급 빈도표 생성
 
##   A   B   C  
##  10 118 106 

qplot(mpg$grade) # 등급 빈도 막대 그래프 생성

#원하는 만큼 범주 만들기
# A, B, C, D 등급 부여
 mpg$grade2 <- ifelse(mpg$total >= 30, "A",                      
				 ifelse(mpg$total >= 25, "B",                             
 					ifelse(mpg$total >= 20, "C", "D"))) 
 
 

 

정리하기

# 1. 데이터 준비 , 패키지 준비
 mpg <- as.data.frame(ggplot2::mpg)  # 데이터 불러오기
 library(dplyr)                      # dplyr 로드
 library(ggplot2)                    # ggplot2 로드
 
# 2. 데이터 파악
 head(mpg)     # Raw 데이터 앞부분
 tail(mpg)     # Raw 데이터 뒷부분
 View(mpg)     # Raw 데이터 뷰어 창에서 확인
 dim(mpg)      # 차원
 str(mpg)      # 속성
 summary(mpg)  # 요약 통계량
 
# 3. 변수명 수정
 mpg <- rename(mpg, company = manufacturer) 
 
# 4. 파생변수 생성
 mpg$total <- (mpg$cty + mpg$hwy)/2                   # 변수 조합
 mpg$test <- ifelse(mpg$total >= 20, "pass", "fail")  # 조건문 활용
 
# 5. 빈도 확인
 table(mpg$test)  # 빈도표 출력
 qplot(mpg$test)  # 막대 그래프 생성
 

 

문제풀이

midwest<-as.data.frame(ggplot2::midwest) #데이터 블러오기
str(midwest) #데이터 특성 파악하기

head(midwest) 
tail(midwest) 
View(midwest) 
dim(midwest) 
summary(midwest) 

#변수명 수정하기
install.packages("dplyr")  # dplyr 설치
library(dplyr)             # dplyr 로드
midwest<- rename(midwest, total = poptotal,
                asian =popasian)  
midwest

#파생변수 만들기
midwest$ratio <-  midwest$asian/midwest$total*100

#히스토스램 출력
hist(midwest$ratio)

#아시아 인구 백분율 전체 평균 구하기
mean(midwest$ratio) 
#아시아 인구 백분율 요약 통계량 산출
summary(midwest$ratio)
#조건문
midwest$grade <- ifelse(midwest$ratio >= 0.4872462, "large", "small")
#빈도표 생성
table(midwest$grade)
#막대 그래프빈 빈도 표현하기
library(ggplot2)  # ggplot2 로드
qplot(midwest$grade)   # 빈도 막대 그래프 생성

 

데이터 전처리

 

# 조건에 맞는 데이터만 추출하기

#1.패키지 로드 & 데이터 준비
library(dplyr) 
exam <- read.csv("csv_exam.csv") 

# exam 에서 class 가 1 인 경우만 추출하여 출력
exam %>% filter(class == 1) 
 
##   id class math english science 
## 1  1     1   50      98      50 
## 2  2     1   60      97      60 
## 3  3     1   45      86      78 
## 4  4     1   30      98      58

# 2 반인 경우만 추출
 exam %>% filter(class == 2) 
 
##   id class math english science 
## 1  5     2   25      80      65 
## 2  6     2   50      89      98 
## 3  7     2   80      90      45 
## 4  8     2   90      78      25 

 #1반이 아닌 경우
 exam %>% filter(class != 1)
 # 3 반이 아닌 경우
 exam %>% filter(class != 3)
 
 #초과, 미만, 이상, 이하  조건 걸기
 
 # 수학 점수가 50 점을 초과한 경우
 exam %>% filter(math > 50) 
 # 수학 점수가 50 점 미만인 경우
 exam %>% filter(math < 50)
 # 영어점수가 80 점 이상인 경우
 exam %>% filter(english >= 80) 
 # 영어점수가 80 점 이하인 경우
 exam %>% filter(english <= 80)

# 여러 조건을 충족하는 행 추출하기
 
 #1반이면서 수학 점수가 50점 이상인 경우
 exam %>% filter(class == 1 & math >= 50)
 # 2 반 이면서 영어점수가 80 점 이상인 경우
 exam %>% filter(class == 2 & english >= 80)
 # 수학 점수가 90 점 이상이거나 영어점수가 90 점 이상인 경우
 exam %>% filter(math >= 90 | english >= 90) 
 # 영어점수가 90 점 미만이거나 과학점수가 50 점 미만인 경우
 exam %>% filter(english < 90 | science < 50) 
 
 #목록에 해당되는 행 추출하기
 exam %>% filter(class == 1 | class == 3 | class == 5)  # 1, 3, 5 반에 해당되면 추출
 exam %>% filter(class %in% c(1,3,5))  # 1, 3, 5 반에 해당하면 추출
 #%in%: 매칭 확인
 
 #추출된 행으로 데이터 만들기
 class1 <- exam %>% filter(class == 1)  # class 가 1 인 행 추출 , class1 에 할당
 class2 <- exam %>% filter(class == 2)  # class 가 2 인 행 추출 , class2 에 할당
 
mean(class1$math)                      # 1 반 수학 점수 평균 구하기
## [1] 46.25 
mean(class2$math)                      # 2 반 수학 점수 평균 구하기
## [1] 61.25 
 
 #필요한 변수만 추출하기
exam %>% select(math)  # math 추출
exam %>% select(english)  # english 추출
exam %>% select(class, math, english)  # class, math, english 변수 추출
exam %>% select(-math)  # math 제외
exam %>% select(-math, -english)  # math, english 제외
 
# class 가 1 인 행만 추출한 다음 english 추출
 exam %>% 
 filter(class == 1) %>% 
 select(english) 
 
 #일부만 출력하기
 exam %>%   
 select(id, math) %>%  # id, math 추출
 head                  # 앞부분 6 행까지 추출
 
 exam %>%   
 select(id, math) %>%  # id, math 추출
 head(10)              # 앞부분 10 행까지 추출

 
#정렬하기
exam %>% arrange(math)  # math 오름차순 정렬
exam %>% arrange(desc(math))  # math 내림차순 정렬
exam %>% arrange(class, math)  # class 및 math 오름차순 정렬
 
#추가하기

exam %>%   
mutate(total = math + english + science) %>%  # 총합 변수 추가
head                                          # 일부 추출

exam %>% 
mutate(total = math + english + science,          # 총합 변수 추가
mean = (math + english + science)/3) %>%   # 총평균 변수 추가
head                                              # 일부 추출


#mutate()에 ifelse() 적용하기 
exam %>%   
mutate(test = ifelse(science >= 60, "pass", "fail")) %>%   
head 
##   id class math english science test 
## 1  1     1   50      98      50 fail 
## 2  2     1   60      97      60 pass 
## 3  3     1   45      86      78 pass 
## 4  4     1   30      98      58 fail 
## 5  5     2   25      80      65 pass 
## 6  6     2   50      89      98 pass 

추가한 변수를 dplyr 코드에 바로 활용하기 
exam %>%   
mutate(total = math + english + science) %>%  # 총합 변수 추가
arrange(total) %>%                            # 총합 변수 기준 정렬
head                                          # 일부 추출
 
##   id class math english science total 
## 1  9     3   20      98      15   133 
## 2 14     4   48      87      12   147 
## 3 12     3   45      85      32   162 
## 4  5     2   25      80      65   170 
## 5  4     1   30      98      58   186
## 6  8     2   90      78      25   193 

#요약하기

exam %>% summarise(mean_math = mean(math))  # math 평균 산출
 
##   mean_math 
## 1     57.45 

#집단별로 요약하기
exam %>%   
group_by(class) %>%                # class 별로 분리
summarise(mean_math = mean(math))  # math 평균 산출
 
## # A tibble: 5 x 2 
##   class mean_math 
##   <int>     <dbl> 
## 1     1     46.25 
## 2     2     61.25 
## 3     3     45.00 
## 4     4     56.75
## 5     5     78.00 

#여러 요약통계량 한 번에 산출하기 
exam %>%   
group_by(class) %>%                   # class 별로 분리
summarise(mean_math = mean(math),     # math 평균
             sum_math = sum(math),       # math 합계
             median_math = median(math), # math 중앙값
             n = n())                    # 학생 수
 
## # A tibble: 5 x 5 
##   class mean_math sum_math median_math     n 
##   <int>     <dbl>    <int>       <dbl> <int> 
## 1     1     46.25      185        47.5     4 
## 2     2     61.25      245        65.0     4 
## 3     3     45.00      180        47.5     4 
## 4     4     56.75      227        53.0     4 
## 5     5     78.00      312        79.0     4 

 

#각 집단별로 다시 집단 나누기 
mpg %>%   group_by(manufacturer, drv) %>%      # 회사별 , 구방방식별 분리
summarise(mean_cty = mean(cty)) %>%  # cty 평균 산출
head(10)                             # 일부 출력
 

dplyr 조합하기 
mpg %>%   group_by(manufacturer) %>%           # 회사별로 분리
   filter(class == "suv") %>%           # suv 추출
   mutate(tot = (cty+hwy)/2) %>%        # 통합 연비 변수 생성
   summarise(mean_tot = mean(tot)) %>%  # 통합 연비 평균 산출
   arrange(desc(mean_tot)) %>%          # 내림차순 정렬
   head(5)                              # 1~5 위까지 출력
 

 

#데이터 합치기

#데이터 생성
# 중간고사 데이터 생성
 test1 <- data.frame(id = c(1, 2, 3, 4, 5),                     
 					midterm = c(60, 80, 70, 90, 85)) 
##   id midterm 
## 1  1      60 
## 2  2      80 
## 3  3      70 
## 4  4      90 
## 5  5      85 
 
# 기말고사 데이터 생성
 test2 <- data.frame(id = c(1, 2, 3, 4, 5),                     
 					final = c(70, 83, 65, 95, 80)) 
##   id final 
## 1  1    70 
## 2  2    83 
## 3  3    65 
## 4  4    95 
## 5  5    80 
                    
#id 기준으로 합치기
total <- left_join(test1, test2, by = "id")  # id 기준으로 합쳐 total 에 할당
##   id midterm final 
## 1  1      60    70 
## 2  2      80    83 
## 3  3      70    65 
## 4  4      90    95 
## 5  5      85    80

#다른 데이터를 변수에 추가하기
name <- data.frame(class = c(1, 2, 3, 4, 5),                            
					teacher = c("kim", "lee", "park", "choi", "jung"))
##   class teacher 
## 1     1     kim 
## 2     2     lee 
## 3     3    park 
## 4     4    choi 
## 5     5    jung 

#class 기준 합치기 
exam_new <- left_join(exam, name, by = "class") 
##    id class math english science teacher 
## 1   1     1   50      98      50     kim 
## 2   2     1   60      97      60     kim 
## 3   3     1   45      86      78     kim 
## 4   4     1   30      98      58     kim 
## 5   5     2   25      80      65     lee 
## 6   6     2   50      89      98     lee 
## 7   7     2   80      90      45     lee 
## 8   8     2   90      78      25     lee 
## 9   9     3   20      98      15    park 
## 10 10     3   50      98      45    park 
## 11 11     3   65      65      65    park 
## 12 12     3   45      85      32    park 
## 13 13     4   46      98      65    choi 
## 14 14     4   48      87      12    choi 
## 15 15     4   75      56      78    choi 
## 16 16     4   58      98      65    choi 
## 17 17     5   65      68      98    jung 
## 18 18     5   80      78      90    jung 
## 19 19     5   89      68      87    jung 
## 20 20     5   78      83      58    jung 

#세로로 합치기
#데이터 생성
# 학생 1~5 번 시험 데이터 생성
 group_a <- data.frame(id = c(1, 2, 3, 4, 5),                       
 						test = c(60, 80, 70, 90, 85)) 
 
# 학생 6~10 번 시험 데이터 생성
 group_b <- data.frame(id = c(6, 7, 8, 9, 10),                       
 						test = c(70, 83, 65, 95, 80)) 
                        
group_all <- bind_rows(group_a, group_b)  # 데이터 합쳐서 group_all 에 할당

 

 

데이터 정제

-빠진데이터, 이상한 데이터 제거하기

 

1.결측치

-누락된 값, 비어있는 값

-함수 적용 불가, 분석결과 왜곡

-제거 후 분석 실시

# 결측치 표기 - 대문자 NA

#결측치 만들기
df <- data.frame(sex = c("M", "F", NA, "M", "F"),                  
				score = c(5, 4, 3, 4, NA)) df 
##    sex score 
## 1    M     5 
## 2    F     4 
## 3 <NA>     3 
## 4    M     4 
## 5    F    NA 

#결측치 확인하기
is.na(df)         # 결측치 확인
##        sex score 
## [1,] FALSE FALSE 
## [2,] FALSE FALSE 
## [3,]  TRUE FALSE 
## [4,] FALSE FALSE 
## [5,] FALSE  TRUE 

table(is.na(df))  # 결측치 빈도 출력
##  ## FALSE  TRUE  
##     8     2 

#변수 별로 결측치 확인하기
table(is.na(df$sex))    # sex 결측치 빈도 출력
##  ## FALSE  TRUE  
##     4     1  

table(is.na(df$score))  # score 결측치 빈도 출력
##  ## FALSE  TRUE  
##     4     1 

#결측치 포함된 상태로 분석
mean(df$score)  # 평균 산출
## [1] NA 
sum(df$score)   # 합계 산출
## [1] NA 

#결측치 제거하기 
library(dplyr) # dplyr 패키지 로드
 df %>% filter(is.na(score))   # score 가 NA 인 데이터만 출력
##   sex score 
## 1   F    NA 

df %>% filter(!is.na(score))  # score 결측치 제거
##    sex score
## 1    M     5
## 2    F     4 
## 3 <NA>     3 
## 4    M     4

#결측치 제외한 데이터로 분석하기
df_nomiss <- df %>% filter(!is.na(score))  # score 결측치 제거

 mean(df_nomiss$score)                      # score 평균 산출 
## [1] 4 

sum(df_nomiss$score)                       # score 합계 산출
## [1] 16 

#여러 변수 동시에 결측치 없는 데이터 추출하기 
# score, sex 결측치 제외
 df_nomiss <- df %>% filter(!is.na(score) & !is.na(sex)) df_nomiss   
##   sex score
## 1   M     5 
## 2   F     4 
## 3   M     4 

#결측치가 하나라도 있으면 제거하기 
df_nomiss2 <- na.omit(df)  # 모든 변수에 결측치 없는 데이터 추출
 
##   sex score
## 1   M     5 
## 2   F     4 
## 4   M     4 

#함수의 결측치 제외 기능 이용하기 - na.rm = T
mean(df$score, na.rm = T)  # 결측치 제외하고 평균 산출 
## [1] 4 
sum(df$score, na.rm = T)   # 결측치 제외하고 합계 산출
## [1] 16 

#summarise()에서 na.rm = T사용하기 
#결측치 생성
exam <- read.csv("csv_exam.csv")            # 데이터 불러오기
exam[c(3, 8, 15), "math"] <- NA             # 3, 8, 15 행의 math 에 NA 할당
 
#평균구하기
exam %>% summarise(mean_math = mean(math))             # 평균 산출
##   mean_math 
## 1        NA 

exam %>% summarise(mean_math = mean(math, na.rm = T))  # 결측치 제외하고 평균 산출
##   mean_math 
## 1  55.23529 

#다른 함수들에 적용
exam %>% summarise(mean_math = mean(math, na.rm = T),      # 평균 산출
                    sum_math = sum(math, na.rm = T),        # 합계 산출
                    median_math = median(math, na.rm = T))  # 중앙값 산출
 
##   mean_math sum_math median_math 
## 1  55.23529      939          50 

#평균값으로 결측치 대체하기 
#평균 구하기
mean(exam$math, na.rm = T)  # 결측치 제외하고 math 평균 산출
## [1] 55.23529
#평균으로 대체하기
exam$math <- ifelse(is.na(exam$math), 55, exam$math)  # math 가 NA 면 55 로 대체
table(is.na(exam$math))                               # 결측치 빈도표 생성
mean(exam$math)  # math 평균 산출


2. 이상치

 

#1. 논리적으로 존재할 수 없으므로 바로 결측 처리 후 분석시 제외 
outlier <- data.frame(sex = c(1, 2, 1, 3, 2, 1),                       
						score = c(5, 4, 3, 4, 2, 6)) outlier 
##   sex score 
## 1   1     5 
## 2   2     4 
## 3   1     3 
## 4   3     4 
## 5   2     2 
## 6   1     6 

#이상치 확인하기
table(outlier$sex) 
## 1 2 3  
## 3 2 1 
table(outlier$score) 
## 2 3 4 5 6  
## 1 1 2 1 1 

#결측 처리하기

# sex 가 3 이면 NA 할당
 outlier$sex <- ifelse(outlier$sex == 3, NA, outlier$sex) outlier 
##   sex score 
## 1   1     5 
## 2   2     4 
## 3   1     3 
## 4  NA     4 
## 5   2     2 
## 6   1     6 
# sex 가 1~5 아니면 NA 할당

 outlier$score <- ifelse(outlier$score > 5, NA, outlier$score) outlier 
##   sex score 
## 1   1     5 
## 2   2     4 
## 3   1     3 
## 4  NA     4 
## 5   2     2 
## 6   1    NA 

#결측치 제외하고 분석
outlier %>%   
filter(!is.na(sex) & !is.na(score)) %>%   
group_by(sex) %>%   
summarise(mean_score = mean(score)) 

## # A tibble: 2 x 2 
##     sex mean_score 
##   <dbl>      <dbl> 
## 1     1          4 
## 2     2          3 

#2. 극단적인 값

#상자그림 생성
mpg <- as.data.frame(ggplot2::mpg) 
boxplot(mpg$hwy)

boxplot(mpg$hwy)$stats  # 상자그림 통계치 출력

#결측 처리하기
# 12~37 벗어나면 NA 할당
 mpg$hwy <- ifelse(mpg$hwy < 12 | mpg$hwy > 37, NA, mpg$hwy) table(is.na(mpg$hwy)) 
 
 #결측치 제외하고 분석하기
 mpg %>%   
 group_by(drv) %>%   
 summarise(mean_hwy = mean(hwy, na.rm = T)) 
 
 

 

정리하기

# 1. 결측치 정제하기
 
 
# 결측치 확인
 table(is.na(df$score)) 
 
# 결측치 제거
 df_nomiss <- df %>% filter(!is.na(score)) 
 
# 여러 변수 동시에 결측치 제거
 df_nomiss <- df %>% filter(!is.na(score) & !is.na(sex)) 
 
# 함수의 결측치 제외 기능 이용하기
 mean(df$score, na.rm = T) exam %>% summarise(mean_math = mean(math, na.rm = T)) 
 
 # 2. 이상치 정제하기
 
 
# 이상치 확인
 table(outlier$sex) 
 
# 결측 처리
 outlier$sex <- ifelse(outlier$sex == 3, NA, outlier$sex) 
 
# boxplot 으로 극단치 기준 찾기
 boxplot(mpg$hwy)$stats 
 
# 극단치 결측 처리
 mpg$hwy <- ifelse(mpg$hwy < 12 | mpg$hwy > 37, NA, mpg$hwy) 

 

그래프 만들기

 

1. 산점도

library(ggplot2)

#배경설정하기
# x 축 displ, y 축 hwy 로 지정해 배경 생성
 ggplot(data = mpg, aes(x = displ, y = hwy)) 
 
 #그래프 추가하기
 # 배경에 산점도 추가
 ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() 
 
 #축 범위를 조정하는 설정 추가하기 
 # x 축 범위 3~6 으로 지정
 ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + xlim(3, 6) 
 
 #축 범위를 조정하는 설정 추가하기 
 # x 축 범위 3~6, y 축 범위 10~30 으로 지정
 ggplot(data = mpg, aes(x = displ, y = hwy)) +    geom_point() +    xlim(3, 6) +    ylim(10, 30) 

2.  막대그래프 - 집단간 차이 표현하기

#1. 평균 막대 그래프 
#집단별 평균표 만들기
library(dplyr) 
 
df_mpg <- mpg %>%   
group_by(drv) %>%   
summarise(mean_hwy = mean(hwy)) 
 
## # A tibble: 3 x 2 
##     drv mean_hwy 
##   <chr>    <dbl> 
## 1     4 19.17476 
## 2     f 28.16038 
## 3     r 21.00000 

# 그래프 생성하기
ggplot(data = df_mpg, aes(x = drv, y = mean_hwy)) + geom_col() 
#크기 순으로 정렬하기
ggplot(data = df_mpg, aes(x = reorder(drv, -mean_hwy), y = mean_hwy)) + geom_col()

#2.빈도 막대 그래프
#값의 개수(빈도)로 막대의 길이를 표현한 그래프 

# x 축 범주 변수 , y 축 빈도
 ggplot(data = mpg, aes(x = drv)) + geom_bar() 
 
 # x 축 연속 변수 , y 축 빈도
 ggplot(data = mpg, aes(x = hwy)) + geom_bar() 
 
 

 

3. 선 그래프 - 시간에 따라 달라지는 데이터 표현

#선 그래프(Line Chart) : 데이터를 선으로 표현한 그래프 
#시계열 그래프(Time Series Chart) : 일정 시간 간격을 두고 나열된 시계열 
#데이터(Time Series Data)를 선으로 표현한 그래프. 환율, 주가지수 등 경제 지표가 시간에 따라 
#어떻게 변하는지 표현할 때 활용 

#시계열 그래프만들기
ggplot(data = economics, aes(x = date, y = unemploy)) + geom_line() 

 

4. 상자 그림 - 집단 간 분포 차이 표현하기

#상자 그림(Box Plot) : 데이터의 분포(퍼져 있는 형태)를 직사각형 상자 모양으로 표현한 그래프 
#분포를 알 수 있기 때문에 평균만 볼 때보다 데이터의 특성을 좀 더 자세히 이해할 수 있음

#상자 그림 만들기
ggplot(data = mpg, aes(x = drv, y = hwy)) + geom_boxplot() 

 

정리하기

# 1. 산점도
 ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() 
 
# 축 설정 추가
 ggplot(data = mpg, aes(x = displ, y = hwy)) +   geom_point() +   xlim(3, 6) +   ylim(10, 30) 
 

# 2. 평균 막대 그래프

# 1 단계 . 평균표 만들기
 df_mpg <- mpg %>%   group_by(drv) %>%   summarise(mean_hwy = mean(hwy)) 
 
# 2 단계 . 그래프 생성하기 , 크기순 정렬하기
 ggplot(data = df_mpg, aes(x = reorder(drv, -mean_hwy), y = mean_hwy)) + geom_col() 
 
# 3. 빈도 막대 그래프
 ggplot(data = mpg, aes(x = drv)) + geom_bar() 
 
# 4. 선 그래프
 ggplot(data = economics, aes(x = date, y = unemploy)) + geom_line() 
 
# 5. 상자 그림
 ggplot(data = mpg, aes(x = drv, y = hwy)) + geom_boxplot() 

 

'한국복지패널데이터' 분석하기

#패키지 준비하기
install.packages("foreign") # 패키지 
install.packages("readxl") # 패키지 설치
library(foreign) #SPSS 파일 로드
library(dplyr) #전처리
library(ggplot2) #시각화
library(readxl) #엑셀파일 불러오기

#데이터 준비하기
raw_welfare <- read.spss(file = "C:/rwork/Koweps_hpc10_2015_beta1.sav",
                         to.data.frame =T)
#복사본 만들기
welfare <- raw_welfare

#데이터 검토하기
head(welfare) 
tail(welfare) 
View(welfare) 
dim(welfare) 
str(welfare) 
summary(welfare) 

#변수명 바꾸기
welfare<-rename(welfare,
                sex=h10_g3, #성별
                birth=h10_g4,#태어난 연도
                marriage=h10_g10,#혼인상태
                religion=h10_g11,#종교
                income=p1002_8aq1,#월급
                code_job=h10_eco9,#직종코드
                code_region=h10_reg7)#지역코드

#질문1.남녀 임금차이

#바뀐 내용 확인
names(welfare)

#변수 검토하기
class(welfare$sex)
table(welfare$sex)

#이상치 결측하기
welfare$sex<-ifelse(welfare$sex==9, NA, welfare$sex)

#결측치 확인
table(is.na(welfare$sex))


#성별 항목 이름 부여
welfare$sex<-ifelse(welfare$sex==1, "male","female")
table(welfare$sex)

#그래프 보기
qplot(welfare$sex)

#월급 변수 검토 및 전처리
class(welfare$income)
summary(welfare$income)#월급 컬럼만 보기

#그래프 보기
qplot(welfare$income) +xlim(0,1000)


#이상치 확인
summary(raw_welfare$income)

qplot(raw_welfare$income)
qplot(raw_welfare$income)+xlim(0,1000)

#이상치 결측 처리
raw_welfare$income <- ifelse(raw_welfare$income %in% c(0,9999),NA,raw_welfare$income)
table(is.na(raw_welfare$income))

#성별 월급 평균표 만들기
sex_income<-welfare%>%
  filter(!is.na(income)) %>%
  group_by(sex) %>%
  summarise(mean_income = mean(income))

sex_income

#그래프 만들기
ggplot(data=sex_income,aes(x=sex,y=mean_income))+geom_col()

#변수 검토하기
class(welfare$birth)
summary(welfare$birth)
qplot(welfare$birth)

#이상치 확인
summary(welfare$birth)
#결측치 확인
table(is.na(welfare$birth))
#이상치 결측 처리
welfare$birth<-ifelse(welfare$birth==9999,NA,welfare$birth)
table(is.na(welfare$birth))

#파생변수 만들기- 나이
welfare$age<-2015-welfare$birth+1
qplot(welfare$age)

#나이와 월급의 관계 분석하기
#1.나이에 따른 월급 평균표 만들기
age_income <- welfare %>%
  filter(!is.na(income)) %>%
  group_by(age) %>%
  summarise(mean_income = mean(income))

head(age_income)

#2.그래프 만들기
ggplot(data=age_income,aes(x=age,y=mean_income))+geom_line()

#연령대에 따른 월급 차이
#분석 절차
#1.변수 검토 및 전처리 : 연령대, 월급
#2. 변수 간 관계 분석 : 연령대별 월급 평균표 만들기, 그래프 만들기
welfare <- welfare %>%
  mutate(ageg = ifelse(age<30, "young",
                       ifelse(age <= 59, "middle", "old")))

table(welfare$ageg)
qplot(welfare$ageg)

#연령대에 따른 월급 차이 분석
#1.연령대별 월급 평균표 만들기
ageg_income <- welfare %>%
  filter(!is.na(income)) %>%
  group_by(ageg) %>%
  summarise(mean_income = mean(income))

ageg_income

#2.그래프만들기
ggplot(data=ageg_income,aes(x=ageg,y=mean_income))+geom_col()

#성별 평균 연령표
#연령대 및 성별 월급 평균표 만들기
sex_income<-welfare%>%
  filter(!is.na(income))%>%
  group_by(ageg,sex)%>%
  summarise(mean_income=mean(income))
sex_income

#그래프 만들기
ggplot(data=sex_income, aes(x=ageg,y=mean_income,fill=sex))+geom_col()+scale_x_discrete(limits=c("young","middle","old"))

#성별 막대 분리 
ggplot(data = sex_income, aes(x = ageg, y=mean_income, fill=sex)) +
  geom_col(position="dodge") +                         # 동일코드지만 옵션만 추가(스택차트가 아닌 그룹차트 생성)
  scale_x_discrete(limits = c("young", "middle", "old"))

#나이 및 성별 월급 차이 분석
#성별 연령별 월급 평균표 만들기
sex_age<-welfare%>%
  filter(!is.na(income))%>%
  group_by(age,sex)%>%
  summarise(mean_income=mean(income))
sex_age
  
#라인차트
ggplot(data = sex_age,aes(x=age,y=mean_income, col=sex))+geom_line()

 

RStudio 설치

 

 

프로젝트 폴더 설정하기

Tools->globel options
인코딩 설정해주기

패키지 설치 

 

패키지명을 검색하여 체크박스 클릭

프로젝트 실행

 

 

View()함수를 이용하여 표형태로 보여주기
View()함수의 결과 표
Grid를 이용하여 삭제하기

 

 

 

 

 

' ctrl + shift + c ' #여러줄 주석

 

다운로드 사이트 : http://kostat.go.kr/


# 작업 순서
# 1. 데이터 파일 읽기 : 6_101_DT_1B26001_A01_M.csv
# 2. '전국' 지역이 아닌 데이터만 추출
# 3. 행정구역 중 '구' 단위에 해당하는 행 번호 추출
# 4. '구' 지역 데이터 제외
# 5. 순이동 인구수가 0보다 큰지역 추출 
# 6. 단어(행정 구역) 할당
# 7. 워드클라우드 출력

# 1. 데이터 파일 읽기 : read.csv(file.choose(), header=T)
# 2. '전국' 지역이 아닌 데이터만 추출('전국' 지역 데이터 제외) : data[data$행정구역.시군구.별 != "전국", ]
# 3. 행정구역 중 '구' 단위에 해당하는 행 번호 추출 : grep("구$", data2$행정구역.시군구.별)
# 4. '구' 지역 데이터 제외 : <- data2[-c(x), ]
# 5. 순이동 인구수가 0보다 큰지역 추출 : data3[data3$순이동.명>0, ]
# 6. 단어(행정 구역) 할당 : data4$행정구역.시군구.별
# 7. 행정구역별 빈도 : data4$순이동.명
# 8. 워드클라우드 출력 : wordcloud()

data <- read.csv(file.choose(), header=T) # 모든 괄호가 .으로 변경된다.
View(data)
head(data)
names(data) # 데이터의 컬럼 확인

# ()가 R에서는 모두 .으로 바뀌어서 들어온다.
data2 <- data[data$행정구역.시군구.별 != "전국", ] # 전체 데이터$컬럼명 중에서 != "전국" 데이터가 아닌 것만 모두 선택


x <- grep("구$", data2$행정구역.시군구.별) # grep함수 : 지정 조건에 맞는 행 번호를 벡터로 반환(x: 구 관련 행번호만 저장)
data3 <- data2[-c(x),] # '구' 지역 데이터 제외

#전입자 수가 많은 지역
data4 <- data3[data3$순이동.명>0, ] # data3중 순이동.명 컬럼 중 0보다 큰애들만 추출
head(data4)

word<- data4$행정구역.시군구.별 # 워드클라우드작업을 위한 글자 데이터만 추출

frequency <- data4$순이동.명 # 숫자값으로 작업할 숫자 데이터만 추
View(frequency)

wordcloud(word,frequency,colors = pal2)

#연설문의 단어에 대한 워드 클라우드 만들기
install.packages("KoNLP")

install.packages("RColorBrewer")

install.packages("wordcloud")
library(rJava)

library(KoNLP)
library(RColorBrewer)
library(wordcloud)

KoNLP::useSejongDic()

pal2 <- brewer.pal(8, "Dark2")

text <- readLines(file.choose())#readLines:문서 내부를 엔터 기준으로 줄 단위로 잘읽어드리는 것

noun <- sapply(text, extractNoun, USE.NAMES = F) # extractNoun 이 명사를 찾아서 벡터로 저장하는 역할, sapply는 반환하는 역할
noun

# list 타입의 데이터를 수치형으로 변환
noun2 <- unlist(noun)
noun2

# p.221
word_count <- table(noun2) # 테이블을 하면 팩터로 바꿔준다. # 쪼개진 단어들의 갯수를 파악하여 테이블로 반환
word_count # 단어의 빈도수를 가지고 있음.

head(sort(word_count, decreasing = TRUE), 10) #정렬해주고 상위 10개만 꺼내온다.

wordcloud(names(word_count), # names 라는 함수를 이용해서 단어를 꺼내고
          freq=word_count,  # freq  옵션을 이용해서 글자나 숫자를 꺼낼 수 있다.
          scale=c(6,0.3),  # 가장 큰값을 6, 가장 작은 값을  0.3의 비율로 맞춘다.
          min.freq=3,      # 최소 빈도수를 3 이상으로 잡는다.(1이나 2는 표기하지않는다.)
          random.order = F, # 실행할때마다 위치 변경
          rot.per = .1,     # 회전 각도값을 0.1 비율로 회전시킨다.
          colors=pal2)      # 글자 색 변경

R?

- 오픈소스 프로그램으로 통계/데이터 마이닝 및 그래프를 위한 언어

- 오픈소스 프로젝트로 진행되고 있는 R은 통계 프로그래밍 언어인 S 언어 기반으로 만들어졌으며 통계 계산과 결과 생성 그래픽을 위한 프로그래밍 언어

- 객체지향형 x 절차지향형 o

- 코드를 만드는 것보다는 해결을 하기 위한 절차 지향형(주로 제공하는 라이브러리를 이용한다.)

- 데이터 프레임 구조를 가져온다.

- 백터 : 1차원 배열

- 배열 : 2차원 배열

- 리스트 : 다차원배열

- 데이터프레임구조 : 백터+배열+리스트

 

Nosql

- 빅 데이터 처리를 위한 비관계형 데이터베이스 관리 시스템(DBMS)

- 전통적인 관계형 데이터베이스 관리 시스템(RDBMS)과는 다르게 설계된 비관계형(non-relational) DBMS로, 대규모의 데이터를 유연하게 처리할 수 있는 것이 강점

- 노에스큐엘(NoSQL)은 테이블-컬럼과 같은 스키마 없이, 분산 환경에서 단순 검색 및 추가 작업을 위한 키 값을 최적화하고, 지연(latency)과 처리율(throughput)이 우수

- 대규모 확대가 가능한 수평적인 확장성의 특징

- NoSQL에 기반을 둔 시스템의 대표적인 예로는 아파치 카산드라(Apache Cassandra), 하둡(Hadoop), 몽고디비(MongoDB) 등

 

빅데이터 활용

- 미래예측

- 앙상블 기법(시장예측)

- 선호도 분석

- 사회적 분위기 파악

- 트렌드 감지 및 예측

 

빅데이터 분석 기법

1.연관규칙학습(Association Rule Learning)

- 상품 혹은 서비스간의 관계를 살펴 보고 유용한 규칙을 찾아 내고자 할 때

- cctv(백화점/마트)

 

2.유전 알고리즘(Genetic Algorithms)

- 환경, 생태계쪽에서 사용하는 방식

- 병렬적이고 전역적인 탐색 알고리즘

- 다윈의 적자생존 이론을 기본 개념으로 함

 

3.회귀분석(Regression Analysis)

- 두 변수 간의 관계에 분명한 방향이 있을 때

- 반응변수와 설명변수

- 혈압과 체질량 지수 

 

4.유형분석(Classification Tree Analysis)

- 사용자는 어떤 특성을 가진 집단에 속하는가? 와 같은 문제를 해결하고자 할 때 사용

 

5.기계학습(Machine Learning)

-  머신러닝에 관련된 학습

- 지도 학습 

- AI를 위한 기초 학습

- 학습용 데이터가 필요하다

 

6.소셜네트워크 분석(Social Network Analysis)

- 사회관계망 분석이라 불리는 소셜네트워크분석은 특정인과 다른 사람이 몇 촌 정도 인가?를 파악할 때 사용

- 오피니언 리더, 즉 영향력 있는 사람을 찾아 내 분석

 

7.감정분석(Sentiment Analysis)

 

R 설치방법

1. R 설치 방법

2. R 스튜디오 설치 방법

 

* 한글 형태소 분석을 하려면 JAVA가 필요함.

 

필요 자료 ▼

https://www.r-project.org 

 

R: The R Project for Statistical Computing

The R Project for Statistical Computing Getting Started R is a free software environment for statistical computing and graphics. It compiles and runs on a wide variety of UNIX platforms, Windows and MacOS. To download R, please choose your preferred CRAN m

www.r-project.org

* 관리자 권한으로 실행

 

 

명령어

기본적으로 설치된 패키지 보기

library(help="base")

 

설치되지 않은 패키지 설치하기

패키지 설치 위치

 

#배열을 x에 넣기

 

#백터 원소가 하나 일 때

 

#산술연산

 

seq()

1부터 3씩 증가하는 10이하 만들고 싶을 때

x <- seq(1,10, by=3)

1~10사이를 같은 간격으로 하는 5개의 숫자

y <- seq(1,10,length.out=5)

 

백터

rep()

x 백터를 2번 반복

rep(x, times=2)

x 백터의 각 원소를 2번 반복

rep(x,each=2)

 

백터의 원소

x <- c(1, 2, 3, 4, 5)

 

x[2]

# 두 번째 원소

x[c(1, 3, 5)]

# 1, 3, 5번째 원소

x[-c(2, 4)]

# 2, 4번째 제외한 원소

x[x2]

# 원소의 값이 2보다 큰 값들만 출력

x[x=2 & x=4]

# 원소의 값이 2 이상이고 4 이하인 값들만 출력

x[2] <- 20

# 2번째 원소의 값을 20으로 수정

x[c(3, 4)] <- 15  

# 3, 4번째 원소들의 값을 모두 15로 수정

x[x=15] <- 10

# 15 이하인 원소 값들을 모두 10으로 수정

 

함수를 이용한 백터 연산

x <- seq(1:10)

 

mean(x)

# x 벡터의 원소 값들의 평균

var(x)

# x 벡터의 원소 값들의

sd(x)

# x 벡터의 원소 값들의 표준편차

sqrt(x)

# x 벡터의 원소 값들의 제곱근

length(x)

# x 벡터의 원소 값들의 개수

abs(x)

# x 벡터의 원소 값들의 절대값

 

 

배열

array()

1~3까지의 정수를 1행 3열의 1차원으로 표시

x<- array(1:3,dim=c(3))  =  x <- seq(1:3)과 동일

 

1~6까지의 정수를 2행 3열의 2차원으로 표시

x<- array(1:6,dim=c(2,3))

 

x[1, 3]

# 13

x[, 3]

# 3열의 모든 값들

x[, -3]

# 3열을 제외한 모든 열의 값들

x[1, 2] <- 20

# 12열의 값을 20으로 수정

names <-

    list(c("1", "2"),

         c("1", "2", "3"))

# 행과 열 이름을 갖는 두 벡터로 하는 리스트 생성

 

행렬

행과 열로 구성 되는 2차원 배열

matrix()

1~6사이의 정수를 행의 수가 2인 행렬로 만듬

x <- matrix()

 

백터의 결합

 

리스트

 

함수 : list()

 

데이터 프레임

- 동일한 속성들을 가지는 여러 개체들로 구성

- 2차원적인 데이터 구조

- 속성들 간 데이터 유형은 서로 다를 수 있음

 

x<-data.frame(성명=c("홍길동","손오공"),나이=c(20,30),주소=c("서울","대전")

x<-cbind(x,학과=c("전산학","경영학")) <==데이터 프레임 x열(학과) 추가

x<-rbind(x,data.frame(성명="장발장", 나이=40, 주소 = "파리", 학과="전산학")) <==데이터 프레임 x에 행(장발장)추가

 

내장되어있는 데이트세트 출력

quakes <= R에 내장된 데이터 명 출력

 

head(quakes, n=10)

# 데이터의 앞부분 10개 행 보기(디폴트 n6)

tail(quakes, n=6)

# 데이터의 뒷부분 일부 보기(디폴트 n6)

names(quakes)

# quakes’ 데이터 세트의 변수명 보기

str(quakes)

# quakes’ 데이터 세트의 데이터 구조 보기

dim(quakes)

# quakes’ 데이터 세트의 차원 보기(행과 열의 수)

summary(quakes)

# quakes’ 데이터 세트의 각 변수별 데이터 요약 정보

summary(quakes$mag)

# quakes’ 데이터 세트 내의 mag 변수에 대한 최솟값, 25백분위수, 중앙값, 평균값, 75백분위수, 최댓값

 

 

데이터파일 저장 및 읽기

write.table(quakes,"C:/Rwork/quakes.txt",sep=",") =>파일 만들기

x<-read.csv("C:/Rwork/quakes.txt", header=T)  = > 파일 읽어 오기

x<-read.csv(file.choose(),header=T) = > 읽어 드릴 파일을 선택할 수 있는 창이 나타남

 

웹의 데이터파일 읽기

 

시각화

 

바차트

heigth<-c(9,15,20,6) #판매액 할당

name<-c("영업 1팀","영업2팀","영업3팀","영업4팀") #부서명할당

barplot(heigth,names.arg=name,main="부서별 영업 실적", col=rainbow(length(heigth)),xlab="부서",ylab="영업실적(억원)")#각부서별로 heigth값을 막대그래프로 출력

 

파이차트

x<-c(9,15,20,6) #영업 실적 할당

label<-c("영업 1팀","영업2팀","영업3팀","영업4팀") #부서명할당

pie(x,labels=label,main="부서별 영업 실적") #파이차트 출력(데이터, 라벨,제목)

 

 

 

작업순서

 

1. 작업하기전에는 반드시 작업할 디렉터리를 지정하고 작업시(분석할) 필요한 데이터들을 저장한다.

 

#아래와 같이 지정.

 setwd("c:\\r_temp")

#현재 설정된 작업 디렉터리 확인

getwd()

#또는 아래와 같이 지정

 setwd("c:\\r_temp") 

getwd()

 

2. 화면에 결과를 출력 - print()와 cat() 사용

print(1+3)

print('a') #문자열

print(pi,digits=3) # digits : 자리수 지정 가능

* 한 가지 값밖에 나오지 않는다.

 

cat() : 여러개의 데이터를 출력하는 함수

cat(1, ' : ', 'a','\n',2,':','b') #숫자와 문자 여러개를 한꺼번에 출력

1;2;3; #여러 개의 출력 명령을 연속적으로 실행할 경우, 세미콜론(;)을 사용

 

숫자형과 주요 산술 연산자

as.numeric( ) : 문자형 숫자를 연산 가능한 숫자로 변경하는 함수

 

문자형

전부 문자열 형태로 인식. ( “ “ 또는 ‘ ‘ 을 사용)

class( ) : 데이터 형을 반환 시켜주는 함수

 

논리값

데이터들을 비교해서 참일 경우, TRUE / 거짓일 경우, FALSE를 반환

컴퓨터 : bit를 사용하여 동작되는 기기.

bit : 0과 1, 두 가지 경우의 수만 존재.

bit 값 중에서 0은 거짓, 0 이외의 값은 모두 참.

 

두 개 이상의 값을 연산했을 경우, 참과 거짓을 찾지 위해 여러 가지 연산자가 존재.

& : 양쪽의 데이터가 모두 참일 경우에만 결과가 참. & 기호를 곱하기로 간주. (1 x 1 = 1, 1 x 0 = 0)

| : 두 값 중에서 한가지만 참이어도 결과는 참. | 기호는 더하기로 간주. (1 + 0 = 1, 1 + 1 = 1)

! : 해당 데이터가 아닌 것이라는 의미를 보유. NOT 라고 호칭

 

NA 형 & NULL 형

NA : 잘못된 값이 들어 올 경우 ( Not Applicable , Not Available, 결측값).

값이 있어도 정해진 범위 안에 있는 값이 아니라서 사용할 수 없는 경우.

NA 값이 포함되어 있을 경우 연상르 수행하면 결과 값은 NA.

 

is.na(변수명) : 변수의 값이 NA 인지를 확인하는 함수

 

cat(1,NA,2) #NA가 그대로 출력

cat(1,NULL,2) #NULL값이 제거 되고 출력

sum(1,NA,2) # NA를 더하니까 결과에 NA로 출력

sum(1,NULL,2)#NULL값은 제외해버리고, 나머지 값만 더해서 결과가 출력

 

*NA값은 연산에 그대로 반영되기 때문에 값은 수동으로 제거해야한다.

*na.rm : NA 값을 수동으로 제거할 수 있는 파라미터. na.rm=T (NA 값을 Remove)

sum(1,2,NA,na.rm=T)#na.rm=T으로 NA값을 제거하고 계산한다.

 

Factor 형

여러 번 중복으로 나오는 데이터들을 각각 모아서 대표 값으로 출력해주는 데이터 형

 

c( ) : combine value 라는 의미로 여러 개의 값을 한꺼번에 처리할 때 사용되는 함수.

 

# Factor 형

setwd("c:\\r_temp")

txt1<-read.csv("factor_test.txt")

txt1

factor1<-factor(txt1$blood)

factor1

summary(factor1)

gender_F<-factor(txt1$gender)

gender_F

summary(gender_F)

 

stringsAsFactors=FALSE : 데이터를 Factor 형태로 바꾸지 않고, 그대로 사용하고 싶을 경우.

 

날짜와 시간

 

Sys.Date() #대소문자 주의! 날짜만 보여주는 함수

Sys.time() #날짜와 시간까지 보여주는 함수

date()#미국식 날짜와 시간을 보여주는 함수

as.Date('2014-11-01')#홀따옴표나 겹따옴표를 사용

as.Date("01-11-2014",format="%d-%m-%Y")#날짜 형태를 지정

as.Date("2014년 5월 15일",format="%Y년 %m월 %d일")#날짜 형태를 지정

as.Date(10,origin="2014-11-10")#주어진 날짜 기준으로 10일 후의 날짜

as.Date(-10,origin="2014-11-10")#주어진 날짜 기준으로 10일 전의 날짜

 

class("2014-11-30") #문자로 확인

as.Date("2014-11-30") - as.Date("2014-11-01") #날짜로 변경해서 계산 

as.Date("2014-11-30")+5 # 5일 후 날짜 출력

+ Recent posts