지난 주차의 초점은 데이터를 불러오는 것이었다면

이번 주차의 초점은 그것을 어떻게 묶고, 연산하고, 정렬할 것인가였음

 

1. Group by

말 그대로 같은 항목의 자료들을 카테고리 별로 묶는 법

 

select name, count(*) from users

group by name

 

select week, min(likes) from checkins

group by week

 

count(*) 자리에 count(*), min(필드 명), max(필드 명), avg(필드 명), sum(필드 명), 등 여러가지가 들어갈 수 있음

 

avg(필드 명)의 경우 평균을 의미하므로 소숫점이 출력될 수 있기에

round(avg(필드 명) , n)을 이용해 수치를 반올림 할 수도 있음

n은 최대로 출력할 소수 자릿수를 의미

 

2. Order by

말 그대로 정렬을 위한 명령어

정렬이므로 다른 코드를 통해 자료 가공이 끝난 뒤 가장 마지막에 사용

 

order by count(*) : 개수를 센 것을 바탕으로 오름차순 정렬

order by count(*) desc : 개수를 센 것을 바탕으로 내림차순 정렬

order by name desc : 이름을 내림차순 정렬. 당연히 시간이나 다른 필드명도 정렬이 가능함

 

+) Alias

자료 가공 시 좀 더 특정성을 높일 수 있도록 별칭을 부여하는 것을 말함

다음 주차에 좀 더 상세히 다룰 예정이기에 예시만을 기록함

 

ex1) 자료에 별칭 부여

select * from orders o

where o.course_title='심화반'

 

ex2) 특정 명령어에 별칭 부여. 이후 파일에 별칭으로 표시

select A, count(*) as cnt from orders

order by cnt

'코딩, 사무 > SQL 강의' 카테고리의 다른 글

SQL 개발일지 1주차(220627~220703)  (0) 2022.07.03

2주차 강의 내용은 두 파트로 나뉨

(0. 크롤링 추가 내용)

1. 워드클라우드 만들기(크롤링 보충, 형태소 분석, 불용어 제거)

2. 머신러닝 기초

 

0. 크롤링 추가 내용

만약 soup.select(  )를 진행하는데 선택자에 nth_child 코드가 있다면 nth_of_type으로 수정할 것

용도는 같으나 전자가 colab에서 오류가 뜨기 쉽기 때문

단, 두 코드 모두 뒤에 딸려오는 숫자가 있는데 선택자가 바뀌었기 때문에 우리가 원하는 정보가 리스트 안에 들어있는 위치가 바뀔 수도 있음

공식은 없고 실제로 숫자를 일일이 조정해가면서 원하는 데이터가 출력될 수 있도록 수정해야 함

 

1. 워드클라우드 만들기

0) Colab 한국어 패치

한글 세팅코드 입력->셀 실행->런 타임 다시 시작->셀 재실행

 

1) 데이터프레임 정리하기

df=pd.read_table('자료 이름', sep' , ')

*sep: seperator, 즉 어떤 문자를 기준으로 자료의 행, 열을 나눌 것인지를 의미

df.isnull(  ) : 자료에 비어있는 행이 있는지 검사. true/false로 출력

print(df.isnull(  ) .sum(  )) : 비어있는 행의 숫자를 출력

df['열 이름'].unique(  ) : 중복된 요소를 전부 제외하고 표시

df['열 이름'].nunique(  ) : 중복되지 않은 요소를 개수로 표시

df.drop_duplicates(subset=[열 이름], inplace=True) : 데이터에서 중복된 요소 제거. inplace는 수정본을 원본에 덮어씌울 것인지 여부. True면 덮어씌운다, False면 원본을 유지한다

df['열 이름'].value_counts(  ) : 열에 요소로 들어있는 항목들의 개수를 표현

*ex) '선호 음식' 열에서 한식 4명, 중식 4명, 일식 2명, 양식 5명

~.plot(kind='bar') : ~ 파일을 시각화. kind가 그래프 종류. bar 이므로 막대그래프로 표현하겠다는 의미

 

2) 토큰화: 형태소 분석

토큰화란?

어떤 글을 문장 미만의 단위로 쪼개는 것. 리스트 형태로 출력됨

형태소 분석: 형태소 단위 토큰화. konply 패키지 사용

 

stop words : 불용화 코드. 조사 등 필요 없는 단어 제거

df['열 이름'].apply(tokenizer.nouns) : 토큰화 진행

 

리스트 컴프리헨션: 말 그대로 리스트를 이해시키기. 리스트에서 어떤 요소를 선택할 것인지 설정하는 단계

