Chapter 14. ์ข…ํ•ฉ ์˜ˆ์ œ#

ํ•™์Šต๋ชฉํ‘œ์™€ ๊ธฐ๋Œ€ํšจ๊ณผ

  • ํ•™์Šต๋ชฉํ‘œ

    • CCTV์™€ ์ธ๊ตฌ์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ค„๋ณด๊ณ  ๋ถ„์„ํ•˜๊ณ  ์‹œ๊ฐํ™”ํ•ด๋ณด์ž.

  • ๊ธฐ๋Œ€ํšจ๊ณผ

    • ๋ถ„์„/์ฒ˜๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด์–ด ํšจ๊ณผ์ ์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ค€๋น„์ž‘์—…#

#1. ํ˜„์žฌ ์…€ ์‹คํ–‰
#2. ๋Ÿฐํƒ€์ž„ -> ๋Ÿฐํƒ€์ž„ ๋‹ค์‹œ ์‹œ์ž‘
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
'sudo' is not recognized as an internal or external command,
operable program or batch file.
'sudo' is not recognized as an internal or external command,
operable program or batch file.
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
plt.rc('font', family='NanumBarunGothic')
plt.text(0.3, 0.3, 'ํ•œ๊ธ€', size=100)
plt.show()
_images/dfd740969b7475cc11c6f4e5cc919552e51814b0bba01e2bfec41284e30a4bb9.png

์ธ๊ตฌ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ#

  • ์ธ๊ตฌ๋ฐ์ดํ„ฐ๋ฅผ read_csv()๋กœ ์ฝ์–ด์˜จ๋‹ค.

  • ์˜ต์…˜ sep๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํƒญ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋‹ˆ ํƒญ๊ธฐ์ค€์œผ๋กœ ์นผ๋Ÿผ์„ ์ฝ์–ด๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

  • ์˜ต์…˜ header๋Š” ์นผ๋Ÿผ๋ช…(์นผ๋Ÿผ ์ธ๋ฑ์Šค)๋ฅผ ์ง€์ •ํ•˜๋Š” ์˜ต์…˜์œผ๋กœ ์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” 2ํ–‰์„ ์นผ๋Ÿผ๋ช…๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

  • ์˜ต์…˜ usecols๋Š” ์‚ฌ์šฉํ•  ์นผ๋Ÿผ ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•˜๋Š” ์˜ต์…˜์œผ๋กœ ๋ฆฌ์ŠคํŠธ์•ˆ์— ์ ํžŒ ์นผ๋Ÿผ๋ฒˆํ˜ธ์— ํ•ด๋‹นํ•˜๋Š” ์นผ๋Ÿผ๋งŒ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

  • ์˜ต์…˜ thousands๋Š” ์ˆซ์ž ๋ฐ์ดํ„ฐ์— ์„ธ์ž๋ฆฌ๋งˆ๋‹ค ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ์ปด๋งˆ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ฝ์œผ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ์ปด๋งˆ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ์ฝ์œผ๋ฉด ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

import pandas as pd

url = 'https://raw.githubusercontent.com/HaesunByun/common/main/data/population_in_Seoul.txt'
pop_Seoul = pd.read_csv(url, sep = '\t',header = 2, usecols = [1, 3, 6, 9, 13],thousands =',')

