상권분석


데이터 출처 : 공공데이터포털

소상공인 상권정보 상가업소 데이터

라이브러리 로드

#라이브러리 로드 

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

한글폰트 설정

# 한글 폰트 설정
plt.rc("font", family="Malgun Gothic")
plt.rc("axes", unicode_minus=False) # -깨지는거 제거
# 레티나 디스플레이로 폰트가 선명하게 표시되도록 합니다.

from IPython.display import set_matplotlib_formats
set_matplotlib_formats("retina")
#한글 폰트 설정 
pd.Series([-4, 1, 0, 3, -2, 4, 5]).plot(title="한글폰트 설정")

<matplotlib.axes._subplots.AxesSubplot at 0x24d4e5e9df0>

png

파일로드

%ls data
 C 드라이브의 볼륨: Windows
 볼륨 일련 번호: F667-FF4C

 C:\Users\actyu\jupyter_ex\data 디렉터리

2021-01-24  오전 12:01    <DIR>          .
2021-01-24  오전 12:01    <DIR>          ..
2021-01-24  오전 12:01            57,732 seoul_municipalities_geo_simple.json
2021-01-24  오전 12:01       264,920,940 상가업소정보_201912_01.csv
2021-01-19  오후 02:35             2,163 전국 평균 분양가격(2013년 9월부터 2015년 8월까지).csv
2021-01-19  오후 02:21           175,016 주택도시보증공사_전국 신규 민간 아파트 분양가격 동향_20200331.csv
2021-01-19  오후 02:36           162,510 주택도시보증공사_전국 평균 분양가격(2019년 12월).csv
               5개 파일         265,318,361 바이트
               2개 디렉터리  102,667,726,848 바이트 남음
# 파일을 로드합니다.

df = pd.read_csv("data/상가업소정보_201912_01.csv", sep='|')
df.shape
(573680, 39)
pd.options.display.max_columns = 39 # 모든컬럼을 표시
df.head()
상가업소번호상호명지점명상권업종대분류코드상권업종대분류명상권업종중분류코드상권업종중분류명상권업종소분류코드상권업종소분류명표준산업분류코드표준산업분류명시도코드시도명시군구코드시군구명행정동코드행정동명법정동코드법정동명지번코드대지구분코드대지구분명지번본번지지번부번지지번주소도로명코드도로명건물본번지건물부번지건물관리번호건물명도로명주소구우편번호신우편번호동정보층정보호정보경도위도
019905471와라와라호프NaNQ음식Q09유흥주점Q09A01호프/맥주I56219기타 주점업11서울특별시11680강남구1168060000대치1동1168010600대치동11680106002060400001대지604NaN서울특별시 강남구 대치동 604116802000003서울특별시 강남구 남부순환로2933NaN1168010600106040000014378대치상가서울특별시 강남구 남부순환로 29331352806280.0NaN1NaN127.06102637.493922
119911397커피빈코리아선릉로93길점코리아선릉로93길점Q음식Q12커피점/카페Q12A01커피전문점/카페/다방I56220비알콜 음료점업11서울특별시11680강남구1168064000역삼1동1168010100역삼동11680101002069600421대지69642.0서울특별시 강남구 역삼동 696-42116804166502서울특별시 강남구 선릉로93길6NaN1168010100106960042022041NaN서울특별시 강남구 선릉로93길 61350806149.0NaN1NaN127.04788337.505675
219911801프로포즈NaNQ음식Q09유흥주점Q09A01호프/맥주I56219기타 주점업11서울특별시11545금천구1154563000독산3동1154510200독산동11545102002016200011대지1621.0서울특별시 금천구 독산동 162-1115453117003서울특별시 금천구 가산로346.01154510200101620001017748NaN서울특별시 금천구 가산로 34-61530108545.0NaN1NaN126.89922037.471711
319912201싱싱커피&토스트NaNQ음식Q07패스트푸드Q07A10토스트전문I56192피자, 햄버거, 샌드위치 및 유사 음식점업26부산광역시26530사상구2653062000괘법동2653010400괘법동26530104002057800001대지578NaN부산광역시 사상구 괘법동 578265303139004부산광역시 사상구 괘감로37NaN2653010400105780000002037산업용품유통상가부산광역시 사상구 괘감로 3761772646977.0NaN126128.98045535.159774
419932756가락사우나내스낵NaNF생활서비스F09대중목욕탕/휴게F09A02사우나/증기탕/온천S96121욕탕업11서울특별시11710송파구1171060000석촌동1171010500석촌동11710105002025600001대지256NaN서울특별시 송파구 석촌동 256117103123001서울특별시 송파구 가락로71NaN1171010500102560005010490NaN서울특별시 송파구 가락로 711388465690.0NaN1NaN127.10407137.500249
df.tail()
상가업소번호상호명지점명상권업종대분류코드상권업종대분류명상권업종중분류코드상권업종중분류명상권업종소분류코드상권업종소분류명표준산업분류코드표준산업분류명시도코드시도명시군구코드시군구명행정동코드행정동명법정동코드법정동명지번코드대지구분코드대지구분명지번본번지지번부번지지번주소도로명코드도로명건물본번지건물부번지건물관리번호건물명도로명주소구우편번호신우편번호동정보층정보호정보경도위도
57367516394290비파티세리공덕NaNQ음식Q01한식Q01A01한식/백반/한정식I56111한식 음식점업11서울특별시11440마포구1144056500공덕동1144010200공덕동11440102002010500671대지10567.0서울특별시 마포구 공덕동 105-67114404139142서울특별시 마포구 마포대로14길4NaN1144010200101050067001710NaN서울특별시 마포구 마포대로14길 41218014211.0NaNNaNNaN126.95505937.548618
57367616336474앤탑PC방NaNN관광/여가/오락N01PC/오락/당구/볼링등N01A01인터넷PC방R91222컴퓨터 게임방 운영업11서울특별시11200성동구1120069000성수2가3동1120011500성수동2가11200115002028900151대지28915.0서울특별시 성동구 성수동2가 289-15112004109367서울특별시 성동구 성수일로8길37NaN1120011500102890015004255으뜸프린팅(주)서울특별시 성동구 성수일로8길 371338344794.0NaN2NaN127.05461537.545853
57367716336218오즈아레나PC방NaNN관광/여가/오락N01PC/오락/당구/볼링등N01A01인터넷PC방R91222컴퓨터 게임방 운영업11서울특별시11680강남구1168052100논현1동1168010800논현동11680108002016500081대지1658.0서울특별시 강남구 논현동 165-8116802102001서울특별시 강남구 강남대로492NaN1168010800101650008000001한맥빌딩서울특별시 강남구 강남대로 4921358256119.0NaN2NaN127.02410237.506202
57367816335152파인트리네일NaNF생활서비스F01이/미용/건강F01A02발/네일케어S96119기타미용업11서울특별시11560영등포구1156054000여의동1156011000여의도동11560110002002300001대지23NaN서울특별시 영등포구 여의도동 23115603118002서울특별시 영등포구 국제금융로10NaN1156011000100230000000001서울국제금융센터서울특별시 영등포구 국제금융로 101509457326.0NaN1NaN126.92486337.525172
57367916335150마이리틀네일NaNF생활서비스F01이/미용/건강F01A02발/네일케어S96119기타미용업11서울특별시11320도봉구1132051100창1동1132010700창동11320107002081200001대지812NaN서울특별시 도봉구 창동 812113204127109서울특별시 도봉구 도봉로114길228.01132010700108120000018489현대타운아파트서울특별시 도봉구 도봉로114길 22-81326911455.0101NaNNaN127.03514537.647099
#인덱스 정보 
df.index
RangeIndex(start=0, stop=573680, step=1)
df.columns
Index(['상가업소번호', '상호명', '지점명', '상권업종대분류코드', '상권업종대분류명', '상권업종중분류코드',
       '상권업종중분류명', '상권업종소분류코드', '상권업종소분류명', '표준산업분류코드', '표준산업분류명', '시도코드',
       '시도명', '시군구코드', '시군구명', '행정동코드', '행정동명', '법정동코드', '법정동명', '지번코드',
       '대지구분코드', '대지구분명', '지번본번지', '지번부번지', '지번주소', '도로명코드', '도로명', '건물본번지',
       '건물부번지', '건물관리번호', '건물명', '도로명주소', '구우편번호', '신우편번호', '동정보', '층정보',
       '호정보', '경도', '위도'],
      dtype='object')
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
df.dtypes
상가업소번호         int64
상호명           object
지점명           object
상권업종대분류코드     object
상권업종대분류명      object
상권업종중분류코드     object
상권업종중분류명      object
상권업종소분류코드     object
상권업종소분류명      object
표준산업분류코드      object
표준산업분류명       object
시도코드           int64
시도명           object
시군구코드          int64
시군구명          object
행정동코드          int64
행정동명          object
법정동코드          int64
법정동명          object
지번코드           int64
대지구분코드         int64
대지구분명         object
지번본번지          int64
지번부번지        float64
지번주소          object
도로명코드          int64
도로명           object
건물본번지          int64
건물부번지        float64
건물관리번호        object
건물명           object
도로명주소         object
구우편번호          int64
신우편번호        float64
동정보           object
층정보           object
호정보           object
경도           float64
위도           float64
dtype: object

