서울상공회의소 서울기술교육센터
자바기반 빅데이터 시각화 시스템 개발 과정 미니 프로젝트
R을 이용하여 데이터를 시각화 하고, Python을 이용하여 네이버 뉴스 크롤링, 지도시각화
시각화한 것들을 바탕으로 분석
1. 서울시 구별 누적 확진자 수 지도시각화 (R)
사용데이터 : GU.csv, seoul_id.csv, TL_SCCO_SIG.shp(지도배경)
출처 : 서울열린데이터광장, 지도틀은 구글링

setwd("c:/Rdata")
getwd()
install.packages("raster")
install.packages("rgeos")
install.packages("maptools")
install.packages("rgdal")
library(dplyr)
library(ggmap)
library(rvest)
library(rgdal)
library(maptools)
store <- read.csv("GU.csv", header = TRUE)
seoul_id <- read.csv("seoul_id.csv", header = TRUE)
seoul_id <- rename(seoul_id, "GU" = "시군구명")
seoul <- left_join(store, seoul_id, by = "GU")
seoul %>% head
library(raster)
map_shape <- shapefile("SIG_201703/TL_SCCO_SIG.shp")
library(ggplot2)
map <- fortify(map_shape, region = "SIG_CD")
str(map)
map$id <- as.numeric(map$id)
seoul_map <- map[map$id <= 11740,]
M <- merge(seoul_map, seoul, by = "id")
ggplot() +
geom_polygon(data = M,
aes(x = long,
y = lat,
group = group,
fill = SU),
color = "white") +
scale_fill_gradient(low = "#FFD8D8",
high = "#FF0000",
space = "Lab",
guide = "colourbar") +
labs(fill = "확진자 수") +
theme_void() +
theme(legend.position = c(.15, .85)) +
geom_text(data = store,
aes(x = LON,
y = LAT,
label = paste(GU, SU, sep = "\n")))
2. 서울시 날짜별 확진자 수 꺾은선 그래프 (R)
사용데이터 : 날짜.csv(날짜별 확진자 목록)

corona <-read.csv(file="C:/Rdata/날짜.csv",header=T)
corona
data_unlist <- unlist(corona)
head(data_unlist)
wordcount <- table(data_unlist)
head(wordcount)
plot(wordcount,col="black")
3. 코로나 백신센터 지도시각화 (Python)
사용데이터 : covid18_vaccine_center.csv
출처:공공데이터포털
example.html
0.07MB

