데이터 분석 관계 분석, 결론 도출을 위한 시각화 방법으로 matplolib, seaborn을 사용해보겠습니다

 

 

1. 패키지 설치

pip install matplotlib
pip install seaborn

 

 

 

 

 

2. 기본 사용법

from matplotlib import pyplot as plt

x = np.arange( 0, 12, 0.01 )
y = np.sin(x)

plt.figure( figsize=(10, 6) )

plt.plot( x, y,  label='sin wave')
plt.plot( x, np.cos(x), label='cos wave' )

numpy의 np.sin을 통해 0~12의 sin값을 예시 그래프 값으로 사용한 차트입니다

 

 

 

3. seaborn boxplot

import seaborn as sns

plt.figure( figsize=(10,6) )
sns.boxplot( x )
plt.show()

파란 박스 구간을 통해 데이터의 중간값들은 17 주변으로 확인되고 대부분 14 ~ 22 사이에 있음을 알 수있다

최대치는 52정도이고 40 이상의 데이터는 많이 없음을 알수있다

 

데이터 결론 도출로는 14 ~ 22의 데이터가 많이 사용되므로 중점적으로 해당 데이터는 가격대로 해당 층의 니즈를 공략해야한다는 결론이 나올수있다

 

 

 

4. seaborn swarmplot

plt.figure( figsize=(10,6) )
sns.boxplot( x='day', y='total_bill', data=tips, palette='Set3' ) 
sns.swarmplot( x='day', y='total_bill', data=tips, color='0.5')
plt.show()

day는 요일로 목금토일을 설정했으며 데이터를 통해 금요일에는 손님이 많이 없으며 주말에 조금 더 높은 가격대를 지출함을 알 수 있다

 

 

 

 

5. seaborn Implot

plt.figure( figsize=(10,5) )
sns.Implot( x='total_bill', y='tip', data=tips, size=10 )
plt.show()

Implot은 컬럼과의 관계 분석을 시각화한 차트로 total_bill 매출과 tip 팁의 관계를 도출한다

 

x로 설정한 매출과 산포도로 측정된 tip과의 관계차트이다

 

x, y 데이터가 얼마나 떨어져 있나와 파란색 영역을 통해 표준편차를 볼 수 있습니다

 

 

 

 

6. seaborn heatmap

plt.figure( figsize=(10,10) )
sns.heatmap(df, annot=True, fmt='d'  )
plt.show()

표는 x year, y month로 연도별 월 고객수를 시각화 한것으로 색이 밝아질수록 고객이 많음을 뜻합니다

 

차트에서는 연도가 지나갈수록 고객이 많아지고 여름에 가장 고객이 많음으로 여름장사에 집중됨을 알 수 있습니다

 

 

 

7. seaborn pairplot

sns.pairplot( iris, hue='species', x_vars=['sepal_width', 'sepal_length'],  y_vars=['petal_width', 'petal_length'])
plt.show()

산포 행렬 시각화 방법으로 데이터의 군집을 확인할 수 있습니다

 

군집데이터의 사용 능력치는 딥러닝에서 빛을 바라기에 활용 방법을 많이 익혀두는게 좋습니다 저 또한 군집데이터에 대한 이해도를 꾸준히 높이고 있습니다

 

 

 

 

8. seaborn 다중 histogram

for spec in iris.species.unique():  
  spec_df = iris[ iris.species == spec ]
  print( spec, spec_df.shape )
  spec_df[ 'petal_width' ].plot( kind='hist', alpha=0.4, label=spec)

plt.legend()
plt.show()

데이터의 분포를 확인하기 좋은 시각화 방법으로 Implot과 heatmap, histogram 시각화를 가장 많이 사용하게 되는것 같습니다

안녕하세요 오늘은 데이터 분석을 위한 pandas 사용법에 대해 소개해보겠습니다

 

pandas는 데이터 분석에서 결과도출, EDA, 분석 등에 활용됩니다

 

 

 

1. 설치방법

pip install pandas

 

 

 

 

2. 자료구조

- Series : 1차원 배열

- DataFrame : 2차원 배열

 

 

 

 

3. Series

import pandas as pd

tmp = pd.Series([1,2,3,4,5])

pd.Series() 안에 배열을 넣어서 Series로 만들 수 있으며 이때 인덱스(순서?)가 생성됩니다

 

 

 

4. DataFrame

import pandas as pd

cols = list('ABCD')

indexs = pd.date_r('20240130', periods=7)

