본문 바로가기
빅데이터 부트캠프/팀 프로젝트

국내 기후변화 예산&의안 분석 프로젝트 (빅데이터 부트캠프 53~54&57~58&60~61일차)

by Mecodata 2022. 9. 27.

내가 맡은 역할

- 국내 기후변화 의안 분석과 관련된 모든 코딩
- 국내 기후변화 관련 의안 데이터 수집(OPEN API) + 데이터 전처리 + 분석 및 시각화(그래프, 워드클라우드)
- 국내 기후변화에 관한 다양한 분야간 주목 키워드 차이 분석을 위한 국내 기후변화 관련 보고서(PDF) 및 법령(TXT) 데이터 수집 + 데이터 전처리 + 분석 및 시각화(그래프, 워드클라우드)
※ 의안(입법부), 보고서(전문가), 법령(사법부)의 시선 비교

프로젝트 진행중에 알게된 것들

- os.path.dirname(__file__) : 현재 사용하고 있는 파이썬 파일의 위치 출력
- os.chdir() = 해당 디렉토리로 경로 이동 (change directory)
- os.path.exists() = 현재 위치에 해당 파일이 있는지 True/False
- 데이터 전처리시 수많은 데이터가 담겨 있는 리스트에서 몇가지 데이터를 제거하고 싶으면 remove를 이용하여 기존의 리스트에서 제거하는 것이 아닌 append를 이용하여 새로운 빈 리스트에 추가하는 것이 효율적
- 반복문에서 for i,j 와 같은 식으로 두 개의 리스트에서 각각의 원소를 불러오고 싶으면 zip(리스트1, 리스트2)을 통해서 두 개의 리스트를 합쳐줘야함 -> for i, j in zip(li1,li2)
- concat()을 통해 두 개의 데이터프레임을 합치고나서 reset_index()를 통해 인덱스를 재정렬할때 drop=True를 해야 이전의 인덱스가 컬럼으로 추가되는 것을 방지하고 inplace=True를 해야 변경사항이 적용됨
- glob.glob() = 사용자가 제시한 조건에 맞는 파일명을 리스트 형식으로 반환

크롤링

- response.get(url) = 해당 url 주소로 접근을 위한 get 요청 + OPEN API 이용시에는 (특히, 공공데이터포털) params에 지정한 파라미터를 딕셔너리 형태로 입력해주어야 호출 가능 (인증키)
※ 직접적으로 url에 파라미터를 입력하여 접근해야하는 OPEN API도 있음 ex) 국가법령정보

- 공공데이터 포털에서 인코딩 키는 에서 url로 입력하여 데이터를 불러오고 싶을때 사용하는 인증키이고, 디코딩 키는 파이참과 같은 IDE를 통해서 데이터를 불러오고 싶을 때 사용하는 인증키

- response = response.get(url)
-> response.content.decode('utf-8') = 해당 url 주소로 요청한 byte 데이터들을 불러오고 'UTF-8' 방식으로 디코딩하여 텍스트 데이터로 수신
※ 수신한 byte단위의 데이터를 자동으로 디코딩 해주는 response.text도 있는데 BeautifulSoup을 이용할 때는 무조건 response.content.decode를 사용해야함

- soup = BeautifulSoup(response.content.decode('utf-8'), 'xml') = 해당 데이터의 xml을 파싱
-> soup.select('태그명') = 지정한 태그 안에 있는 데이터들만 추출
※ BeautifulSoup은 기본적으로 html을 파싱하지만 xml이나 lxml도 가능하며 xml과 lxml이 html보다 처리 속도가 더 빠름

정규표현식

