EDA 과제1 풀이 메모

김민지·2023년 4월 12일
0
  1. 스타벅스 매장 정보 가져오기
from selenium import webdriver
url = ''
driver = webdriver.Chrome('../driver/chromedriver')
driver.get(url)
driver.find_element(BY.CSS_SELECTOR, '.gugun_arae_box > li > a').click()

-> .class 밑에 li 밑에 a를 지정

seoul_list_sel = driver.find_elements(BY.CSS_SELECTOR, '#mCSB_3_container ul li')

-> #id 밑에 ul 밑에 li들을 모두 가져옴

from bs4 import BeautifulSoup
html = driver.page_source
dom = BeautifulSoup(html, 'html.parser')

-> 현재 셀레니움으로 접근한 웹페이지 소스 가져오기

seoul_list = dom.select('#mCSB_3_container ul li')

-> beautifulsoup으로 데이터 가져오기 (셀레니움으로는 서울 전체 클릭까지만 이용)

title = seoul_list[0]['data-name']
lat = seoul_list[0]['data-lat']
lng = seoul_list[0]['data-long']

-> 매장명, 위도, 경도 가져오기

address = seoul_list[0].select_one('p').text[:-9]

-> 태그를 선택해서 주소 가져오기, 맨 뒤에 9개의 숫자(전화번호) 삭제

import pandas as pd
from tqdm import tqdm_notebook

datas = []

for content in tqdm_notebook(seoul_list):
	title = content['data-name']
    address = content.select_one('p').text[:-9]
    lat = content['data-lat']
	lng = content['data-long']
    datas.append({
    	'title':title,
        'address':address,
        'lat':lat,
        'lng':lng,
    )}
    
driver.close()
df = pd.DataFrame(datas)        
df.tail()

-> 전체데이터 가져오기

df['gu'] = df['address'][0].split()[1]

for idx, rows in df.iterrows():
	rows['gu'] = df['address'][idx].split()[1]

-> 데이터프레임에 새로운 칼럼('gu') 만들기 (구 이름)

df.to_csv('../data/starbucks.csv', encoding='utf-8')

-> csv 파일 저장

starbucks_df = pd.read_csv('../data/starbucks.csv', index_col=0)

-> csv 데이터 가져오기, 필요없는 첫 번째 컬럼은 가져오지 않음

  1. 이디야 매장 정보 가져오기
import pandas as pd
import warnings
from selenium import webdriver
from bs4 import BeautifulSoup
from tqdm import tqdm_notebook
import time
warnings.simplefilter(action='ignore') # 경고 무시
url = ''
driver = webdriver.Chrome('../driver/chromedriver')
driver.get(url)

-> 웹페이지 접속

driver.find_element(BY.CSS_SELECTOR, '복사한 주소').click()

-> 주소 검색탭 선택(CSS_SELECTOR 주소 복사)

starbucks_df = pd.read_csv('../data/starbucks.csv', index_col=0)
gu_list = list(starbucks_df['gu'].unique())

-> 스타벅스 구 리스트 가져오기

gu_list = [str('서울 ') + gu for gu in gu_list]

-> '서울 '을 앞에 붙여주기

search_keyword = driver.find_element(BY.CSS_SELECTOR, '#keyword')
search_keyword.clear()   # 입력된 검색어 삭제해주기 (다음 검색어와 중첩되지 않게끔)
search_keyword.send_keys(gu_list[2])

-> 검색어 입력

for gu in gu_list:
	search_keyword.send_keys(gu)     
    search_keywod.clear()
search_button = driver.find_element(BY.CSS_SELECTOR, '복사한 주소')
search_button.click()

-> 돋보기(검색)버튼 누르기

html = driver.page_source
dom = BeautifulSoup(html, 'html.parser') # 현재페이지
contents = dom.select('#placesList li')  # 데이터 가져오기

-> 검색결과 리스트 가져오기

title = contents[0].select_one('dt').text
address = contents[0].select_one('dd').text

-> 매장명, 주소 가져오기

url = ''
driver = webdriver.Chrome('../driver/chromedriver')
driver.get(url)

driver.find_element(BY.CSS_SELECTOR, '복사한 주소').click()
search_keyword = driver.find_element(BY.CSS_SELECTOR, '#keyword')
search_button = driver.find_element(BY.CSS_SELECTOR, '복사한 주소')
time.sleep(1)

datas = []

for gu in gu_list:
	search_keyword.clear()
    search_keyword.send_keys(gu)
    search_button.click()
    time.sleep(1)
    
    html = driver.page_source
    dom = BeautifulSoup(html, 'html.parser')
    contents = dom.select('#placesList li')
    
    for content in contents:
    	title = content.select_one('dt').text
		address = content.select_one('dd').text
    	datas.append({
        	'title':title,
            'address':address
        })
        
driver.close()

df = pd.DataFrame(datas)

-> 전체 데이터 수집(처음부터 쭉 전체 코드)

for idx, rows in df.iterrows():
	rows['gu'] = df['address'][idx].split(' ')[1]
df['gu'].unique()

-> 구 칼럼 만들기

import googlemaps

gmaps_key = '발급된 키값'
gmaps = googlemaps.Client(key=gmaps_key)

-> 위도,경도 가져오기 위한 작업

import numpy as np

df['lat'] = np.nan
df['lng'] = np.nan  # 일단 칼럼 만들어줌
for idx, rows in tqdm_notebook(df.iterrows()):
	address = rows['address']
    tmp = gmaps.geocode(address, language='ko')  # 검색어:address, 언어:한국어
    tmp[0].get('formatted_address')
    
    lat = tmp[0].get('geometry')['location']['lat']
    lng = tmp[0].get('geometry')['location']['lng']
    
    df.loc[idx, 'lat'] = lat
    df.loc[idx, 'lng'] = lng  # 위도, 경도를 각 칼럼에 넣어줌
