[SK쉴더스 루키즈 24기] Python(4) 데이터 수집 및 시각화

아굥·2024년 12월 18일

SK Shieldus Rookies

목록 보기
4/32

데이터 수집 개요 및 HTTP 요청

1. 데이터 수집 방법 개요

데이터를 효율적으로 모으고 활용하기 위해 중요한 단계

  • 데이터는 다양한 형식과 출처에서 수집 가능하며, 목적에 따라 방법도 달라짐
    ㄴ> 목적과 환경에 따라 적절한 방법을 선택

데이터 수집 방법

방법설명
웹 스크래핑(Web Scraping, 웹 크롤링)웹사이트에서 HTML 데이터를 가져와 필요한 정보 추출
API 활용REST API를 통해 JSON 형태의 데이터 제공
데이터베이스에서 데이터 가져오기이미 수집된 데이터를 데이터베이스에서 쿼리를 통해 추출
공개된 데이터셋 활용정부/기업/연구기관에서 제공하는 공개 데이터셋 다운하거나 API를 통해 사용
IoT 또는 센서 데이터 수집센서를 이용해 실시간 데이터 수집 (온도 센서, 카메라, GPS 장치 등)
소셜 미디어 데이터 수집소셜 미디어 플랫폼에서 사용자 활동 데이터 수집 (해당 플랫폼 API 사용)

2. requests 모듈을 활용한 데이터 수집

  • requests 모듈: HTTP 요청을 보내고 응답 처리에 사용되는 라이브러리
  • 웹 서버와 통신하여 데이터를 가져오거나 전송하는 작업 수행
    ㄴ> HTTP 메서드 지원

requests 모듈 설치

pip install requests

1) 응답 데이터 처리

import requests

url = 'https://jsonplaceholder.typicode.com/posts'
response = requests.get(url)					# GET method: 서버에서 데이터 가져옴

if response.status_code == 200:
	# 1_response.text: 응답을 문자열로 반환
    print(response.text[:500])
    
    # 2_response.json(): JSON 형식의 응답 -> 딕셔너리로 변환
    data = response.json()
    print(data['title'])
    print(data['body'])
else:
    print(f'오류 발생: {response.status_code}')	# HTTP 상태 코드 반환

2) 쿼리 파라미터 사용

  • 서버에서 데이터 전달 시, URL에 파라미터 포함해서 전달 가능
import requests

url = 'https://jsonplaceholder.typicode.com/posts'
params = {'userId': 1}

response = requests.get(url, params=params)

if response.status_code == 200:
    print(response.json())
else:
    print(f'오류 발생: {response.status_code}')	# HTTP 상태 코드 반환

3) 주의사항

  • API 호출 시 요청 제한을 초과하지 않도록 해야 함
  • 민감한 데이터(API key, 인증 정보)는 환경 변수로 관리하거나 안전하게 저장
  • 웹 크롤링 시 사이트의 robot.txt 규칙을 준수해야 함
    ㄴ> 잘못하면 법적 문제가 발생할 수 있음

웹 스크래핑 기초

1. HTML 구조 이해

웹 페이지의 구조를 정의하는 마크업 언어

  • HTML 문서는 브라우저가 읽어서 화면에 표시하는 기본 구조를 제공함

1) 태그(Tags)

  • HTML 요소를 정의함
<태그명 속성=""> 내용 </태그명>

2) 속성(Attributes)

  • 태그에 추가 정보 제공

3) DOM(Document Object Model)

  • 브라우저가 HTML 문서를 파싱하여 생성한 객체 모델
    ㄴ> 트리 구조, 각 요소는 노드(Node)로 구성됨
<html>							|	html
  	<body>						|	 └── body 	
		<h1>title</h1>			|		  ├── h1
    	<p>content</p>			|	      │   └── "Hello, World!"
	</body>						|		  └── p
</html>          				|			  └── "This is a paragraph."

