{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "1WqwrHkQU30G" }, "source": [ "## 1 환경설정" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 17 }, "id": "gsty_JknJLEw", "outputId": "443c4d4e-cbda-44e4-c18d-d278439db457" }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.core.display import display, HTML\n", "display(HTML(\"\"))\n", "%matplotlib inline\n", "\n", "import pandas as pd\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import numpy as np\n", "from scipy import stats\n", "import warnings\n", "import folium\n", "import folium.plugins\n", "import requests\n", "import json\n", "import folium.plugins\n", "from IPython.display import Image\n", "warnings.filterwarnings('ignore')\n", "\n", "mpl.rcParams['figure.figsize'] = (12,8) #시각화 figure default 설정\n", "mpl.rcParams['font.family'] = 'NanumGothic' #폰트 디폴트 설정\n", "mpl.rcParams['font.size'] = 10 #폰트 사이즈 디폴트 설정\n", "plt.rcParams['axes.unicode_minus'] = False\n", "%config InlineBackend.figure_format='retina' # 그래프 글씨 뚜렷\n", "pd.options.display.float_format = '{:.3f}'.format # 넘파이 과학적 표기 제거" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# 부산 행정구역 json raw파일(githubcontent)\n", "r = requests.get('https://raw.githubusercontent.com/raqoon886/Local_HangJeongDong/master/hangjeongdong_%EB%B6%80%EC%82%B0%EA%B4%91%EC%97%AD%EC%8B%9C.geojson')\n", "c = r.content\n", "busan_geo = json.loads(c)" ] }, { "cell_type": "markdown", "metadata": { "id": "gCQwz0sASSzM" }, "source": [ "## 2 전처리 작업" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1 데이터 전처리 후 결합\n", "- (지역구)_요일_시간대별 방문자 집중율 * (지역구)_방문자 수\n", "- 각 지역구별 시간대별 방문자 수 추산하여 하나의 데이터프레임으로 결합" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "['강서구_방문자 수.csv',\n", " '강서구_요일_시간대 별 방문자 집중율.csv',\n", " '금정구_방문자 수.csv',\n", " '금정구_요일_시간대 별 방문자 집중율.csv',\n", " '기장군_방문자 수.csv',\n", " '기장군_요일_시간대 별 방문자 집중율.csv',\n", " '남구_방문자 수.csv',\n", " '남구_요일_시간대 별 방문자 집중율.csv',\n", " '동구_방문자 수.csv',\n", " '동구_시간대 별 방문자 집중율.csv',\n", " '동래구_방문자 수.csv',\n", " '동래구_요일_시간대 별 방문자 집중율.csv',\n", " '부산진구_방문자 수.csv',\n", " '부산진구_요일_시간대 별 방문자 집중율.csv',\n", " '북구_방문자 수.csv',\n", " '북구_요일_시간대 별 방문자 집중율.csv',\n", " '사상구_방문자 수.csv',\n", " '사상구_요일_시간대 별 방문자 집중율.csv',\n", " '사하구_방문자 수.csv',\n", " '사하구_요일_시간대 별 방문자 집중율.csv',\n", " '서구_방문자 수.csv',\n", " '서구_요일_시간대 별 방문자 집중율.csv',\n", " '수영구_방문자 수.csv',\n", " '수영구_요일_시간대 별 방문자 집중율.csv',\n", " '연제구_방문자 수.csv',\n", " '연제구_요일_시간대 별 방문자 집중율.csv',\n", " '영도구_방문자 수.csv',\n", " '영도구_요일_시간대 별 방문자 집중율.csv',\n", " '중구_방문자 수.csv',\n", " '중구_요일_시간대 별 방문자 집중율.csv',\n", " '해운대구_방문자 수.csv',\n", " '해운대구_요일_시간대 별 방문자 집중율.csv']" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import os\n", "\n", "path = \"./\"\n", "file_list = os.listdir(path)\n", "csv_list = [file for file in file_list if file.endswith(\".csv\")]\n", "csv_list" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "visitor_csv = [csv for csv in csv_list if csv.split(\".\")[0].endswith(\"수\")]\n", "time_csv = [csv for csv in csv_list if csv not in visitor_csv]\n", "gu_list = [csv.split(\"_\")[0] for csv in time_csv]" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "16 16\n", "['강서구', '금정구', '기장군', '남구', '동구', '동래구', '부산진구', '북구', '사상구', '사하구', '서구', '수영구', '연제구', '영도구', '중구', '해운대구']\n" ] } ], "source": [ "print(len(visitor_csv), len(time_csv))\n", "print(gu_list)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
요일방문 시간대방문자 집중률
0일요일00~06시2.400
1일요일06~11시2.600
2일요일11~14시2.600
3일요일14~18시3.300
4일요일18~21시1.900
5일요일21~24시1.200
6월요일00~06시1.700
7월요일06~11시2.700
8월요일11~14시2.300
9월요일14~18시3.100
10월요일18~21시1.900
11월요일21~24시1.200
12화요일00~06시1.600
13화요일06~11시2.700
14화요일11~14시2.400
15화요일14~18시3.200
16화요일18~21시2.000
17화요일21~24시1.300
18수요일00~06시1.600
19수요일06~11시2.700
20수요일11~14시2.400
21수요일14~18시3.200
22수요일18~21시2.100
23수요일21~24시1.400
24목요일00~06시1.600
25목요일06~11시2.700
26목요일11~14시2.300
27목요일14~18시3.100
28목요일18~21시2.100
29목요일21~24시1.400
30금요일00~06시1.700
31금요일06~11시2.900
32금요일11~14시2.500
33금요일14~18시3.400
34금요일18~21시2.400
35금요일21~24시1.800
36토요일00~06시2.400
37토요일06~11시3.100
38토요일11~14시3.300
39토요일14~18시4.500
40토요일18~21시3.200
41토요일21~24시2.200
\n", "
" ], "text/plain": [ " 요일 방문 시간대 방문자 집중률\n", "0 일요일 00~06시 2.400\n", "1 일요일 06~11시 2.600\n", "2 일요일 11~14시 2.600\n", "3 일요일 14~18시 3.300\n", "4 일요일 18~21시 1.900\n", "5 일요일 21~24시 1.200\n", "6 월요일 00~06시 1.700\n", "7 월요일 06~11시 2.700\n", "8 월요일 11~14시 2.300\n", "9 월요일 14~18시 3.100\n", "10 월요일 18~21시 1.900\n", "11 월요일 21~24시 1.200\n", "12 화요일 00~06시 1.600\n", "13 화요일 06~11시 2.700\n", "14 화요일 11~14시 2.400\n", "15 화요일 14~18시 3.200\n", "16 화요일 18~21시 2.000\n", "17 화요일 21~24시 1.300\n", "18 수요일 00~06시 1.600\n", "19 수요일 06~11시 2.700\n", "20 수요일 11~14시 2.400\n", "21 수요일 14~18시 3.200\n", "22 수요일 18~21시 2.100\n", "23 수요일 21~24시 1.400\n", "24 목요일 00~06시 1.600\n", "25 목요일 06~11시 2.700\n", "26 목요일 11~14시 2.300\n", "27 목요일 14~18시 3.100\n", "28 목요일 18~21시 2.100\n", "29 목요일 21~24시 1.400\n", "30 금요일 00~06시 1.700\n", "31 금요일 06~11시 2.900\n", "32 금요일 11~14시 2.500\n", "33 금요일 14~18시 3.400\n", "34 금요일 18~21시 2.400\n", "35 금요일 21~24시 1.800\n", "36 토요일 00~06시 2.400\n", "37 토요일 06~11시 3.100\n", "38 토요일 11~14시 3.300\n", "39 토요일 14~18시 4.500\n", "40 토요일 18~21시 3.200\n", "41 토요일 21~24시 2.200" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_csv(\"연제구_요일_시간대 별 방문자 집중율.csv\", encoding = \"cp949\")" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
기준연월방문자수지역구
02022012836937.000강서구
12022022498954.000강서구
22022032863433.000강서구
32022043318821.000강서구
42022053277041.000강서구
............
72022086428823.000해운대구
82022095351563.000해운대구
92022105799430.000해운대구
102022115255393.000해운대구
112022125797922.000해운대구
\n", "

192 rows × 3 columns

\n", "
" ], "text/plain": [ " 기준연월 방문자수 지역구\n", "0 202201 2836937.000 강서구\n", "1 202202 2498954.000 강서구\n", "2 202203 2863433.000 강서구\n", "3 202204 3318821.000 강서구\n", "4 202205 3277041.000 강서구\n", ".. ... ... ...\n", "7 202208 6428823.000 해운대구\n", "8 202209 5351563.000 해운대구\n", "9 202210 5799430.000 해운대구\n", "10 202211 5255393.000 해운대구\n", "11 202212 5797922.000 해운대구\n", "\n", "[192 rows x 3 columns]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_visitor = pd.DataFrame()\n", "\n", "for gu, csv in zip(gu_list, visitor_csv):\n", " df = pd.read_csv(csv, encoding = \"cp949\")\n", " df[\"지역구\"] = gu\n", " df_visitor = df_visitor.append(df)\n", "\n", "df_visitor" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
요일방문 시간대방문자 집중률지역구
0일요일00~06시1.300강서구
1일요일06~11시3.100강서구
2일요일11~14시3.400강서구
3일요일14~18시4.600강서구
4일요일18~21시2.200강서구
...............
37토요일06~11시3.200해운대구
38토요일11~14시3.400해운대구
39토요일14~18시5.200해운대구
40토요일18~21시3.200해운대구
41토요일21~24시2.200해운대구
\n", "

672 rows × 4 columns

\n", "
" ], "text/plain": [ " 요일 방문 시간대 방문자 집중률 지역구\n", "0 일요일 00~06시 1.300 강서구\n", "1 일요일 06~11시 3.100 강서구\n", "2 일요일 11~14시 3.400 강서구\n", "3 일요일 14~18시 4.600 강서구\n", "4 일요일 18~21시 2.200 강서구\n", ".. ... ... ... ...\n", "37 토요일 06~11시 3.200 해운대구\n", "38 토요일 11~14시 3.400 해운대구\n", "39 토요일 14~18시 5.200 해운대구\n", "40 토요일 18~21시 3.200 해운대구\n", "41 토요일 21~24시 2.200 해운대구\n", "\n", "[672 rows x 4 columns]" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_time = pd.DataFrame()\n", "\n", "for gu, csv in zip(gu_list, time_csv):\n", " df = pd.read_csv(csv, encoding = \"cp949\")\n", " df[\"지역구\"] = gu\n", " df_time = df_time.append(df)\n", "\n", "df_time " ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "df_202212 = df_visitor.loc[df_visitor[\"기준연월\"] == 202212, [\"지역구\", \"방문자수\"]].reset_index(drop = True)" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [], "source": [ "df_time[\"방문자 집중률\"] = df_time[\"방문자 집중률\"] / 100" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "df_visitor_time = df_time.join(df_202212.set_index(\"지역구\"), on = \"지역구\")" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "df_visitor_time[\"시간별방문자수\"] = df_visitor_time[\"방문자 집중률\"] * df_visitor_time[\"방문자수\"]" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [], "source": [ "df_visitor_time.to_csv(\"부산시_지역별_시간대별_방문자수.csv\")" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
요일방문 시간대방문자 집중률지역구방문자수시간별방문자수
0일요일00~06시0.013강서구3079993.00040039.909
1일요일06~11시0.031강서구3079993.00095479.783
2일요일11~14시0.034강서구3079993.000104719.762
3일요일14~18시0.046강서구3079993.000141679.678
4일요일18~21시0.022강서구3079993.00067759.846
.....................
37토요일06~11시0.032해운대구5797922.000185533.504
38토요일11~14시0.034해운대구5797922.000197129.348
39토요일14~18시0.052해운대구5797922.000301491.944
40토요일18~21시0.032해운대구5797922.000185533.504
41토요일21~24시0.022해운대구5797922.000127554.284
\n", "

672 rows × 6 columns

\n", "
" ], "text/plain": [ " 요일 방문 시간대 방문자 집중률 지역구 방문자수 시간별방문자수\n", "0 일요일 00~06시 0.013 강서구 3079993.000 40039.909\n", "1 일요일 06~11시 0.031 강서구 3079993.000 95479.783\n", "2 일요일 11~14시 0.034 강서구 3079993.000 104719.762\n", "3 일요일 14~18시 0.046 강서구 3079993.000 141679.678\n", "4 일요일 18~21시 0.022 강서구 3079993.000 67759.846\n", ".. ... ... ... ... ... ...\n", "37 토요일 06~11시 0.032 해운대구 5797922.000 185533.504\n", "38 토요일 11~14시 0.034 해운대구 5797922.000 197129.348\n", "39 토요일 14~18시 0.052 해운대구 5797922.000 301491.944\n", "40 토요일 18~21시 0.032 해운대구 5797922.000 185533.504\n", "41 토요일 21~24시 0.022 해운대구 5797922.000 127554.284\n", "\n", "[672 rows x 6 columns]" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_visitor_time" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "scrolled": true }, "outputs": [], "source": [ "df_example = df_visitor_time.groupby(\"지역구\").mean().reset_index()" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "scrolled": false }, "outputs": [], "source": [ "# busan_geo" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ "" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = folium.Map(\n", " location=[35.137922, 129.055628],\n", " zoom_start=11, \n", " tiles='OpenStreetMap',\n", " zoom_control = True\n", ")\n", "\n", "folium.GeoJson(\n", " busan_geo,\n", " name='지역명',\n", ").add_to(m)\n", "\n", "folium.Choropleth(\n", " geo_data= busan_geo,\n", " data=df_example,\n", " columns = [\"지역구\", \"시간별방문자수\"],\n", " fill_color='RdBu_r',\n", " line_color=\"Black\", \n", " fill_opacity=0.8,\n", " line_opacity=1.0,\n", " bins = 10, \n", " key_on='properties.sggnm',\n", " legend_name='지역별 방문자수').add_to(m) \n", "\n", "m" ] } ], "metadata": { "colab": { "provenance": [], "toc_visible": true }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "165px" }, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 1 }