df.to_csv('../data/ediya.csv', encoding='utf-8')
ediya_df = pd.read_csv('../data/ediya.csv', index_col=0)
  1. 스타벅스, 이디야 데이터 분석
import pandas as pd

stb_df = pd.read_csv('../data/starbucks.csv', encoding='utf-8', index_col=0)

ediya_df = pd.read_csv('../data/ediya.csv', encoding='utf-8', index_col=0)
stb_df['brand'] = '스타벅스'
ediya_df['brand'] = '이디야'

-> 두 데이터를 합칠 때, 구분되도록 브랜드명 칼럼을 만들어줌

cafe_df = pd.concat([stb_df, ediya_df], axis=0)

-> 두 데이터프레임 합치기

cafe_df.reset_index(inplace=True)
del cafe_df['index']

-> 새로운 인덱스를 달아주고, 기존 인덱스 삭제

import matplotlib.pyplot as plt
%matplotlib inline
from matplotlib import rc
rc("font", family="Malgun Gothic")

-> 한글 대응 코드

  • 각 매장의 주요 분포지역 확인해보기
cafe_df['gu'][cafe_df['brand'] == '스타벅스'].value_counts(ascending=False)[:5]

-> 스타벅스 매장의 구별 매장수 구하기 (내림차순 정렬, 상위5개)

cafe_df['gu'][cafe_df['brand'] == '이디야'].value_counts(ascending=False)[:5]

-> 이디야 매장의 구별 매장수 구하기 (내림차순 정렬, 상위5개)

df1 = cafe_df.groupby(['gu', 'brand'])['title'].count().reset_index(name='shop_count')

-> 구별로 스타벅스, 이디야가 각 몇 개씩 분포해있는지 보여주는 df 만들기

import numpy as np
df1.pivot_table(index='gu', columns='brand', aggfunc=np.sum)

-> 보기 편하도록 피벗테이블로 만들기

plt.figure(figsize=(24, 6))
sns.barplot(data=df1, x=df1['gu'], y=df1['shop_count'], hue='brand', palette='Set1')
plt.show()

-> 구별 매장수를 막대그래프(barplot)로 그려주기

plt.figure(figsize=(24, 6))
sns.barplot(data=df1, x=df1['gu'], y=df1['shop_count'], hue='brand', dodge=False, alpha=0.8, palette='Set1')
plt.show()

-> dodge=False: 그래프를 겹치도록 하기, alpha: 투명도를 다르게 줌

stb_df_m = stb_df.groupby(['gu', 'brand'])['title'].count().reset_index(name='shop_count')
stb_df_m = stb_df_m.pivot_table(index='gu')
edi_df_m = ediya_df.groupby(['gu', 'brand'])['title'].count().reset_index(name='shop_count')
edi_df_m = edi_df_m.pivot_table(index='gu')
  • 지도 시각화하기
import folium
import json
geo_path = '../data/02. skorea_municipalities_geo_simple.json'
geo_str = json.load(open(geo_path, encoding='utf-8'))
sta_m = folium.Map(location=[37.5502, 126.982], zoom_start=12)  # 서울이 잘 보이는 위치로 지정

sta_m.choropleth(
	geo_data=geo_str,
    data=stb_df_m['shop_count'],
    columns=[stb_df_m.index, stb_df_m['shop_count']],
    fill_color='PuRd',
    key_on='feature.id'
)   # 구별 경계선 그리기 (색깔은 매장개수)

for idx, rows in stb_df.iterrows():
	folium.Circle(
    	location=[rows['lat'], rows['lng']],
        radius=100,
        popup=rows['title'] + '점',
        color='#2c9147', fill_color='#2c9147'
    ).add_to(sta_m)  # 스타벅스 매장 위치 찍어주기
   
edi_m = folium.Map(location=[37.5502, 126.982], zoom_start=12)  # 서울이 잘 보이는 위치로 지정

edi_m.choropleth(
	geo_data=geo_str,
    data=edi_df_m['shop_count'],
    columns=[edi_df_m.index, edi_df_m['shop_count']],
    fill_color='PuRd',
    key_on='feature.id'
)   # 구별 경계선 그리기 (색깔은 매장개수)

for idx, rows in ediya_df.iterrows():
	folium.Circle(
    	location=[rows['lat'], rows['lng']],
        radius=100,
        popup=rows['title'] + '점',
        color='#5882FA', fill_color='#5882FA'
    ).add_to(edi_m)  # 이디야 매장 위치 찍어주기
   
sta_edi_m = folium.Map(location=[37.5502, 126.982], zoom_start=12)  # 서울이 잘 보이는 위치로 지정

sta_edi_m.choropleth(
	geo_data=geo_str,
    data=stb_df_m['shop_count'],
    columns=[stb_df_m.index, stb_df_m['shop_count']],
    fill_color='PuRd',
    key_on='feature.id'
)   # 구별 경계선 그리기 (색깔은 매장개수)

for idx, rows in stb_df.iterrows():
	folium.Circle(
    	location=[rows['lat'], rows['lng']],
        radius=100,
        popup=rows['title'] + '점',
        color='#2c9147', fill_color='#2c9147'
    ).add_to(sta_edi_m)  # 스타벅스 매장 위치 찍어주기

for idx, rows in ediya_df.iterrows():
	folium.Circle(
    	location=[rows['lat'], rows['lng']],
        radius=100,
        popup=rows['title'] + '점',
        color='#5882FA', fill_color='#5882FA'
    ).add_to(sta_edi_m)  # 이디야 매장 위치 찍어주기
   

-> 스타벅스, 이디야 매장위치 지도시각화

<제로베이스 데이터 취업 스쿨>

0개의 댓글