수업 일지

4주차 정리

cort53 2025. 1. 11. 20:15

데이터 분석 실습 요약

01. 데이터 가공 및 분석 기본

01-01. DataFrame과 Series 이해하기

  • DataFrame: 2차원 데이터 구조 (표 형태).
  • Series: 1차원 데이터 구조 (열 형태).

구분설명

DataFrame pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
Series pd.Series([1, 2, 3], name='example_column')

01-02. 데이터 불러오기, 저장하기

  • 데이터를 다양한 포맷에서 불러오고 저장합니다.
기능 코드 예시
CSV 불러오기 pd.read_csv('data.csv')
Excel 저장 df.to_excel('data.xlsx', index=False)

01-03. 조건에 맞는 데이터 추출

  • 조건 필터링으로 원하는 데이터 선택.
기능 코드 예시
조건 필터링 df[df['Age'] > 30]

01-04. 데이터 가공_인덱스, 행, 열

  • 데이터의 행(row), 열(column), 인덱스를 다룹니다.
기능 코드 예시
행 선택 (loc) df.loc[0:2, 'A':'B']
열 선택 (iloc) df.iloc[:, [0, 1]]

01-05. 데이터 가공_결측값 처리

  • 결측값(null)을 처리합니다.
기능 코드 예시
결측값 확인 df.isnull().sum()
결측값 채우기 df.fillna(0)

01-06. 데이터 가공_타입 변환

  • 데이터 타입을 변환하여 일관성 유지.
기능 코드 예시
타입 확인 df.dtypes
타입 변환 df['A'] = df['A'].astype(float)

01-07. 데이터 가공_날짜 다루기

  • 날짜 데이터를 처리합니다.
기능 코드 예시
날짜 변환 df['Date'] = pd.to_datetime(df['Date'])
연도 추출 df['Year'] = df['Date'].dt.year

01-08. 데이터 가공_고급기능 (apply, map, 문자열 다루기)

  • 데이터를 유연하게 가공합니다.
기능 코드 예시
apply 활용 df['A'] = df['A'].apply(lambda x: x**2)
문자열 다루기 df['A'].str.upper()

01-09. 데이터 가공_데이터 결합

  • 데이터를 병합하거나 연결합니다.
기능 코드 예시
데이터 결합 pd.merge(df1, df2, on='key')

01-10~01-11. 데이터 집계_분포와 통계량 / groupby

  • 데이터를 요약하거나 그룹화합니다.
기능 코드 예시
통계량 확인 df.describe()
그룹화 df.groupby('key').sum()

01-12~01-14. 데이터 재구조화

  • 데이터를 변형하여 재구조화.
기능 코드 예시
피벗 테이블 df.pivot_table(values='A', index='B')
스택/언스택 df.stack()

02. 데이터 시각화

02-01. matplotlib과 seaborn 이해하기

  • matplotlib: 기본 그래프 작성.
  • seaborn: 고급 시각화 제공.
기능 코드 예시
matplotlib 활용 plt.plot(x, y)
seaborn 활용 sns.scatterplot(data=df, x='A', y='B')

02-02. matplotlib과 seaborn으로 유형별 그래프 그리기

  • 다양한 시각화 유형을 학습합니다.
그래프 유형 코드 예시
막대 그래프 sns.barplot(data=df, x='A', y='B')
히스토그램 plt.hist(df['A'])

요약

  • 데이터 가공, 집계, 시각화의 기본기를 탄탄히 다질 수 있는 단계.
  • pandas, matplotlib, seaborn의 주요 기능 학습.

 


1. 크롬을 통한 데이터 수집

Selenium과 WebDriver Manager를 사용해 크롬 브라우저를 실행하고 데이터 수집을 시작합니다.

 

# 필수 라이브러리 설치

pip install webdriver-manager selenium

 

# 크롬 드라이버 설정 및 브라우저 실행

from webdriver_manager.chrome import ChromeDriverManager

from selenium import webdriver

 

browser = webdriver.Chrome(ChromeDriverManager( ).install( ))

browser.get("https://www.naver.com") # 네이버로 이동

 

 

 

2. 요소 찾기 (By.CLASS_NAME)

By 모듈을 사용해 웹 요소를 찾을 수 있습니다. 가장 많이 사용된 메서드는 By.CLASS_NAME

 

from selenium.webdriver.common.by import By

 

# 클래스 이름으로 요소 찾기

element = browser.find_element(By.CLASS_NAME, "some-class-name" )

 

3. 단일 요소 vs 다수 요소 찾기

  • 단일 요소: find_element
  • 다수 요소: find_elements

# 단일 요소 가져오기

element = browser.find_element(By.CLASS_NAME, "single-class-name" )

 

# 다수 요소 가져오기

elements = browser.find_elements(By.CLASS_NAME, "multiple-class-name" )

 

4. 컨테이너와 반복 처리

가져온 다수 요소(find_elements)를 컨테이너로 정리하고, for문을 통해 각 요소를 처리할 수 있습니다.

 

containers = browser.find_elements(By.CLASS_NAME, "container-class" )

 

for elem in containers:

      print(elem.text)      # 각 요소의 텍스트 출력


 

네이버 부동산, 구글 뉴스, 논문 자료를 활용한 데이터를 수집하여 전처리 이후 csv파일로 저장

 

 

ex _ 논문 데이터(DB)

 

 

