본문 바로가기
DB 공부하기

230228_DB복습

by 보랏 2023. 2. 28.

안녕하세요. 보랏입니다.

 

어제에 이어서 편의점 개수에 대한 데이터 분석을 이어서 진행하였으며, 

folium을 통한 지도 매핑(히트맵), matplotlib활용 데이터 시각화를 진행하였습니다.

 

바로 복습시작하겠습니다. 

 

1.  편의점 데이터 분석

  • 어제 pkl파일로 만들었던 편의점파일과 강사님께서 만들어주신 data.pkl파일을 활용하여 전체 편의점별 제공 서비스를 분석하였습니다. 
  • offeringservice에는 삼중 list로 만들어져 있어 이를 for문을 반복해서 service 리스트에 추가하였고, 중복된 값이 없도록 set을 활용하였습니다. 
편의점 = pd.read_pickle("./20230227.pkl")
data = pd.read_pickle("./data.pkl")

data['error_list'] #cu에서 없는 지역들

편의점[편의점.address.str.find('안암동4') > -1] # 주소column에 안암동4가가 포함된 row출력

set([z for z in y for y in [i for i in 편의점['offeringService'].values]].values]])
# cafe25, post, toto, withdrawal

#편의점 리스트 내 리스트로 감싸져있는 내용을 service리스트에 담기
service = []
for x in 편의점['offeringService'].values : 
	try : 
    	if type(x) == list : #offerservice의 값이 list로 감싸져 있어 반복문으로 출력
        	for y in x : 
            	service.append(y) #NaN의 값이 float이기 때문에 이를 제외한 값을 출력
        elif type(x) != float : 
        	service.append(x)
    except : 
    	pass

list(set(service)

 

  • 이제 이렇게 출력한 각 편의점별 서비스를 하나의 카테고리로 만들기 위해서 딕셔너리를 활용하여 하나의 변수로 만든 후 편의점 데이터와 master 의 value값과 비교, 비교 후 데이터가 있으면 1을 출력하도록 하였습니다. 
master = {"배송서비스" : {"무인택배접수", "페덱스서비스", "delivery_service", "post"},
          "의약품" : {"drug", "의약품"},
          "인출서비스" : {"atm","ATM", "withdrawal", "smart_atm", "시디"}}
          
set(편의점['offeringService'][0]) #{'cafe25', 'post', 'toto', 'withdrawal'}
len(set(편의점['offeringService'][0]) & master['배송서비스']) #1

# 결측치(NaN)가 아닌 값들만 도출하여, 배송서비스와 offeringService에서 lambda를 통해 중복값과 master['배송서비스']의 value가 한개라도 있으면 출력
편의점.loc[편의점['offeringService'].notnull(), '의약품'] = \
편의점.loc[편의점['offeringService'].notnull(), 'offeringService'].apply(lambda x : 'Y' if len(set(x) & master['의약품']) > 0 else 'N')
편의점2 = 편의점[['brand', 'shopName', 'address', '배송서비스', '의약품', '인출서비스']].copy()
편의점2[(편의점2['address'].str.find("서초구") > -1) & (편의점2['배송서비스']=='Y') & (편의점2['의약품'] == 'Y') & (편의점2['인출서비스']=='N')]
# DB 적재

from sqlalchemy import create_engine
connection(host='192.168.56.101', user='encore', password='123', charset='utf8', db='test')
engine = create_engine("mysql+pymysql://encore:123@192.168.56.101/test", echo = False)
편의점2.to_sql(name="convenience", if_exists='append', con=engine)

 

2. 데이터 시각화

  • 이제 folium을 활용하여 서울 내 편의점 위치를 지도에 맵핑하는 작업을 하였습니다. GS25만 선택하여 히트맵으로 도출하는 코드입니다. 
import folium
import json


서울 = 편의점[편의점.시 =='서울특별시'].copy()
서울['구'] = 서울['address'].apply(lambda x : x.split()[1])
서울 = 서울[서울['구'].isin(['양천구', '마포구', '서대문구', '강남구', '강동구', '서초구', '영등포구', '성동구', '종로구',
       '강서구', '용산구', '도봉구', '광진구', '성북구', '은평구', '중랑구', '노원구', '중구',
       '송파구', '동작구', '금천구', '구로구', '강북구', '동대문구', '관악구'])].copy()

#지리정보관련 json 데이터
geo_data = json.load(open("./skorea_municipalities_geo_simple.json", "r", encoding = 'utf-8'))

folium.Choropleth(geo_data=geo_data, 
                  data = 서울편의점,
                  columns=[서울편의점.index, 'shopName'],
                  fill_color='YlOrRd', fill_opacity=0.7, line_opacity=0.3, 
                  key_on = 'feature.properties.name').add_to(seoul_map)
                 
seoul_map

 

3. matplotlib활용 데이터 시각화

  • 이제 matplotlib를 활용하여 편의점 개수에 대한 정보를 막대, 원 차트로 시각화 하였습니다. 우선 한글 폰트를 다운받아 한글이 적용되게 하였고, 전국 편의점 점유율을 구하였습니다. 
#한글 설치
from matplotlib import font_manager, rc
font_path = "./font/malgun.ttf"
font_name = font_manager.FontProperties(fname = font_path).get_name()
rc('font', family=font_name)

#브랜드별 지점 개수
data = 편의점.groupby(['brand'])['shopName'].count()

plt.style.use("ggplot")
plt.figure(figsize=(15,15)) #사이즈 조절
plt.title('전국 편의점 점유율')
x = np.arange(data.values.size) #데이터 범위
name = data.index
values = data.values

plt.bar(x, values)
plt.xticks(x, name)
plt.legend(loc='best', labels='점유율') #범례 표시
plt.show()

from matplotlib import font_manager, rc
font_path = "./font/malgun.ttf"
font_name = font_manager.FontProperties(fname = font_path).get_name()
rc('font', family=font_name)

plt.style.use("ggplot")
plt.figure(figsize=(15,15)) #사이즈 조절
plt.title('전국 편의점 점유율')
x = np.arange(data.values.size)
name = data.index
values = data.values

#데이터 원차트 시각화
plt.pie(values)
plt.xticks(x, name)
plt.legend(loc='best', labels=data.index) #범례 표시
plt.show()

 

 

'DB 공부하기' 카테고리의 다른 글

230307_DB복습  (0) 2023.03.07
230306_DB복습  (0) 2023.03.06
230227_DB복습  (0) 2023.02.27
230224_DB 복습  (0) 2023.02.24
230222_DB복습  (0) 2023.02.22