본문 바로가기

Python_Intermediate/Pandas

Pandas - 서울시 자치구 년도별 CCTV 설치 현황

728x90

1. 공공기관 Data를 사용하여 분석

- DB : http://data.seoul.go.kr/dataList/datasetView.do?infId=OA-2734&srvType=F&serviceKind=1&currentPageNo=null


2. 서울시 자치구 년도별 CCTV 설치 현황 DB

기관명 소계 2013년도 이전 2014년 2015년 2016년
강남구 3238 1292 430 584 932
강동구 1010 379 99 155 377
강북구 831 369 120 138 204
강서구 911 388 258 184 81
관악구 2109 846 260 390 613
광진구 878 573 78 53 174
구로구 1884 1142 173 246 323
금천구 1348 674 51 269 354
노원구 1566 542 57 451 516
도봉구 825 238 159 42 386
동대문구 1870 1070 23 198 579
동작구 1302 544 341 103 314
마포구 980 314 118 169 379
서대문구 1254 844 50 68 292
서초구 2297 1406 157 336 398
성동구 1327 730 91 241 265
성북구 1651 1009 78 360 204
송파구 1081 529 21 68 463
양천구 2482 1843 142 30 467
영등포구 1277 495 214 195 373
용산구 2096 1368 218 112 398
은평구 2108 1138 224 278 468
종로구 1619 464 314 211 630
중구 1023 413 190 72 348
중랑구 916 509 121 177 109


3. Code

- Import Module

import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
from print_df import print_df


- head() : DB 첫 5행 출력

df = pd.read_csv('C:\python\pandas\data.csv', encoding='utf-8')

print_df(df.head())

+---+--------+------+---------------+--------+--------+--------+

|   | 기관명 | 소계 | 2013년도 이전 | 2014년 | 2015년 | 2016년 |

+---+--------+------+---------------+--------+--------+--------+

| 0 | 강남구 | 3238 |      1292     |  430   |  584   |  932   |

| 1 | 강동구 | 1010 |      379      |   99   |  155   |  377   |

| 2 | 강북구 | 831  |      369      |  120   |  138   |  204   |

| 3 | 강서구 | 911  |      388      |  258   |  184   |   81   |

| 4 | 관악구 | 2109 |      846      |  260   |  390   |  613   |

+---+--------+------+---------------+--------+--------+--------+




Process finished with exit code 0


- rename() : 이름 변경

df.rename(columns={df.columns[0]:'구별'}, inplace=True)

print_df(df.head())

inplace = True : 변수의 내용 갱신

+---+--------+------+---------------+--------+--------+--------+

|   |  구별  | 소계 | 2013년도 이전 | 2014년 | 2015년 | 2016년 |

+---+--------+------+---------------+--------+--------+--------+

| 0 | 강남구 | 3238 |      1292     |  430   |  584   |  932   |

| 1 | 강동구 | 1010 |      379      |   99   |  155   |  377   |

| 2 | 강북구 | 831  |      369      |  120   |  138   |  204   |

| 3 | 강서구 | 911  |      388      |  258   |  184   |   81   |

| 4 | 관악구 | 2109 |      846      |  260   |  390   |  613   |

+---+--------+------+---------------+--------+--------+--------+




Process finished with exit code 0


- 구별 열을 리스트 변환

area_list = list(df['구별'])
print_df(area_list)

['강남구', '강동구', '강북구', '강서구', '관악구', '광진구', '구로구', '금천구', '노원구', '도봉구', '동대문구', '동작구', '마포구', '서대문구', '서초구', '성동구', '성북구', '송파구', '양천구', '영등포구', '용산구', '은평구', '종로구', '중구', '중랑구']




Process finished with exit code 0


- 인덱스 리스트와 구별 리스트를 결합하여 딕셔너리 구조 생성

index_dict = {}
for i, v in enumerate(area_list):
index_dict[i] = v

print_df(index_dict)

{0: '강남구', 1: '강동구', 2: '강북구', 3: '강서구', 4: '관악구', 5: '광진구', 6: '구로구', 7: '금천구', 8: '노원구', 9: '도봉구', 10: '동대문구', 11: '동작구', 12: '마포구', 13: '서대문구', 14: '서초구', 15: '성동구', 16: '성북구', 17: '송파구', 18: '양천구', 19: '영등포구', 20: '용산구', 21: '은평구', 22: '종로구', 23: '중구', 24: '중랑구'}




Process finished with exit code 0


- 구별 열을 제거하고 인덱스 이름 변경 후 출력

df.drop('구별', axis=1, inplace=True)
df.rename(index=index_dict, inplace=True)

print_df(df.head(5))

+--------+------+---------------+--------+--------+--------+

|        | 소계 | 2013년도 이전 | 2014년 | 2015년 | 2016년 |

+--------+------+---------------+--------+--------+--------+

| 강남구 | 3238 |      1292     |  430   |  584   |  932   |

| 강동구 | 1010 |      379      |   99   |  155   |  377   |