item for item in test_list if len(item)>1 : 해당 형태소 리스트에서 글자수가 1보다 큰 것만을 아이템이라고 하겠다

item for item in test_list if item not in remove_word_list : 제거할 단어 목록에 있지 않은 것만을 아이템이라고 하겠다

 

불용어 제거: 분석 가치가 적어 제거하기로 결정한 단어 제거하기

lamdaX:X.작업코드 : 어떤 행을 X라고 하고 그 행에 작업코드에 해당하는 작업을 하겠다는 의미. extend, append, 등 여러가지가 들어갈 수 있음

 

3) 분야 별 빈도수 출력하기

df[df['열 이름']=='카테고리 이름'] : 카테고리 별로 묶기

df[df['열 이름']=='카테고리 이름']['tokenized'].values : 윗 단계에서 카테고리 별로 묶었지만 사실 행들로 나뉘어 있음. 이 행들을 해체해서 하나의 리스트로 합치는 것

 

import numpy as np

새로운 인스턴스 이름 = np.hstack(df[df['열 이름']=='카테고리 이름']['tokenized'].values) : 윗 단계를 진행한 결과 현재 리스트의 리스트 상태. 이거를 요소들의 리스트로 변환하는 과정

print(len(새로운 인스턴스 이름)) : 총 단어 개수 확인

 

from collections import counter

새로운인스턴스이름_count = counter(새로운 인스턴스 이름) : 단어 별 빈도수 출력

새로운인스턴스이름_count = counter(새로운 인스턴스 이름.most_common(n)) : 단어 별 빈도 수 가장 높은 것 n개만 출력

 

4) 워드클라우드 만들기

from wordcloud import WordCloud

temp_data = '  '.join(새로운 인스턴스 이름) : 리스트들끼리 연결. '  ' 부분은 무엇으로 리스트를 연결할 것인지를 의미. 띄어쓰기, 쉼표, 등 다 가능은 함

이후 워드클라우드 포맷 사용

 

2. 머신러닝 기초

1) 단어의 벡터화

벡터화란?

기계는 단어를 이해할 수 없음. 따라서 문장의 단어들을 특정 규칙에 따라 숫자를 부여하고 숫자에 따라 상대적 관계성을 부여해야 기계가 단어들을 해석할 수 있게 됨

 

train_data : 학습 자체에 사용되는 데이터

test_data : 학습에는 이용되지 않고 완성된 모델을 검증하는 데에만 이용되는 데이터

train_test_split : 만약 train_data와 test_data가 따로 준비되어 있지 않고 하나의 데이터만 있을 때 그거를 두 개로 나눠주는 코드

 

이후 train_data에 해당하는 Y변수와 X변수, test_data에 해당하는 Y변수와 X변수를 따로 나누어서 자료의 각 열을 배정해야 함. 장르 구분 머신러닝 모형 예시에서 Y변수는 항목이므로 숫자로만 치환에도 충분. X변수는 시놉시스이므로 벡터화를 진행해줘야 함

 

DTM: 벡터화 방법 중 하나. 각 단어 별로 해당 자료에서 등장하는 횟수를 바탕으로 숫자 부여. 단, 영어에서 이 방법으로 벡터화를 쓸 경우 a, the와 같은 여러 관사들의 빈도수가 높게 측정되어 상관도 없는 시놉시스들이 높은 유사도로 측정될 수 있음

TF-IDF: DTM에 연계하여 기존 문제를 해결한 벡터화 방법. 덜 등장하는 단어일수록 높은 가중치를 부여함.

.transform(  ) : 벡터를 저장하지 않는 벡터화. 즉 출력된 값을 기억할 필요가 없고 그 값이 확인 용도에 불과할 때 사용. test_data가 보통 이에 해당

.fit_transform(  ) : 벡터를 저장하는 벡터화. 출력된 값을 학습해야 하는 train_data의 벡터화에 사용

 

2) 학습 진행

나이브 베이즈 분류기 : 베이즈 정리 이용하여 가장 높은 확률에 해당하는 결과를 출력. 확률만 계산하면 되므로 다른 두 방법에 비해 시간 적게 소요

Logistic 회귀분석: 도출된 값들의 총합을 1로 유지하는 softmax 함수를 이용. 모형 도출값과 test_data의 실제값을 비교하여 그 오차가 줄을 때까지 연산을 반복하는 방식으로 진행하는 최적화 방식의 학습. 최고의 결과까지 얼마나 많은 반복이 필요할지 알 수 없으므로 반복 횟수를 직접 지정할 수 있음

Support Vector Machine : 벡터들을 평면에 흩뿌려놓고 그 위에 경계선 긁기. 최고로 정확도가 높은 경계선이 나올 때까지 반복하는 방식

 