pop_Seoul
์ž์น˜๊ตฌ ๊ณ„ ๊ณ„.1 ๊ณ„.2 65์„ธ์ด์ƒ๊ณ ๋ น์ž
0 ํ•ฉ๊ณ„ 10013781 9733655 280126 1518239
1 ์ข…๋กœ๊ตฌ 161984 151217 10767 28073
2 ์ค‘๊ตฌ 136469 126175 10294 23794
3 ์šฉ์‚ฐ๊ตฌ 246165 229579 16586 39439
4 ์„ฑ๋™๊ตฌ 307193 299042 8151 44728
5 ๊ด‘์ง„๊ตฌ 365990 350417 15573 48989
6 ๋™๋Œ€๋ฌธ๊ตฌ 362793 346156 16637 60367
7 ์ค‘๋ž‘๊ตฌ 400678 395619 5059 66764
8 ์„ฑ๋ถ๊ตฌ 454532 442494 12038 72172
9 ๊ฐ•๋ถ๊ตฌ 316750 312985 3765 61660
10 ๋„๋ด‰๊ตฌ 333495 331238 2257 60023
11 ๋…ธ์›๊ตฌ 535495 531037 4458 82682
12 ์€ํ‰๊ตฌ 482509 478019 4490 82245
13 ์„œ๋Œ€๋ฌธ๊ตฌ 325875 312642 13233 53038
14 ๋งˆํฌ๊ตฌ 386086 374570 11516 53283
15 ์–‘์ฒœ๊ตฌ 460532 456339 4193 62761
16 ๊ฐ•์„œ๊ตฌ 595703 589302 6401 85992
17 ๊ตฌ๋กœ๊ตฌ 438308 405837 32471 67432
18 ๊ธˆ์ฒœ๊ตฌ 251370 232583 18787 38508
19 ์˜๋“ฑํฌ๊ตฌ 404766 371903 32863 59373
20 ๋™์ž‘๊ตฌ 407802 395014 12788 63378
21 ๊ด€์•…๊ตฌ 516662 499374 17288 76664
22 ์„œ์ดˆ๊ตฌ 434801 430568 4233 58332
23 ๊ฐ•๋‚จ๊ตฌ 549898 544804 5094 72602
24 ์†กํŒŒ๊ตฌ 680883 674095 6788 89539
25 ๊ฐ•๋™๊ตฌ 457042 452646 4396 66401
  • ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ํ™•์ธํ•ด๋ณด๊ณ  ์–ด๋–ค ์ž‘์—…์ด ํ•„์š”ํ•œ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.

  • ์นผ๋Ÿผ๋ช…์„ ๋ณ€๊ฒฝํ•ด์ค˜์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์นผ๋Ÿผ๋ช…์„ ๋ณ€๊ฒฝํ•ด์ฃผ์ž.

pop_Seoul.columns = ['์ง€์—ญ๊ตฌ', '์ธ๊ตฌ์ˆ˜', 'ํ•œ๊ตญ์ธ', '์™ธ๊ตญ์ธ', '๊ณ ๋ น์ž']
pop_Seoul
  • .set_index()ํ•จ์ˆ˜๋กœ โ€˜์ง€์—ญ๊ตฌโ€™ ์—ด์„ ์ธ๋ฑ์Šค๋กœ ์ง€์ •ํ•ด๋ณด์ž. ๋˜ํ•œ inplace ์˜ต์…˜์„ True๋กœ ์ค˜์„œ ์›๋ณธ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์— ๋ฐ”๋กœ ์—…๋ฐ์ดํŠธํ•ด๋ณด์ž.

  • ์ž์น˜๊ตฌ ์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ CCTV์ˆ˜๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์ด๋ฏ€๋กœ index 0์— ์žˆ๋Š” โ€˜ํ•ฉ๊ณ„โ€™ ํ–‰์€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์ธ๊ฒƒ ๊ฐ™๋‹ค. ์‚ญ์ œํ•˜์ž. ๋˜ํ•œ inplace ์˜ต์…˜์„ True๋กœ ์ค˜์„œ ์›๋ณธ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์— ๋ฐ”๋กœ ์—…๋ฐ์ดํŠธํ•ด๋ณด์ž.

CCTV ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ#