| 강북구 | 831  |      369      |  120   |  138   |  204   |

| 강서구 | 911  |      388      |  258   |  184   |   81   |

| 관악구 | 2109 |      846      |  260   |  390   |  613   |

+--------+------+---------------+--------+--------+--------+




Process finished with exit code 0


-  CCTV 적은 구역 찾기(소계 기준 내림차순)
print_df(df.sort_values(by='소계', ascending=True).head(5))

+--------+------+---------------+--------+--------+--------+

|        | 소계 | 2013년도 이전 | 2014년 | 2015년 | 2016년 |

+--------+------+---------------+--------+--------+--------+

| 도봉구 | 825  |      238      |  159   |   42   |  386   |

| 강북구 | 831  |      369      |  120   |  138   |  204   |

| 광진구 | 878  |      573      |   78   |   53   |  174   |

| 강서구 | 911  |      388      |  258   |  184   |   81   |

| 중랑구 | 916  |      509      |  121   |  177   |  109   |

+--------+------+---------------+--------+--------+--------+




Process finished with exit code 0


- CCTV 많은 구역 찾기(소계 기준 오름차순)
print_df(df.sort_values(by='소계', ascending=False).head(5))

+--------+------+---------------+--------+--------+--------+

|        | 소계 | 2013년도 이전 | 2014년 | 2015년 | 2016년 |

+--------+------+---------------+--------+--------+--------+

| 강남구 | 3238 |      1292     |  430   |  584   |  932   |

| 양천구 | 2482 |      1843     |  142   |   30   |  467   |

| 서초구 | 2297 |      1406     |  157   |  336   |  398   |

| 관악구 | 2109 |      846      |  260   |  390   |  613   |

| 은평구 | 2108 |      1138     |  224   |  278   |  468   |

+--------+------+---------------+--------+--------+--------+




Process finished with exit code 0


- 최근 증가율 계산(2014년 + 2015년 + 2016년 / 2013년 이전) 후 출력

df['최근증가율'] = (df['2014년'] + df['2015년'] + df['2016년']) / df['2013년도 이전'] * 100

print_df(df.sort_values(by='최근증가율', ascending=False).head(5))

+--------+------+---------------+--------+--------+--------+--------------------+

|        | 소계 | 2013년도 이전 | 2014년 | 2015년 | 2016년 |     최근증가율     |

+--------+------+---------------+--------+--------+--------+--------------------+

| 종로구 | 1619 |      464      |  314   |  211   |  630   | 248.92241379310346 |

| 도봉구 | 825  |      238      |  159   |   42   |  386   | 246.6386554621849  |

| 마포구 | 980  |      314      |  118   |  169   |  379   | 212.1019108280255  |

| 노원구 | 1566 |      542      |   57   |  451   |  516   |  188.929889298893  |

| 강동구 | 1010 |      379      |   99   |  155   |  377   | 166.49076517150397 |

+--------+------+---------------+--------+--------+--------+--------------------+




Process finished with exit code 0


- 파일 저장(CSV / encoding = ANSI)

filename = '서울시 CCTV Data' + '.csv'
df.to_csv(filename, encoding='ANSI', na_rep='NaN', index_label='구별',
header=['소계', '2013년도 이전', '2014년', '2015년', '2016년', '최근증가율'])
구별 소계 2013년도 이전 2014년 2015년 2016년 최근증가율
강남구 3238 1292 430 584 932 150.6192
강동구 1010 379 99 155 377 166.4908
강북구 831 369 120 138 204 125.2033
강서구 911 388 258 184 81 134.7938
관악구 2109 846 260 390 613 149.2908
광진구 878 573 78 53 174 53.22862
구로구 1884 1142 173 246 323 64.97373
금천구 1348 674 51 269 354 100
노원구 1566 542 57 451 516 188.9299
도봉구 825 238 159 42 386 246.6387
동대문구 1870 1070 23 198 579 74.76636
동작구 1302 544 341 103 314 139.3382
마포구 980 314 118 169 379 212.1019
서대문구 1254 844 50 68 292 48.5782
서초구 2297 1406 157 336 398 63.37127
성동구 1327 730 91 241 265 81.78082
성북구 1651 1009 78 360 204 63.62735
송파구 1081 529 21 68 463 104.3478
양천구 2482 1843 142 30 467 34.67173
영등포구 1277 495 214 195 373 157.9798
용산구 2096 1368 218 112 398 53.21637
은평구 2108 1138 224 278 468 85.23726
종로구 1619 464 314 211 630 248.9224
중구 1023 413 190 72 348 147.6998
중랑구 916 509 121 177 109 79.96071


- 최근 증가율 기준으로 수평 그래프 그리기

plt.rcParams["font.family"] = 'NanumGothic'
plt.rcParams["font.size"] = 14
plt.rcParams["figure.figsize"] = (10 ,10)

plt.figure()
area_df['최근증가율'].plot(kind='barh')
plt.grid()
plt.legend()
plt.savefig('최근증가율.png')
plt.close()


반응형