- import re
- 정규표현식을 적용하기 위해서는 해당 데이터의 타입이 string이어야함
- BeautifulSoup으로 크롤링해온 경우에는 데이터 타입이 bs4.element.ResultSet이라 반드시 string으로 변환해준후 적용해줘야 함
- 정규 표현식 패턴 지정후 적용하는 함수 = re.sub
- re.sub('([특수문자들])', '', text) = text에서 특수문자들이 있을 경우 해당 문자 제거
(단, '와 "를 제거하려면 \와 함께 입력해야함 \', \")
- re.sub('<.+>', '', text) = text에서 <tag> 형식의 문자가 있을 경우 해당 문자 제거
- re.compile('(?<=\<태그명>)(.*?)(?=<\/태그명>)')
-> rule1.findall(text) = text에서 해당 태그의 안에 있는 내용만 추출
?<=후방탐색을 의미하고 ?=전방탐색을 의미, \는 \뒤에 오는 문자를 기준으로 설정해줌
-> ?<=\<태그명>는 <태그명>을 기준으로 후방탐색을 하라는 의미이고
?=<\/태그명>는 </태그명>을 기준으로 전방탐색을 하라는 의미, .*?는 모든 텍스트 출력을 의미

PDF 파일 텍스트 추출

- PyPDF2 = PDF파일 텍스트 추출 패키지
- from PyPDF2 import PdfFileReader
- PdfFileReader.pages[페이지 번호]로 지정한 하나의 페이지의 텍스트를 불러올 수 있으나 전체 페이지 출력은 불가능하여 전체 페이지를 출력하려면 차라리 새로운 텍스트파일을 생성해 저장한 후 생성한 텍스트 파일의 내용을 읽어오는 것이 효율적
- PdfFileReader(open('pdf파일명','rb'))로 PDF 파일을 읽은 후
with open('텍스트 파일명', 'wb') as f: 을 통하여 텍스트파일에 저장할 수 있음

시각화

- matploltlib에서 시각화를 하였는데 한글이 깨졌다면 다음을 꼭 입력하자
matplotlib.rcParams['font.family'] ='Malgun Gothic'
matplotlib.rcParams['axes.unicode_minus'] = False


- WordCloud 생성시 mask로 이미지를 지정하여 지정한 이미지 모양으로 워드클라우드 생성 가능
(단, 바탕이 흰색이어야함)

- 파워포인트나 워드로 글씨를 크게하여 캡처한 후 그 이미지를 mask로 사용하면 해당 글씨 모양이 적용된 워드클라우드 생성 가능

- WordCloud의 라이브러리 중에서 ImageColorGenerator를 이용하면 해당 이미지를 그대로 이용하여 워드클라우드 출력 가능 (형태 뿐만 아니라 색깔)

- WordCloud의 파라미터 중 color_func이 있는데
def color_func(word, font_size, position,orientation,random_state=None, **kwargs):
return ("hsl({:d},{:d}%, {:d}%)".format(np.random.randint(120, 140), np.random.randint(80, 100), np.random.randint(10, 60))) 식으로 정의한 후 다음의 사이트를 참고하여 hsl 값의 범위를 조정한뒤
WordCloud(data, color_func=color_func)으로 입력하면 워드클라우드의 색깔 선택을 좀 더 자유롭게 할 수 있음
https://www.w3schools.com/colors/colors_picker.asp

 

HTML Color Picker

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

- fig.update_xaxes(range=[0, 3]) = plotly x축 범위 설정
- fig.update_yaxes(range=[50, 200]) = plotyl y축 범위 설정

프로젝트 보고서, PPT

5조 - 기후위기 현황 및 관련 예산과 입법 분석 보고서.pdf
1.73MB
5조 - 기후위기 현황 및 관련 예산과 입법 분석.pptx
1.77MB

 

프로젝트 관련 GitHub 주소

https://github.com/anydevil0812/bootcamp_project/tree/main/Project3

 

GitHub - anydevil0812/bootcamp_project: 부트캠프 프로젝트

부트캠프 프로젝트. Contribute to anydevil0812/bootcamp_project development by creating an account on GitHub.

github.com

 

댓글