url = 'https://raw.githubusercontent.com/HaesunByun/common/main/data/CCTV_in_Seoul.csv'
CCTV_Seoul = pd.read_csv(url)
CCTV_Seoul
Unnamed: 0 ๊ธฐ๊ด€๋ช… ์†Œ๊ณ„ 2017๋…„๋„์ด์ „ 2018๋…„ 2019๋…„ 2020๋…„
0 0 ๊ฐ•๋‚จ๊ตฌ 2780 1292 430 584 932
1 1 ๊ฐ•๋™๊ตฌ 773 379 99 155 377
2 2 ๊ฐ•๋ถ๊ตฌ 748 369 120 138 204
3 3 ๊ฐ•์„œ๊ตฌ 884 388 258 184 81
4 4 ๊ด€์•…๊ตฌ 1496 846 260 390 613
5 5 ๊ด‘์ง„๊ตฌ 707 573 78 53 174
6 6 ๊ตฌ๋กœ๊ตฌ 1561 1142 173 246 323
7 7 ๊ธˆ์ฒœ๊ตฌ 1015 674 51 269 354
8 8 ๋…ธ์›๊ตฌ 1265 542 57 451 516
9 9 ๋„๋ด‰๊ตฌ 485 238 159 42 386
10 10 ๋™๋Œ€๋ฌธ๊ตฌ 1294 1070 23 198 579
11 11 ๋™์ž‘๊ตฌ 1091 544 341 103 314
12 12 ๋งˆํฌ๊ตฌ 574 314 118 169 379
13 13 ์„œ๋Œ€๋ฌธ๊ตฌ 962 844 50 68 292
14 14 ์„œ์ดˆ๊ตฌ 1930 1406 157 336 398
15 15 ์„ฑ๋™๊ตฌ 1062 730 91 241 265
16 16 ์„ฑ๋ถ๊ตฌ 1464 1009 78 360 204
17 17 ์†กํŒŒ๊ตฌ 618 529 21 68 463
18 18 ์–‘์ฒœ๊ตฌ 2034 1843 142 30 467
19 19 ์˜๋“ฑํฌ๊ตฌ 904 495 214 195 373
20 20 ์šฉ์‚ฐ๊ตฌ 1624 1368 218 112 398
21 21 ์€ํ‰๊ตฌ 1873 1138 224 278 468
22 22 ์ข…๋กœ๊ตฌ 1002 464 314 211 630
23 23 ์ค‘๊ตฌ 671 413 190 72 348
24 24 ์ค‘๋ž‘๊ตฌ 660 509 121 177 109
  • ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ํ™•์ธํ•ด๋ณด๊ณ  ์–ด๋–ค ์ž‘์—…์ด ํ•„์š”ํ•œ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.

  • โ€˜๊ธฐ๊ด€๋ช…โ€™์„ ์ธ๋ฑ์Šค๋กœ ์ง€์ •ํ•ด๋ณด์ž. ๋˜ํ•œ inplace ์˜ต์…˜์„ True๋กœ ์ค˜์„œ ์›๋ณธ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์— ๋ฐ”๋กœ ์—…๋ฐ์ดํŠธํ•ด๋ณด์ž.

๋ฐ์ดํ„ฐ ํ•ฉ์น˜๊ธฐ#

  • CCTV_Seoul์˜ โ€˜์†Œ๊ณ„โ€™์—ด ๋ฐ์ดํ„ฐ๋ฅผ pop_Seoul์˜ โ€˜CCTV์ˆ˜โ€™ ์—ด์— ์ €์žฅํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ฉ์ณ๋ณด์ž.

ํ•ฉ์นœ ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ#

  • to_csv(โ€˜ํŒŒ์ผ๋ช…โ€™)๋กœ ํ•ฉ์นœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ž. ํŒŒ์ผ๋ช…์€ โ€˜CCTVnPop_in_Seoul.csvโ€™๋กœ ํ•œ๋‹ค.

  • ์ด๋ ‡๊ฒŒ ์ „์ฒ˜๋ฆฌ ์ž‘์—…์„ ๊ฑฐ์นœ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ๋‹ค์Œ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ €์žฅํ•ด ๋†“์€ ํ›„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ๋†“์œผ๋ฉด ์ถ”ํ›„์— ๋™์ผ ์ž‘์—…์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

  • ์ €์žฅํ•œ ํŒŒ์ผ์„ read_csv()๋กœ ๋ถˆ๋Ÿฌ์™€๋ณด์ž. ๋ถˆ๋Ÿฌ์˜จ ํ›„, set_index()๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ index_col ์˜ต์…˜์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

df = pd.read_csv('CCTVnPop_in_Seoul.csv', index_col = 0)
df

๋ฐ์ดํ„ฐ ๋ถ„์„#

  • numpy์˜ corrcoef()ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด โ€˜์ธ๊ตฌ์ˆ˜โ€™์™€ โ€˜CCTV์ˆ˜โ€™์™€์˜ ์ƒ๊ด€๊ณ„์ˆ˜๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

  • corrcoef() ๊ด„ํ˜ธ์•ˆ์— ์ƒ๊ด€๊ณ„์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ณ ์ž ํ•˜๋Š” ์นผ๋Ÿผ์˜ ์ด๋ฆ„์„ ๋ช…์‹œํ•œ๋‹ค.

import numpy as np
print (np.corrcoef(df['์ธ๊ตฌ์ˆ˜'], df['CCTV์ˆ˜']))
  • corr()ํ•จ์ˆ˜๋Š” ๋ชจ๋“  ์นผ๋Ÿผ ๊ฐ„์˜ ์ƒ๊ด€ ๊ณ„์ˆ˜๋ฅผ ๋งคํŠธ๋ฆญ์Šค ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

df.corr()

๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”#