출력
DatetimeIndex(['2024-01-30', '2024-01-31', '2024-02-01', '2024-02-02',
               '2024-02-03', '2024-02-04', '2024-02-05'],
              dtype='datetime64[ns]', freq='D')

다음과 같이 선택일자부터 7일동안의 데이터를 임의 생성합니다

 

values = np.random.randn( len( indexs ), len(cols) )
df = pd.DataFrame( values, indexs, cols )
df

이후 indexs와 cols의 개수만큼 7,4 배열에 랜덤값을 만들어준 후 DataFrame으로 만들면 표로 시각화됩니다

 

pandas DataFrame으로 시각화한 표로 데이터 분석에 자주 사용되는 데이터 분석을 위한 확인 방법입니다

 

 

 

5. read_csv

csv_path = '/content/drive/MyDrive/res/data.csv'
df = pd.read_csv( csv_path )

csv 파일을 DataFrame으로 만드는 방법으로 인공지능 학습 데이터의 구조로 사용됩니다

 

 

 

 

6.df.head, df.tail

df.head()
df.tail()

DataFrame의 앞에서 5개의 데이터, 뒤에서 5개의 데이터를 뽑아오는 방법입니다

 

 

 

7. df.info

df.info()

빅데이터서 데이터의 구조를 쉽게 확인하는 방법으로 컬럼명, 데이터의 개수, 타입 확인을 쉽게 할수있습니다

 

 

 

8. sort_values

df.sort_values(by='age', ascending=Faslse)

age 나이를 기준으로 정렬하는 방법으로 내림차순, 오름차순 등으로 정렬 가능합니다

 

 

 

 

9. .columns, .values

df.columns
df.values

columns는 컬럼들을 나열하여 컬럼명을 확인하기 편합니다

values는 해당 값을 확인할 수 있으며 인덱스나 컬럼의 값을 통해 검색하는 방법처럼 사용됩니다

 

 

 

 

 

10. 인덱싱

10-1 컬럼 인덱싱

df.[['age', 'id']]

df의 컬럼이 여러개일때에 age, id 컬럼값만 인덱싱 하는 방법입니다

 

 

10-2 인덱스 인덱싱

df[1:10:2]

numpy를 공부하고 오셧다면 바로 이해할수 있습니다 1번부터 10번까지 2단위로 인덱싱합니다

 

 

10-3 인덱스 교체

data_size = df.shape

cus_indexs = pd.data_range('20240130',periods=data_size)

df.index = cus_indexs

df의 shape을 통해 날짜를 shape만큼 만들어서 index를 날짜로 변경하는 방법입니다

 

 

 

 

 

11 loc

df.loc['2024-05-05':'2024-10-10', 'age']

날짜로 바꾼 인덱스를 통해 loc.[날짜,컬럼] 방식으로 데이터를 추출합니다

 

위 코드는 5월5일부터 10월10일까지의 데이터를 나이만 가져오게 됩니다

 

데이터 분석으로 예시를 들면 5월5일 부터 10월10일 까지 유저들의 나이대를 알수있습니다

 

 

 

 

12 iloc

df.iloc[1:3, 1:3]
df.iloc[[4,5,2,6], [5,1,4,2]]

iloc를 사용한 슬라이싱(?) 방법으로

첫번째는 1번부터 3번전까지의 인덱스를 1번부터 3번전까지의 컬럼만 출력한다 입니다

 

두번째는 numpy에서도 비슷하게 사용했던 비연속적인 데이터 추출입니다 4,5,2,6 인덱스에서 5,1,4,2 컬럼을 가져옵니다

 

 

 

 

13.블리언 인덱싱

df2.is_deleted == 0

참, 거짓의 데이터에서 사용되며 0, True인 데이터만을 인덱싱 하는 방법입니다

 

예시로 loc와 함께 사용한다면 구매여부 True, 물건을 구입한 사람 중 5월 ~ 10월 사이의 유저 나이 처럼 응용할수있습니다

 

 

 

 

14. drop

df.drop(['age'], axis=1)

데이터에서 age 컬럼을 제거합니다

컬럼이 많을때에는 인덱싱 하기에 번거로울 수 있어서 사용됩니다

 

 

 

15. groupby

df.groupby(['purchase', 'gender']).count()

purchase 는 1,0 으로 대분류로 구분해주고 gender에 따라 중분류를 진행할 수있습니다

 

구매 여부에따른 여자와 남자의 수 를 확인할수있습니다

 

 

 

 

16. 컬럼추가

df['gender'] = data['gender']