결측치 확인

df.isnull() 
# true 는 결측치
상가업소번호상호명지점명상권업종대분류코드상권업종대분류명상권업종중분류코드상권업종중분류명상권업종소분류코드상권업종소분류명표준산업분류코드표준산업분류명시도코드시도명시군구코드시군구명행정동코드행정동명법정동코드법정동명지번코드대지구분코드대지구분명지번본번지지번부번지지번주소도로명코드도로명건물본번지건물부번지건물관리번호건물명도로명주소구우편번호신우편번호동정보층정보호정보경도위도
0FalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseTrueFalseTrueFalseFalse
1FalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseTrueFalseFalseFalseTrueFalseTrueFalseFalse
2FalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseTrueFalseTrueFalseFalse
3FalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseTrueFalseFalseFalseFalse
4FalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseTrueFalseTrueFalseFalseFalseTrueFalseTrueFalseFalse
........................................................................................................................
573675FalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseTrueFalseFalseFalseTrueTrueTrueFalseFalse
573676FalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseTrueFalseTrueFalseFalse
573677FalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseTrueFalseTrueFalseFalse
573678FalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseTrueFalseTrueFalseFalse
573679FalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseFalseTrueTrueFalseFalse

573680 rows × 39 columns

n = df.isnull().sum()
#막대그래프 시각화
n.plot.bar() # 결측치 보기 
<matplotlib.axes._subplots.AxesSubplot at 0x24d4ed9f760>

png

# 옆으로 그래프 보기(결측치 순서대로) sort_values
n.sort_values().plot.barh(figsize=(7,8))
<matplotlib.axes._subplots.AxesSubplot at 0x24d4fec1a00>

png

missingno로 결측치 시각화

import missingno as msno
msno.matrix(df)
<matplotlib.axes._subplots.AxesSubplot at 0x24d264ee160>

png

#heatmap 으로 시각화
msno.heatmap(df)
<matplotlib.axes._subplots.AxesSubplot at 0x24d297517c0>

png

# dendrogram으로 표현 
msno.dendrogram(df)
<matplotlib.axes._subplots.AxesSubplot at 0x24d0777ac10>

png

사용하지 않는 칼럼 제거

# sort_values 를 통해 결측치가 많은 데이터를 위에서 9개 가져와서 not_use 변수에 담습니다.
# not_use 변수에 담긴 인덱스값만 추출해서 not_use_col 이라는 변수에 담습니다.

not_use = n.sort_values(ascending=False).head(9)
not_use_col = not_use.index
not_use_col

Index(['동정보', '건물부번지', '지점명', '호정보', '건물명', '층정보', '지번부번지', '표준산업분류명',
       '표준산업분류코드'],
      dtype='object')
# 사용하지 않는 칼럼 제거, shpae으로 확인
print(df.shape) # 칼럼 39
df = df.drop(not_use_col, axis=1) # 칼럼제거 axis =1
print(df.shape) # 칼럼 30
(573680, 39)
(573680, 30)
cols = df.columns
cols_code = cols[cols.str.contains("코드|번호")] # 코드나 번호가 들어가는 칼럼
cols_code
Index(['상가업소번호', '상권업종대분류코드', '상권업종중분류코드', '상권업종소분류코드', '시도코드', '시군구코드',
       '행정동코드', '법정동코드', '지번코드', '대지구분코드', '도로명코드', '건물관리번호', '구우편번호',
       '신우편번호'],
      dtype='object')