CCTV์ˆ˜์˜ ์‹œ๊ฐํ™”#

  • ์ž์น˜๊ตฌ๋ณ„ โ€˜CCTV์ˆ˜โ€™๋ฅผ ์ˆ˜ํ‰๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ ค๋ณด์ž.

  • color_palette()ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ํŒ”๋ ˆํŠธ์™€ ์ƒ‰ ๊ฐฏ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.

  • ํŒ”๋ ˆํŠธ ์ด๋ฆ„์€ ๋‹ค์Œ ๋งํฌ๋ฅผ ํ†ตํ•ด ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. https://seaborn.pydata.org/tutorial/color_palettes.html

import matplotlib.pyplot as plt
import seaborn as sns
colors=sns.color_palette(palette='hls', n_colors=len(df['CCTV์ˆ˜']))
df['CCTV์ˆ˜'].plot(kind='barh', grid = True, color=colors)
plt.show()
  • ์ •๋ ฌํ•œ ๊ฐ€๋กœ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ ค๋ณด์ž. ์ •๋ ฌ์€ sort_values()๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

df['CCTV์ˆ˜'].sort_values().plot(kind='barh', grid = True, color=colors)
plt.show()

์ธ๊ตฌ์ˆ˜์™€ CCTV์ˆ˜์˜ ์‹œ๊ฐํ™”#

  • โ€˜์ธ๊ตฌ์ˆ˜โ€™์™€ โ€˜CCTV์ˆ˜โ€™๋กœ ์‚ฐํฌ๋„ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ณด์ž.

plt.figure(figsize=(10,8))
plt.scatter(df['์ธ๊ตฌ์ˆ˜'], df['CCTV์ˆ˜'], s = 50)
plt.xlabel('์ธ๊ตฌ์ˆ˜')
plt.ylabel('CCTV์ˆ˜')
plt.grid()
plt.show()

์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ CCTV ๊ธฐ์ค€์„  ๊ธ‹๊ธฐ#

  • ์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ ์ ์ • CCTV ์ˆ˜ ์˜ ๊ธฐ์ค€์„ ์„ ๊ทธ์–ด๋ณด์ž.

  • numpy์˜ polyfit(a, b, n)ํ•จ์ˆ˜๋Š” ๋‘ ๋ฐ์ดํ„ฐ a, b๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” n์ฐจ ๋ฐฉ์ •์‹์˜ ๊ณ„์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

  • โ€˜์ธ๊ตฌ์ˆ˜โ€™์™€ โ€˜CCTV์ˆ˜โ€™๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” 1์ฐจ ๋ฐฉ์ •์‹์˜ ๊ณ„์ˆ˜๋ฅผ ๊ตฌํ•ด๋ณด์ž.

fp = np.polyfit(df['์ธ๊ตฌ์ˆ˜'], df['CCTV์ˆ˜'], 1)
print(fp)
  • ์•ž์—์„œ ๊ตฌํ•œ ๊ณ„์ˆ˜๋ฅผ numpy์˜ poly1d()ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๋ฉด 1์ฐจ ๋‹คํ•ญ์‹ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • poly1d()๋Š” 1์ฐจ ๋‹คํ•ญ์‹์„ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

f = np.poly1d(fp)
print(f)
  • df[โ€˜์ธ๊ตฌ์ˆ˜โ€™]์™€ df[โ€˜CCTV์ˆ˜โ€™]๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๋‹คํ•ญ์‹ ํ•จ์ˆ˜ f๋ฅผ ๊ตฌํ–ˆ์œผ๋ฏ€๋กœ ๊ทธ f์— ์ธ๊ตฌ์ˆ˜๋ฅผ ๋„ฃ์–ด๋ณด์ž.

  • f์— ๋„ฃ์„ ์ธ๊ตฌ์ˆ˜๋ฅผ ์ผ์ •ํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด numpy์˜ linspace()ํ•จ์ˆ˜๋กœ ์ผ์ •ํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ ๋“ฑ๋ถ„ํ•œ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.

  • linspace()ํ•จ์ˆ˜๋กœ 100000๋ถ€ํ„ฐ 700000๊นŒ์ง€ 100๊ฐœ๋กœ ๋“ฑ๋ถ„ํ•œ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด x์ถ• ๋ฐ์ดํ„ฐ๋กœ ์‚ฌ์šฉํ•˜์ž.

  • ์—ฌ๊ธฐ์„œ 100000~700000๋ฅผ ๋ฒ”์œ„๋กœ ์ค€ ์ด์œ ๋Š” ์ธ๊ตฌ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ์ง€์—ญ๊ตฌ๊ฐ€ 136469, ๊ฐ€์žฅ ๋†’์€ ์ง€์—ญ๊ตฌ๊ฐ€ 680883์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