df에 gender 컬럼이 없다는 가정하에 작성하는 코드로 data에 있는 젠더 값을 가져오는 코드입니다 다른방법으로는 Series를 컬럼으로 추가할 수 있습니다

이때 값의 수가 같아야 하며 다를경우 다른 컬럼들이 None으로 추가됩니다

 

 

 

17. merge

left_df  = pd.DataFrame({
    'key':list('1234'),
    'A':list('ABCD'),
    'B':list('EFGH'),
})
right_df = pd.DataFrame({
    'key':list('0123'), 
    'C':list('가나다라'),
    'D':list('WXYZ'),
})

pd.merge( left_df, right_df, on='key' )

차원이 같은 두 데이터를 병합하는 방법으로 key값을 기준으로 병합되며 A,B,C,D 컬럼이 생기게 됩니다

 

pd.merge( left_df, right_df, on='key', how='left' )

(3,4) 배열과 (4,3)의 배열을 merge 하게되면 Nan으로 채우게 됩니다 이는 16. 컬럼추가와 같습니다

Nan이 되면 결측치가 발생하게 되며 이는 제거하거나 값을 추가해서 사용할 수 있습니다

 

 

 

 

18 조건 인덱싱

df = df[df['age'] >= 20]

실무에서 가장 많이 사용되는 인덱싱 방법인데 공부할때는 기본적인 사용법만 학습하다 보니 내용이 따로 없어서 하나 추가해보았습니다 조건에 따른 인덱싱 방법으로

예시는 20살 이상이 데이터만 가져온다입니다

 

결측치를 그래프로 시각화하여 결측치를 제거하거나 필요한 데이터 조건을 설정하는데 많이 사용됩니다

데이터 수집의 종류별 공부 중 API 형태의 데이터 수집으로 네이버 검색 API 수집을 완료했다 이후 웹 스크래핑 형식의 데이터 수집을 진행해보려 한다

웹 스크래핑은 웹 구조를 이용한 데이터 수집 방법으로 흔히 사이트를 긁어온다 라고 표현하며 사이트 별로 구조가 모두 다르기에 웹 페이즈에 대한 구조와 웹 스크래핑을 위한 BS4_BeautifulSoup 라이브러리 사용 경험치가 중요한 작업이다

간단 웹 페이지 구조

1. html5 : 데이터, 뼈대, 구조

2. css : 디자인, 레이아웃, 애니메이션, 반응형 (모바일<->PC)

  • bootstrap, 머터리얼 등의 디자인 템플릿도 가능

3. javascript, Ajax : 사용자 상호작용, 이벤트, 화면조작

웹 스크래핑 방법

  1. html 문자열
  2. BeautifulSoup 파싱
  3. html 구조로 메모리에 적재
  4. 탐색/검색
  5. 정보 추출

6. 데이터화

데이터 수집 타겟 사이트 선정

네이버 증권 환율 지표 데이터로 선정 'F12' 키 검사로 들어가서 확인해보면 네이버 환율 사이트는 친절이 document 사이트를 제공해 주어 손쉽게 데이터 수집이 가능 할 것으로 예상되며 최근 엔화의 하락이 있어서 엔화 변동성을 확인하여

엔화 ETF 매수 시점을 잡아보려고 시도중으로 네이버 환율 사이트를 타겟 사이트로 선정

 

 

친절히 환율 리스트만 따로 제공해주는 네이버 매매기준율을 기준으로 데이터 수집을 진행해보겠습니다

 

데이터 수집 코드 실습

  1. 모듈 가져오기
from urllib.request import urlopen from bs4 import BeautifulSoup

파싱을 위한 BeautifulSoup와 사이트 적솝을 위한 urlopen 모듈을 가져옵니다

2. 사이트 접속

target_site = 'https://finance.naver.com/marketindex/exchangeList.naver' res = urlopen( target_site )

타겟사이트인 네이버 증권 시장지표 환율정보이며 네이버에서는 따로 환율 리스트 정보만을 가지고있는 사이트를 제공해주기에 타겟사이트에 입력

3. 파싱

soup = BeautifulSoup( res , 'html5lib' )

BeautifulSoup로 html5lib을 사용한 파싱

4. 데이터 추출

사이트에서 데이터 수집 타겟인 매매기준율의 class 이름을 확인 'sale' 클래스로 확인

바로 옆의 통화명은 tit 입니다 사이트도 제공해주더니 데이터 수집도 간단하게 만들어 둔 사이트의 예시네요

for td_sale in soup.select('.sale'): print( td.text.strip() , end=" , " ) for td_tit in soup.select('.tit'): print( td.text.strip() , end=" , " )