# 1. 첫 번째 논문의 (1) 논문명 (2) 태그 (3) 저자명 (4) 발행일 (5) 이용수 (6) 링크

browser.find_element(By.CLASS_NAME, 'thesis__tit').text
browser.find_element(By.CLASS_NAME, 'thesis__keyword').text
browser.find_element(By.CLASS_NAME, 'thesis__info').text
browser.find_element(By.CLASS_NAME, 'thesis__link').get_attribute('href')

 

 

# 2. 1페이지의 논문 (1) 논문명 (2) 저자명 (3) 태그 (4) 발행일 (5) 이용수 (6) 링크

containers = browser.find_elements(By.CLASS_NAME, 'thesisWrap')

data = []
for elem in containers:
    try:
        제목 = elem.find_element(By.CLASS_NAME, 'thesis__tit').text
    except:
        제목 = ''

    try:
        태그 = elem.find_element(By.CLASS_NAME, 'thesis__keyword').text
    except:
        태그 = ''

    try:
        정보 = elem.find_element(By.CLASS_NAME, 'thesis__info').text
    except:
        정보 = ''
   
    try:
        링크 = elem.find_element(By.CLASS_NAME, 'thesis__link').get_attribute('href')
    except:
        pass
       
    data.append({
        '제목':제목,
        '태그':태그,
        '정보':정보,
        '링크':링크})

 

 

import pandas as pd
pd.DataFrame(data)
 
(pandas 형태로 변환)

 

# 크롬 브라우저 종료
driver.quit()

# DataFrame으로 변환
df = pd.DataFrame(articles)

# CSV로 저장
df.to_csv('naver_news.csv', index=False, encoding='utf-8-sig')

print("데이터 수집 완료! CSV 파일로 저장되었습니다.")

 


Numpy & Pandas

1. Pandas 특징

  • 패키지 이름 유래: Panel Data Analysis의 약자.
  • 역할: 데이터 조작 및 분석 도구, 특히 테이블 형식 데이터(DataFrame) 처리에 특화됨.
  • 장점:
    • SQL과 유사한 데이터 조작 가능 (CRUD: Create, Read, Update, Delete).
    • Numpy 기반으로 빠른 연산 성능 제공, 직관적
    • 대용량 데이터 처리에서 Excel보다 우수.

2. Pandas 주요 함수 정리

(1) 데이터 로드 및 저장

함수설명

read_csv() CSV 파일 읽기
read_excel() Excel 파일 읽기
to_csv() CSV 파일로 저장
to_excel() Excel 파일로 저장

(2) 데이터 확인

함수설명

df.shape 데이터프레임의 (행, 열) 구조
df.info() 데이터 요약 정보 확인
df.columns 컬럼 이름 확인
df.dtypes 각 컬럼 데이터 타입 확인
df.head() 상위 5개 데이터 확인

 


(3) 값 정렬

함수설명

df.sort_values()
df.sort_values('a', ascending=False)
데이터 정렬
데이터 정렬(내림차순)

(4) 데이터 조작

작업함수

특정 컬럼/행 삭제 df.drop(['컬럼'], axis=1)
특정 컬럼 이름 변경 df.rename(columns={'A':'B'})

(5) 중복 관리

작업함수

행 제거하기 df.drop([3], inplace=True)
컬럼 제거하기 df.drop('etc', axis=1, inplace=True)

(6) df.loc[ ]

특정 값 조회 df.loc['row1', 'col1'] 'row1' 인덱스의 'col1' 값 조회
특정 행 조회 df.loc['row1'] 'row1' 인덱스의 전체 행 조회
특정 열 조회 df.loc[:, 'col1'] 모든 행에서 'col1' 값 조회
여러 값 조회 df.loc[['row1', 'row2'], ['col1', 'col2']] 'row1', 'row2'에서 'col1', 'col2' 조회

(7) Boolean Indexing

조건 필터링 df[df['A'] > 15] A 값이 15보다 큰 행 조회
여러 조건 조합 df[(df['A'] > 15) & (df['B'] < 60)] A > 15이고 B < 60 조건 필터링

 

(8) filter( )를 이용한 검색

특정 컬럼 필터링 df.filter(['A'], axis=1) 'A' 컬럼만 선택
특정 행 필터링 df.filter(['row1', 'row3'], axis=0) 'row1', 'row3' 행만 선택
패턴 매칭 필터링 df.filter(like='A', axis=1) 컬럼 이름에 'A' 포함된 컬럼 필터링

(9) 데이터 추가

행 추가 df.loc['new_row'] = [70, 80] 'new_row'라는 행 추가
컬럼 추가 df['C'] = [100, 110, 120] 'C'라는 새 컬럼 추가

3. 통계 함수 요약

함수설명

count null 제외 데이터 개수
min/max 최소/최댓값
sum 합계
mean 평균
median 중앙값
quantile 분위수
var 분산
std 표준편차
describe 요약 통계량 출력

ex)

 

import pandas as pd
 
# 데이터프레임 생성 data = {'영화': ['영화1', '영화2', '영화3'], '개봉 연도': [2015, 2017, 2020]}
df = pd.DataFrame(data)
 
# 2015년 이후 개봉 영화 필터링
df_filtered = df[df['개봉 연도'] > 2015]
print(df_filtered[['영화', '개봉 연도']])

 

result

 
 
       영화 개봉 연도
 영화2  2017
  영화3  2020