2. BeautifulSoup을 활용한 웹 스크래핑

Python에서 HTML과 XML 문서를 파싱하고, 원하는 데이터를 추출할 때 사용하는 라이브러리

  • DOM 구조를 탐색하고 태그, 속성, 텍스트를 추출

BeautifulSoup 설치

pip install beautifulsoup4

from bs4 import BeautifulSoup

html_doc = """
<html>
    <head>
        <title>Example Page</title>
    </head>
    <body>
        <h1>Welcome to Web Scraping</h1>
        <p class="description">This is an example paragraph.</p>
        <a href="https://example.com1">Visit Example1</a>
        <a href="https://example.com2">Visit Example2</a>
        <a href="https://example.com3">Visit Example3</a>
        <a href="https://example.com4">Visit Example4</a>
    </body>
</html>
"""

soup = BeautifulSoup(html_doc, 'html.parser')

print(soup.title.string)
print(soup.h1.string)
print(soup.a['href'])

3. 주요 기능

  • 특정 태그 찾기: 태그 이름으로 요소 찾기 가능
  • 여러 태그 찾기: find_all()을 사용하여 특정 태그를 모두 찾을 수 있음
# 모든 <a> 태그 찾기
links = soup.find_all('a')
  • CSS 선택자 사용: select()를 사용하여 요소 찾기 가능
    ㄴ> 복잡한 선택 조건을 간단히 표현 가능
# 클래스가 "description"인 태그 찾기
description = soup.select_one('.description')

동적 웹페이지 데이터 수집

Selenium을 활용한 동적 데이터 수집

웹 브라우저를 자동으로 제어할 수 있게 해주는 라이브러리

  • 웹 애플리케이션 테스트, 동적 웹 페이지 데이터 수집에 사용
    ㄴ> 브라우저로 페이지 로드, JS 실행 결과도 확인 가능함

왜 사용하는가?

  • 정적 웹 페이지: HTML 소스코드만 파싱하면 데이터를 가져올 수 있음
  • 동적 웹 페이지: JavaScript로 콘텐츠를 생성 -> 일반 웹 스크래핑 도구로는 데이터 수집이 어려움
    => Selenium는 브라우저를 직접 제어 -> JavaScript 로드 이후의 데이터를 가져올 수 있음

Selenium 설치

pip install selenium


API를 활용한 데이터 수집

1. REST API의 이해

REST 원칙을 따르는 API

  • REST: 웹 서비스 <-> 클라이언트 간의 통신을 설계하는 아키텍처 스타일
  • 클라이언트와 서버 간 데이터(JSON, XML)를 주고 받는데 사용됨

1) REST API 구조

  • URL 구조: 자원 접근은 URL로 구성
    ㄴ> 기본 형식 https://www.example/resource/{id}
  • HTTP 메서드: 서버에 요청 보낼 때 HTTP 메서드와 URL을 조합하여 사용
메서드동작
GET데이터 조회
POST새 데이터 생성
PUT기존 데이터 수정
DELETE데이터 삭제

  • Headers: 요청/응답의 부가 정보
POST /users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer token123
  • Body: 요청 시 보내는 데이터
{
  "name": "hong",
  "email": "123@example.com"
}

2. 활용 방법

1) 원하는 데이터 탐색 후 인증키(API Key) 발급

2) API를 사용하여 데이터 수집

  • requests 모듈로 API 요청
  • 데이터는 JSON 형식으로 반환, 이를 처리하여 적합한 형식으로 변환하여 사용

3) 데이터 전처리

  • 결측치 처리, 중복 제거, 데이터 형식 변환 등으로 데이터 정리

4) 데이터 분석

  • Pandas, Matplotlib 등으로 데이터 시각화 및 통계 분석

데이터 저장 및 관리

1. CSV, Excel, JSON 파일에 데이터 저장