3) 정확도 확인

accuracy_score : 테스트 결과와 일치하는 경우 정확도를 높이고 불일치하는 경우 정확도를 낮춤

 

+) 불용어 제거

벡터화를 시키기 전에 sk learn와 count vectorize를 이용하여 불용어를 제거하고 작업할 수도 있음. 그러나 불용화를 한다고 해서 무조건 정확도가 상승하는 것은 아니며, 자료에 따라, 학습 진행 방식에 따라 정확도 변동폭이 상이함

 

1주차 내용을 정리할 때는 최대한 배웠던 모든 내용을 정리하려고 했으나 SQL 강의와 달리 데이터 분석 강의의 경우 한번의 시청으로 학습을 끝내기에는 암기량이 많고 복습을 전제로 깔고 학습하는 수밖에 없겠다는 것을 느낌

그러나 현재 일상 업무가 벅차 학습을 병행하면서 복습까지 하기에는 시간제약이 있어 추후 한 번 더 강의를 본다는 것을 전제로 1회차 시청은 전반적인 흐름을 파악하는 것에 집중하기로 함

따라서 이번 정리부터는 정리 내용에 생략된 부분이 어느 정도 있을 예정

스파르타 코딩 클럽의 강의 '데이터 분석 종합반 8회차' 수업을 듣고 정리한 것

 

1. 기초

엑셀로 자료분석하기

구글 스프레드시트에 XL miner analysis 플러그인 사용하면 기본 엑셀보다 좀 더 특화된 자료분석 가능

 

데이터분석 5단계

크롤링-클리닝-탐색-모형-전개

 

Colab 사용법

# 혹은 내용 앞 줄에 ''', 내용 다음 줄에 ''' : 코드가 아니라 메모로 인식

print( ) : 괄호 속 내용 출력

shift+enter : 칸바꿈

ctrl+enter : 실행

intend: 들여쓰기. tab 혹은 스페이스 네 번

 

파이썬 기초

자료형

int정수, float실수, str문자, list목록

    type(알아보고 싶은 대상): 대상의 자료형이 무엇인지 알 수 있음

 

list 조작법

listname1 = [z,x,c,a,s,d,q,w,e,...... ]

listname1.append(6) : 6이라는 원소를 listname1 리스트에 추가하기

listname1.extend(listname2) : listname2라는 리스트를 listname1에 추가하기

 

반복문/조건문

for 각각의 데이터 in 전체 데이터 :

if 조건, elif 조건, else :

     반복문과 조건문 뒤에는 반드시 :를 입력하고 줄바꿈을 해줘야 함

 

함수 정의하기

def name (인자1, 인자2, ... , 인자n)

    return 인자를 이용한 함수

까지 입력하면 함수 완성

 

클래스와 인스턴스

클래스: 어떤 세부적인 양식틀을 가진 객체의 명칭.

(예를 들어 몬스터가 체력과 스테미나를 포함하도록 정의되어 있다면 몬스터는 클래스)

인스턴스: 객체

(예를 들어 slime = Monster() 라고 코드를 짠다면 slime은 Monster라는 클래스 형식을 포함한 객체로 정의됨)

 

try문과 except문

try:

    print(a/b)

except:

    print('오류')

try 밑에 있는 명령을 실행해보고 오류가 발생했을 시 except 밑에 있는 코드를 실행하라는 의미

 

판다스 데이터프레임 조작법

패키지란? 누군가가 이미 만들어놓은 클래스, 함수 덩어리. 판다스도 패키지

1) pandas로 표 만들기

import pandas as pd

데이터 이름={'행 이름1' : [list1], '행 이름2' : [list2], ..., '행 이름n' : [listn]}

df = pd.DataFrame(데이터 이름)

df

2) 데이터 프레임 2개 합치기

pd.concat([df1, df2])

 

엑셀파일로 추출하기

객체명.to_csv('파일이름', index=false)

(index=false는 데이터프레임 작성시 자동으로 생성되는 인덱스열을 지우고 저장하라는 의미)

 

엑셀 파일 불러오기

새로운 객체명 = pd.read_table('파일이름', sep=' , ')

 

2.크롤링 기초

html문서의 구성

웹사이트는 기본적으로 html 문서

태그: <head>, <body>, <a>, 등 html 문서 각 항목의 구조와 특성을 알려주는 이정표

선택자(selector) : id, class, 등

 

웹사이트 분석 기초

f12를 누르면 개발자 도구를 실행시켜 해당 사이트의 html을 코드문서 형태로 볼 수 있음

