안녕하세요. 보랏입니다.
어제에 이어서 편의점 개수에 대한 데이터 분석을 이어서 진행하였으며,
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 |