1) CSV

  • 간단한 데이터 저장과 교환에 적합
  • 대부분의 분석 도구와 호환
  • 계층적 데이터 저장 불가능

대량 데이터 저장, 분석 초기 단계에 적합

import csv

data = [
    ['Name', 'Age', 'City'],
    ['Alice', 30, 'New York'],
    ['Bob', 25, 'Los Angeles'],
    ['Charlie', 35, 'Chicago']
]

# CSV 파일로 저장
with open('data.csv', mode='w', encoding='utf-8', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(data)

data = pd.read_csv('data.csv')			# CSV 파일 -> 데이터프레임 형태로 변환

2) Excel

  • 데이터 시각화와 분석에 적합
  • 표 형태의 데이터 저장 가능 -> 구조화된 데이터 관리
  • 무겁기 때문에 대규모 데이터 교환에는 부적합함
  • openpyxl, pandas 라이브러리를 주로 사용함

데이터 요약, 보고서 작성, 분석 작업에 유용

data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [30, 25, 35],
    'City': ['New York', 'Los Angeles', 'Chicago']
}

df = pd.DataFrame(data)
df.to_excel('data.xlsx', index=False)	# Excel 파일로 저장

data = pd.read_excel('data.xlsx')		# Excel 파일 읽기

3) JSON

  • API 데이터 교환에 적합
  • 계층적 데이터 구조로 표현 가능
  • 사람이 직접 읽기 힘들어서 편집 도구가 필요

웹이나 모바일 애플리케이션과의 데이터 교환에 적합

import json

data = {
    'people': [
        {'name': 'Alice', 'age': 30, 'city': 'New York'},
        {'name': 'Bob', 'age': 25, 'city': 'Los Angeles'},
        {'name': 'Charlie', 'age': 35, 'city': 'Chicago'}
    ]
}

with open('data.json', mode='w', encoding='utf-8') as file:
    json.dump(data, file, indent=4)		# json.dump(): JSON형식으로 저장

with open('data.json', mode='r') as file:
    data2 = json.load(file)				# JSON 파일 -> 딕셔너리로 변환: json.load()

2. SQLite를 활용한 간단한 데이터베이스 관리

파일 기반의 관계형 데이터베이스 관리 시스템(RDBMS)

  • Python 내장 모듈로 서버 설치 X
  • 데이터 저장, 조회, 관리 등에 활용

1) 주요 기능

  • SQLite - Python 연동
import sqlite3

# 데이터베이스 연결 (파일 생성)
connection = sqlite3.connect('example.db')

# 연결 종료
connection.close()
  • 테이블 생성
connection = sqlite3.connect('example.db')
cursor = connection.cursor()

