*이 글을 읽기전에 작성자 개인의견이 있으니, 다른 블로그와 교차로 읽는것을 권장합니다.*
import pandas as pd
df = pd.read_csv('/content/drive/MyDrive/KDT/5. 데이터 분석/데이터/소상공인시장진흥공단_상가(상권)정보_서울_202303.csv')
df
df.info()
shop = ['엽기떡볶이', '죠스떡볶이', '신전떡볶이', '청년다방', '감탄떡볶이']
# 파리바게트(+파리바게뜨) 데이터 필터링
# contains(): 특정 문자열 포함 여부에 따라 True, False를 반환
data =df['상호명'].str.contains('파리바게트|파리바게뜨')
df_paris = df.loc[data, ['상가업소번호', '상호명', '경도', '위도']].copy()
df_paris
# column명 교체, .set_axis(), .reset_index()
df_paris = df_paris.set_axis(['업소번호', '업소상호명', '업소경도', '업소위도'], axis=1).reset_index(drop=True)
df_paris
# 떡볶이 프랜차이즈 데이터필터링
df_shop = df.copy()
# 상가업소번호, 상호명, 시군구명, 경도, 위도
# extract() : 특정 문자열을 포함하고 있으면 그 문자열을 반환하고, 포함하지 않으면 NaN을 반환
# '엽기떡볶이|죠스떡볶이|신전떡볶이|청년다방|감탄떡볶이'
df_shop['상호명'] = df_shop['상호명'].str.extract('({})'.format('|'.join(shop)))[0]
df_shop
df_shop = df_shop.dropna(subset=['상호명']).iloc[:, [0, 1, 14, 37, 38]].reset_index(drop=True)
df_shop
# 두 지점 사이의 거리를 계산
# merge() 함수에서 cross옵션을 사용해서 거리를 내고, 거기서 최소거리 구하기
# 곱집합
# 예시
df1 = pd.DataFrame(['A', 'B'])
df2 = pd.DataFrame(['가', '나', '다'])
df1.merge(df2, how='cross')
# 수학식으로 두 지점 사이의 거리를 내려면 어려우니까
# 하버사인 공식
# 두 지점의 위도와 경도를 입력하면 거리를 구해주는 모듈
!pip install haversine
from haversine import haversine
seoul = [37.541, 126.986]
paris = [48.8567, 2.3508]
print(haversine(seoul, paris, unit='km'))
print(haversine(seoul, paris, unit='m'))
# 떡볶이
df_shop.shape
# 파리바게트
df_paris.shape
df_cross = df_shop.merge(df_paris, how='cross')
df_cross
# 거리 column 추가
df_cross['거리'] = df_cross.apply(lambda x: haversine([x['위도'], x['경도']], [x['업소위도'], x['업소경도']], unit='m'), axis=1)
df_cross
# 개별 떡볶이 매장과 파리바게트와의 최소 거리
df_dis = df_cross.groupby(['상가업소번호', '상호명'])['거리'].min().reset_index()
df_dis
# 각 프랜차이즈별 파리바게트와의 평균 거리
df_dis.groupby('상호명')['거리'].mean()
# agg(): 다중 집계작업을 간단하게 해주는 함수
df_dis.groupby('상호명')['거리'].agg(['mean', 'count'])
# 거리를 입력하면 프랜차이즈 별 파리바게트와의 평균거리와 매장갯수를 출력하는 함수
# x는 m이내 집계
def distance(x):
dis = df_dis['거리'] <= x
return df_dis[dis].groupby('상호명')['거리'].agg(['mean', 'count'])
# 50m 이내 집계 출력
distance(50)
PandasEcharts
: Pandas와 Echarts를 통합한 모듈. Pandas의 DataFrame을 통해 데이터를 조작하고, Echarts를 통해 대화형 그래프 생성(시각화)할 수 있습니다.
!pip install pandasecharts
# 100m이내 집계 객체
df_100 = distance(100).reset_index()
df_100
import IPython
from pandasecharts import echart
from pyecharts.charts import Timeline, Grid
# 원그래프
df_100.echart.pie(x='상호명', y='count', figsize=(600,400), radius=['20%', '60%'], label_opts={'position':'outer'},
title='떡볶이 프랜차이즈의 입점전략은 과연 파리바게트 옆인가?',
legend_opts={'pos_right':'0%','orient':'vertical'},
subtitle='100m 이내 매장수').render()
IPython.display.HTML(filename='render.html')
tl = Timeline({'width':'600px', 'height':'400px'})
pie1 = df_100.echart.pie(x='상호명', y='count', figsize=(600,400), radius=['20%', '60%'], label_opts={'position':'outer'},
title='떡볶이 프랜차이즈의 입점전략은 과연 파리바게트 옆인가?',
legend_opts={'pos_right':'0%','orient':'vertical'},
subtitle='100m 이내 매장수')
tl.add(pie1, '100m').render()
IPython.display.HTML(filename='render.html')
tl = Timeline({'width':'600px', 'height':'400px'})
for i in [1000, 100, 50, 30]:
df_d = distance(i).reset_index()
pie1 = df_d.echart.pie(x='상호명', y='count', figsize=(600,400), radius=['20%', '60%'], label_opts={'position':'outer'},
title='떡볶이 프랜차이즈의 입점전략은 과연 파리바게트 옆인가?',
legend_opts={'pos_right':'0%','orient':'vertical'},
subtitle='100m 이내 매장수'.format(i))
tl.add(pie1, '{}m'.format(i)).render()
IPython.display.HTML(filename='render.html')
'Python > 데이터 분석(전처리, 시각화)' 카테고리의 다른 글
파이썬(11)- 따릉이 API활용 (0) | 2024.06.03 |
---|---|
파이썬(10)-Boxplot, barplot으로 데이터분석 (0) | 2024.05.29 |
파이썬(9)-Seaborn, Folium을 이용한 산점도, marker 시각화 (0) | 2024.05.29 |
파이썬(8)-Numpy와 Pandas를 이용한 데이터 전처리, 분석 (0) | 2024.05.27 |
파이썬(7)-matplotlib (0) | 2024.05.27 |