소상공인시장진흥공단 상가업소정보로 스타벅스, 이디야 위치 분석하기
이번 실습에서는 이디야와 스타벅스의 매장입지의 차이에 대해 파악하는 과정을 다룬다.
다음 기사에서 제시된 시각화 자료와 비슷하게 만들어보기 위해 Pandas, Numpy, Seaborn, Matplotlib, folium 등을 사용한다.
관련 기사
[비즈&빅데이터]스타벅스 '쏠림' vs 이디야 '분산'
스타벅스와 이디야는 해외브랜드와 토종브랜드를 대표하는 양대 커피 전문점이다. 1999년 이대1호점으로 국내에 상륙한 스타벅스는 신세계 이마트와 미국 스타벅스 본사(스타벅스커피인터내셔
news.bizwatch.co.kr
다루는 내용
- 공공데이터를 활용해 텍스트 데이터 정제하고 원하는 정보 찾아내기
- 문자열에서 원하는 텍스트 추출하기
- 문자열을 활용한 다양한 분석 방법과 위치 정보 사용하기
- folium을 통한 위경도 데이터 시각화 이해하기
이전 글
소상공인시장진흥공단 상가업소정보로 프랜차이즈 입점분석 (1)
[python] 소상공인시장진흥공단 상가업소정보로 프랜차이즈 입점분석 (1)
상가업소정보로 프랜차이즈 입점분석 배스킨라빈스 & 던킨도너츠 프랜차이즈 매장의 밀집도를 지도를 통해 표시하고, 이를 위해 데이터 전처리 과정을 진행한다. 다루는 내용 데이터 요약하기
imstatdust.tistory.com
소상공인시장진흥공단 상가업소정보로 프랜차이즈 입점분석 (2)
[python] 소상공인시장진흥공단 상가업소정보로 프랜차이즈 입점분석 (2)
https://www.inflearn.com/course/%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A1%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0 공공데이터로 파이썬 데이터 분석 시작하
imstatdust.tistory.com
1. 필요한 라이브러리 불러오기
import numpy as np
import pandas as pd
import seaborn as sns
2. 시각화를 위한 한글 폰트 사용하기
import matplotlib.pyplot as plt
plt.rc("font", family="Malgun Gothic")
plt.rc("axes", unicode_minus=False)
# 폰트가 선명하게 보이도록 retina 설정
from IPython.display import set_matplotlib_formats
%config InlineBackend.figure_format = 'retina'
3. 데이터 불러오기
import pandas as pd
df = pd.read_csv("C:/Users/yobin/Downloads/상가업소정보_201912_01.csv", sep="|")
df.shape
(573680, 39)
3-1. 데이터 미리보기
df.head(1)
상가업소번호 | 상호명 | 지점명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 표준산업분류코드 | ... | 건물관리번호 | 건물명 | 도로명주소 | 구우편번호 | 신우편번호 | 동정보 | 층정보 | 호정보 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 19905471 | 와라와라호프 | NaN | Q | 음식 | Q09 | 유흥주점 | Q09A01 | 호프/맥주 | I56219 | ... | 1168010600106040000014378 | 대치상가 | 서울특별시 강남구 남부순환로 2933 | 135280 | 6280.0 | NaN | 1 | NaN | 127.061026 | 37.493922 |
1 rows × 39 columns
3-2. info 보기
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 573680 entries, 0 to 573679
Data columns (total 39 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 상가업소번호 573680 non-null int64
1 상호명 573679 non-null object
2 지점명 76674 non-null object
3 상권업종대분류코드 573680 non-null object
4 상권업종대분류명 573680 non-null object
5 상권업종중분류코드 573680 non-null object
6 상권업종중분류명 573680 non-null object
7 상권업종소분류코드 573680 non-null object
8 상권업종소분류명 573680 non-null object
9 표준산업분류코드 539290 non-null object
10 표준산업분류명 539290 non-null object
11 시도코드 573680 non-null int64
12 시도명 573680 non-null object
13 시군구코드 573680 non-null int64
14 시군구명 573680 non-null object
15 행정동코드 573680 non-null int64
16 행정동명 573680 non-null object
17 법정동코드 573680 non-null int64
18 법정동명 573680 non-null object
19 지번코드 573680 non-null int64
20 대지구분코드 573680 non-null int64
21 대지구분명 573680 non-null object
22 지번본번지 573680 non-null int64
23 지번부번지 474924 non-null float64
24 지번주소 573680 non-null object
25 도로명코드 573680 non-null int64
26 도로명 573680 non-null object
27 건물본번지 573680 non-null int64
28 건물부번지 71988 non-null float64
29 건물관리번호 573680 non-null object
30 건물명 265608 non-null object
31 도로명주소 573680 non-null object
32 구우편번호 573680 non-null int64
33 신우편번호 573671 non-null float64
34 동정보 50856 non-null object
35 층정보 347127 non-null object
36 호정보 85266 non-null object
37 경도 573680 non-null float64
38 위도 573680 non-null float64
dtypes: float64(5), int64(11), object(23)
memory usage: 170.7+ MB
3-3. 결측치 보기
# isnull() 을 사용하면 데이터의 결측치를 볼 수 있습니다.
# 결측치는 True로 값이 있다면 False로 표시되는데 True 는 1과 같기 때문에
# True 값을 sum()을 사용해서 더하게 되면 합계를 볼 수 있습니다.
df.isnull()
df.isnull().sum()
상가업소번호 0
상호명 1
지점명 497006
상권업종대분류코드 0
상권업종대분류명 0
상권업종중분류코드 0
상권업종중분류명 0
상권업종소분류코드 0
상권업종소분류명 0
표준산업분류코드 34390
표준산업분류명 34390
시도코드 0
시도명 0
시군구코드 0
시군구명 0
행정동코드 0
행정동명 0
법정동코드 0
법정동명 0
지번코드 0
대지구분코드 0
대지구분명 0
지번본번지 0
지번부번지 98756
지번주소 0
도로명코드 0
도로명 0
건물본번지 0
건물부번지 501692
건물관리번호 0
건물명 308072
도로명주소 0
구우편번호 0
신우편번호 9
동정보 522824
층정보 226553
호정보 488414
경도 0
위도 0
dtype: int64
df.isnull().sum().plot.barh(figsize=(8,9))
<AxesSubplot:>
3-4. 사용하지 않는 컬럼 제거하기
columns = ['상호명', '상권업종대분류명', '상권업종중분류명', '상권업종소분류명',
'시도명', '시군구명', '행정동명', '법정동명', '도로명주소',
'경도', '위도']
df=df[columns].copy()
df.shape
(573680, 11)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 573680 entries, 0 to 573679
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 상호명 573679 non-null object
1 상권업종대분류명 573680 non-null object
2 상권업종중분류명 573680 non-null object
3 상권업종소분류명 573680 non-null object
4 시도명 573680 non-null object
5 시군구명 573680 non-null object
6 행정동명 573680 non-null object
7 법정동명 573680 non-null object
8 도로명주소 573680 non-null object
9 경도 573680 non-null float64
10 위도 573680 non-null float64
dtypes: float64(2), object(9)
memory usage: 48.1+ MB
4. 색인으로 서브셋 가져오기
4-1. 서울만 따로 보기
df_seoul = df[df["시도명"] == "서울특별시"].copy()
df_seoul.shape
(407376, 11)
4-2. 일부 텍스트가 들어가는 데이터만 가져오기
df_seoul["상호명_소문자"] = df_seoul["상호명"].str.lower()
df_seoul.loc[df_seoul["상호명_소문자"].str.contains("이디야|이디아|ediya"), "상호명_소문자"].shape
(543,)
# 상호명에서 스타벅스만 가져오기
df_seoul.loc[df_seoul["상호명_소문자"].str.contains("스타벅스|starbucks"), "상호명_소문자"].shape
(506,)
# '상호명_소문자'컬럼으로 '스타벅스|starbucks|이디야|이디아|ediya'를 가져와 df_cafe 변수에 담는다.
df_cafe = df_seoul[
df_seoul["상호명_소문자"].str.contains('스타벅스|starbucks|이디야|이디아|ediya')].copy()
df_cafe.shape
(1049, 12)
df_cafe.loc[df_cafe["상호명_소문자"].str.contains('스타벅스|starbucks'), "브랜드명"] = "스타벅스"
df_cafe.loc[~df_cafe["상호명_소문자"].str.contains('스타벅스|starbucks'), "브랜드명"] = "이디야"
df_cafe[["상호명_소문자", "브랜드명"]].head()
# 스타벅스를 제외한 데이터는 이디야이기 때문에 이디야로 브랜드명을 만듭니다.
# df_cafe["브랜드명"].fillna("이디야")
상호명_소문자 | 브랜드명 | |
---|---|---|
1104 | 스타벅스 | 스타벅스 |
1675 | 이디야커피 | 이디야 |
2023 | 스타벅스종로3가점 | 스타벅스 |
2770 | 스타벅스 | 스타벅스 |
2957 | 이디야커피 | 이디야 |
# df_cafe에 담긴 상호명','브랜드명'으로 미리보기
df_cafe[["상호명", "브랜드명"]].tail()
상호명 | 브랜드명 | |
---|---|---|
567090 | 스타벅스 | 스타벅스 |
567828 | 스타벅스 | 스타벅스 |
568636 | 이디야커피 | 이디야 |
570096 | 스타벅스 | 스타벅스 |
571052 | 스타벅스 | 스타벅스 |
4-3. 시각화
분류별 countplot 그리기
df_cafe["상권업종중분류명"].value_counts()
커피점/카페 1036
학원-어학 3
광고/인쇄 2
주유소/충전소 1
유흥주점 1
분양 1
주택수리 1
기타판매업 1
종합소매점 1
패스트푸드 1
운동/경기용품소매 1
Name: 상권업종중분류명, dtype: int64
df_cafe["상권업종중분류명"].value_counts().plot.barh()
<AxesSubplot:>
print(df_cafe.shape)
df_cafe = df_cafe[df_cafe["상권업종중분류명"] == "커피점/카페"].copy()
df_cafe.shape
(1049, 13)
(1036, 13)
df_cafe["브랜드명"].value_counts()
이디야 532
스타벅스 504
Name: 브랜드명, dtype: int64
sns.countplot(data=df_cafe, x="브랜드명")
<AxesSubplot:xlabel='브랜드명', ylabel='count'>
plt.figure(figsize = (15, 4))
sns.countplot(data=df_cafe, x="시군구명", hue="브랜드명")
<AxesSubplot:xlabel='시군구명', ylabel='count'>
#pandas - scatterplot
df_cafe[["위도", "경도"]].plot.scatter(x="경도", y="위도")
<AxesSubplot:xlabel='경도', ylabel='위도'>
#seaborn - scatterplot
sns.scatterplot(data=df_cafe, x="경도", y="위도", hue="브랜드명")
<AxesSubplot:xlabel='경도', ylabel='위도'>
jointplot 그리기
sns.jointplot(data=df_cafe, x="경도", y="위도", kind="kde")
<seaborn.axisgrid.JointGrid at 0x1dd06840a60>
'Data Analysis > python' 카테고리의 다른 글
[python] 소상공인시장진흥공단 상가업소정보로 프랜차이즈 입점분석 (4) (0) | 2023.01.29 |
---|---|
[python] 100 pandas puzzles (0) | 2023.01.27 |
[python] jupyter notebook에서 생성한 folium map 티스토리로 불러오기 (2) | 2023.01.26 |
[python] 소상공인시장진흥공단 상가업소정보로 프랜차이즈 입점분석 (2) (1) | 2023.01.25 |
[python] 소상공인시장진흥공단 상가업소정보로 프랜차이즈 입점분석 (1) (0) | 2023.01.25 |
댓글