클래스 값은 이름앞에 .을 붙혀서 .sale 의 형식으로 사용이 가능합니다

이제 soup를 사용해 통화명과 매매기준율 데이터 가져올 수 있습니다

 

네이버 증권 환율 정보를 가져오는 간단한 웹 스크래핑 방법 이였습니다

웹 스크래핑은 간단한 사이트에서 주로 사용하는 경우가 많아서 사이트도 간단한 사이트로 선정해서 진행해보았습니다

다음에는 조금더 고급(?) 스킬인 셀레니움을 통한 데이터 수집을 진행해보겠습니다

selenium을 사용해서는 데이터 수집이 조금은 더 까다로운 웹 페이지도 가능하니 세세하게 공부해두면 더 좋을것같습니다

데이터 분석을 위한 사전공부 데이터 종류와 데이터 수집에 대해 공부를 진행했다

데이터의 종류에 대한 생각과 데이터 수집중 API 형태의 데이터 수집 그 중 네이버 검색 API 내가 원하는 키워드대로 수집하는 코드를 작성한다

데이터 종류

  1. 정형
    • 구조화 된 데이터
    • RDMS를 통한 데이터일 확률이 높음
    • 데이터와 구조정보가 분리되어 있다
  2. 비정형
    • 구조가 없는 데이터
    • 바이너리 데이터 ( 비디오, 오디오, 문서파일 )
    • NoSQL
  3. 반정형
    • RDBMS에서 추출하진 않았지만, 어느 정도는 구조를 가지고 있음
    • JSON, XML -> 텍스트 기반 이기종, 플랫폼, 언어 독립적인 데이터 포멧
    • HTML 형식
    • 데이터 안에 데이터와 구조정보가 같이 존재함

데이터 수집 방법 : 네이버 open API를 활용한 뉴스 수집

뉴스 데이터 수집으로 자연어 처리 용도로 활용이 가능하다

API는 검색만 신청한 후 Client ID, Client Secret 필요

 

import sys import os import urllib.request

먼저 사용 할 모듈을 가져와 줍니다

CLIENT_ID = "" CLIENT_SECRET = ""

네이버 검색 API를 사용하기 위해 필요한 키로 네이버 개발자 센터에서 발급받을 수 있습니다

네이버 API를 사용하기 위해 네이버 개발자 센터 Naver Developer 에서 API 제휴 신청을 해줍니다

검색 API의 일 허용량은 25,000회로 자동화 하거나 추후 많이 사용하게 될때 참고해두세요

encText = urllib.parse.quote("키워드") url = "https://openapi.naver.com/v1/search/news.json?query=" + encText

키워드 입력하는 변수와 url 값을 만들어 줍니다


request = urllib.request.Request(url) # 프로토콜 헤더에 정보를 세팅한다 
request.add_header("X-Naver-Client-Id", CLIENT_ID) 
request.add_header("X-Naver-Client-Secret", CLIENT_SECRET) # 
urlopen() 실제적으로 서버에 요청하는 함수 
response = urllib.request.urlopen(request) 
rescode = response.getcode() 
if(rescode==200): 
	response_body = response.read() print(response_body.decode('utf-8')) 
	else: print("Error Code:" + rescode)

 

이후 네이버 API 사용 방법에 따라 response 해주고 코드 200으로 성공일때 작동하도록 만들어 줍니다

정상적으로 코드가 실행되면 5가지 값이 출력됩니다 title, originallink, link, description, pubDate

import sys import os 
import urllib.request 
CLIENT_ID = "" 
CLIENT_SECRET = "" 
encText = urllib.parse.quote("키워드") 
url = "https://openapi.naver.com/v1/search/news.json?query=" + encText 
request = urllib.request.Request(url) # 프로토콜 헤더에 정보를 세팅한다 
request.add_header("X-Naver-Client-Id", CLIENT_ID) 
request.add_header("X-Naver-Client-Secret", CLIENT_SECRET) # 
urlopen() 실제적으로 서버에 요청하는 함수 
response = urllib.request.urlopen(request) 
rescode = response.getcode() 
if(rescode==200): 
	response_body = response.read() 
	print(response_body.decode('utf-8')) 
else: print("Error Code:" + rescode)

1차 기본적인 네이버 API 테스트 총합 코드입니다

간단하게 API 형태 데이터 수집 방법을 작성해봤습니다 앞으로 웹 스크래핑, 크롤링, 자동화 까지 진행 후 본격적인 EDA 시작 해보겠습니다

+ Recent posts