본문 바로가기

파이썬 & 머신러닝과 딥러닝

상관관계 확인, OpenAPI 사용, beautifulsoup, Selenium, 통계 분석 개념 및 정리

Kaggle, Dacon

 

자연어 처리를 위한 라이브러리

Gensim 

- 임베딩 가능

- 토픽 모델링

- LDA 등 지원

 

Scikit-learn

- CountVectorizer : 텍스트 내 단어 빈도수

- TfidVectorizer : TF-IDF(단어 중요도 파악) 기법을 적용하여 값 도출

- HashingVectorizer : 해시 함수로 실행시간 감소

 


 

CSV 파일 다루기

object 형식을 컴퓨터가 이해하지 못하기 때문에 임베딩(수치화 시켜야함)

 

column들간의 상관관계를 확인

-> 특징과 특징 사이 연관 관계 (선형 관계, 상관 관계) : 정답데이터와 상관없을 수 있음

 

  • +1: 완전한 양의 상관관계 (한 특징이 증가할 때 다른 특징도 증가).
  • 0: 상관관계 없음 (특징 간에 선형 관계가 없음).
  • -1: 완전한 음의 상관관계 (한 특징이 증가할 때 다른 특징은 감소).

 

-> 라벨데이터(정답값) 과 연관 관계  

: 어떤 특징이 라벨과 가장 높은 상관관계를 가지는지 파악

 

 

import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv('C:/Users/campus4D033/life_expectancy.csv')
print(df.describe())
print(df.info())

extract_df = df[['Life expectancy', 'Year', 'Alcohol', 'Percentage expenditure']]
print(extract_df.shape)

print(extract_df.isnull().sum())
print('-----결측치 처리-----')

extract_df.dropna(inplace = True)
print(extract_df.isnull().sum())

import seaborn as sns
sns.set(rc = {'figure.figsize':(12, 10)})
correlation_matrix = extract_df.corr().round(2)
sns.heatmap(data = correlation_matrix, annot=True)
plt.show()

sns.pairplot(extract_df)
plt.show()

 

 

상관 계수

: 두 변수 간의 선형 관계의 강도와 방향을 나타내는 수치

  • 1 : 양의 상관관계가 가장 높다
  • -1 : 음의 상관관계가 가장 높다
  • 0 : 상관관계가 없다

 


 

OpenAPI 사용

import requests
import json
from bs4 import BeautifulSoup
#-------------------------------------------------인코딩-------------------------------------------------
# service_key = "oc9dQD9TcZyDCiIRueejn3i%2B8CpL0iQFb8JjJ8QmTdeWcdzdDec%2BnzgL%2B1Q8IWKAxBjf8k8gbrY2QMpTBpzDmg%3D%3D"
# url = f"http://apis.data.go.kr/B552061/frequentzoneFreezing/getRestFrequentzoneFreezing?ServiceKey=인증키&type=json&searchYearCd=2017&siDo=11&guGun=110&numOfRows=10&pageNo=1"
# response = requests.get(url)
# content = response.json()
# parsed_data = json.loads(response.text)
# print(parsed_data,type(parsed_data))
#-------------------------------------------------디코딩-------------------------------------------------
url = 'http://apis.data.go.kr/B552061/frequentzoneFreezing/getRestFrequentzoneFreezing'
service_key = "oc9dQD9TcZyDCiIRueejn3i+8CpL0iQFb8JjJ8QmTdeWcdzdDec+nzgL+1Q8IWKAxBjf8k8gbrY2QMpTBpzDmg=="
params ={'serviceKey' : service_key,
          'type' : 'json',
          'searchYearCd' : 2017,
          'siDo' : 11,
          'guGun' : 110,
          'numOfRows' : 10,
          'pageNo' : 1 }
response = requests.get(url, params=params)
parsed_data = json.loads(response.text)
print(parsed_data,type(parsed_data))

body = parsed_data['items']['item']
print(body)

import pandas as pd
data = pd.json_normalize(body)
print(data)

 

 

 


 

beautifulsoup

 

https://search.naver.com/search.naver?nso=&page=2&query=코로나&sm=tab_pge&start=1&where=web

 

https://search.naver.com/search.naver?nso=&page=3&query=코로나&sm=tab_pge&start=16&where=web

-> 2페이지에서 3페이지로 가니 start가 15 증가 15 * 1 = 15

 

