본문 바로가기
프로젝트/상권분석

[상권분석] - withwork 3. 기능 구현

by 바디스 2021. 2. 23.

withwork 에서는 다양한 데이터들을 시각화하여 보여주기에 각 데이터별로 이해하기 쉬운 그래프 형태로 나타냅니다.

 

업종/ 지역 선택

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 검색 이벤트
    observeEvent(input$search,{
    dong_code <- input$select1
    print(dong_code)
    category <- input$select_category
 
    dong_location <- dong_ip %>% filter(행정동코드==dong_code)
    #leaflet 지도 현재 위치 표시하기      
    
    output$map <- renderLeaflet({
      m%>%setView(lng=dong_location[4], lat=dong_location[3], zoom=14)%>%
        addPolygons(data = emd_nn%>%filter(adm_dr_nm==dong_location[[2]]), 
                    fillColor = "red"
                    fillOpacity = 0.5,
                    color = "black",
                    stroke = T, 
                    weight = 1
                    group = "regions")%>%
        addCircles(data=seoul2%>%filter(상권업종소분류명==category), lng=~경도, lat=~위도, label=~(상호명))
    }
    )
cs

업종과 지역을 선택한 뒤 검색 버튼을 누르면 dong_ip 데이터에서 해당 동의 위치정보를 읽어들여 지도에서 이동하고 해당하는 데이터로 그래프들을 변경하여 출력한다.

 

 

상권 정보

 

 

1
2
3
4
5
6
7
8
9
10
11
    #상가 정보 출력
    output$store_info <- renderDataTable({
      seoul2 %>% filter(상권업종소분류명==category,행정동코드==dong_code) %>%
        dplyr::select(상호명,지점명)%>%
        as.data.frame(matrix(rnorm(100),5,5))
    },
    
    options = list(
      scrollY = 200,
      pageLength=5)
    )
cs

상권 정보를 출력해 주는 부분이다. 선택한 업종이 선택한 지역에 몇개나 있는지 상호명등 정보를 출력하여 보여준다.

 

 

서울시 비교

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
 
#rader 차트와 같이 나올 테이블
radertable<-function(code,category){
  rader_data <- seoul2 %>% filter(상권업종소분류명==category,행정동코드==code)
  if(nrow(rader_data)==0){
    rader_data <- data.frame(행정동코드=c(code),
                                  점포수=c(0))
    rader_people <- total_people %>% filter(행정동코드==code)
    rader_total <- cbind(rader_people,rader_data[2])
    rader_total[7= 0
  }
  else{
    rader_data <- data.frame(table(rader_data$행정동코드))
  
    names(rader_data)[1<- c("행정동코드")
    names(rader_data)[2<- c("점포수")
    
    rader_people <- total_people %>% filter(행정동코드==code)
    rader_total <- cbind(rader_people,rader_data[2])
    rader_total[7= (rader_total[3]/rader_total[6])
  }
  
  
  
  names(rader_total)[7<- c("인구수ㅣ점포수")
  
  seoul_count<-count(seoul2%>% filter(상권업종소분류명==category),"상권업종소분류명")
 
  min_max <- data.frame(행정동명=c("서울평균"),
                            평균인구수=c(25000),
                            최대인구수=c(31375),
                            평임대료=c(120854),
                            점포수=c(seoul_count[[2]]/424))
 
  min_max[6= (min_max[2]/min_max[5])
  names(min_max)[6<- c("인구수ㅣ점포수")
  rader<-rbind(rader_total[2:7],min_max)
  
  return(rader)
}
#rader 차트  -- 평임대료 점포수 평균인구 최대인구 인구수/점포수
raderchart <- function(code,category){
  rader_data <- seoul2 %>% filter(상권업종소분류명==category,행정동코드==code)
  if(nrow(rader_data)==0){
    rader_data <- data.frame(행정동코드=c(code),
                                  점포수=c(0))
    rader_people <- total_people %>% filter(행정동코드==code)
    rader_total <- cbind(rader_people,rader_data[2])
    rader_total[7= 0
  }
  else{
    rader_data <- data.frame(table(rader_data$행정동코드))
    
    names(rader_data)[1<- c("행정동코드")
    names(rader_data)[2<- c("점포수")
    
    rader_people <- total_people %>% filter(행정동코드==code)
    rader_total <- cbind(rader_people,rader_data[2])
    rader_total[7= (rader_total[3]/rader_total[6])
  }
  
  names(rader_total)[7<- c("인구수ㅣ점포수")
  
  seoul_count<-count(seoul2%>% filter(상권업종소분류명==category),"상권업종소분류명")
  
  min_max <- data.frame(행정동명=c("서울평균","max","min"),
                           
                            평균인구수=c(25000,200000,0),
                            최대인구수=c(31375,200000,0),
                            평임대료=c(120854,383781,0),
                            점포수=c(seoul_count[[2]]/424,100,0))
  
  
  min_max[6= (min_max[2]/min_max[5])
  min_max[2,6]<-8000
  min_max[3,6]<-0
  names(min_max)[6<- c("인구수ㅣ점포수")
  rader<-rbind(rader_total[2:7],min_max)
 
  
  #rescale 
  rescale_df=function(data1,groupvar=NULL){
    if(is.null(groupvar)) df=data1
    else df=data1[,-which(names(data1) %in% groupvar)]
    
    select=sapply(df,is.numeric)
    df[select]=lapply(df[select], scales::rescale)
    if(!is.null(groupvar)) {
      df=cbind(df,data1[[groupvar]])
      colnames(df)[length(df)]=groupvar
    }        
    df
  }
  
  rescaled=rescale_df(rader)
  rescaled <- rescaled %>% filter(행정동명!="max",행정동명!="min")
  return(rescaled)
}
cs
1
2
3
4
   #rader 테이블 출력
    output$rader_t <- renderTable({
      p<-radertable(dong_code,category)
    })
cs

 

서울시 평균과 비교하여 선택한 업종의 지역정보를 알려줍니다.

rader 그래프로 평당 임대료, 해당 업종의 점포수, 유동인구 수, 인구당 점포 비율을 보여주면서 값을 테이블로 출력합니다.

개업률 폐업률

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#개업/폐업률
open_close_chart <- function(category,code){
  per_data1 <- data.frame(t(oriData %>
                              filter(CD==11&종목==category) %>
                              dplyr::select("2018개업률""2018폐업률""2019개업률""2019폐업률""2020개업률""2020폐업률")))
  names(per_data1)[1<- c("수치")
  
  per_data2 <- data.frame(t(oriData %>
                              filter(CD==code&종목==category) %>
                              dplyr::select("2018개업률""2018폐업률""2019개업률""2019폐업률""2020개업률""2020폐업률")))
  names(per_data2)[1<- c("수치")
  
  per_data <- data.frame("년도"=c("2018","2019","2020"),
                         "개폐업률"=c("평균개업률""평균폐업률""지역개업률""지역폐업률""평균개업률""평균폐업률""지역개업률""지역폐업률""평균개업률""평균폐업률""지역개업률""지역폐업률"), 
                         "수치"=c(per_data1[1:2,1], per_data2[1:2,1],per_data1[3:4,1], per_data2[3:4,1],per_data1[5:6,1], per_data2[5:6,1]))
  
  return(per_data)
}
cs
1
2
3
4
5
6
7
8
9
10
11
#개업 폐업
    output$open_close <- renderPlotly({
      #code <- get_code(dong_code)
      md <- open_close_chart(category,dong_code)
      md_convi_plot <- ggplot(data=md, aes(x=년도, y= 수치, fill = 개폐업률)) +
        geom_bar(stat="identity", position=position_dodge()) + ggtitle("년도별 개업률 및 폐업률"+
        geom_text(aes(label=수치),position = position_dodge(0.9))+
        theme_bw()
      fig <- ggplotly(md_convi_plot)
      fig
    })
cs

선택한 지역의 선택 업종과 다른업종들의 평균 개업률 패업률을 보여주는 부분입니다.

최근 3년간의 개업률 과 폐업률을 보여줍니다.

 

시간대별 생활인구

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#시간대별 유동인구
time_popul <- function(code_num){
  #동 데이터 추출
  code = code_num
  population <- LOCAL_PEOPLE_DONG %>% filter(행정동코드==code)
  
  #변수이름 영어로 변경
  
  colnames(population) <- c("DateID""시","code""Total")
  
  
  
  #날짜,시간대,행정동코드, 생활인구수만 추출
  
  population <- population[1:4]
  
  
  #요일추출
  population$newDate <- ymd(population$DateID)
  
  
  population$day <- wday(population$newDate)
  
  
  #요일중 화,금,토만 추출
  population <- population %>% filter(day %in% c(367))
  population$day <- as.character(population$day)
  population$day[population$day==3<- as.character("화")
  population$day[population$day==6<- as.character("금")
  population$day[population$day==7<- as.character("토")
  
  population
  
  #일별, 시간대별 유동인구수
  
  data <- data.table(population)
  
  date_time_grouping <- data.frame(data[,.(생활인구 = mean(Total)), .(day,시)])
  
  
  return(date_time_grouping)
}
cs
1
2
3
4
5
6
7
8
9
10
#시간대별 생활인구 출력
    output$time <- renderPlotly({
      #code <- get_code(dong_code)
      date_time<-time_popul(dong_code)
      popul_plot <- ggplot(data=date_time, aes(x =시, y =  생활인구, colour=day)) +
        geom_line() +
        geom_point(size=2, shape=1+
        coord_cartesian(xlim=c(1,24), expand = FALSE)+theme_bw()
      ggplotly(popul_plot) %>% layout(legend = list(orientation = "h", x = 0., y = -0.2))
    })
cs

선택한 지역의 시간대별 생활 인구수를 보여줍니다.

평일(화), 금요일, 주말(토) 별 시간대별 생활 인구수를 비교하여 그래프로 보여준다.

 

연령별 인구분포

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#연령대별 인구
pie_chart <- function(code){
  #행정동 선택
  md_age <- LOCAL_PEOPLE_DONG%>% filter(행정동코드 == code)
  
  #연령대 묶어주기
  md_age$md_underteen <- md_age$underteen + md_age$fe_underteen
  md_age$md_teen <- md_age$teen_1 + md_age$teen_2 + md_age$teen_3 + md_age$teen_4
  md_age$md_twenty <- md_age$twenty_1 + md_age$twenty_2 + md_age$twenty_3 + md_age$twenty_4
  md_age$md_thirty <- md_age$thirty_1 + md_age$thirty_2 + md_age$thirty_3 + md_age$thirty_4
  md_age$md_fourty <- md_age$fourty_1 + md_age$fourty_2 + md_age$fourty_3 + md_age$fourty_4
  md_age$md_fifty <- md_age$fifty_1 + md_age$fifty_2 + md_age$fifty_3 + md_age$fifty_4
  md_age$md_sixty <- md_age$sixty_1 + md_age$sixty_2 + md_age$seventies +md_age$sixty_3 + md_age$sixty_4 + md_age$fe_seventies
  
  
  #e데이터 연령별 추출
  md_age1 <- md_age[1:4]
  md_age2 <- md_age[34:40]
  md_age <- cbind(md_age1, md_age2)
  
  df_md_age <- data.frame(
    underteen = mean(md_age$md_underteen),
    teens= mean(md_age$md_teen),
    twenties = mean(md_age$md_twenty),
    thirties = mean(md_age$md_thirty),
    fourties = mean(md_age$md_fourty),
    fifties = mean(md_age$md_fifty),
    sixties = mean(md_age$md_sixty))
  
  df_md_age
  
  return(df_md_age)
  
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    #연령대별 인구 출력
    output$age <- renderPlotly({
      #code <- get_code(dong_code)
      df<-pie_chart(dong_code)
      df <- t(df)
      df <- data.frame(df)
      name_df <- c("10대 이하""10대""20대""30대""40대""50대""60대 이상")
      name_df<-data.frame(name_df)
      df <- cbind(name_df,df)
      
      df<-df[order(df$df),]
      title2 <-as.character(df[7,1])
      title1=paste(title2,c("가 가장 많습니다."))
      
      plot_ly(df,labels=~name_df,values=~df)  %>
        add_pie(hole = 0.5)%>%
        layout(title=title1,
               xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
               yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
      
    })
cs

선택한 지역의 연령별 인구분포를 보여줍니다.

연령별 인구분포를 파이 그래프로 보여주고 가장 많은 연령대를 알려줍니다.

 

 

이외 로그인, 랭킹 부분도 있지만 생략 하겠습니다.

전체 코드는 아래 git 에서 받아주세요

 

person003333/withwork
Contribute to person003333/withwork development by creating an account on GitHub.
github.com

댓글