minju0730 commited on
Commit
1da62ce
·
verified ·
1 Parent(s): 9e58634

Upload 12 files

Browse files
Files changed (13) hide show
  1. .gitattributes +2 -0
  2. app.py +243 -0
  3. bokeh_plot.html +52 -0
  4. folium_map.html +0 -0
  5. graph.jpeg +0 -0
  6. month_graph.png +0 -0
  7. photo1.jpeg +3 -0
  8. photo2.jpeg +3 -0
  9. photo3.jpeg +0 -0
  10. photo4.jpeg +0 -0
  11. photo5.jpeg +0 -0
  12. requirements.txt +9 -0
  13. wordcloud.png +0 -0
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ photo1.jpeg filter=lfs diff=lfs merge=lfs -text
37
+ photo2.jpeg filter=lfs diff=lfs merge=lfs -text
app.py ADDED
@@ -0,0 +1,243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import matplotlib.pyplot as plt
4
+ import pandas_bokeh
5
+ import folium
6
+ from streamlit_folium import st_folium
7
+ import requests
8
+ import streamlit as st
9
+ from PIL import Image, ExifTags
10
+
11
+ # 이미지 회전
12
+ def correct_image_orientation(image):
13
+ try:
14
+ for orientation in ExifTags.TAGS.keys():
15
+ if ExifTags.TAGS[orientation] == 'Orientation':
16
+ break
17
+ exif = image._getexif()
18
+ if exif is not None:
19
+ if exif[orientation] == 3:
20
+ image = image.rotate(180, expand=True)
21
+ elif exif[orientation] == 6:
22
+ image = image.rotate(270, expand=True)
23
+ elif exif[orientation] == 8:
24
+ image = image.rotate(90, expand=True)
25
+ except (AttributeError, KeyError, IndexError):
26
+ # cases: image don't have getexif
27
+ pass
28
+ return image
29
+
30
+ import streamlit as st
31
+ from PIL import Image, ImageOps
32
+
33
+
34
+ # 이미지 가운데 정렬
35
+ def center_image(image, new_width, new_height):
36
+ """
37
+ Center the image in a new blank canvas of specified size.
38
+
39
+ Args:
40
+ image (PIL.Image): The original image.
41
+ new_width (int): The width of the new canvas.
42
+ new_height (int): The height of the new canvas.
43
+
44
+ Returns:
45
+ PIL.Image: The centered image.
46
+ """
47
+ # Create a new blank image with a white background
48
+ new_image = Image.new("RGB", (new_width, new_height), (255, 255, 255))
49
+
50
+ # Calculate the position to paste the original image onto the center of the new image
51
+ x_offset = (new_width - image.width) // 2
52
+ y_offset = (new_height - image.height) // 2
53
+
54
+ # Paste the original image onto the center of the new image
55
+ new_image.paste(image, (x_offset, y_offset))
56
+
57
+ return new_image
58
+
59
+ # 기사 시작
60
+ st.markdown('# 늘어나는 무인 점포 절도, 업주들 "피해 막막해"')
61
+
62
+ st.write("<br><br><br>", unsafe_allow_html=True) # 3줄 띄어쓰기
63
+ # Replace 'uploaded_image.jpg' with the path to your image file
64
+ image_path = 'photo1.jpeg'
65
+ image = Image.open(image_path)
66
+ corrected_image = correct_image_orientation(image)
67
+
68
+ st.image(corrected_image, caption='동대문구 소재 무인점포', use_column_width=True)
69
+
70
+ # 도입
71
+ st.write('''"절도 사례가 한참 많을 때는 제가 3일 동안 몰래 숨어서 지켜보기도 했어요. CCTV도 지속적으로 확인하고요."
72
+ 한 아이스크림 무인점포를 운영하고 있는 A 씨(40)가 말했다.
73
+ A 씨는 운영의 편리함 덕에 부업으로 무인점포를 운영하고 있지만, 계속되는 절도 범죄에 골치 아프다고 털어놓았다.
74
+ 절도범을 경찰에 넘겨도 가벼운 훈방조치에 그치는 탓에 나아지는 것이 없다고도 말했다.
75
+ 인터뷰 끝에는 "제 가게에 있는 물품들이 얼마 하진 않지만, 결국 훔치면 절도되잖아요? 이러한 죄의 무게감을 느끼게 해줬으면 좋겠어요"라고 덧붙였다.''' )
76
+
77
+ st.write("<br><br><br>", unsafe_allow_html=True)
78
+
79
+ st.markdown("#### 무인점포, 범죄의 표적이 되다: 증가하는 절도 사건")
80
+ st.write('''무인점포란 사람 없이 오직 매대와 [키오스크](https://namu.wiki/w/%ED%82%A4%EC%98%A4%EC%8A%A4%ED%81%AC)로 판매 영업을 하는 가게를 말한다.
81
+ 과거에는 인형 뽑기나 코인노래방과 같이 일부 업종에 한정됐으나, 최근 몇 년간 아이스크림, 카페, 세탁소, 편의점, 사진관, 밀키트 등 다양한 업종으로 확대됐다.
82
+ 종류가 다양해지면서 무인점포는 2023년 기준 5년 만에 5배 가까이 늘었다.
83
+ 소방청에 따르면 2023년 3월 기준 국내 무인점포의 수는 6323개에 달했다.
84
+ 이 중 전체의 31.8%를 차지하는 아이스크림 무인점포는 2011개로 파악된다.''')
85
+ with open('bokeh_plot.html', 'r', encoding='utf-8') as f:
86
+ html_content1 = f.read()
87
+ st.components.v1.html(html_content1, height=500)
88
+
89
+ st.write('''무인점포의 가장 큰 장점은 키오스크 도입으로 인한 인건비 절감이다.
90
+ 고객의 입장에서도 24시간 상품을 편하게 볼 수 있다.
91
+ 실제로 한 20대 이용자는 "아무래도 주인이 없다 보니까 눈치를 보지 않아도 되어서 좋다. 또한 물건을 자세히 볼 수 있는 자유로운 쇼핑 환경 때문에 무인점포를 자주 이용하는 것 같다"고 말하기도 했다.
92
+ 이러한 이점들로 인해 무인점포의 수는 앞으로도 늘어날 것으로 보인다.''')
93
+
94
+ st.write("<br><br>", unsafe_allow_html=True)
95
+
96
+ # CCTV 사진
97
+ image_path = 'photo2.jpeg'
98
+ image = Image.open(image_path)
99
+ corrected_image = correct_image_orientation(image)
100
+
101
+ st.image(corrected_image, caption='매장내 CCTV', use_column_width=True)
102
+
103
+ st.write('''하지만 CCTV 외 다른 보안 시스템이 충분히 구축되어 있지 않고, 매장 상황을 감시할 수 있는 직원이 상주하지 않아 범죄에 취약하다.
104
+ 판매 직원 없이 24시간 운영되는 무인점포는 비용적, 시간적으로 편리함을 극대화하는 동시에 범죄가 쉽게 일어나는 공간이다.''')
105
+
106
+ st.write("<br><br><br>", unsafe_allow_html=True)
107
+
108
+ # 워드클라우드
109
+ st.markdown("#### 무인점포 증가량에 비례하는 절도 범죄")
110
+ st.write('주요 단어들을 워드클라우드로 보여주면 다음과 같다.')
111
+ st.image('wordcloud.png', caption="'무인점포'를 키워드로 2023년 뉴스 기사 웹스크래핑하여 제작한 워드클라우드")
112
+ st.write('''키워드인 무인점포를 제외하면 디지털, 경찰, 절도 순으로 단어가 가장 많이 사용됐다.
113
+ 범죄와 관련된 단어로는 출입, 재물, 훼손, 청소년, 구속 등을 확인할 수 있다.
114
+ 그중에서도 '절도'가 관련 뉴스 기사에서 가장 많이 언급됐다.''')
115
+
116
+ st.write("<br><br>", unsafe_allow_html=True)
117
+
118
+ # 월별 절도건수 그래프
119
+ st.image('month_graph.png', caption='무인점포 월별 절도 발생건수')
120
+ st.write('''경찰청에서 발표한 자료에 따르면 무인점포 월별 절도 발생건수는 2021년 3월 223건, 2022년 12월 525건으로 두 배 이상 증가했다.
121
+ 무인점포가 늘어남에 따라 절도 사건도 급증한 것이다.''')
122
+
123
+ st.write("<br><br>", unsafe_allow_html=True)
124
+
125
+ # 지도 html
126
+ st.write('''취재팀은 지역별 무인점포 절도 발생 건수를 지도로 나타내 보았다.
127
+ 지도 내 각 지역 위에 마우스를 놓으면 관련 정보가 나타난다.''')
128
+ with open('folium_map.html', 'r', encoding='utf-8') as f:
129
+ html_content2 = f.read()
130
+ st.components.v1.html(html_content2, height=500)
131
+ st.write('''2022년에 집계된 전체 6,018건의 절도 중 경기도가 1,740건으로 가장 많이 발생했다.
132
+ 다음으로는 서울특별시 1,428건, 인천광역시 452건, 부산광역시 447건으로 수도권과 대도시 주위에 절도 범죄가 두드러졌다.''')
133
+
134
+ st.write("<br><br>", unsafe_allow_html=True)
135
+
136
+ # 검거율
137
+ st.image('graph.jpeg', caption='무인점포 절도 발생건수, 검거 건수, 검거 인원 증가율')
138
+ st.write('''무인점포의 절도 범죄 발생률은 급증하는 추세지만, 검거율은 그에 따라가지 못하는 것이 문제이다.
139
+ 2021년 기준 절도 범죄 발생 건수는 3,514건, 검거 건수는 2,379건으로 검거율은 약 68%이다.
140
+ 2022년도 마찬가지로 검거율이 약 69%에 머무른 것으로 보면, 무인점포 내에 CCTV가 설치되어 있으나 각종 범죄를 예방 및 검거하기에는 역부족한 실정이다.
141
+ 직원을 고용하지 않고 소자본으로 운영하고자 한 점주 입장에서는 오히려 범죄로 인해 금전적인 피해가 발생하는 상황이다.''')
142
+
143
+ st.write("<br><br><br>", unsafe_allow_html=True)
144
+
145
+ st.markdown("#### 무인점포 절도를 막기 위한 정책 다양화... 실효성은 없어")
146
+
147
+ # 양심거울
148
+ image_path = 'photo4.jpeg'
149
+ image = Image.open(image_path)
150
+ new_width = 400
151
+ new_height = 600
152
+ centered_image = center_image(image, new_width, new_height)
153
+
154
+ st.image(centered_image, caption='출처 안성경찰서', use_column_width=True)
155
+
156
+ st.write('''무인점포 절도의 무서운 증가세에 다양한 해결방법이 등장하고 있다.
157
+ 그 중 가장 많이 알려진 것은 양심거울 설치다.
158
+ 매장 내 손님이 본인의 모습을 볼 수 있는 거울을 설치해 양심의 가책을 느끼고 충동적 범죄욕구를 차단하도록 한다.
159
+ 보통 절도 범죄의 형량이나 그릇됨을 알려주는 다양한 문구를 양심거울과 함께 적시하여 효과를 극대화한다.
160
+ 양심거울 설치는 2021년 3월 12일 동두천경찰서를 시작으로 대전서부경찰서, 부산동부경찰서, 영등포경찰서 등 다양한 지역에서 시행되고 있다.
161
+ 제주서부경찰서의 보고에 따르면 2022년 8월 양심거울을 무인점포 5곳에 설치한 결과, 관내 무인점포 절도 신고가 57.5% 감소한 것으로 밝혀졌다.
162
+ 개인 사업자도 쉽게 설치가 가능하고 다른 방안에 비해 저렴하여 무인점포 절도 예방의 기초적인 방법으로 자리 잡았다.''')
163
+
164
+ st.write("<br><br>", unsafe_allow_html=True)
165
+
166
+ # 출입인증시스템
167
+ st.image('photo3.jpeg', caption='출입인증장치')
168
+ st.write('''최근에는 기술의 발달로 본인 인증 출입시스템이 주목받고 있다.
169
+ [QR코드](https://namu.wiki/w/QR%EC%BD%94%EB%93%9C?from=QR%20%EC%BD%94%EB%93%9C)나 신용카드 등을 통해 본인 인증을 하고 난 뒤 점포에 들어갈 수 있는 방식으로 절도 범죄 발생률 자체를 낮춘다.
170
+ 뿐만 아니라 범죄 발생시 범인을 특정할 수 있다.''')
171
+
172
+ st.write("<br>", unsafe_allow_html=True)
173
+
174
+ # 교육활동
175
+ st.write('''앞선 두가지 방법이 무인점포 내적으로 진행되는 방범활동이라면 외적으로 진행되는 예방활동으로는 경찰의 집중 순찰과 10대들을 대상으로 한 교육활동이 있다.
176
+ 경찰청 자료에 따르면 2022년 7월부터 12월까지 발생한 무인점포 절도 전체 1,962건 중 474건이 10대로 약 25%를 차지하고 있다.
177
+ 10대의 무인점포 절도를 막기 위해 지난해 추석 연휴 대전경찰서에서는 업주와 협의해 특별순찰구역을 지정하고 순찰활동을 실시했다.
178
+ 그 밖에도 다양한 지역의 경찰서에서 무인점포 절도 범죄의 심각성을 인지하고 특별순찰활동을 진행하고 있다.
179
+ 동시에 10대 청소년을 대상으로 한 교육활동도 전국적으로 활발히 진행 중이다.
180
+ 부산동부경찰서 범죄예방대응과는 학교에 방문해 학생들이 죄의식 없이 범하기 쉬운 무인점포 소년 범죄에 대해 예방할 수 있는 교육활동을 제공하고 있다.
181
+ 경기도교육청은 각 학교에 공문을 내려 자체적인 절도 예방교육을 권장하고 있다고 밝혔다.''')
182
+
183
+ st.write("<br><br>", unsafe_allow_html=True)
184
+
185
+ # 보안 프로그램
186
+ st.image('photo5.jpeg', caption="SK쉴더스 '캡스 뷰가드', 에스원 '안심24'" )
187
+ st.write('''마지막으로 보안 회사에서도 다양한 보안 프로그램 제공을 통해 무인점포 절도 예방에 힘쓰고 있다.
188
+ 가장 대표적인 프로그램으로는 SK쉴더스의 관제 애플리케이션 '캡스 뷰가드'와 에스원의 '안심24' 서비스가 있다.
189
+ SK쉴더스의 '캡스 뷰가드'는 '사람・차량', '영역지정', '침입・방문', '색상' 등을 기준으로 녹화본을 검색하는 'AI 스마트 검색' 기능을 지원한다.
190
+ 에스원의 '안심24'는 영상 보안부터 긴급출동, 키오스크 감시가 가능한 무인매장 전용 솔루션으로 현금 도난시에도 최대 1,000만 원까지 보상이 가능하다.''')
191
+
192
+ st.write("<br>", unsafe_allow_html=True)
193
+
194
+ # 한계
195
+ st.write('''하지만 무인점포 절도 예방을 위한 다양한 활동에도 불구하고 범죄는 꾸준히 증가하고 있다.
196
+ 여러 정책이 도입된 이후에도 해마다 증가하는 범죄율을 통계적으로 학인할 수 있다.
197
+ 앞서 소개한 활동들의 한계점은 다음과 같다.
198
+ 양심거울은 충동적 범죄를 억제할 수 있지만 계획적인 절도에는 무력하고, 본인인증시스템은 설치와 유지 비용이 높아 모든 무인점포에 적용하기 어렵다.
199
+ 경찰 순찰과 교육활동은 인력과 자원의 한계로 일관되게 시행하기 어렵고, 보안 프로그램은 여전히 비용 부담이 있어 소규모 자영업자들이 쉽게 접근하기 어렵다.
200
+
201
+ st.write("<br><br><br>", unsafe_allow_html=True)
202
+
203
+ st.markdown("#### 솜방방이 처벌, 무인점포 절도 범죄를 부추기다")
204
+ st.write("여러 노력에도 불구하고 무인점포 절도 범죄율이 계속 늘어나는 이유에는 이른바 '솜방방이 처벌'이 있다. 2021년 대법원이 무인점포 절도 사건에 대해 [주거침입죄](https://namu.wiki/w/%EC%A3%BC%EA%B1%B0%EC%B9%A8%EC%9E%85%EC%A3%84)를 적용하지 않겠다는 판결을 내리면서 이 문제가 더욱 부각됐다.")
205
+
206
+ st.write("<br>", unsafe_allow_html=True)
207
+
208
+ st.markdown('''새벽에 무인점포에 침입해 재물을 절도한 B씨가 [야간주거침입절도](https://namu.wiki/w/%EC%95%BC%EA%B0%84%EC%A3%BC%EA%B1%B0%EC%B9%A8%EC%9E%85%EC%A0%88%EB%8F%84%EC%A3%BC) 및 공동주거침입 등의 혐의로 재판에 넘겨졌다.
209
+ 절도죄의 경우 6년 이하의 징역이나 1000만 원 이하의 벌금형에 처해지지만, 만약 야간에 주거 침입하여 절취한 경우 야간주거침입절도죄가 적용되어 10년 이하의 징역형에 처해진다.
210
+ B씨는 야간주거침입절도죄 항목으로 가중처벌되어야 했지만, 대법원은 "단순히 주거에 들어가는 행위 자체가 거주자의 의사에 반한다는 거주자의 주관적 사정만으로 바로 침입에 해당한다고 볼 수 없다"며 "B씨가 일반인의 출입이 상시 허용된 무인 매장에 통상적인 출입 방법으로 들어갔으며, B씨의 출입으로 인해서 건조물 관리자의 평온 상태가 침해되었다고 볼 만한 사정이 없다"고 밝혔다.
211
+ 천안 법무법인 법승 서상원 변호사는 "주거에 들어간 행위가 침입에 해당하는지 판단할 때 '거주자의 의사에 반하는지'는 사실상의 평온 상태를 해치는 행위 태양인가를 평가할 때 고려할 요소 중 하나이지만 주된 평가 요소가 될 수 없다"고 설명했다.''', unsafe_allow_html=True)
212
+
213
+ st.write("<br>", unsafe_allow_html=True)
214
+
215
+ st.write('''이에 대해 대중들은 "돈을 훔치러 들어갔는데 무죄?", "범죄자들이 절도하기 좋게 만드는 것 아니냐", "개혁이 시급하다" 등의 부정적인 반응을 보였다.''')
216
+
217
+ # 결론
218
+ st.write("<br><br><br>", unsafe_allow_html=True)
219
+ st.markdown("#### 처벌 규정 명확화, 기술적・교육적 지원도 병행해야")
220
+
221
+ st.write('''무인점포는 인건비를 대폭 줄일 수 있는 효율적인 대안으로써, 앞으로 그 수가 더욱 늘어날 전망이다.
222
+ 이런 경향을 반영하여 관련 범죄율을 낮추기 위해서는 사회 전반의 노력이 필요하다.
223
+ 단순히 보안 프로그램이나 방범 시스템 도입을 통한 경비 강화는 점주에게 비용적 부담이 되어 제대로 시행되기는 어려울 것으로 보인다.
224
+ 실제로 최근 다양한 경비 대책이 나왔지만, 대부분의 무인점포는 CCTV 외에는 도입하고 있지 않는 상황이다.
225
+ 경찰은 개인의 수익 활동을 전적으로 보호해줄 수 없기 때문에 경찰력으로 근본적인 해결은 기대하기 어렵다.''')
226
+
227
+ st.write("<br>", unsafe_allow_html=True)
228
+
229
+ st.write('''따라서 무인점포 절도 범죄에 대한 개념 정의나 처벌 기준을 명확하게 하는 것이 우선되어야 한다.
230
+ 이와 관련하여 전문가들은 아무리 작은 금액이라도 물건을 훔치는 것은 중대한 범죄가 될 수 있다는 것을 인식시켜야 한다고 강조했다.
231
+ 서원대 경찰행정학부 김영식 교수는 "적발이 돼서 또 재범이 이뤄지지 않게끔 경고를 주는 게 굉장히 중요하다"며, 훈방 조치나 선도심사위원회와 같은 공적인 제재가 필요하다고 언급했다.
232
+ 동시에 기술적인 측면에서 무인점포 보안 시스템을 표준화하고, 이를 설치하는 데 필요한 재정적 지원이 제공되어야 한다.
233
+ 결론적으로 무인점포 절도 문제를 해결하기 위해서는 법적, 기술적, 교육적 측면에서 다각도의 노력이 필요하다.
234
+ 사회 전반이 협력하여 무인점포가 안전하게 운영될 수 있는 환경을 조성함으로써 범죄율을 줄이고 무인점포의 지속 가능한 성장을 도모할 수 있을 것이다.''')
235
+
236
+ st.write("<br><br><br>", unsafe_allow_html=True)
237
+ st.markdown("###### 경희대학교 데이터저널리즘 4조")
238
+ st.write('''강성훈 기자, kang-sh8783@khu.ac.kr''')
239
+ st.write('''박민주 기자, minju0730@khu.ac.kr''')
240
+ st.write('''백다은 기자, qor1120@khu.ac.kr''')
241
+ st.write('''이은서 기자, 321les@khu.ac.kr''')
242
+ st.write('''황주찬 기자, 2021103139@khu.ac.kr''')
243
+ st.write('''PHAM HUU BAO 기자, Bpham627@khu.ac.kr''')
bokeh_plot.html ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Bokeh Plot</title>
6
+ <script type="text/javascript" src="https://cdn.bokeh.org/bokeh/release/bokeh-2.4.3.min.js"></script>
7
+ <script type="text/javascript">
8
+ Bokeh.set_log_level("info");
9
+ </script>
10
+ </head>
11
+ <body>
12
+ <div class="bk-root" id="2c1af981-2a88-45f8-a60b-a8b160d1ad3d" data-root-id="1037"></div>
13
+
14
+ <script type="application/json" id="1257">
15
+ {"8a2d0b69-712c-4973-a99c-4eea50c76a69":{"defs":[],"roots":{"references":[{"attributes":{},"id":"1086","type":"UnionRenderers"},{"attributes":{"source":{"id":"1072"}},"id":"1078","type":"CDSView"},{"attributes":{},"id":"1087","type":"Selection"},{"attributes":{"field":"\uacc4_angle","include_zero":true},"id":"1070","type":"CumSum"},{"attributes":{"data":{"__x__values":["\ubc00\ud0a4\ud2b8","\uc0ac\uc9c4\uad00","\uc138\ud0c1\uc18c","\uc2a4\ud130\ub514\uce74\ud398","\uc544\uc774\uc2a4\ud06c\ub9bc"],"__x__values_original":["\ubc00\ud0a4\ud2b8","\uc0ac\uc9c4\uad00","\uc138\ud0c1\uc18c","\uc2a4\ud130\ub514\uce74\ud398","\uc544\uc774\uc2a4\ud06c\ub9bc"],"color":["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0"],"inner_radius":[0.0,0.0,0.0,0.0,0.0],"outer_radius":[0.9,0.9,0.9,0.9,0.9],"\uacc4":[662,708,1975,967,2011],"\uacc4_angle":{"__ndarray__":"+p29rfQM5T+3NW05aoPmP+hMvE+pZv8/KL6+Z8i/7j+Lnt9ZMPn/Pw==","dtype":"float64","order":"little","shape":[5]}},"selected":{"id":"1087"},"selection_policy":{"id":"1086"}},"id":"1072","type":"ColumnDataSource"},{"attributes":{},"id":"1081","type":"BasicTickFormatter"},{"attributes":{"coordinates":null,"group":null,"text":"\uc804\uad6d \uc8fc\uc694 \ubb34\uc778\uc810\ud3ec \ud604\ud669"},"id":"1038","type":"Title"},{"attributes":{"coordinates":null,"formatter":{"id":"1081"},"group":null,"major_label_policy":{"id":"1082"},"ticker":{"id":"1053"},"visible":false},"id":"1052","type":"LinearAxis"},{"attributes":{"axis":{"id":"1052"},"coordinates":null,"dimension":1,"grid_line_color":null,"group":null,"ticker":null},"id":"1055","type":"Grid"},{"attributes":{"coordinates":null,"formatter":{"id":"1084"},"group":null,"major_label_policy":{"id":"1085"},"ticker":{"id":"1093"},"visible":false},"id":"1048","type":"LinearAxis"},{"attributes":{},"id":"1060","type":"ResetTool"},{"attributes":{},"id":"1059","type":"SaveTool"},{"attributes":{"overlay":{"id":"1062"}},"id":"1058","type":"BoxZoomTool"},{"attributes":{},"id":"1056","type":"PanTool"},{"attributes":{"end":2,"start":-1.45},"id":"1040","type":"Range1d"},{"attributes":{},"id":"1057","type":"WheelZoomTool"},{"attributes":{"end_angle":{"expr":{"id":"1071"}},"fill_alpha":{"value":0.2},"fill_color":{"field":"color"},"hatch_alpha":{"value":0.2},"inner_radius":{"field":"inner_radius"},"line_alpha":{"value":0.2},"line_color":{"value":"white"},"line_width":{"value":2},"outer_radius":{"field":"outer_radius"},"start_angle":{"expr":{"id":"1070"}},"x":{"value":0},"y":{"value":0}},"id":"1076","type":"AnnularWedge"},{"attributes":{"end_angle":{"expr":{"id":"1071"}},"fill_color":{"field":"color"},"inner_radius":{"field":"inner_radius"},"line_color":{"value":"white"},"line_width":{"value":2},"outer_radius":{"field":"outer_radius"},"start_angle":{"expr":{"id":"1070"}},"x":{"value":0},"y":{"value":0}},"id":"1074","type":"AnnularWedge"},{"attributes":{},"id":"1053","type":"BasicTicker"},{"attributes":{"coordinates":null,"data_source":{"id":"1072"},"glyph":{"id":"1074"},"group":null,"hover_glyph":null,"muted_glyph":{"id":"1076"},"nonselection_glyph":{"id":"1075"},"view":{"id":"1078"}},"id":"1077","type":"GlyphRenderer"},{"attributes":{},"id":"1061","type":"HelpTool"},{"attributes":{},"id":"1084","type":"BasicTickFormatter"},{"attributes":{},"id":"1044","type":"LinearScale"},{"attributes":{},"id":"1085","type":"AllLabels"},{"attributes":{"axis":{"id":"1048"},"coordinates":null,"grid_line_color":null,"group":null,"ticker":null},"id":"1051","type":"Grid"},{"attributes":{},"id":"1046","type":"LinearScale"},{"attributes":{"end_angle":{"expr":{"id":"1071"}},"fill_alpha":{"value":0.1},"fill_color":{"field":"color"},"hatch_alpha":{"value":0.1},"inner_radius":{"field":"inner_radius"},"line_alpha":{"value":0.1},"line_color":{"value":"white"},"line_width":{"value":2},"outer_radius":{"field":"outer_radius"},"start_angle":{"expr":{"id":"1070"}},"x":{"value":0},"y":{"value":0}},"id":"1075","type":"AnnularWedge"},{"attributes":{"label":{"field":"__x__values_original"},"renderers":[{"id":"1077"}]},"id":"1090","type":"LegendItem"},{"attributes":{"below":[{"id":"1048"}],"center":[{"id":"1051"},{"id":"1055"},{"id":"1089"}],"height":400,"left":[{"id":"1052"}],"renderers":[{"id":"1077"}],"title":{"id":"1038"},"toolbar":{"id":"1063"},"toolbar_location":null,"x_range":{"id":"1040"},"x_scale":{"id":"1044"},"y_range":{"id":"1042"},"y_scale":{"id":"1046"}},"id":"1037","subtype":"Figure","type":"Plot"},{"attributes":{"coordinates":null,"group":null,"items":[{"id":"1090"}]},"id":"1089","type":"Legend"},{"attributes":{"callback":null,"renderers":[{"id":"1077"}],"tooltips":[["\uc601\uc5c5\uc7a5 \uc885\ub958","@__x__values_original"],["\uacc4","@{\uacc4}"]]},"id":"1091","type":"HoverTool"},{"attributes":{"end":1.2,"start":-1.2},"id":"1042","type":"Range1d"},{"attributes":{"tools":[{"id":"1056"},{"id":"1057"},{"id":"1058"},{"id":"1059"},{"id":"1060"},{"id":"1061"},{"id":"1091"}]},"id":"1063","type":"Toolbar"},{"attributes":{"bottom_units":"screen","coordinates":null,"fill_alpha":0.5,"fill_color":"lightgrey","group":null,"left_units":"screen","level":"overlay","line_alpha":1.0,"line_color":"black","line_dash":[4,4],"line_width":2,"right_units":"screen","syncable":false,"top_units":"screen"},"id":"1062","type":"BoxAnnotation"},{"attributes":{"field":"\uacc4_angle"},"id":"1071","type":"CumSum"},{"attributes":{},"id":"1082","type":"AllLabels"},{"attributes":{"ticks":[0,1,2,3,4]},"id":"1093","type":"FixedTicker"}],"root_ids":["1037"]},"title":"Bokeh Application","version":"2.4.3"}}
16
+ </script>
17
+ <script type="text/javascript">
18
+ (function() {
19
+ const fn = function() {
20
+ Bokeh.safely(function() {
21
+ (function(root) {
22
+ function embed_document(root) {
23
+ const docs_json = document.getElementById('1257').textContent;
24
+ const render_items = [{"docid":"8a2d0b69-712c-4973-a99c-4eea50c76a69","root_ids":["1037"],"roots":{"1037":"2c1af981-2a88-45f8-a60b-a8b160d1ad3d"}}];
25
+ root.Bokeh.embed.embed_items(docs_json, render_items);
26
+ }
27
+ if (root.Bokeh !== undefined) {
28
+ embed_document(root);
29
+ } else {
30
+ let attempts = 0;
31
+ const timer = setInterval(function(root) {
32
+ if (root.Bokeh !== undefined) {
33
+ clearInterval(timer);
34
+ embed_document(root);
35
+ } else {
36
+ attempts++;
37
+ if (attempts > 100) {
38
+ clearInterval(timer);
39
+ console.log("Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing");
40
+ }
41
+ }
42
+ }, 10, root)
43
+ }
44
+ })(window);
45
+ });
46
+ };
47
+ if (document.readyState != "loading") fn();
48
+ else document.addEventListener("DOMContentLoaded", fn);
49
+ })();
50
+ </script>
51
+ </body>
52
+ </html>
folium_map.html ADDED
The diff for this file is too large to render. See raw diff
 
graph.jpeg ADDED
month_graph.png ADDED
photo1.jpeg ADDED

Git LFS Details

  • SHA256: 9abe14e49fe1065f356427078f6ea98e00b54ac66b3957e661b1fa6c340fdb40
  • Pointer size: 132 Bytes
  • Size of remote file: 3.7 MB
photo2.jpeg ADDED

Git LFS Details

  • SHA256: 6a3004baf22e68cb7f88ee52980cf6113aa94f6b7916530454ee4f84926bea64
  • Pointer size: 132 Bytes
  • Size of remote file: 2.62 MB
photo3.jpeg ADDED
photo4.jpeg ADDED
photo5.jpeg ADDED
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ streamlit
2
+ pandas
3
+ openpyxl
4
+ matplotlib
5
+ pandas-bokeh
6
+ bokeh==2.4.3
7
+ folium
8
+ streamlit-folium
9
+ requests
wordcloud.png ADDED