Python/데이터분석

Python 떡볶이 프렌차이즈 입점전

dustKim 2024. 6. 3. 22:24
  • 필요한 모듈 가져오기
# 하버사인 공식
# 두 지접의 위도와 경도를 입력하면 거리를 구해주는 모듈
!pip install haversine

!pip install pandasecharts

import pandas as pd
from haversine import haversine  # 두 지점 간의 거리 계산
import IPython  # 상호작용적인 컴퓨터 환경 제공
from pandasecharts import echart  # 데이터프레임 시각화(차트)
from pyecharts.charts import Timeline, Grid

 

  • 사용할 데이터 읽어오기
더보기
df = pd.read_csv("파일경로")
df
결과

 

df.info()
결과

 

  • 원하는 데이터만 저장하기
더보기
shop = ["엽기떡볶이", "죠스떡볶이", "신전떡볶이", "청년다방", "감탄떡볶이"]

 

사용할 떡볶이 프랜차이즈 선택하기

 

 

# 파리바게트(파리바게뜨) 데이터 필터링
# contains(): 특정 문자열 포함 여부에 따라 True, False를 반환
data = df["상호명"].str.contains("파리바게트|파리바게뜨")
df_paris = df.loc[data, ["상가업소번호", "상호명", "경도", "위도"]].copy()
df_paris
결과

 

필요한 데이터만 골라서 copy 한다.

 

 

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.dropna(subset=["상호명"]).iloc[:, [0, 1, 14, 37, 38]].reset_index(drop=True)
df_shop
결과

 

떡볶이 프랜차이즈 필터링 후 인덱스 설정.

 

 

# 떡볶이 프렌차이즈, 파리바게트 곱집합
df_cross = df_shop.merge(df_paris, how="cross")
df_cross
결과

 

 

# 떡볶이 프렌차이즈와 파리바게트 사이의 거리 구하기
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"])
결과

 

 

# 거리를 입력하면 프렌차이즈 별 파리바게트와의 평균거리와 매장개수를 출력하는 함수
def distance(x):
  dis = df_dis["거리"] <= x
  return df_dis[dis].groupby("상호명")["거리"].agg(["mean", "count"])

distance(50)
결과

 

 

# 거리가 100m 이하인 매장, 인덱스 생성
df_100 = distance(100).reset_index()
df_100
결과

 

 

# df_100 데이터 차트로 나타내기
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")  # 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="{}m 이내 매장수".format(i))
  tl.add(pie1,"{}m".format(i)).render()
IPython.display.HTML(filename="render.html")
결과