fx = np.linspace(100000, 700000, 100)
print(fx)
  • ๋“ฑ๋ถ„๋ฐฐ์—ด fx๋ฅผ x์˜ ๊ฐ’์œผ๋กœ ์ฃผ๊ณ , ์œ„์—์„œ ๋งŒ๋“  ํ•จ์ˆ˜ f์— fx๋ฅผ ๋„ฃ์–ด y์˜ ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค. x์™€ y๊ฐ€ ๋งŒ๋‚˜๋Š” ์ขŒํ‘œ์— ์ ์„ ์ฐ์€ ํ›„, ์„ ์œผ๋กœ ์ด์–ด ์„ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ณด์ž.

  • ์˜ต์…˜ ls๋Š” line style, lw๋Š” line width์ด๋‹ค.

plt.plot(fx, f(fx), ls='dashed', lw=3, color='g')
plt.xlabel('์ธ๊ตฌ์ˆ˜')
plt.ylabel('CCTV์ˆ˜')
plt.show()
  • ์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ CCTV์ˆ˜์˜ ๊ธฐ์ค€์„ (๋Œ€ํ‘œ์ง์„ ) ๊ทธ๋ž˜ํ”„์™€ ์‚ฐํฌ๋„ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ด๋ณด์ž.

plt.figure(figsize=(10,8))
plt.scatter(df['์ธ๊ตฌ์ˆ˜'], df['CCTV์ˆ˜'], s = 50)
plt.plot(fx, f(fx), ls='dashed', lw=3, color='g')
plt.xlabel('์ธ๊ตฌ์ˆ˜')
plt.ylabel('CCTV์ˆ˜')
plt.grid()
plt.show()
  • ์‹ค์ œ CCTV์ˆ˜์™€ ์‹ค ์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ ๊ธฐ์ค€์ด ๋˜๋Š” CCTV์ˆ˜์˜ ์˜ค์ฐจ๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด์ž.

  • ์‹ค ์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ CCTV์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์•ž์—์„œ ๊ตฌํ•œ 1์ฐจ ๋‹คํ•ญ์‹ fํ•จ์ˆ˜์— ์‹ค โ€˜์ธ๊ตฌ์ˆ˜โ€™๋ฅผ ๋„ฃ์œผ๋ฉด ์‹ค ์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ ์ ์ • CCTV์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค.

f(df['์ธ๊ตฌ์ˆ˜'])
  • ์‹ค โ€˜CCTV์ˆ˜โ€™์—์„œ ์‹ค ์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ ์ ์ • CCTV์ˆ˜๋ฅผ ๋นผ๋ฉด ๊ทธ ์˜ค์ฐจ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์‹ค โ€˜CCTV์ˆ˜โ€™๊ฐ€ ์ ์ • CCTV์ˆ˜๋ณด๋‹ค ๋งŽ์„ ์ˆ˜๋„, ํ˜น์€ ์ ์„ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ์˜ค์ฐจ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์ ˆ๋Œ€๊ฐ’์„ ์ทจํ•œ๋‹ค.

df['์˜ค์ฐจ'] = np.abs(df['CCTV์ˆ˜'] - f(df['์ธ๊ตฌ์ˆ˜']))
df.head(5)
  • ์˜ค์ฐจ๊ฐ€ ํฐ ์ƒ์œ„ 10๊ฐœ๊ตฌ๋ฅผ ํ™•์ธํ•ด๋ณด๊ธฐ ์œ„ํ•ด ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด๋ณด์ž.

df.sort_values(by='์˜ค์ฐจ', ascending=False, inplace = True)
df.head(5)

์ƒ์œ„ 10๊ฐœ๊ตฌ ๊ตฌ์ด๋ฆ„ ํ‘œ์‹œํ•˜๊ธฐ#

  • ์˜ค์ฐจ๊ฐ€ ํฐ ์ƒ์œ„ 10๊ฐœ๊ตฌ์— ํ•ด๋‹นํ•˜๋Š” ์‚ฐํฌ๋„ ์  ์œ„์น˜์— ๊ตฌ์ด๋ฆ„์„ ํ‘œ์‹œํ•ด๋ณด์ž.

