
안녕하세요! 이번 주는 한파로 정말 추운 날씨였는데, 다들 잘 지내셨나요?
저는 날씨가 너무 추워서 헬스장보다는 집에서 운동을 하고, 강아지 산책도 짧아졌어요. (강아지들도 추워서 그런지 산책을 짧게 끝내주더라고요.) 얼른 따뜻한 봄날씨가 찾아와서 바깥 활동을 할 수 있었으면 좋겠어요.
벌써 부트 캠프를 시작한 지 한 달이 되었어요!
시간이 참 빠르게 지나간 것 같아요. 이번 주에는 파이썬을 활용한 데이터 전처리와 시각화, 데이터 수집을 위한 웹 크롤링 기법을 배우고, 그동안 학습했던 내용을 바탕으로 본격적인 데이터 분석에 돌입했습니다. 특히 이번 주는 배울 내용의 난이도가 크게 올라간 느낌이라 공부량도 자연스럽게 늘어났어요. 그래서인지 한 주가 유독 길게 느껴졌답니다. 새로운 개념들을 이해하고 익히는 데 시간이 걸렸지만, 점점 더 깊이 있는 분석 기술을 익혀가는 과정이 흥미로웠어요.
여러분도 한 주 동안 어떤 도전을 마주했는지 궁금하네요. 다음 주에도 더 성장한 모습을 기대하며 열심히 해보겠습니다!
| 데이터 전처리
1) Pandas란
- 쉽고 직관적으로 작업할 수 있도록 설계된 빠르고 유연한 데이터 구조를 제공하는 Phtyon 패키지
import pandas as pd
2) Series와 DataFrame
- Series : pandas에서 사용하는 리스트
#(1) 딕셔너리로 시리즈 만들기
dic = {'a':1, 'b':2, 'c':3}
dic_series = pd.Series(dic)
#(2) 리스트로 시리즈 만들기
ls = [1,2,3]
ls_series = pd.Series(ls, index=['a','b','c']
#(3) 시리즈 값, 인덱스, 타입 확인
print(dic_series.values) # [1,2,3]
print(dic_series.index) # index(['a','b','c'], dtype='object')
print(dic_series.dtypes) # int64
print(ls_series.values) # [1,2,3]
print(ls_series.index) # index(['a','b','c'], dtype='object')
print(ls_series.dtypes) # int64
- DataFrame : Series를 표 형태로 만들기
- 딕셔너리 : 열 단위로 값을 입력할때 (값의 길이가 다르면 에러)
- 리스트 : 행 단위로 값을 입력할 때(각 리스트의 길이가 다르면 에러)
#(1) 딕셔너리로 데이터 프레임 만들기
import pandas as pd
dic = {'Name':['John','Merry','Chris']
,'Number':[1,2,3]
, 'Month':['Feb','Oct','Nov']}
df = pd.DataFrame(dic) df
#(2) 리스트로 데이터 프레임 만들기
ls = [['John', 1, 'Feb']
,['Merry',2,'Oct']
,['Chris',3,'Nov']]
df = pd.DataFrame(ls, columns=['Name','Number','Month'])
df
#(3) 데이터프레임 값, 인덱스, 타입, 컬럼
print(df.values)
print(df.index)
print(df.dtypes)
print(df.columns)
- DataFrame
- .head()
- .tail()
- .info() : 데이터 프레임의 전체행, 컬럼 정보, 데이터 타입 등을 보여준다.
- .describe() : 컬럼별 통계(갯수, 평균, 표준편차 등)를 보여준다.
3) 데이터 불러오기+저장하기
- csv 파일
# 불러오기
변수 = pd.read_csv(파일경로)
# 저장하기
변수.to_csv(파일경로)
csv_data1 = pd.read_csv(csv_file_path, index_col=0) # index_col 인덱스로 사용할 컬럼
csv_data1 = pd.read_csv(csv_file_path, index_col = 'PassengerId',
usecols = ['PassengerId','Survived','Pclass','Age'])#usecols : 사용할 컬럼
- excel 파일
# 불러오기
변수 = pd.read_excel(파일경로, sheet_name=시트이름)
# 저장하기
변수.to_excel(파일경로, sheet_name=시트이름)
# header : 컬럼 이름으로 사용할 행
# index_col : 인덱스로 사용할 컬럼
# usecols : 사용할 컬럼
- html 파일
pd.read_html(html 경로)
# encoding : 한글이 깨져서 나올 때 'ut f-8' or 'cp949'로 설정
4) 데이터 추출
- 행 조회
- 데이터프레임명[인덱스 : 인덱스+1]
- 데이터프레임명[시작 인덱스 : 끝 인덱스+1]
- 열 조회
- 데이터프레임[컬럼명]
- 데이터프레임.컬럼명
- 데이터프레임[[컬럼명1, 컬럼명2, ...]]
- loc : 레이블 값을 사용하여 조회
- 데이터프레임명.loc[행조건, 열조건]
- 열만 조회할 때, 행 조건에 :를 입력
- iloc : 위치인덱스를 사용하여 조회
- 데이터프레임명.iloc[행인덱스조건, 열인덱스조건]
- 데이터 정렬
- 데이터프레임명.sort_values(정렬기준컬럼) : 오름차순
- 데이터프레임명.sort_values(정렬기준컬럼, ascending=False) : 내림차순
- 데이터프레임명.sort_values([정렬기준컬럼1, 정렬기준컬럼2], ascending=[False,True]) : 정렬기준컬럼 1은 내림차순, 정렬기준컬럼2는 오름차순
- 조건 데이터 추출
- 데이터프레임명[조건식]
- 데이터프레임명.query('조건식')
[1] 데이터 가공
1) 인덱스, 행, 열
- 인덱스 : 데이터프레임 행들의 이름
- df.index
- 인덱스 변경 : df.rename({인덱스:바꿀 인덱스, 인덱스:바꿀 인덱스, ...})
- 인덱스 전체 변경 : df.index = 바꿀 인덱스 리스트
- 열을 인덱스로 : df.set_index(컬럼명)
- 인덱스를 열로
- df.reset_index() : 열로 변환후 그 열을 남김
- df.reset_index(drop=True) : 열로 변환 후 열 삭제
- 행
- 행 추가 : pd.concat([기존 데이터명, 붙일 데이터명])
- 행 제거 : 데이터명.drop(인덱스명, axis=0)
- 행 중복 제거 : 데이터명.drop_duplicates()
- 열
- 열 추가 : 데이터명[추가할 컬럼명] = 추가할 값
- 열 제거 : 데이터명.drop(제거할 컬럼명, axis=1)
- 열 이름 변경 : 데이터명.rename({열이름:바꿀이름, 열이름:바꿀이름, ...}, axis=1)
- 열 이름 전체 변경 : 데이터명.colums = 열 이름 리스트
2) 결측값처리
- 결측값 확인
- isna() : 결측값을 True로 반환
- notna() : 결측값을 False로 반환
- 결측값 제거 : 데이터명.dropna(axis=0, how='any', subset=None)
- axis : {0:index / 1:columns}
- how : {'any' : 존재하면 제거 / 'all' : 모두 결측치면 제거}
- subset : 행/열의 이름 지정
- 결측값 대치
- 데이터 전체의 결측값을 특정 값으로 변경 : 데이터명.fillna(대치할 값)
- 특정 컬럼의 결측값을 특정 값으로 변경 : 데이터명[컬럼명].fillna(대치할 값)
- 결측값을 바로 위의 값과 동일하게 변경 : 데이터명.fillna(method='ffill')
- 결측값을 바로 아래의 값과 동일하게 변경 : 데이터명.fillna(method='bfill')
3) 타입변환
- 타입 확인 :
- .dtypes : 열의 타입을 시리즈로 반환
- 특정 타입을 가진 컬럼만 추출 : 데이터명.select_dtypes(타입)
- 타입 변환
- 데이터명[컬럼명].astype(타입)
4) 날짜 다루기
- 문자형 → 날짜형 : pd.to_datetime(컬럼, format='%Y-%m-%d')
- 날짜형식 변경 : 데이터컬럼.dt.strftime(날짜형식)
- dt 연산자
- 데이터컬럼.dt.year : 연도
- 데이터컬럼.dt.month : 월
- 데이터컬럼.dt.day : 일
- 데이터컬럼.dt.dayofweek : 요일(0-월, 6-일)
- 데이터컬럼.dt.day_name() : 요일을 문자로
- 날짜 계산
- day 연산 : pd.Timedelta(day=숫자)
- month 연산 : DateOffset(months=숫자)
- year 연산 : DateOffset(years=숫자)
- 날짜 구간 데이터 만들기
- pd.date_range(start=시작일자, end=종료일자, periods=기간수, freq=주기)
- 월말 : pd.date_range(start=시작일자, end=종료일자, periods=기간수, freq='M')
- 월초 : pd.date_range(start=시작일자, end=종료일자, periods=기간수, freq='MS')
- 연말 : pd.date_range(start=시작일자, end=종료일자, periods=기간수, freq='A')
- 연초 : pd.date_range(start=시작일자, end=종료일자, periods=기간수, freq='AS')
- 기간 이동 계산
- 컬럼.rolling().집계함수
- 7일 이동평균 : 컬럼.rolling(7).mean()
- 직전 7개의 합 : 컬럼.rolling(7).sum()
- 직전 7개의 최소값 : 컬럼.rolling(7).min()
- 직전 7개의 최대값 : 컬럼.rolling(7).max()
- 행 이동
- 컬럼.shift(이동할 행의 수)
5) 고급기능
- apply 함수 : 사용자 정의 함수를 데이터에 적용할 때
- .apply(함수, axis=0 / 1)
- map 함수 : 값을 특정 값으로 치환할 때
- 데이터명[컬럼명].map(매핑 딕셔너리)
- 문자열 다루기
- .str.contains(문자열) : 문자열 포함여부
- .str.replace(기존문자열, 대치문자열) : 문자열 대치
- .str.split(문자열, expand=True / False, n=개수) : 특정 문자열을 기준으로 분리
- .str.lower() : 소문자로 변환
- .str.upper() : 대문자로 변환
6) 데이터 결합
- 두 개의 데이터를 특정 컬럼을 기준으로 합함.
- 결합 방법
- INNER JOING
- FULL OUTER JOIN
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- pd.merge(데이터1, 데이터2, on=기준컬럼, how=결합방법)
- pd.merge(데이터1, 데이터2, left_on=데이터 1의 기준 컬럼, right_on=데이터2의 기준 컬럼, how=결합방법)
[2] 데이터 집계
1) 분포와 통계량
- describe() : 컬럼별 개수, 평균, 표준편차, 최솟값, 최댓값, 사분위수
- min()
- max()
- mean()
- median()
- std()
- var()
- quantile()
2) 그룹화(groupby)
- 같은 값을 한 그룹으로 묶어서 여러 가지 연산 및 통계를 구함.
- 데이터.groupby(컬럼명).연산및통계함수
- aggregat으로 여러 통계값 계산 : df.groupby([컬럼명1, 컬럼명2])[[컬럼명3,컬럼명4,컬럼명5]].aggregate([np.mean, np.min, np.max])
[3] 데이터 구조화
1) crosstab
- 범주형 데이터를 비교분석
- pd.crosstab(index=행, columns=열, margins=True/False, normalize=True/False)
- 범주별 갯수
- pd.crosstab(행, 열)
- 범주별 비율
- 전체 합 100% : normalize = 'all'
- 행별 합 100% : normalize = 'index'
- 열별 합 100% : normalize = 'columns'
2) 피벗테이블
- 엑셀의 피벗테이블처럼 인덱스별 컬럼별 값의 연산을 함.
- margins 옵션으로 행과 열 전체의 값을 구함
- pd.pivot_table(df, index=, columns=, values=, aggfunc=, margins=True/False)
3) stack, unstack, melt
- stack : 컬럼 레벨에서 인덱스 레벨로 데이터프레임을 변경
- pivot.stack(0) : 컬럼의 첫번째 레벨을 인덱스로 내리기
- unstack : 인덱스 레벨에서 컬럼 레벨로 데이터프레임을 변경
- pivot.unstack(0) : 인덱스의 첫번째 레벨을 컬럼으로 쌓기
- melt
- pd.melt(데이터명, id_vars=기준 컬럼)
| 데이터 시각화
1) matplotlib와 seaborn
- matplotlib : 파이썬 데이터 시각화의 가장 기본적인 라이브러리.
- seaborn : matplotlib을 쉽고 아름답게 시각화하는 라이브러리.
# matplotlib과 seaborn 설치
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(가로, 세로)) #그래프 크기 설정
sns.000plot(data=데이터, x=X축 컬럼, y=Y축 컬럼, hue=범례 컬럼) #seaborn으로 그래프 그리기
plt.title(제목) #제목 설정
plt.xlabel(라벨) #x축 라벨 설정
plt.ylabel(라벨) #y축 라벨 설정
plt.legend(loc=범례 위치 설정)
plt.xticks(rotation=x축 각도 설정)
plt.yticks(rotation=y축 각도 설정)
plt.show() #그래프 출력
- 스타일 설정
- sns.set_style(스타일) - darkgrid, whitegrid, dark, white
- sns.set_palette(팔레트)
- 그래프 유형
- 산점도
sns.scatterplot(data=데이터, x=X축 컬럼, y=Y축 컬럼, hue=색) #산점도
sns.lmplot(data=데이터, x=X축 컬럼, y=Y축 컬럼, hue=색) #회귀선 추가
- 히스토그램
sns.displot(data=데이터, x=X축 컬럼, hue=색)
-
- 밀도 분포
sns.displot(data=데이터, x=X축 컬럼, hue=색, kind='kde')
-
- 상자 그림
sns.boxplot(data=데이터, x=X축 컬럼, y=Y축 컬럼, hue=색)
-
- 막대 그래프
# X축의 범주별로 행의 개수를 카운트한 막대형 그래프
sns.countplot(data=데이터, x=X축 컬럼, hue=색)
#막대 그래프
sns.barplot(data=데이터, y=Y축 컬럼, hue=색)
-
- 선 그래프
sns.lineplot(data=데이터, x=X축 컬럼, y=Y축 컬럼, hue=색)
-
- 히트맵
sns.heatmap(data=데이터, annot=값 표시 여부, fmt=값 포맷, cmap=컬러맵)
2) plotly : 인터랙티브한 시각화가 가능한 라이브러리.
# 설치
!pip install plotly
fig = px.그래프종류(data_frame=데이터, x=X축 컬럼, y=Y축 컬럼, color=범례 컬럼, title=제목,
labels=dict(X축 컬럼=X축 라벨, Y축 컬럼=Y축 라벨),
width=그래프 가로, height=그래프 세로, text_auto=True/False)
fig.show()
3) folium : 지도 시각화 라이브러리
# 설치
!pip install folium
f = folium.Figure(width=가로, height=세로)
m = folium.Map(location=[위도, 경도], zoom_start= 12).add_to(f)
m.save('test.html') #지도 저장
m
| 데이터 수집
크롤링이란
- 웹사이트, 하이퍼링크, 데이터, 정보 자원들 자동화된 방법으로 수집, 분류, 저장하는 것.
1) BeautilfulSoup : 텍스트형태의 데이터에서 원하는 html 태그를 추출
# 설치
!pip install beautifulsoup
import requests from bs4
import BeautifulSoup as bs
- html 구조 : li > dl > dt > a
2) Selenium : 자바스크립트로 동적으로 생성된 정보를 수집.
# 설치
!pip install selenium
#Selenium으로 브라우저 실행
from selenium import webdriver
browser = webdriver.Chrome()
brower.get('http://www.naver.com')
(1) By : 웹 페이지에서 특정 요소 찾기
# By 불러오기
from selenium.webdriver.common.by import By
# 주요 By 메서드
By.CLASS_NAME # 클래스명으로 찾기
By.ID # ID로 찾기
By.XPATH # XPATH로 찾기
By.TAG_NAME # 태그 이름으로 찾기
(2) Keys : 키보드의 동작 자동화
# Keys 불러오기
from selenium.webdriver.common.keys import Keys
# 검색창에 '날씨' 검색하기
# 검색창 찾기
search_box = browser.find_element(By.ID, 'query')
# '날씨'입력
search_box.send_keys("날씨")
# 실행
search_box.send_keys(Keys.ENTER)
- Keys 라이브러리에서 제공하는 주요키
- ENTER
- BACKSPACK
- SHIFT
- CONTROL
- TAB
(3) 여러 요소 가져오기
# (1) 단일 요소 : find_element(없을 시 오류)
element = browser.find_element(By.CLASS_NAME, "shortcut_list") # 첫 번째 요소만 반환
# (2) 다수의 요소 : find_elements(없을 시 빈 리스트)
elements = browser.find_elements(By.CLASS_NAME, "shortcut_list") # 리스트 반환
(4) GUI없이 백그라운드에서 실행 : Headless 모드
from selenium import webdriver
options = webdriver.ChromeOptions() # 옵션 생성
options.add_argument("headless") # Headless 모드 설정
# Headless 브라우저 실행
browser = webdriver.Chrome(options=options)
browser.get("https://www.naver.com")
(5) 로딩대기
# Implicit Wait : 최대 대기 시간 지정
browser.implicitly_wait(5) # 최대 5초 대기
# Time Sleep : 정해진 시간 동안 대기
import time time.sleep(5) # 5초 대기
'DBA 부트캠프 기록' 카테고리의 다른 글
[패캠 BDA17] 데이터 분석가 필수 툴 SQL_v2 (9주차) (0) | 2025.02.14 |
---|---|
[패캠 BDA17] 데이터 분석가 필수 툴 SQL (8주차) (3) | 2025.02.08 |
[패캠 BDA17] 파이썬 데이터 분석 입문 : 필수 기초 스킬 (3주차) (6) | 2025.01.13 |
[패캠 BDA17] 기초 통계로 데이터 분석 완벽 이해 (2주차) (2) | 2025.01.12 |
[패캠 BDA17] 엑셀 데이터 분석 가이드 : 실전 활용법 (1주차) (5) | 2025.01.11 |