좌측 상단에 커서 아이콘을 누르면 내가 알고자 하는 객체가 어떤 코드에 대응되는지 탐색할 수 있음

우클릭 - 복사 - selector를 누르면 구체적인 내용은 제거하고 선택자 형식만을 추출해낼 수 있음

 

크롤링 기본 코드 이해

!pip install beautifulSoup4

#colab에는 기본 설치되어있음

from bs4 import BeautifulSoup

soup=(html, 'html.parser')

#html 문서를 분석해서 html 자료 형태로 읽어오기

soup=(data.text, 'html.parser')

#html 문서를 분석해서 텍스트 형태로 읽어오기

print(soup.select( ))

#어떤 입력값에 해당하는 애들만 추출하기

#('태그명'), ('.클래스명'), ('#아이디'), ('상위태그명 하위태그명'), ('상위태그명 > 하위태그명')

.text

#해당 작업을 텍스트 부분만 읽어오기

.text[0, n]

#해당 작업을  n-1번째 글자까지의 텍스트 부분만 읽어오기

.strip()

#출력된 내용에서 쓸데없는 띄어쓰기 삭제하기

 

newspaper3k 패키지

신문자료 크롤링할 때 쓰는 패키지

!pip install newspaper3k

from newspaper import Article
url = '뉴스 기사 페이지 주소'
article = Article(url, language='ko')
article.download()
article.parse()

print(article.title)

print(article.text)

 

크롤링 차단 시

headers = {'에이전트 정보'}

news = requests.get(url, headers=headers)

참고: https://hogni.tistory.com/64

 

크롤링이 차단되었다면 유저 에이전트(User Agent)를 지정해보자, 크롤링 차당 방지법

크롤링을 하다 보면 종종 페이지에서 아무것도 받아오지 못해서 막히는 경우가 생깁니다. 여러 가지 이유가 있을 수 있겠지만 본인이 잘못한 게 없다면 대개 서버에서 차단을 당했기 때문입니

hogni.tistory.com

 

스파르타 코딩 클럽의 강의 '엑셀보다 쉬운, SQL 18회차' 수업을 듣고 정리한 것

일단 개발일지라기보다 공부한 내용 정리에 가까운 것 같지만 요청하는 제목이 개발일지인지라 개발일지로 적음.

개발일지를 보통 어떤 형태로 쓰는지 알지 못하는 데다 길게 쏟을 시간이 없는 상황이기 때문에 간략하게 작성할 예정.

 

SQL? 데이터베이스 프로그램. DBeaver 이용.

생성, 검색, 갱신, 삭제의 4개 프로세스

강의의 초점은 검색

 

show tables로 DB에 들어있는 테이블 명을 검색하는 것으로 시작

테이블은 말 그대로 표를 말함

필드는 테이블의 각 열을 말함

 

Select 절로 데이터를 읽고 Where 절로 구체적인 조건을 붙이는 형식

select 필드명 from 테이블명 where 조건

이 기본 형태

and/or로 여러 조건들을 한꺼번에 붙일 수 있음

 

필드명 = '데이터명' : 해당 필드에 속한 정보가 '데이터명'에 해당하는 자료 표시

필드명 >= 숫자 : 해당 필드에 조건으로 제시된 숫자보다 크거나 같은 수를 갖고있는 자료 표시

(!=은 같지 않다는 의미)

필드명 between A and B :해당 필드에  A와 B 사이에 해당하는 숫자를 갖고 있는 자료 표시

(자리에 숫자와 문자 형태의 숫자(날짜, 시간 등) 모두 들어갈 수 있음)

필드명 in (n, o, p, q, ...) : 해당 필드에 괄호 안의 조건들을 내용으로 갖는 자료 표시

필드명 like '_%_' : 해당 필드에 _로 시작하고 _로 끝나는 정보를 갖는 자료 표시

 

그 외

limit 숫자 : 숫자에 해당하는 개수의 자료만 표시

select distinct(필드명) from 테이블명 : 해당 테이블의 필드에 들어있는 자료의 종류를 표시(ex: 한식, 양식, 중식, 일식)

select count(필드명) from 테이블명 : 해당 테이블의 필드에 몇 개의 자료가 들어있는지 표시

select count(distinct(필드명)) from 테이블명: 해당 테이블의 필드에 들어있는 자료의 종류가 몇 개인지를 표시(ex: 4)

이처럼 괄호를 통해 여러 절을 겹칠 수 있음

'코딩, 사무 > SQL 강의' 카테고리의 다른 글

SQL 개발일지 2주차(220704~220707)  (0) 2022.07.07

주 1회 잡상 기록용 블로그

+ Recent posts