plt.figure(figsize=(10,8))
plt.scatter(df['์ธ๊ตฌ์ˆ˜'], df['CCTV์ˆ˜'], s = 50)
plt.plot(fx, f(fx), ls='dashed', lw=3, color='g')
for n in range(10):
  plt.text(df['์ธ๊ตฌ์ˆ˜'][n], df['CCTV์ˆ˜'][n]-100, df.index[n], fontsize = 10)
plt.xlabel('์ธ๊ตฌ์ˆ˜')
plt.ylabel('CCTV์ˆ˜')
plt.grid()
plt.show()

colorbar ์ถ”๊ฐ€#

  • ์˜ค์ฐจ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ‰๊ณผ ์—ฐ๊ฒฐํ•˜์—ฌ colorbar()๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž.

  • scatter ๊ทธ๋ž˜ํ”„์—์„œ c = df[โ€˜์˜ค์ฐจโ€™]์™€ ๊ฐ™์ด ์ปฌ๋Ÿฌ(c) ์˜ต์…˜์„ ์˜ค์ฐจ ๋ฐ์ดํ„ฐ์™€ ์—ฐ๋™์‹œ์ผœ์ค€๋‹ค.

plt.scatter(df['์ธ๊ตฌ์ˆ˜'], df['CCTV์ˆ˜'], s = 50, c = df['์˜ค์ฐจ'])

๊ทธ๋Ÿฐ ํ›„์— colorbar()๋ฅผ ๋ณด์ด๊ฒŒ ํ•œ๋‹ค.

plt.colorbar()

plt.colorbar()๊นŒ์ง€ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

plt.figure(figsize=(10,8))
plt.scatter(df['์ธ๊ตฌ์ˆ˜'], df['CCTV์ˆ˜'], s = 50, c = df['์˜ค์ฐจ'])
plt.plot(fx, f(fx), ls='dashed', lw=3, color='g')
for n in range(10):
  plt.text(df['์ธ๊ตฌ์ˆ˜'][n], df['CCTV์ˆ˜'][n]-100, df.index[n], fontsize = 10)
plt.colorbar()
plt.xlabel('์ธ๊ตฌ์ˆ˜')
plt.ylabel('CCTV์ˆ˜')
plt.grid()
plt.show()

๋งˆ๋ฌด๋ฆฌ#

  • ์ธ๊ตฌ์ˆ˜ ๋ฐ์ดํ„ฐ์™€ CCTV ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ๊ฐ ๋ถˆ๋Ÿฌ์™”๋‹ค.

  • ์ด๋“ค ๋ฐ์ดํ„ฐ์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ์ œ๊ฑฐํ•˜๊ณ  ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋กœ๋งŒ ํ•ฉ์น˜๋Š” ์ž‘์—…์„ ํ•ด์„œ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

  • ์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ CCTV์ˆ˜์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•ด๋ณด์•˜๋‹ค.

  • ์ž์น˜๊ตฌ๋ณ„ CCTV์ˆ˜๋ฅผ ๋ง‰๋Œ€๊ทธ๋ž˜ํ”„๋กœ ๋‚˜ํƒ€๋‚ด๋ณด์•˜๋‹ค.

  • ์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ CCTV์ˆ˜์˜ ๋Œ€ํ‘œ์ง์„ ์„ ๊ทธ๋ ค๋ณด์•˜๋‹ค.

  • ์‹ค์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ CCTV ์ˆ˜์™€ ๊ธฐ์ค€ ์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ CCTV ์ˆ˜์˜ ์˜ค์ฐจ๋ฅผ ๊ตฌํ•ด ๋ณด์•˜๋‹ค.

  • ์‚ฐํฌ๋„๊ทธ๋ž˜ํ”„์™€ colorbar()๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ค์ฐจ๋ฅผ ํ‘œํ˜„ํ•ด๋ณด์•˜๋‹ค.

  • ๊ฒฐ๋ก ์ ์œผ๋กœ ์ง€์—ญ๊ตฌ๋ณ„ ์ธ๊ตฌ์ˆ˜ ๋Œ€๋น„ ์ ์ • CCTV์ˆ˜์™€ ์‹ค CCTV ์ˆ˜์˜ ์˜ค์ฐจ๋ฅผ ํŒŒ์•…ํ•ด๋ณด๊ณ  ์˜ค์ฐจ๊ฐ€ ์ˆœ 10๊ฐœ๊ตฌ๋ฅผ ํ‘œ์‹œํ•ด๋ณด๋Š” ์˜ˆ์ œ๋ฅผ ๋‹ค๋ค„๋ณด์•˜๋‹ค.