AI 데이터 분석 과정
- 데이터 수집
- 오픈데이터 API, 웹 크롤링, 파일 읽기, DB 액세스
데이터 종류
- 정형데이터(Structure data)
- 미리 정해진 형식으로 구조화된 데이터
- 예) 엑셀 시트, RDBMS 테이블
- 반정형데이터(Semi-structure data)
- 특정한 형식에 따라 저장된 데이터이지만 정형데이터와 달리 형식에 대한 설명을 함께 제공
- 구조를 해석하는 파싱(일종의 번역) 과정이 필요하며 파일 형태로 저장
- 예) XML, JSON
- 특정한 형식에 따라 저장된 데이터이지만 정형데이터와 달리 형식에 대한 설명을 함께 제공
- 비정형데이터(Unstructured data)
- 정해진 구조가 없이 저장된 데이터
- 빅데이터의 대부분을 차지
- 예) 텍스트, 영상, 이미지 SNS
- 정해진 구조가 없이 저장된 데이터
데이터 소스
- 데이터가 존재하는 곳
미디어(SNS등) ,클라우드 , 웹, 사물인터넷, 데이터베이스 , 오픈 데이터/ API
외부 데이터 불러 오기
- 판다스는 다양한 형식의 파일로부터 데이터 불러오기 함수를 제공한다.
- 외부 데이터는 불러와 정형 데이터 구조(데이터 프레임)으로 변환
판다스에서 지원하는 외부 데이터 파일 형식
- csv 파일
- pd.read_csv() 함수
- df.to_csv() 메소드
- excel 파일
- pd.read_excel() 함수
- df.to_excel() 메소드
- json 파일
- pd.read_json() 함수
- df.to_json() 메소드
- 피클(pickle) 파일
- pd.read_pickle() 함수
- df.to_pickle() 메소드
CSV 파일
- CSV(Comma-separated values)
- 각 라인의 컬럼들이 콤마로 분리된 텍스트 파일 포맷
- CSV 파일 읽기/저장
- df = pd.read_csv(‘파일경로/이름’)
- df.to_csv(‘파일경로/이름‘, index=False)
index=False 를 사용하여 저장하는 이유 → df1은 csv를 불러 올 때 인덱스를 생략하여 데이터 프레임 변환과정에서 자동으로 인덱스가 붙어 버렸는데 이 인덱스를 저장하기는 싫어서(쓸모없는 데이터이기때문)
Excel 파일
- pd.read_excel(’파일경로/이름’) ← 해당 엑셀 파일 데이터프레임으로 변
- df.to_excel(’파일경로/이름’, index=False) ← df라는 데이터프레임 엑셀 파일로 저장
자동 생성된 index는 저장을 하지 말자
만약 판다스로 데이터를 불러 올 때 index_col를 지정하지 않았으면 저장 할때 index=False라는 옵션을 꼭 주어서 저장하자 , 안그러면 위의 사진처럼 쓸모없는 순서 인덱스가 추가된다.
json 파일
- JavaScript Object Notation의 약자
- json 파일 읽기/저장
→ json은 저장 할 때는 인덱스를 따로 저장하지 않음
import pandas as pd
file_path1 = 'weather.json'
df1 = pd.read_json(file_path1) # read_json() 함수로 데이터프레임 변환
df.to_json('sample_data.json') # json 파일 저장
file_path2 = 'sample_data.json'
df2 = pd.read_json(file_path2) # 저장 파일 확인
print(df2)
pickle 파일
- 파이썬에서 객체를 저장하기 위한 이진 파일 형식
- 텍스트 파일 : json, excel, csv … 등등
- 이진 파일 : 음악, 한글 파일, …
텍스트파일 : (아스키코드, 유니코드) 등 문자코드로 바꿔서 저장 → 메모장으로 읽을 수 있는 데이터들
이진 파일 : 자체 포맷이 있음, 텍스트로 변환하지 않고 객체, 정수 등등 있는 그대로 저장, 메모장으로 열었을 때 읽을 수가 없다
import pandas as pd
file_path1 = 'weather.pkl'
df1 = pd.read_pickle(file_path1) # read_pickle() 함수로 데이터프레임 변환
df1.to_pickle('sample_data.pkl') # pickle 파일 저장
file_path2 = 'sample_data.pkl'
df2 = pd.read_pickle(file_path2) # 저장 파일 확인
print(df2)
엑셀, csv 파일은 자동으로 인덱스를 생성함
- 저장 시 디폴트로 인덱스도 저장함
pickle, json 파일은 자동으로 인덱스를 생성 함
- 저장 시 인덱스는 저장되지 않음
웹 크롤링(crawling)
- 웹 페이지를 원본 그대로 불러와 웹 페이지 내에 데이터를 추출하는 기술
- 웹 스크래이핑(Scraping)이라고도 함
- 크롤링을 전용 소프트웨어는 웹크롤러(Crawler)라고 함
- 파이썬 크롤링 라이브러리 : Beautifulsoup
- Beautifulsoup을 이용한 웹 크롤링 절차
- 데이터를 웹 크롤링하기 위해서는 웹소켓을 이용하여 원하는 웹사이트에 연결 요청을 진행
- 연결 요청을 응답으로 웹서버는 읍답(Response)를 보내면 보통 HTML이나 JSON형식으로 반환
- 반환된 HTML, JSON데이터를 Beautiful Soup으로 파싱
BeautifulSoup4, requests 라이브러리 필요
BeautifulSoup 객체 생성
- requests 모듈 사용
- page = requests.get**("https://www.daangn.com/hot_articles")**
- soup = BeautifulSoup**(**page.content, ‘html.parser’)
- 첫번째 인자 : HTML 텍스트(page.content, page.text)
- 두번째 인자 : 파서 종류
- html.parser : 기본 설치, 보통 속도
- lxml : lxml 모듈 추가 설치 필요, 매우 빠름
- html5lib : 브라우저와 같은 방식, 매우 느림
- urllib.request 모듈 사용
- fr = urlopen('https://www.naver.com/’)
- soup = BeautifulSoup(fr.read(), 'html.parser')
HTML 태그(요소) 이름을 속성으로 가짐
- 태그(요소) 탐색 가능
- ex) soup.h2 : 첫번째 h2 태그 추출 (태그 + 내용)
- ex) soup.h2.string == soup.h2.text : 첫번째 p 태그의 내용만 추출
from bs4 import BeautifulSoup as bs
import requests
page = requests.get('https://www.daangn.com/hot_articles')
soup = bs(page.content, "html.parser")
print(soup.h2)
print('---------------------------------')
print(soup.h2.string)
print(soup.h2.text)
h2태그의 첫번째 요소를 출력하였음
- soup.find(‘태그명’)
- 첫번째 태그명 추출 **== soup.**태그명
- soup.find(‘태그명’, attrs={‘속성’:‘값’})
- attrs 속성을 가진 첫번째 태그 추출
- cf**)** 태그의 내용만 추출 : tag.text 속성 == tag.get_text**()** 메소드
import requests
page = requests.get('https://www.daangn.com/hot_articles')
soup = bs(page.content, "html.parser")
print(soup.h2)
print(soup.find('h2'))
print(soup.find('h2').text)
print("-----------------------------------")
print(soup.find("h1",{"id":"hot-articles-head-title"}))
- soup.find_all(‘태그명’)
- 태그명을 가진 모든 태그 추출
- 반환타입 : bs4.element.ResultSet
- soup.find_all(‘태그명’, attrs={‘속성’:‘값’})
- 태그명 중에서 attrs 속성을 가진 태그 추출
# soup.find_all('태그명')
import requests
page = requests.get('https://www.daangn.com/hot_articles')
soup = bs(page.content, "html.parser")
print(soup.find_all('h2'))
print(len(soup.find_all("h2")))
print("-----------------------------------")
print(soup.find_all(attrs={"class":"head-title"}))
print(len(soup.find_all(attrs={"class":"head-title"})))
벅스 Top 100 웹 크롤링
from urllib.request import urlopen
from bs4 import BeautifulSoup as bs
fr = urlopen("https://music.bugs.co.kr/chart?wl_ref=M_left_02_01")
soup = bs(fr.read(), 'html.parser')
# td 태그에 check라는 class가 있는 td 태그를 모두 가져온다.
musics = soup.find_all("td", "check")
artists2 = soup.find_all("p", {"class":"artist"})
# musics의 각 태그들에 대해서
for i, music in enumerate(musics):
# input 태그안에 title 속성값을 parsing 한다.
print("{}위 : {} {}".format(i+1, music.input['title'], soup.select('.artist')[i+1].get_text()))
AI 데이터 분석 과정
- 데이터 수집
- 오픈데이터 API, 웹 크롤링, 파일 읽기, DB 액세스
데이터 종류
- 정형데이터(Structure data)
- 미리 정해진 형식으로 구조화된 데이터
- 예) 엑셀 시트, RDBMS 테이블
- 반정형데이터(Semi-structure data)
- 특정한 형식에 따라 저장된 데이터이지만 정형데이터와 달리 형식에 대한 설명을 함께 제공
- 구조를 해석하는 파싱(일종의 번역) 과정이 필요하며 파일 형태로 저장
- 예) XML, JSON
- 특정한 형식에 따라 저장된 데이터이지만 정형데이터와 달리 형식에 대한 설명을 함께 제공
- 비정형데이터(Unstructured data)
- 정해진 구조가 없이 저장된 데이터
- 빅데이터의 대부분을 차지
- 예) 텍스트, 영상, 이미지 SNS
- 정해진 구조가 없이 저장된 데이터
데이터 소스
- 데이터가 존재하는 곳
미디어(SNS등) ,클라우드 , 웹, 사물인터넷, 데이터베이스 , 오픈 데이터/ API
외부 데이터 불러 오기
- 판다스는 다양한 형식의 파일로부터 데이터 불러오기 함수를 제공한다.
- 외부 데이터는 불러와 정형 데이터 구조(데이터 프레임)으로 변환
판다스에서 지원하는 외부 데이터 파일 형식
- csv 파일
- pd.read_csv() 함수
- df.to_csv() 메소드
- excel 파일
- pd.read_excel() 함수
- df.to_excel() 메소드
- json 파일
- pd.read_json() 함수
- df.to_json() 메소드
- 피클(pickle) 파일
- pd.read_pickle() 함수
- df.to_pickle() 메소드
CSV 파일
- CSV(Comma-separated values)
- 각 라인의 컬럼들이 콤마로 분리된 텍스트 파일 포맷
- CSV 파일 읽기/저장
- df = pd.read_csv(‘파일경로/이름’)
- df.to_csv(‘파일경로/이름‘, index=False)
index=False 를 사용하여 저장하는 이유 → df1은 csv를 불러 올 때 인덱스를 생략하여 데이터 프레임 변환과정에서 자동으로 인덱스가 붙어 버렸는데 이 인덱스를 저장하기는 싫어서(쓸모없는 데이터이기때문)
Excel 파일
- pd.read_excel(’파일경로/이름’) ← 해당 엑셀 파일 데이터프레임으로 변
- df.to_excel(’파일경로/이름’, index=False) ← df라는 데이터프레임 엑셀 파일로 저장
자동 생성된 index는 저장을 하지 말자
만약 판다스로 데이터를 불러 올 때 index_col를 지정하지 않았으면 저장 할때 index=False라는 옵션을 꼭 주어서 저장하자 , 안그러면 위의 사진처럼 쓸모없는 순서 인덱스가 추가된다.
json 파일
- JavaScript Object Notation의 약자
- json 파일 읽기/저장
→ json은 저장 할 때는 인덱스를 따로 저장하지 않음
import pandas as pd
file_path1 = 'weather.json'
df1 = pd.read_json(file_path1) # read_json() 함수로 데이터프레임 변환
df.to_json('sample_data.json') # json 파일 저장
file_path2 = 'sample_data.json'
df2 = pd.read_json(file_path2) # 저장 파일 확인
print(df2)
pickle 파일
- 파이썬에서 객체를 저장하기 위한 이진 파일 형식
- 텍스트 파일 : json, excel, csv … 등등
- 이진 파일 : 음악, 한글 파일, …
텍스트파일 : (아스키코드, 유니코드) 등 문자코드로 바꿔서 저장 → 메모장으로 읽을 수 있는 데이터들
이진 파일 : 자체 포맷이 있음, 텍스트로 변환하지 않고 객체, 정수 등등 있는 그대로 저장, 메모장으로 열었을 때 읽을 수가 없다
import pandas as pd
file_path1 = 'weather.pkl'
df1 = pd.read_pickle(file_path1) # read_pickle() 함수로 데이터프레임 변환
df1.to_pickle('sample_data.pkl') # pickle 파일 저장
file_path2 = 'sample_data.pkl'
df2 = pd.read_pickle(file_path2) # 저장 파일 확인
print(df2)
엑셀, csv 파일은 자동으로 인덱스를 생성함
- 저장 시 디폴트로 인덱스도 저장함
pickle, json 파일은 자동으로 인덱스를 생성 함
- 저장 시 인덱스는 저장되지 않음
웹 크롤링(crawling)
- 웹 페이지를 원본 그대로 불러와 웹 페이지 내에 데이터를 추출하는 기술
- 웹 스크래이핑(Scraping)이라고도 함
- 크롤링을 전용 소프트웨어는 웹크롤러(Crawler)라고 함
- 파이썬 크롤링 라이브러리 : Beautifulsoup
- Beautifulsoup을 이용한 웹 크롤링 절차
- 데이터를 웹 크롤링하기 위해서는 웹소켓을 이용하여 원하는 웹사이트에 연결 요청을 진행
- 연결 요청을 응답으로 웹서버는 읍답(Response)를 보내면 보통 HTML이나 JSON형식으로 반환
- 반환된 HTML, JSON데이터를 Beautiful Soup으로 파싱
BeautifulSoup4, requests 라이브러리 필요
BeautifulSoup 객체 생성
- requests 모듈 사용
- page = requests.get**("https://www.daangn.com/hot_articles")**
- soup = BeautifulSoup**(**page.content, ‘html.parser’)
- 첫번째 인자 : HTML 텍스트(page.content, page.text)
- 두번째 인자 : 파서 종류
- html.parser : 기본 설치, 보통 속도
- lxml : lxml 모듈 추가 설치 필요, 매우 빠름
- html5lib : 브라우저와 같은 방식, 매우 느림
- urllib.request 모듈 사용
- fr = urlopen('https://www.naver.com/’)
- soup = BeautifulSoup(fr.read(), 'html.parser')
HTML 태그(요소) 이름을 속성으로 가짐
- 태그(요소) 탐색 가능
- ex) soup.h2 : 첫번째 h2 태그 추출 (태그 + 내용)
- ex) soup.h2.string == soup.h2.text : 첫번째 p 태그의 내용만 추출
from bs4 import BeautifulSoup as bs
import requests
page = requests.get('https://www.daangn.com/hot_articles')
soup = bs(page.content, "html.parser")
print(soup.h2)
print('---------------------------------')
print(soup.h2.string)
print(soup.h2.text)
h2태그의 첫번째 요소를 출력하였음
- soup.find(‘태그명’)
- 첫번째 태그명 추출 **== soup.**태그명
- soup.find(‘태그명’, attrs={‘속성’:‘값’})
- attrs 속성을 가진 첫번째 태그 추출
- cf**)** 태그의 내용만 추출 : tag.text 속성 == tag.get_text**()** 메소드
import requests
page = requests.get('https://www.daangn.com/hot_articles')
soup = bs(page.content, "html.parser")
print(soup.h2)
print(soup.find('h2'))
print(soup.find('h2').text)
print("-----------------------------------")
print(soup.find("h1",{"id":"hot-articles-head-title"}))
- soup.find_all(‘태그명’)
- 태그명을 가진 모든 태그 추출
- 반환타입 : bs4.element.ResultSet
- soup.find_all(‘태그명’, attrs={‘속성’:‘값’})
- 태그명 중에서 attrs 속성을 가진 태그 추출
# soup.find_all('태그명')
import requests
page = requests.get('https://www.daangn.com/hot_articles')
soup = bs(page.content, "html.parser")
print(soup.find_all('h2'))
print(len(soup.find_all("h2")))
print("-----------------------------------")
print(soup.find_all(attrs={"class":"head-title"}))
print(len(soup.find_all(attrs={"class":"head-title"})))
벅스 Top 100 웹 크롤링
from urllib.request import urlopen
from bs4 import BeautifulSoup as bs
fr = urlopen("https://music.bugs.co.kr/chart?wl_ref=M_left_02_01")
soup = bs(fr.read(), 'html.parser')
# td 태그에 check라는 class가 있는 td 태그를 모두 가져온다.
musics = soup.find_all("td", "check")
artists2 = soup.find_all("p", {"class":"artist"})
# musics의 각 태그들에 대해서
for i, music in enumerate(musics):
# input 태그안에 title 속성값을 parsing 한다.
print("{}위 : {} {}".format(i+1, music.input['title'], soup.select('.artist')[i+1].get_text()))