# CREATE TABLE IF NOT EXISTS: 테이블이 없을 경우에만 생성
# PRIMARY KEY AUTOINCREMENT: 기본 키, 자동 증가 값 사용
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (			
	id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER
)
""")

connection.close()
  • 데이터 삽입
cursor.execute("INSERT INTO users (name, age, city)
VALUES (?, ?, ?)", 						# ?: 자리표시자, SQL 인젝션 방지
			("Alice", 30, "New York"))

# 여러 데이터 삽입
data = [
  ("Bob", 25, "Los Angeles"),
  ("Charlie", 35, "Chicago"),
  ("Diana", 28, "Houston")
]
cursor.executemany("INSERT INTO users (name, age, city)
VALUES (?, ?, ?)", data)


connection.commit()						# 변경사항 저장
  • 데이터 조회
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()				# fetchall(): 모든 조회 결과 가져옴
										# fetchone(): 한 행씩 가져옴
  • 데이터 수정
cursor.execute("UPDATE users SET age = ? WHERE
name = ?", (31, "Alice"))

connection.commit()
  • 데이터 삭제
cursor.execute("DELETE FROM users WHERE name = ?",
("Bob",))

connection.commit()

데이터 시각화

1. 기본 시각화_Matplotlib의 활용

데이터를 시각화하기 위한 가장 기본적인 라이브러리

1) 선형 그래프(Line Plot)

  • 데이터 점을 선으로 연결하여 값의 변화 추이를 시각화
  • 시간에 따른 변화, 연속적인 데이터 비교에 사용
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5] 
y = [2, 3, 5, 7, 11]

plt.plot(x, y, marker='o', linestyle='-', color='b', label='Prime Numbers')

plt.title("Line Plot Example")
plt.show()

생성 옵션

  • color: 선 색상
  • marker: 각 데이터 포인트를 나타내는 기호
  • linestyle: 선 스타일

2) 막대 그래프(Bar Chart)

  • 카테고리형 데이터 시각화
import matplotlib.pyplot as plt

categories = ['A', 'B', 'C', 'D', 'E']
values = [5, 7, 3, 8, 4]

# 막대 그래프 생성
plt.bar(categories, values, color='skyblue', edgecolor='black’)

# 수평 막대 그래프 생성
plt.barh(categories, values, color='lightgreen', edgecolor='black')

plt.title("Bar Chart Example")
plt.show()

생성 옵션

  • color: 막대 색상
  • edgecolor: 막대 테두리 색상

3) 히스토그램(Histogram)

  • 데이터를 구간별로 나누어 빈도를 시각화
  • 데이터 분포를 파악할 때 사용
import matplotlib.pyplot as plt
import numpy as np

data = np.random.randn(1000)

# 히스토그램 생성
plt.hist(data, bins=20, color='orange',edgecolor='black', alpha=0.7)

plt.title("Histogram Example")
plt.show()

생성 옵션

  • bins: 데이터 나눌 구간 수
  • alpha: 막대 투명도 설정

2. 고급 시각화_Seaborn의 활용

데이터 시각화를 위해 설계, 복잡한 데이터를 쉽게 이해할 수 있도록 함

1) 히트맵(Heatmap)

  • 데이터의 관계를 행(row)과 열(col)로 나열
  • 값의 크기를 색상으로 표현함
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

data = np.random.rand(10, 10)
mask = np.triu(np.ones_like(data, dtype=bool))
sns.heatmap(data, annot=True, mask=mask,cmap='coolwarm')

plt.title("Heatmap Example")
plt.show()

생성 옵션

  • annot: 셀에 숫자 표시
  • cmap: 색상 팔레트
  • mask: 특정 영역 숨기기

사용 사례

  • 변수 간 상관 관계 확인
  • 범주형 데이터의 빈도 시각화

2) 박스 플롯(Box Plot)

  • 데이터 분포를 한눈에 확인 가능
  • 중앙값, 사분위 범위, 이상치 확인에 사용
import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset("tips")
sns.boxplot(x="day", y="total_bill", data=tips, palette="Set2")

plt.title("BoxPlot Example")
plt.show()

생성 옵션

  • Box: 데이터의 중앙값과 1, 3 사분위수
  • Whiskers: 데이터 최소/최대 값 표시
  • point: 이상치 나타냄

사용 사례

  • 데이터 분포 및 이상치 탐지
  • 그룹별 데이터 비교

3) 바이올린 플롯(Violin Plot)

  • 데이터 분포 밀도 확인 가능
    ㄴ> 박스플롯의 기능 포함됨
  • 데이터의 대칭성과 분포 패턴 확인에 유용
import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset("tips")
sns.violinplot(x="day", y="total_bill", data=tips, palette="muted", split=True)

plt.title("ViolinPlot Example")
plt.show()

생성 옵션

  • Width: 데이터 밀도
    ㄴ> 넓을수록 데이터가 해당 값에 많이 분포된 것
  • 중앙선: 중앙값이나 사분위수

사용 사례

  • 그룹 간 분포 차이 시각화
  • 데이터 밀도 확인
profile
열심히 살아보아요

0개의 댓글