#코드나 번호가 들어가는 칼럼 제거
print(df.shape) # 칼럼 30
df = df.drop(cols_code, axis= 1)
print(df.shape) # 칼럼 16
(573680, 30)
(573680, 16)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 573680 entries, 0 to 573679
Data columns (total 16 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  int64  
 10  지번주소      573680 non-null  object 
 11  도로명       573680 non-null  object 
 12  건물본번지     573680 non-null  int64  
 13  도로명주소     573680 non-null  object 
 14  경도        573680 non-null  float64
 15  위도        573680 non-null  float64
dtypes: float64(2), int64(2), object(12)
memory usage: 70.0+ MB

행,열 기준으로 값을 가져오기

열기준으로 가져오기

#상호명 가져오기
df[["상호명"]]
상호명
0와라와라호프
1커피빈코리아선릉로93길점
2프로포즈
3싱싱커피&토스트
4가락사우나내스낵
......
573675비파티세리공덕
573676앤탑PC방
573677오즈아레나PC방
573678파인트리네일
573679마이리틀네일

573680 rows × 1 columns

# 상호명,도로명 칼럼가져오기 (두 칼럼 이상 가져올때는 [[]]형태로 가져오기)
df[["상호명","도로명주소"]].head()
상호명도로명주소
0와라와라호프서울특별시 강남구 남부순환로 2933
1커피빈코리아선릉로93길점서울특별시 강남구 선릉로93길 6
2프로포즈서울특별시 금천구 가산로 34-6
3싱싱커피&토스트부산광역시 사상구 괘감로 37
4가락사우나내스낵서울특별시 송파구 가락로 71

행기준으로 가져오기

# 0번째 인덱스 행을 가져오기
df.loc[0]
상호명                       와라와라호프
상권업종대분류명                      음식
상권업종중분류명                    유흥주점
상권업종소분류명                   호프/맥주
시도명                        서울특별시
시군구명                         강남구
행정동명                        대치1동
법정동명                         대치동
대지구분명                         대지
지번본번지                        604
지번주소           서울특별시 강남구 대치동 604
도로명              서울특별시 강남구 남부순환로
건물본번지                       2933
도로명주소       서울특별시 강남구 남부순환로 2933
경도                       127.061
위도                       37.4939
Name: 0, dtype: object
# 0, 1, 2 번째 인덱스 행을 가져온다 .
df.loc[[0,1,2]]
상호명상권업종대분류명상권업종중분류명상권업종소분류명시도명시군구명행정동명법정동명대지구분명지번본번지지번주소도로명건물본번지도로명주소경도위도
0와라와라호프음식유흥주점호프/맥주서울특별시강남구대치1동대치동대지604서울특별시 강남구 대치동 604서울특별시 강남구 남부순환로2933서울특별시 강남구 남부순환로 2933127.06102637.493922
1커피빈코리아선릉로93길점음식커피점/카페커피전문점/카페/다방서울특별시강남구역삼1동역삼동대지696서울특별시 강남구 역삼동 696-42서울특별시 강남구 선릉로93길6서울특별시 강남구 선릉로93길 6127.04788337.505675
2프로포즈음식유흥주점호프/맥주서울특별시금천구독산3동독산동대지162서울특별시 금천구 독산동 162-1서울특별시 금천구 가산로34서울특별시 금천구 가산로 34-6126.89922037.471711
#0번째 행의 상호명을 가져오기
df.loc[0, "상호명"]
'와라와라호프'
#0, 1, 2 번째 행의 "상호명" , "도로명주소"가져오기
df.loc[[0, 1, 2], ["상호명", "도로명주소"]]
상호명도로명주소
0와라와라호프서울특별시 강남구 남부순환로 2933
1커피빈코리아선릉로93길점서울특별시 강남구 선릉로93길 6
2프로포즈서울특별시 금천구 가산로 34-6
# 위에서 5개의 행과 왼쪽에서 5개의 열을 가져온다. iloc 슬라이싱

df.iloc[:5]
상호명상권업종대분류명상권업종중분류명상권업종소분류명시도명시군구명행정동명법정동명대지구분명지번본번지지번주소도로명건물본번지도로명주소경도위도
0와라와라호프음식유흥주점호프/맥주서울특별시강남구대치1동대치동대지604서울특별시 강남구 대치동 604서울특별시 강남구 남부순환로2933서울특별시 강남구 남부순환로 2933127.06102637.493922
1커피빈코리아선릉로93길점음식커피점/카페커피전문점/카페/다방서울특별시강남구역삼1동역삼동대지696서울특별시 강남구 역삼동 696-42서울특별시 강남구 선릉로93길6서울특별시 강남구 선릉로93길 6127.04788337.505675
2프로포즈음식유흥주점호프/맥주서울특별시금천구독산3동독산동대지162서울특별시 금천구 독산동 162-1서울특별시 금천구 가산로34서울특별시 금천구 가산로 34-6126.89922037.471711
3싱싱커피&토스트음식패스트푸드토스트전문부산광역시사상구괘법동괘법동대지578부산광역시 사상구 괘법동 578부산광역시 사상구 괘감로37부산광역시 사상구 괘감로 37128.98045535.159774
4가락사우나내스낵생활서비스대중목욕탕/휴게사우나/증기탕/온천서울특별시송파구석촌동석촌동대지256서울특별시 송파구 석촌동 256서울특별시 송파구 가락로71서울특별시 송파구 가락로 71127.10407137.500249
#끝에서 5개의 행과 , 오른쪽에서 5개의 열을 가져오기

df.iloc[-5:,-5:]
도로명건물본번지도로명주소경도위도
573675서울특별시 마포구 마포대로14길4서울특별시 마포구 마포대로14길 4126.95505937.548618
573676서울특별시 성동구 성수일로8길37서울특별시 성동구 성수일로8길 37127.05461537.545853
573677서울특별시 강남구 강남대로492서울특별시 강남구 강남대로 492127.02410237.506202
573678서울특별시 영등포구 국제금융로10서울특별시 영등포구 국제금융로 10126.92486337.525172
573679서울특별시 도봉구 도봉로114길22서울특별시 도봉구 도봉로114길 22-8127.03514537.647099

기술통계값 보기

# describe()  기술통계값을 볼 수 있다.
df.describe()
지번본번지건물본번지경도위도
count573680.000000573680.000000573680.000000573680.000000
mean469.281810153.912094127.59628736.854698
std484.778049276.9809350.9412621.081285
min1.0000000.000000126.76816935.006760
25%109.00000020.000000126.96831635.215422
50%335.00000050.000000127.04767237.511207
75%678.000000172.000000128.98693837.560362
max9999.0000003318.000000129.29224337.692398
df[["위도","경도"]].describe()
위도경도
count573680.000000573680.000000
mean36.854698127.596287
std1.0812850.941262
min35.006760126.768169
25%35.215422126.968316
50%37.511207127.047672
75%37.560362128.986938
max37.692398129.292243
# 결측치를 제외한 값의 갯수를 계산 
df["위도"].count()
573680
#평균 
df["위도"].max()
37.69239838166121
#최솟값
df["위도"].min()
35.0067597383124
#1 사분위 수(25%)
df["위도"].quantile(q=0.25)
35.21542173433561
# 중앙값 
df["위도"].median()
37.5112070048312
#평균 
df["위도"].mean()
36.85469787421801
# 분산
df["위도"].var()
1.1691762199811755
# 표준편차1
import numpy as np

np.sqrt(df["위도"].var())
1.0812845231395738
# 표준편차2

df["위도"].std()
1.0812845231395738

단변량 수치형 변수 시각화

# 위도의 distplot을 그린다. 

sns.distplot(df["위도"])
# bins로 막대그리프 갯수를 정할 수 있다.
<matplotlib.axes._subplots.AxesSubplot at 0x24d06547250>

png

# 경도의 distplot을 그린다. 
sns.distplot(df["경도"])
<matplotlib.axes._subplots.AxesSubplot at 0x24d06e602b0>

png

# 위도의 평균, 중앙값의 표현, color로 선의 색상을 linestyle로 점선으로 표시
plt.axvline(df["위도"].mean(), linestyle=":", color="r")
plt.axvline(df["위도"].median(), linestyle="--", color="b")
sns.distplot(df["위도"])
<matplotlib.axes._subplots.AxesSubplot at 0x24d06513eb0>

png

상관계수 구하기

# 각 변수의 상관계수 

corr = df.corr()
corr
지번본번지건물본번지경도위도
지번본번지1.0000000.0579870.182678-0.196658
건물본번지0.0579871.0000000.0002550.004606
경도0.1826780.0002551.000000-0.994711
위도-0.1966580.004606-0.9947111.000000
#위에서 구한 상관계수를 시각화
sns.heatmap(corr, annot=True, cmap="Blues" ) # annot=True 값도 표시 # Blues색으로 표현

<matplotlib.axes._subplots.AxesSubplot at 0x24d285bd3d0>

png

mask = np.triu(np.ones_like(corr, dtype=np.bool))
sns.heatmap(corr, annot=True, cmap="Blues", mask=mask)
<matplotlib.axes._subplots.AxesSubplot at 0x24d070f9d00>

png

산점도로 이변량 수치형 변수 표현

# scatterplot 으로 경도와 위도를 표현하며, 
# 데이터의 갯수가 많으면 오래 걸리기 때문에 1000 개의 샘플을 추출해서 그립니다.

sns.scatterplot(data=df.sample(1000), x="경도", y="위도") 
<matplotlib.axes._subplots.AxesSubplot at 0x24d076b5e20>

png

# 위 시각화에서 회귀선을 그리기
sns.regplot(data=df.sample(1000), x="경도", y="위도") 
<matplotlib.axes._subplots.AxesSubplot at 0x24d0779f160>

png

# 회귀선을 그리는 그래프의 서브플롯을 그리기


sns.lmplot(data=df.sample(1000), x="경도", y="위도", hue="시도명",col="시도명",truncate=False, fit_reg=True)
<seaborn.axisgrid.FacetGrid at 0x24d077aebb0>

png

object타입의 데이터 요약

# object 타입 문자열 데이터 요약
df.describe(include="object")
상호명상권업종대분류명상권업종중분류명상권업종소분류명시도명시군구명행정동명법정동명대지구분명지번주소도로명도로명주소
count573679573680573680573680573680573680573680573680573680573680573680573680
unique378758994709239629648219023718001190486
top점프셈교실음식한식한식/백반/한정식서울특별시강남구역삼1동역삼동대지부산광역시 부산진구 부전동 503-15서울특별시 서초구 신반포로부산광역시 부산진구 가야대로 772
freq22971855165972538133407376470801040012102572913105835431058
# 상권업종대분류명의 요약값 
df["상권업종대분류명"].describe()
count     573680
unique         9
top           음식
freq      185516
Name: 상권업종대분류명, dtype: object
#상권업종대분류명 의 unique값 
df["상권업종대분류명"].unique()
array(['음식', '생활서비스', '소매', '의료', '학문/교육', '관광/여가/오락', '부동산', '숙박', '스포츠'],
      dtype=object)
#상권업종대분류명 의 unique 개수
df["상권업종대분류명"].nunique()
9
df["상권업종대분류명"].mode() # mode 최빈값
0    음식
dtype: object
# 범주형 변수 의 빈도수
df["상권업종대분류명"].value_counts()
음식          185516
소매          179460
생활서비스        97789
학문/교육        42477
의료           25509
부동산          20918
관광/여가/오락     16377
숙박            5327
스포츠            307
Name: 상권업종대분류명, dtype: int64

인덱싱과 필터로 서브셋 만들기

# "상권업종대분류명" 이 "음식인 데이터만 가져오기
# df_food 라는 변수에 담아줍니다. 서브셋을 새로운 변수에 저장할 때 copy()를 사용하는 것을 권장

df_food = df[df["상권업종대분류명"] == "음식"].copy()
df_food.head()
상호명상권업종대분류명상권업종중분류명상권업종소분류명시도명시군구명행정동명법정동명대지구분명지번본번지지번주소도로명건물본번지도로명주소경도위도
0와라와라호프음식유흥주점호프/맥주서울특별시강남구대치1동대치동대지604서울특별시 강남구 대치동 604서울특별시 강남구 남부순환로2933서울특별시 강남구 남부순환로 2933127.06102637.493922
1커피빈코리아선릉로93길점음식커피점/카페커피전문점/카페/다방서울특별시강남구역삼1동역삼동대지696서울특별시 강남구 역삼동 696-42서울특별시 강남구 선릉로93길6서울특별시 강남구 선릉로93길 6127.04788337.505675
2프로포즈음식유흥주점호프/맥주서울특별시금천구독산3동독산동대지162서울특별시 금천구 독산동 162-1서울특별시 금천구 가산로34서울특별시 금천구 가산로 34-6126.89922037.471711
3싱싱커피&토스트음식패스트푸드토스트전문부산광역시사상구괘법동괘법동대지578부산광역시 사상구 괘법동 578부산광역시 사상구 괘감로37부산광역시 사상구 괘감로 37128.98045535.159774
5초밥왕음식일식/수산물음식점-초밥전문서울특별시송파구잠실6동신천동대지7서울특별시 송파구 신천동 7-28서울특별시 송파구 올림픽로293서울특별시 송파구 올림픽로 293-19127.10249037.515149

강남구의 상권업종대분류가 음식만 보기

df[df["시군구명"] == "강남구"].head()
상호명상권업종대분류명상권업종중분류명상권업종소분류명시도명시군구명행정동명법정동명대지구분명지번본번지지번주소도로명건물본번지도로명주소경도위도
0와라와라호프음식유흥주점호프/맥주서울특별시강남구대치1동대치동대지604서울특별시 강남구 대치동 604서울특별시 강남구 남부순환로2933서울특별시 강남구 남부순환로 2933127.06102637.493922
1커피빈코리아선릉로93길점음식커피점/카페커피전문점/카페/다방서울특별시강남구역삼1동역삼동대지696서울특별시 강남구 역삼동 696-42서울특별시 강남구 선릉로93길6서울특별시 강남구 선릉로93길 6127.04788337.505675
26쉼터음식분식라면김밥분식서울특별시강남구삼성1동삼성동대지159서울특별시 강남구 삼성동 159서울특별시 강남구 봉은사로524서울특별시 강남구 봉은사로 524127.05710037.512939
27배제현의웰빙낙지한마리수제비음식일식/수산물낙지/오징어서울특별시강남구신사동신사동대지512서울특별시 강남구 신사동 512-13서울특별시 강남구 강남대로152길19서울특별시 강남구 강남대로152길 19127.02094537.517574
38타워광명내과의원의료병원내과/외과서울특별시강남구도곡2동도곡동대지467서울특별시 강남구 도곡동 467-14서울특별시 강남구 언주로30길39서울특별시 강남구 언주로30길 39127.05319837.488742
# 시군구명이 강남구, 사우건업종대분류명이 음식인것
# 상권업종중분류명 별로 빈도수를  구하기
df[(df["시군구명"] == "강남구") &
   (df["상권업종대분류명"] == "음식")]["상권업종중분류명"].value_counts()
한식         4371
커피점/카페     2790
유흥주점       1573
양식         1573
일식/수산물     1255
분식         1197
패스트푸드       786
제과제빵떡케익     650
닭/오리요리      539
중식          358
별식/퓨전요리     341
부페           63
기타음식업        47
음식배달서비스      11
Name: 상권업종중분류명, dtype: int64
# 위와 똑같이 구하고 loc 이용하기

df.loc[(df["시군구명"] == "강남구") &
   (df["상권업종대분류명"] == "음식"), "상권업종중분류명"].value_counts()
한식         4371
커피점/카페     2790
유흥주점       1573
양식         1573
일식/수산물     1255
분식         1197
패스트푸드       786
제과제빵떡케익     650
닭/오리요리      539
중식          358
별식/퓨전요리     341
부페           63
기타음식업        47
음식배달서비스      11
Name: 상권업종중분류명, dtype: int64

구별 음식점 업종 비교하기

# df_seoul_food 에 "시도명"이 "서울특별시" 이고 "상권업종대분류명" 이 "음식" 에 대한 서브셋만 가져오기

df_seoul_food = df[(df["시도명"] == "서울특별시") & (df["상권업종대분류명"] == "음식")].copy()
df_seoul_food.shape
(132889, 16)
# "시군구명", "상권업종중분류명" 으로 그룹화 
# 결과를 food_gu 에 담아 재사용할 예정

food_gu = df_seoul_food.groupby(["시군구명", "상권업종중분류명"])["상호명"].count()
food_gu.head()
시군구명  상권업종중분류명
강남구   기타음식업         47
      닭/오리요리       539
      별식/퓨전요리      341
      부페            63
      분식          1197
Name: 상호명, dtype: int64
# food_gu 에 담긴 데이터로 시각화
# 상권업종 중분류명과 상점수로 barplot 그리기

food_gu.unstack().plot.bar()
#unstack으로 피벗테이블로 바꾼다
<matplotlib.axes._subplots.AxesSubplot at 0x24d0cf03c10>

png

food_gu.unstack().iloc[:5, :5]
상권업종중분류명기타음식업닭/오리요리별식/퓨전요리부페분식
시군구명
강남구47.0539.0341.063.01197.0
강동구4.0318.0138.024.0509.0
강북구2.0208.097.06.0329.0
강서구16.0323.0145.021.0531.0
관악구11.0324.0118.011.0461.0
food = food_gu.reset_index()
food = food.rename(columns={"상호명":"상호수"})
food.head()
시군구명상권업종중분류명상호수
0강남구기타음식업47
1강남구닭/오리요리539
2강남구별식/퓨전요리341
3강남구부페63
4강남구분식1197
plt.figure(figsize=(15,4))
sns.barplot(data=food, x="시군구명", y="상호수")
# 검은색은 신뢰구간
<matplotlib.axes._subplots.AxesSubplot at 0x24d070571c0>

png

# catplot으로 사용하여 서브프롯을 그리기
sns.catplot(data=food, x="시군구명", y="상호수", 
            kind="bar", col="상권업종중분류명", col_wrap=4)
<seaborn.axisgrid.FacetGrid at 0x24d0d999310>

png

구별 학원수 비교

df["상권업종대분류명"].unique()
# 학문/교육
array(['음식', '생활서비스', '소매', '의료', '학문/교육', '관광/여가/오락', '부동산', '숙박', '스포츠'],
      dtype=object)
# 시도명이 서울특별시이고, 상권업종대분류명이 학문/교육인 데이터 셋
df_academy = df[(df["시도명"] == "서울특별시") & (df["상권업종대분류명"] == "학문/교육")].copy()
df_academy
상호명상권업종대분류명상권업종중분류명상권업종소분류명시도명시군구명행정동명법정동명대지구분명지번본번지지번주소도로명건물본번지도로명주소경도위도
85GIA보석교육원학문/교육학원-자격/국가고시학원-보석감정서울특별시강남구압구정동신사동대지639서울특별시 강남구 신사동 639-3서울특별시 강남구 압구정로320서울특별시 강남구 압구정로 320127.03643737.528532
101안재형영어학문/교육학원-어학학원-외국어/어학서울특별시양천구목5동목동대지905서울특별시 양천구 목동 905-34서울특별시 양천구 목동서로133서울특별시 양천구 목동서로 133-2126.87597337.531592
121정아트학문/교육학원-음악미술무용서예/서화/미술서울특별시강서구염창동염창동대지184서울특별시 강서구 염창동 184-8서울특별시 강서구 양천로73가길21서울특별시 강서구 양천로73가길 21126.87364537.550924
126경찰태권도학문/교육학원-예능취미체육태권도장서울특별시성북구길음1동길음동대지1283서울특별시 성북구 길음동 1283-4서울특별시 성북구 길음로20서울특별시 성북구 길음로 20127.02302037.604749
134아트인스튜디오학문/교육학원-음악미술무용서예/서화/미술서울특별시강남구역삼1동역삼동대지818서울특별시 강남구 역삼동 818-1서울특별시 강남구 강남대로96길12서울특별시 강남구 강남대로96길 12127.02805437.499729
...................................................
573529쌤통수학교습소학문/교육학원-보습교습입시학원-입시서울특별시서대문구홍제2동홍제동대지106서울특별시 서대문구 홍제동 106서울특별시 서대문구 통일로34길24서울특별시 서대문구 통일로34길 24126.94938937.585709
573654골든벨독서실학문/교육도서관/독서실독서실서울특별시양천구신월2동신월동대지447서울특별시 양천구 신월동 447-5서울특별시 양천구 월정로56서울특별시 양천구 월정로 56126.84170637.524719
573656에이디링크연구소학문/교육학원기타학원(종합)서울특별시송파구가락본동가락동대지76서울특별시 송파구 가락동 76서울특별시 송파구 양재대로62길47서울특별시 송파구 양재대로62길 47127.12075737.495986
573661도무스링구아학문/교육학원-보습교습입시학원-입시서울특별시서초구양재1동우면동대지721서울특별시 서초구 우면동 721-1서울특별시 서초구 태봉로70서울특별시 서초구 태봉로 70127.02557137.464531
573662아소비학문/교육학원-보습교습입시학원-입시서울특별시구로구고척1동고척동대지327서울특별시 구로구 고척동 327서울특별시 구로구 중앙로6길17서울특별시 구로구 중앙로6길 17126.86560137.500695

31509 rows × 16 columns

#df_academy 에서 상호명으로 빈도수 구하기
df_academy["상호명"].value_counts().head(10)
점프셈교실      1659
해법수학         57
윤선생영어교실      34
뮤엠영어         27
해법영어교실       24
눈높이          22
해동검도         22
삼성영어         21
구몬학습         20
경희대태권도       19
Name: 상호명, dtype: int64
#"시군구명"으로 빈도수 구하기
df_academy["시군구명"].value_counts()
강남구     4005
서초구     2103
양천구     1881
광진구     1848
송파구     1797
강동구     1585
노원구     1582
강서구     1498
은평구     1333
관악구     1313
성북구     1246
구로구     1140
동대문구    1051
동작구     1050
마포구     1007
영등포구     984
도봉구      931
중랑구      884
서대문구     773
성동구      742
금천구      701
종로구      638
강북구      513
용산구      491
중구       413
Name: 시군구명, dtype: int64
# 상권업종소분류명 으로 빈도수를 구하고 위에서 30개만 보기
academy_count = df_academy["상권업종소분류명"].value_counts().head(30)
academy_count
학원-입시          7509
학원(종합)         4561
어린이집           4395
학원-외국어/어학      3544
피아노/바이올린/기타    2868
서예/서화/미술       1595
독서실            1096
고시원            1062
학원-기타           677
태권도장            610
학습지보급           430
학원-어린이영어        319
컴퓨터학원           270
학원-스포츠/재즈댄스     269
학원-무용           220
놀이방             139
학원-주산암산부기속셈     122
유아교육기관기타        107
학원-미용           106
학원-배우/탤런트       102
합기도장             96
검도도장             95
실내놀이터-유아         84
학원-요리            78
학원-간호조무사         76
학원/국가고시          70
학원-사교춤           54
유도장              49
학원-심리변론          46
학원-국악            45
Name: 상권업종소분류명, dtype: int64
# 상권업종소분류명으로 빈도수를 구하고
# 빈도수가 1000개 이상인 데이터 보기

academy_count_1000 = academy_count[academy_count > 1000]
academy_count_1000
학원-입시          7509
학원(종합)         4561
어린이집           4395
학원-외국어/어학      3544
피아노/바이올린/기타    2868
서예/서화/미술       1595
독서실            1096
고시원            1062
Name: 상권업종소분류명, dtype: int64
# "시군구명", "상권업종소분류명" 으로 그룹화를 하고 "상호명"으로 빈도수를 계산

g_academy = df_academy.groupby(["시군구명", "상권업종소분류명"])["상호명"].count()
g_academy = g_academy.reset_index()
g_academy.columns = ["시군구명", "상권업종소분류명", "상호수"]
g_academy.head()
시군구명상권업종소분류명상호수
0강남구검도도장9
1강남구고시원139
2강남구놀이방8
3강남구독서실125
4강남구서예/서화/미술219

seaborn으로 시각화 하기

# 위에서 구한 결과를 시군구명, 상호수로 barplot을 그림

plt.figure(figsize=(15, 4))
sns.barplot(data=g_academy, x="시군구명", y="상호수")
# ci=None으로 신뢰구간 없애기 가능
<matplotlib.axes._subplots.AxesSubplot at 0x24d0d9d3040>

png

isin을 사용해서 서브셋 만들기

academy_count_1000.index
Index(['학원-입시', '학원(종합)', '어린이집', '학원-외국어/어학', '피아노/바이올린/기타', '서예/서화/미술',
       '독서실', '고시원'],
      dtype='object')
# isin 으로 빈도수로 계산했을 때 1000개 이상인 데이터만 가져와서 봅니다.
# 서브셋을 df_academy_selected 에 저장합니다.

print(df_academy.shape)
df_academy_selected = df_academy[
    df_academy["상권업종소분류명"].isin(academy_count_1000.index)].copy()
df_academy_selected.shape
(31509, 16)





(26630, 16)
df_academy_selected["상권업종소분류명"].value_counts()
학원-입시          7509
학원(종합)         4561
어린이집           4395
학원-외국어/어학      3544
피아노/바이올린/기타    2868
서예/서화/미술       1595
독서실            1096
고시원            1062
Name: 상권업종소분류명, dtype: int64
# df_academy_selected 의 "시군구명"으로 빈도수를 셉니다.

df_academy_selected["시군구명"].value_counts()
강남구     3410
서초구     1732
양천구     1706
광진구     1536
송파구     1484
노원구     1425
강서구     1288
강동구     1255
은평구     1162
관악구     1115
성북구     1066
구로구      987
동작구      877
동대문구     863
마포구      857
도봉구      849
영등포구     775
중랑구      745
서대문구     656
성동구      642
금천구      568
종로구      479
강북구      444
용산구      395
중구       314
Name: 시군구명, dtype: int64
df_academy_selected.loc[
    df_academy_selected["법정동명"] == "목동", 
    "상권업종소분류명"].value_counts()
학원-입시          375
학원-외국어/어학      152
학원(종합)          88
어린이집            61
피아노/바이올린/기타     41
서예/서화/미술        39
독서실             22
고시원              7
Name: 상권업종소분류명, dtype: int64
df_academy_selected.loc[
    df_academy_selected["법정동명"] == "대치동", 
    "상권업종소분류명"].value_counts()
학원-입시          831
학원-외국어/어학      281
학원(종합)         211
서예/서화/미술       113
피아노/바이올린/기타     60
독서실             42
고시원             30
어린이집            16
Name: 상권업종소분류명, dtype: int64
# df_academy_selected 로 위에서 했던 그룹화를 복습
# "상권업종소분류명", "시군구명" 으로 그룹화를 하고 "상호명"으로 빈도수를 계산
# g 라는 변수에 담아 재사용 할 예정
g = df_academy_selected.groupby(["상권업종소분류명", "시군구명"])["상호명"].count()
g
상권업종소분류명  시군구명
고시원       강남구     139
          강동구      62
          강북구      11
          강서구      32
          관악구      83
                 ... 
학원-입시     용산구      70
          은평구     337
          종로구      75
          중구       59
          중랑구     172
Name: 상호명, Length: 200, dtype: int64

Pandas 의 plot 으로 시각화

# 상권업종소분류명이 index
# loc를 통해 index 값을 가져올 수 있다.
# 그룹화된 결과 중 "학원-입시" 데이터
g.loc["학원-입시"].sort_values().plot.barh(figsize=(10, 7))
<matplotlib.axes._subplots.AxesSubplot at 0x24d12a1d910>

png

# 그룹화된 데이터를 시각화 하게 되면 멀티인덱스 값으로 표현이 되어 보기가 어렵습니다.
# 다음 셀부터 이 그래프를 개선해 봐요!

g.plot.bar()
<matplotlib.axes._subplots.AxesSubplot at 0x24d12ae4c70>

png

#g.unstack()
g.unstack().iloc[:5,:5]

시군구명강남구강동구강북구강서구관악구
상권업종소분류명
고시원13962113283
독서실12546146069
서예/서화/미술219110197072
어린이집189210112262220
피아노/바이올린/기타26618947150139
# 행과 열을 바꾸기 
g.unstack().T.iloc[:5,:5]
상권업종소분류명고시원독서실서예/서화/미술어린이집피아노/바이올린/기타
시군구명
강남구139125219189266
강동구6246110210189
강북구11141911247
강서구326070262150
관악구836972220139
# 그룹화된 결과에 unstack 을 사용하면 마지막 인덱스 컬럼이 컬럼으로 바꿈
g.unstack().plot.barh(figsize=(8,9))
<matplotlib.axes._subplots.AxesSubplot at 0x24d13123f70>

png

# T는 transpose이다.
g.unstack().T.plot.bar(figsize=(15, 5))
<matplotlib.axes._subplots.AxesSubplot at 0x24d17ebaeb0>

png

# 그룹화한 값의 인덱스
g.index
MultiIndex([(  '고시원',  '강남구'),
            (  '고시원',  '강동구'),
            (  '고시원',  '강북구'),
            (  '고시원',  '강서구'),
            (  '고시원',  '관악구'),
            (  '고시원',  '광진구'),
            (  '고시원',  '구로구'),
            (  '고시원',  '금천구'),
            (  '고시원',  '노원구'),
            (  '고시원',  '도봉구'),
            ...
            ('학원-입시',  '성동구'),
            ('학원-입시',  '성북구'),
            ('학원-입시',  '송파구'),
            ('학원-입시',  '양천구'),
            ('학원-입시', '영등포구'),
            ('학원-입시',  '용산구'),
            ('학원-입시',  '은평구'),
            ('학원-입시',  '종로구'),
            ('학원-입시',   '중구'),
            ('학원-입시',  '중랑구')],
           names=['상권업종소분류명', '시군구명'], length=200)
# 멀티인덱스 보기쉽게
t = g.reset_index()
t = t.rename(columns={"상호명":"상호수"})
t
상권업종소분류명시군구명상호수
0고시원강남구139
1고시원강동구62
2고시원강북구11
3고시원강서구32
4고시원관악구83
............
195학원-입시용산구70
196학원-입시은평구337
197학원-입시종로구75
198학원-입시중구59
199학원-입시중랑구172

200 rows × 3 columns

같은 그래프를 seaborn으로 그리기

# 상권업종소분류명으로 색상을 다르게 표현
plt.figure(figsize=(15,4))
sns.barplot(data=t, x="시군구명", y="상호수",ci=None)
<matplotlib.axes._subplots.AxesSubplot at 0x24d178aeee0>

png

# 시군구명 색상을 다르게 표현
plt.figure(figsize=(15,4))
sns.barplot(data=t, x="상권업종소분류명", y="상호수",ci=None)
<matplotlib.axes._subplots.AxesSubplot at 0x24d17bbbbb0>

png

# 상권업종소분류명이 학원-입시인 서브셋만 가져와서 시각화
academy_sub = t[t["상권업종소분류명"] == "학원-입시"].copy()
print(academy_sub.shape)
plt.figure(figsize=(15,4))
sns.barplot(data=academy_sub, x="시군구명", y="상호수")
(25, 3)





<matplotlib.axes._subplots.AxesSubplot at 0x24d17b0a160>

png

# catplot을 통해 그리기
sns.catplot(data =t, x="상권업종소분류명", y="상호수", kind="bar", col="시군구명", 
           col_wrap=4, sharex=False)
<seaborn.axisgrid.FacetGrid at 0x24d17d17760>

png

경도와 위도를 scatterplot으로 표현

#scatterplot으로 경도 위도 표현, 시군구명으로 색상을 다르게
plt.figure(figsize=(10, 7))
sns.scatterplot(data=df_academy_selected, x="경도", y="위도", hue="시군구명")
<matplotlib.axes._subplots.AxesSubplot at 0x24d2081ec40>

png

# 상권업종소분류명으로 색상을 다르게
plt.figure(figsize=(10, 7))
sns.scatterplot(data=df_academy_selected, x="경도", y="위도", hue="상권업종소분류명")
<matplotlib.axes._subplots.AxesSubplot at 0x24d24596c40>

png

# 상권업종소분류명이 학원-입시인 데이터만 그리기
plt.figure(figsize=(10, 7))
sns.scatterplot(
    data=df_academy_selected[df_academy_selected["상권업종소분류명"] == "학원-입시"], 
                x="경도", y="위도", hue="상권업종소분류명")
<matplotlib.axes._subplots.AxesSubplot at 0x24d24fd41f0>

png

# 상권업종소분류명이 어린이집인 데이터만 그리기
plt.figure(figsize=(10, 7))
sns.scatterplot(
    data=df_academy_selected[df_academy_selected["상권업종소분류명"] == "어린이집"], 
                x="경도", y="위도", hue="상권업종소분류명")
<matplotlib.axes._subplots.AxesSubplot at 0x24d17a65760>

png

# 상권업종소분류명이 어린이집과 학원-입시인것만 보기
plt.figure(figsize=(10, 7))
sns.scatterplot(
    data=df_academy_selected[df_academy_selected["상권업종소분류명"].isin(["어린이집","학원-입시"])], 
                x="경도", y="위도", hue="상권업종소분류명")
<matplotlib.axes._subplots.AxesSubplot at 0x24d24fc4940>

png

folium 으로 지도에 자세히 표현하기

# 학원-입시에 대한 상호 데이터를 지도에 시각화
import folium
long = df_academy_selected["경도"].mean()
lat = df_academy_selected["위도"].mean()
df_m = df_academy_selected[
        df_academy_selected["상권업종소분류명"].isin(["어린이집", "학원-입시"])]
df_m = df_m.sample(1000) # 10000개중에 천개만 뽑기
df_m.shape
(1000, 16)
m = folium.Map(location=[lat, long], zoom_start=12)

folium.Marker([37.5545, 126.867], tooltip="해법수학").add_to(m)

m
m.save('index.html')
df_m.index
Int64Index([215750, 547772, 206446,   2764, 294827, 344741, 254574,  23980,
            492177, 542639,
            ...
             29611, 504010, 504878, 195984, 183872, 100263, 341046, 488051,
            343393, 340195],
           dtype='int64', length=1000)
for i in df_m.index[:10]:
    tooltip = df_m.loc[i, "상호명"] +"-"+ df_m.loc[i, "도로명주소"]
    lat = df_m.loc[i, "위도"]
    long = df_m.loc[i, "경도"]
    
    print(tooltip, lat, long)
이앤씨중국어학원-서울특별시 양천구 중앙로32길 61 37.52007048583621 126.860285482948
김동하국어논술-서울특별시 송파구 위례성대로20길 28 37.508990067945795 127.127085790274
트리니타스학원-서울특별시 강남구 삼성로 38 37.4886790644454 127.066824789888
분석수학-서울특별시 강서구 강서로 289 37.551594718354295 126.83596025326901
일공교육그룹-서울특별시 서초구 서초대로46길 19-18 37.49163218142171 127.011151105667
튼튼어린이집-서울특별시 은평구 갈현로31길 14-9 37.62056046519629 126.914530631335
해법영수학원-서울특별시 노원구 노원로28길 9 37.6530158859823 127.06845526207199
배화여자대학사직어린이집-서울특별시 종로구 필운대로1길 16-8 37.57810285378061 126.96868574886601
예랑어린이집-서울특별시 강동구 고덕로 210 37.553126080293204 127.14836913597601
개인과외-서울특별시 도봉구 해등로 113 37.6535161376325 127.039822243456
m = folium.Map(location=[lat, long], zoom_start=12, 
    tiles='Stamen Toner')
#Stamen Toner 스타일 바꿈

for i in df_m.index[:100]:
    tooltip = df_m.loc[i, "상호명"] +"-"+ df_m.loc[i, "도로명주소"]
    lat = df_m.loc[i, "위도"]
    long = df_m.loc[i, "경도"]
    
    folium.CircleMarker([lat, long], tooltip=tooltip, radius=3).add_to(m)
    #radius=3 마커크기 줄이기

m








© 2021.01. by 윤영재

Powered by 윤영재