https://search.naver.com/search.naver?nso=&page=10&query=코로나&sm=tab_pge&start=121&where=web

-> 10페이지는 start가 120 증가한 모습 15 * 8 = 120

 

 

검색어와 페이지 번호를 입력받아 네이버 검색 url 반환

import requests
from bs4 import BeautifulSoup

input_search = input("검색어 입력 : ")
page = int(input("검색할 페이지 : "))

# page 지정시 계산 부분
new_page = 0
if page == 1:
    url = f'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query={input_search}'
elif page == 0:
    url = f'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query={input_search}'
else:
    new_page = (page-2) * 15 + 1
    url = f'https://search.naver.com/search.naver?nso=&page={page}&query={input_search}&sm=tab_pge&start={new_page}&where=web'
print(url)

 

 


 

Selenium

브라우저를 통해 접근 실행

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

# open the Chrome 브라우저
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))


# 원하는 사이트의 url 입력
driver.get('https://www.google.com/search?q=%EC%BD%94%EB%A1%9C%EB%82%98&oq=%EC%BD%94%EB%A1%9C%EB%82%98&gs_lcrp=EgZjaHJvbWUyBggAEEUYOdIBCDI0ODRqMGo3qAIAsAIA&sourceid=chrome&ie=UTF-8')

driver.find_element(By.XPATH, '//*[@id="rso"]/div[2]/div/div/div[1]/div/div/span/a/h3')

 

 


 

 

Selenium을 사용한 금융데이터 수집

네이버의 환율 정보를 크롤링하는 학습 방법

-> 수집한 데이터를 데이터프레임으로 

 

 

import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

# 드라이버 생성
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

# 원하는 사이트의 url 입력 - 네이버 환율 정보 테이블에 접근
driver.get('https://finance.naver.com/marketindex/?tabSel=exchange#tab_selection')

# ifram객체는 반드시 스위칭 후에 UI Element 접근 가능
driver.switch_to.frame('frame_ex1')

data = driver.find_element(By.XPATH, '/html/body/div/table')

for i in data.find_elements(By.TAG_NAME, 'tr'):
    print(i.text)
    
d_list = []
for j in data.find_elements(By.TAG_NAME, 'tr'):
    d_list.append(j.text.split())
    
df = pd.DataFrame(d_list)

# 데이터프레임 출력
print(df)

 

추가적으로 첫번째 행 삭제하는 전처리 필요

 

 


 

통계 분석 개념 및 정리

모든 특성 수치 표현

- 데이터가 수치화 되는 것이 기본

 

최대한 다양한 변수를 넣어 주요 변수 파악

- 한가지의 특성은 여러가지 특성으로부터 영향을 받음

 

 

통계 분석을 하는 이유

 

- 지수

  • 추상적 개념은 직접적 관찰 어려움 -> 실제 측정값을 사용해야함
  • 추상적인 내용들과 연관된 내용들이 있음 -> 관찰 가능한 다른 특성들과 연관 (추천 행동, 추천)

 

- 군집화

  • 비지도 학습에 속함
  • 비슷한 특성을 모아 하나의 집단으로 
  • K-평균(K-means) 군집화 알고리즘 : 홀수 형태로 값을 늘려가면서 k 값 성능을 확인
  • K-최근접 이웃(KNN) 알고리즘 : 주어진 데이터 집합을 K개의 군집으로 나누는 것 (데이터 패턴 이해)

 

- 통계 분석의 예

  • 추천 시스템
  • 당근마켓 매물 분석

 

- 분류와 회귀

  • 오차를 활용하여 회귀
  • 선택지가 정해진 분류 중 하나를 선택

 


 

변수의 종류

 

 범주형 변수 : 특정 내용 카테고리에 포함

- 순서형 (서열)

- 명목형 (비서열)

 

수치형 변수 : 숫자로 나타낼 수 있음

- 이산형 : 소수점으로 표현 안되는 수치적인 의미 존재

- 연속형 : 소수점으로 표현되는 연속적인 값

 


 

상관분석 

 

- 두 변수의 연관성을 수치로 나타낸 것

- -1 ~ +1 로 상관계수를 나타냄

  • +1 한 변수가 증가시 다른 변수도 증가
  • -1 하나가 높으면 다른 하나가 낮다
  • 상관계수가 0이면 관계 없음