1. 공공기관 Data를 사용하여 분석
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
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
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()
'Python_Intermediate > Pandas' 카테고리의 다른 글
Pandas - 어린이집 시설 현황 분석(Excel +그래프) (0) | 2019.05.15 |
---|---|
Pandas - 교통 사고 사망 / 사고 / 부상 그래프 분석 (0) | 2019.05.15 |
Python Pandas 박스오피스 180507 순위 분석 (0) | 2019.05.08 |
Data Refining NA Data(데이터 정제 결측치) (0) | 2019.05.07 |
190507 14:22> Naver 실시간 검색어 20위 (0) | 2019.05.07 |