# csv 파일 불러오기
import csv
import pandas as pd
data=pd.read_csv("covid19_vaccine_center.csv", encoding='cp949')
!pip install folium
import folium
#지도의 중심을 지정하기 위해 위도와 경도의 평균 구하기
lat = data['lat'].mean()
long = data['lon'].mean()
#지도 띄우기
m = folium.Map([lat,long],zoom_start=9)
for i in data.index:
sub_lat = data.loc[i,'lat']
sub_long = data.loc[i,'lon']
title = data.loc[i,'center_name']
try:
#지도에 데이터 찍어서 보여주기
folium.Marker([sub_lat,sub_long],tooltip = title).add_to(m)
except:
continue
#한글이 안나오는 오류로 html로 trouble shooting
m.save('example.html')
m
4. 구간별 이슈 분석을 위한 네이버 뉴스 크롤링 (Python, R)
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
from datetime import datetime
import requests
import pandas as pd
import re
#한글깨짐 방지
import sys
import io
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
< naver 뉴스 검색시 리스트 크롤링하는 프로그램 > _select사용
- 크롤링 해오는 것 : 링크,제목,신문사,내용요약본
- 내용요약본 -> 정제 작업 필요
- 리스트 -> 딕셔너리 -> df -> 엑셀로 저장
'''''''''''''''''''''
#각 크롤링 결과 저장하기 위한 리스트 선언
title_text=[]
link_text=[]
source_text=[]
contents_text=[]
result={}
#엑셀로 저장하기 위한 변수
RESULT_PATH ='D:/' #결과 저장할 경로
now = datetime.now() #파일이름 현 시간으로 저장하기
#내용 정제화 함수
def contents_cleansing(contents):
first_cleansing_contents = re.sub('<dl>.*?</a> </div> </dd> <dd>', '',str(contents)).strip() #앞에 필요없는 부분 제거
second_cleansing_contents = re.sub('<ul class="relation_lst">.*?</dd>', '', first_cleansing_contents).strip()#뒤에 필요없는 부분 제거 (새끼 기사)
third_cleansing_contents = re.sub('<.+?>', '', second_cleansing_contents).strip()
contents_text.append(third_cleansing_contents)
#print(contents_text)
#크롤링 시작
def crawler(maxpage,query,sort,s_date,e_date):
s_from = s_date.replace(".","")
e_to = e_date.replace(".","")
page = 1
maxpage_t =(int(maxpage)-1)*10+1 # 11= 2페이지 21=3페이지 31=4페이지 ...81=9페이지 , 91=10페이지, 101=11페이지
while page <= maxpage_t:
url = "https://search.naver.com/search.naver?where=news&query=" + query + "&sort="+sort+"&ds=" + s_date + "&de=" + e_date + "&nso=so%3Ar%2Cp%3Afrom" + s_from + "to" + e_to + "%2Ca%3A&start=" + str(page)
response = requests.get(url)
html = response.text
#뷰티풀소프의 인자값 지정
soup = BeautifulSoup(html, 'html.parser')
#<a>태그에서 제목과 링크주소 (a 태그 중 class 명이 news_tit인 것)
atags = soup.find_all('a', 'news_tit')
for atag in atags:
title = atag.get('title')
title_text.append(title) #제목
link_text.append(atag['href']) #링크주소
#신문사 추출 (a 태그 중 class 명이 info press인 것)
source_lists = soup.find_all('a', 'info press')
for source_list in source_lists:
source_text.append(source_list.text) #신문사
#본문요약본 (a 태그 중 class 명이 api_txt_lines dsc_txt_wrap인 것)
contents_lists = soup.find_all('a','api_txt_lines dsc_txt_wrap')
for contents_list in contents_lists:
contents_cleansing(contents_list) #본문요약 정제화
#모든 리스트 딕셔너리형태로 저장
result= {"title":title_text , "source" : source_text ,"contents": contents_text ,"link":link_text }
df = pd.DataFrame(result) #df로 변환
page += 10
# 새로 만들 파일이름 지정
outputFileName = '%s-%s-%s %s시 %s분 %s초 merging.xlsx' % (now.year, now.month, now.day, now.hour, now.minute, now.second)
df.to_excel(RESULT_PATH+outputFileName,sheet_name='sheet1')
#메인함수
def main():
info_main = input("="*50+"\n"+"입력 형식에 맞게 입력해주세요."+"\n"+" 시작하시려면 Enter를 눌러주세요."+"\n"+"="*50)
maxpage = input("최대 크롤링할 페이지 수 입력하시오: ") #10,20...
query = input("검색어 입력: ") #네이버, 부동산...
sort = input("뉴스 검색 방식 입력(관련도순=0 최신순=1 오래된순=2): ") #관련도순=0 최신순=1 오래된순=2
s_date = input("시작날짜 입력(2019.01.04):") #2019.01.04
e_date = input("끝날짜 입력(2019.01.05):") #2019.01.05
crawler(maxpage,query,sort,s_date,e_date)
print("크롤링 완료")
#메인함수 수행
main()

크롤링하고 나면 해당 사진과 같이 제목, 신문자, 내용, 링크 내용을 csv 파일로 저장
이를 기준으로 Rstudio를 이용하여 텍스트마이닝해서 이슈 캐치

install.packages("rJava")
install.packages("memoise")
install.packages("KoNLP")
library(KoNLP)
library(dplyr)
Sys.setenv(JAVA_HOME="C:/Program Files/Java/jdk1.8.0_171")
data <-readLines("D:/통합 문서2.csv")
head(data)
install.packages("stringr")
library(stringr)
#특수문자 제거
data <- str_replace_all(data, "\\W", " ") # 모든 특수기호를 찾아서 공백 처리
head(data)
#불필요한 단어 제거
data <- gsub("\\d+", "", data) #숫자제거
data <- gsub("이번", "", data)
data <- gsub("방역", "", data)
data <- gsub("신규", "", data)
data <- gsub("명대", "", data)
#명사추출
nouns <- extractNoun(data)
# 추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성
wordcount <- table(unlist(nouns))
# 넘어가기
wordcount_top <- head(sort(wordcount, decreasing = T), 100)
wordcount_top
# 데이터 프레임으로 변환
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)
df_word
# 상위 100개 추출
top100 <- df_word %>%
arrange(desc(freq)) %>%
head(100)
top100
library(ggplot2)
library(wordcloud)
order <- arrange(top100, freq)$word
ggplot(data = top100, aes(x = word, y = freq)) +
ylim(0, 2500) +
geom_col() +
coord_flip() +
scale_x_discrete(limit = order) + # 빈도 순서 변수 기준 막대 정렬
geom_text(aes(label = freq), hjust = -0.3) # 빈도 표시
pal <- brewer.pal(8,"Dark2") # 색상 목록 생성
wordcloud(words = df_word$word, # 단어
freq = df_word$freq, # 빈도
min.freq = 10, # 최소 단어 빈도
max.words = 1000, # 표현 단어 수
random.order = F, # 고빈도 단어 중앙 배치
random.color = T,
rot.per = .1, # 회전 단어 비율
scale = c(6, 0.2), # 단어 크기 범위
colors = pal) # 색상 목록
2조 데이터 프로젝트 ver1 .pptx
2.17MB
반응형
'프로젝트' 카테고리의 다른 글
JSP 기반의 사진 변환 서비스 제공 웹 미니 프로젝트 (0) | 2021.04.30 |
---|---|
JavaScript로 구현한 영상 처리 웹 Instagram. <OutStagram> (0) | 2021.04.08 |