11 분 소요

PYTHON PROGRAMMING

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb

%matplotlib inline

import platform

from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False

if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    path = "c:/Windows/Fonts/malgun.ttf"
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Unknown system... sorry~~~~')

실습 1. CCTV_in_Seoul.csv 파일을 pandas 로 읽어오세요.

CCTV_Seoul = pd.read_csv('CCTV_in_Seoul.csv')
CCTV_Seoul
기관명 소계 2013년도 이전 2014년 2015년 2016년
0 강남구 2780 1292 430 584 932
1 강동구 773 379 99 155 377
2 강북구 748 369 120 138 204
3 강서구 884 388 258 184 81
4 관악구 1496 846 260 390 613
5 광진구 707 573 78 53 174
6 구로구 1561 1142 173 246 323
7 금천구 1015 674 51 269 354
8 노원구 1265 542 57 451 516
9 도봉구 485 238 159 42 386
10 동대문구 1294 1070 23 198 579
11 동작구 1091 544 341 103 314
12 마포구 574 314 118 169 379
13 서대문구 962 844 50 68 292
14 서초구 1930 1406 157 336 398
15 성동구 1062 730 91 241 265
16 성북구 1464 1009 78 360 204
17 송파구 618 529 21 68 463
18 양천구 2034 1843 142 30 467
19 영등포구 904 495 214 195 373
20 용산구 1624 1368 218 112 398
21 은평구 1873 1138 224 278 468
22 종로구 1002 464 314 211 630
23 중구 671 413 190 72 348
24 중랑구 660 509 121 177 109

실습 2. 컬럼 중 “기관명” 컬럼명을 “구별” 로 이름을 바꾸세요.

CCTV_Seoul.rename(columns={"기관명":"구별"},inplace=True)
CCTV_Seoul
구별 소계 2013년도 이전 2014년 2015년 2016년
0 강남구 2780 1292 430 584 932
1 강동구 773 379 99 155 377
2 강북구 748 369 120 138 204
3 강서구 884 388 258 184 81
4 관악구 1496 846 260 390 613
5 광진구 707 573 78 53 174
6 구로구 1561 1142 173 246 323
7 금천구 1015 674 51 269 354
8 노원구 1265 542 57 451 516
9 도봉구 485 238 159 42 386
10 동대문구 1294 1070 23 198 579
11 동작구 1091 544 341 103 314
12 마포구 574 314 118 169 379
13 서대문구 962 844 50 68 292
14 서초구 1930 1406 157 336 398
15 성동구 1062 730 91 241 265
16 성북구 1464 1009 78 360 204
17 송파구 618 529 21 68 463
18 양천구 2034 1843 142 30 467
19 영등포구 904 495 214 195 373
20 용산구 1624 1368 218 112 398
21 은평구 1873 1138 224 278 468
22 종로구 1002 464 314 211 630
23 중구 671 413 190 72 348
24 중랑구 660 509 121 177 109

실습 4.population_in_Seoul.xls 파일을 읽으세요.

header 는 3번째 row 로 사용할 것입니다. 따라서 header = 2 로 셋팅하세요.

엑셀파일의 컬럼은 B, D, G, J, N 만 사용할 것입니다.

# header 는 행 시작, usecols는 열 시작
pop_Seoul = pd.read_excel('population_in_Seoul.xls',
                         header=2,
                         usecols='B, D, G, J, N')          
pop_Seoul.dropna(inplace=True)
pop_Seoul
자치구 계.1 계.2 65세이상고령자
0 합계 10197604.0 9926968.0 270636.0 1321458.0
1 종로구 162820.0 153589.0 9231.0 25425.0
2 중구 133240.0 124312.0 8928.0 20764.0
3 용산구 244203.0 229456.0 14747.0 36231.0
4 성동구 311244.0 303380.0 7864.0 39997.0
5 광진구 372164.0 357211.0 14953.0 42214.0
6 동대문구 369496.0 354079.0 15417.0 54173.0
7 중랑구 414503.0 409882.0 4621.0 56774.0
8 성북구 461260.0 449773.0 11487.0 64692.0
9 강북구 330192.0 326686.0 3506.0 54813.0
10 도봉구 348646.0 346629.0 2017.0 51312.0
11 노원구 569384.0 565565.0 3819.0 71941.0
12 은평구 494388.0 489943.0 4445.0 72334.0
13 서대문구 327163.0 314982.0 12181.0 48161.0
14 마포구 389649.0 378566.0 11083.0 48765.0
15 양천구 479978.0 475949.0 4029.0 52975.0
16 강서구 603772.0 597248.0 6524.0 72548.0
17 구로구 447874.0 416487.0 31387.0 56833.0
18 금천구 255082.0 236353.0 18729.0 32970.0
19 영등포구 402985.0 368072.0 34913.0 52413.0
20 동작구 412520.0 400456.0 12064.0 56013.0
21 관악구 525515.0 507203.0 18312.0 68082.0
22 서초구 450310.0 445994.0 4316.0 51733.0
23 강남구 570500.0 565550.0 4950.0 63167.0
24 송파구 667483.0 660584.0 6899.0 72506.0
25 강동구 453233.0 449019.0 4214.0 54622.0

실습 5-1. pop_Seoul 의 컬럼명을 모두 출력하세요.

pop_Seoul.columns
Index(['자치구', '계', '계.1', '계.2', '65세이상고령자'], dtype='object')

실습 5-2. 컬럼명을 다음처럼 바꿉니다.

0번째는 ‘구별’ , 1번째는 ‘인구수’, 2번쨰는 ‘한국인’, 3번째는 ‘외국인’, 4번째는 ‘고령자’ 로 rename

pop_Seoul.columns = ['구별','인구수','한국인','외국인','고령자']
pop_Seoul.rename(columns={'자치구':'구별','계':'인구수','계.1':'한국인','계.2':'외국인','65세이상고령자':'고령자'},inplace = True)
pop_Seoul
구별 인구수 한국인 외국인 고령자
0 합계 10197604.0 9926968.0 270636.0 1321458.0
1 종로구 162820.0 153589.0 9231.0 25425.0
2 중구 133240.0 124312.0 8928.0 20764.0
3 용산구 244203.0 229456.0 14747.0 36231.0
4 성동구 311244.0 303380.0 7864.0 39997.0
5 광진구 372164.0 357211.0 14953.0 42214.0
6 동대문구 369496.0 354079.0 15417.0 54173.0
7 중랑구 414503.0 409882.0 4621.0 56774.0
8 성북구 461260.0 449773.0 11487.0 64692.0
9 강북구 330192.0 326686.0 3506.0 54813.0
10 도봉구 348646.0 346629.0 2017.0 51312.0
11 노원구 569384.0 565565.0 3819.0 71941.0
12 은평구 494388.0 489943.0 4445.0 72334.0
13 서대문구 327163.0 314982.0 12181.0 48161.0
14 마포구 389649.0 378566.0 11083.0 48765.0
15 양천구 479978.0 475949.0 4029.0 52975.0
16 강서구 603772.0 597248.0 6524.0 72548.0
17 구로구 447874.0 416487.0 31387.0 56833.0
18 금천구 255082.0 236353.0 18729.0 32970.0
19 영등포구 402985.0 368072.0 34913.0 52413.0
20 동작구 412520.0 400456.0 12064.0 56013.0
21 관악구 525515.0 507203.0 18312.0 68082.0
22 서초구 450310.0 445994.0 4316.0 51733.0
23 강남구 570500.0 565550.0 4950.0 63167.0
24 송파구 667483.0 660584.0 6899.0 72506.0
25 강동구 453233.0 449019.0 4214.0 54622.0

실습 6. CCTV 갯수가 가장 많은 순부터 적은 순으로 정렬한 후, 상위 20개만 화면에 보여주세요.

CCTV_Seoul.sort_values(by='소계',ascending=False).head(20)
구별 소계 2013년도 이전 2014년 2015년 2016년
0 강남구 2780 1292 430 584 932
18 양천구 2034 1843 142 30 467
14 서초구 1930 1406 157 336 398
21 은평구 1873 1138 224 278 468
20 용산구 1624 1368 218 112 398
6 구로구 1561 1142 173 246 323
4 관악구 1496 846 260 390 613
16 성북구 1464 1009 78 360 204
10 동대문구 1294 1070 23 198 579
8 노원구 1265 542 57 451 516
11 동작구 1091 544 341 103 314
15 성동구 1062 730 91 241 265
7 금천구 1015 674 51 269 354
22 종로구 1002 464 314 211 630
13 서대문구 962 844 50 68 292
19 영등포구 904 495 214 195 373
3 강서구 884 388 258 184 81
1 강동구 773 379 99 155 377
2 강북구 748 369 120 138 204
5 광진구 707 573 78 53 174

실습 7. 최근 3년간 CCTV 증가율을 계산하여, dataframe 에 ‘최근증가율’ 컬럼을 추가하세요.

증가율 계산 : (2016 + 2015 + 2014) / 2013이전 * 100

CCTV_Seoul.head(3)
구별 소계 2013년도 이전 2014년 2015년 2016년
0 강남구 2780 1292 430 584 932
1 강동구 773 379 99 155 377
2 강북구 748 369 120 138 204
CCTV_Seoul['최근증가율'] = CCTV_Seoul[['2014년','2015년','2016년']].sum(axis=1)/ CCTV_Seoul['2013년도 이전'] * 100
CCTV_Seoul.head(3)
구별 소계 2013년도 이전 2014년 2015년 2016년 최근증가율
0 강남구 2780 1292 430 584 932 150.619195
1 강동구 773 379 99 155 377 166.490765
2 강북구 748 369 120 138 204 125.203252

실습 8. 최근 3년간 CCTV 증가율이 가장 높은 순으로 5개의 구를 찾으세요.

CCTV_Seoul.sort_values(by='최근증가율',ascending=False).head(5)
구별 소계 2013년도 이전 2014년 2015년 2016년 최근증가율
22 종로구 1002 464 314 211 630 248.922414
9 도봉구 485 238 159 42 386 246.638655
12 마포구 574 314 118 169 379 212.101911
8 노원구 1265 542 57 451 516 188.929889
1 강동구 773 379 99 155 377 166.490765

실습 9. 서울시의 인구 데이터 중, 가장 첫번째 로우(row) 는 필요 없으니, 삭제하세요.

pop_Seoul.drop(0,inplace = True)
pop_Seoul.head(5)
구별 인구수 한국인 외국인 고령자 외국인비율 고령자비율
1 종로구 162820.0 153589.0 9231.0 25425.0 5.669451 15.615404
2 중구 133240.0 124312.0 8928.0 20764.0 6.700690 15.583909
3 용산구 244203.0 229456.0 14747.0 36231.0 6.038828 14.836427
4 성동구 311244.0 303380.0 7864.0 39997.0 2.526635 12.850689
5 광진구 372164.0 357211.0 14953.0 42214.0 4.017852 11.342849

실습 9. 서울시의 인구 데이터 중, NaN이 있는지 확인하고, NaN이 있으면 해당 row를 삭제하세요.

pop_Seoul.isna().sum()
구별     0
인구수    0
한국인    0
외국인    0
고령자    0
dtype: int64

실습 10. ‘외국인비율’ 과 ‘고령자비율’ 두개의 컬럼을 추가하세요.

외국인비율 = 외국인 수 / 인구수 * 100

고령자비율 = 고령자 수 / 인구수 * 100

pop_Seoul.head(5)
구별 인구수 한국인 외국인 고령자
1 종로구 162820.0 153589.0 9231.0 25425.0
2 중구 133240.0 124312.0 8928.0 20764.0
3 용산구 244203.0 229456.0 14747.0 36231.0
4 성동구 311244.0 303380.0 7864.0 39997.0
5 광진구 372164.0 357211.0 14953.0 42214.0
pop_Seoul['외국인비율'] = pop_Seoul['외국인']/pop_Seoul['인구수'] *100
pop_Seoul['고령자비율'] = pop_Seoul['고령자']/pop_Seoul['인구수'] *100
pop_Seoul
구별 인구수 한국인 외국인 고령자 외국인비율 고령자비율
1 종로구 162820.0 153589.0 9231.0 25425.0 5.669451 15.615404
2 중구 133240.0 124312.0 8928.0 20764.0 6.700690 15.583909
3 용산구 244203.0 229456.0 14747.0 36231.0 6.038828 14.836427
4 성동구 311244.0 303380.0 7864.0 39997.0 2.526635 12.850689
5 광진구 372164.0 357211.0 14953.0 42214.0 4.017852 11.342849
6 동대문구 369496.0 354079.0 15417.0 54173.0 4.172440 14.661322
7 중랑구 414503.0 409882.0 4621.0 56774.0 1.114829 13.696885
8 성북구 461260.0 449773.0 11487.0 64692.0 2.490353 14.025062
9 강북구 330192.0 326686.0 3506.0 54813.0 1.061806 16.600342
10 도봉구 348646.0 346629.0 2017.0 51312.0 0.578524 14.717507
11 노원구 569384.0 565565.0 3819.0 71941.0 0.670725 12.634883
12 은평구 494388.0 489943.0 4445.0 72334.0 0.899091 14.631019
13 서대문구 327163.0 314982.0 12181.0 48161.0 3.723221 14.720797
14 마포구 389649.0 378566.0 11083.0 48765.0 2.844355 12.515110
15 양천구 479978.0 475949.0 4029.0 52975.0 0.839413 11.036964
16 강서구 603772.0 597248.0 6524.0 72548.0 1.080540 12.015794
17 구로구 447874.0 416487.0 31387.0 56833.0 7.007998 12.689506
18 금천구 255082.0 236353.0 18729.0 32970.0 7.342345 12.925255
19 영등포구 402985.0 368072.0 34913.0 52413.0 8.663598 13.006191
20 동작구 412520.0 400456.0 12064.0 56013.0 2.924464 13.578251
21 관악구 525515.0 507203.0 18312.0 68082.0 3.484582 12.955291
22 서초구 450310.0 445994.0 4316.0 51733.0 0.958451 11.488308
23 강남구 570500.0 565550.0 4950.0 63167.0 0.867660 11.072217
24 송파구 667483.0 660584.0 6899.0 72506.0 1.033584 10.862599
25 강동구 453233.0 449019.0 4214.0 54622.0 0.929765 12.051638

실습 11. 외국인 대상으로 장사를 하려 합니다. 외국인이 가장 많은 구와, 외국인비율이 가장 높은 구를 각각 5개씩 찾으세요.

pop_Seoul.sort_values(by = '외국인비율',ascending=False).head(5)
구별 인구수 한국인 외국인 고령자 외국인비율 고령자비율
19 영등포구 402985.0 368072.0 34913.0 52413.0 8.663598 13.006191
18 금천구 255082.0 236353.0 18729.0 32970.0 7.342345 12.925255
17 구로구 447874.0 416487.0 31387.0 56833.0 7.007998 12.689506
2 중구 133240.0 124312.0 8928.0 20764.0 6.700690 15.583909
3 용산구 244203.0 229456.0 14747.0 36231.0 6.038828 14.836427
pop_Seoul.sort_values(by = '외국인',ascending=False).head(5)
구별 인구수 한국인 외국인 고령자 외국인비율 고령자비율
19 영등포구 402985.0 368072.0 34913.0 52413.0 8.663598 13.006191
17 구로구 447874.0 416487.0 31387.0 56833.0 7.007998 12.689506
18 금천구 255082.0 236353.0 18729.0 32970.0 7.342345 12.925255
21 관악구 525515.0 507203.0 18312.0 68082.0 3.484582 12.955291
6 동대문구 369496.0 354079.0 15417.0 54173.0 4.172440 14.661322

실습 12. 고령자 대상 마케팅을 구상 중입니다. 고령자가 가장 많은 구와, 고령자비율이 가장 높은 구를 각각 5개씩 찾으세요.

pop_Seoul.sort_values(by = '고령자',ascending=False).head(5)
구별 인구수 한국인 외국인 고령자 외국인비율 고령자비율
16 강서구 603772.0 597248.0 6524.0 72548.0 1.080540 12.015794
24 송파구 667483.0 660584.0 6899.0 72506.0 1.033584 10.862599
12 은평구 494388.0 489943.0 4445.0 72334.0 0.899091 14.631019
11 노원구 569384.0 565565.0 3819.0 71941.0 0.670725 12.634883
21 관악구 525515.0 507203.0 18312.0 68082.0 3.484582 12.955291
pop_Seoul.sort_values(by = '고령자비율',ascending=False).head(5)
구별 인구수 한국인 외국인 고령자 외국인비율 고령자비율
9 강북구 330192.0 326686.0 3506.0 54813.0 1.061806 16.600342
1 종로구 162820.0 153589.0 9231.0 25425.0 5.669451 15.615404
2 중구 133240.0 124312.0 8928.0 20764.0 6.700690 15.583909
3 용산구 244203.0 229456.0 14747.0 36231.0 6.038828 14.836427
13 서대문구 327163.0 314982.0 12181.0 48161.0 3.723221 14.720797

실습 13. CCTV 데이터와 인구 데이터 합치고 분석하기

data_result = pd.merge(CCTV_Seoul, pop_Seoul, on = '구별')
data_result.head(5)
구별 소계 2013년도 이전 2014년 2015년 2016년 최근증가율 인구수 한국인 외국인 고령자 외국인비율 고령자비율
0 강남구 2780 1292 430 584 932 1.506192 570500.0 565550.0 4950.0 63167.0 0.867660 11.072217
1 강동구 773 379 99 155 377 1.664908 453233.0 449019.0 4214.0 54622.0 0.929765 12.051638
2 강북구 748 369 120 138 204 1.252033 330192.0 326686.0 3506.0 54813.0 1.061806 16.600342
3 강서구 884 388 258 184 81 1.347938 603772.0 597248.0 6524.0 72548.0 1.080540 12.015794
4 관악구 1496 846 260 390 613 1.492908 525515.0 507203.0 18312.0 68082.0 3.484582 12.955291

실습 14. data_result 에서, 다음 4개의 컬럼을 모두 버려 버립니다.

‘2013년도 이전’, 2014년’, ‘2015년’, ‘2016년’

data_result.drop(['2013년도 이전','2014년','2015년','2016년'],axis=1,inplace = True)
data_result.head(5)
구별 소계 최근증가율 인구수 한국인 외국인 고령자 외국인비율 고령자비율
0 강남구 2780 1.506192 570500.0 565550.0 4950.0 63167.0 0.867660 11.072217
1 강동구 773 1.664908 453233.0 449019.0 4214.0 54622.0 0.929765 12.051638
2 강북구 748 1.252033 330192.0 326686.0 3506.0 54813.0 1.061806 16.600342
3 강서구 884 1.347938 603772.0 597248.0 6524.0 72548.0 1.080540 12.015794
4 관악구 1496 1.492908 525515.0 507203.0 18312.0 68082.0 3.484582 12.955291

실습 15-1. dara_result 의 인덱스를, ‘구별’ 로 바꿔 줍니다.

data_result = data_result.set_index('구별')
data_result.head(5)
소계 최근증가율 인구수 한국인 외국인 고령자 외국인비율 고령자비율
구별
강남구 2780 1.506192 570500.0 565550.0 4950.0 63167.0 0.867660 11.072217
강동구 773 1.664908 453233.0 449019.0 4214.0 54622.0 0.929765 12.051638
강북구 748 1.252033 330192.0 326686.0 3506.0 54813.0 1.061806 16.600342
강서구 884 1.347938 603772.0 597248.0 6524.0 72548.0 1.080540 12.015794
관악구 1496 1.492908 525515.0 507203.0 18312.0 68082.0 3.484582 12.955291

실습 15-2. 이 데이터프레임을 csv 파일로 저장합니다.

파일명은, CCTV_result.csv 입니다.

data_result.to_csv('CCTV_result')

실습 16. 상관 관계 분석에 대해서 알아봅니다.

https://ko.wikipedia.org/wiki/%EC%83%81%EA%B4%80_%EB%B6%84%EC%84%9D

상관계수는 -1부터 1까지의 값을 갖는다.1일 때 완벽한 양의 상관관계가 되고, -1일 때 완벽한 음의 상관관계가 된다. 0이라면 별다른 상관관계가 없음을 의미한다.

상관계수가 0.1 이하면 관계가 없고, 0.3 이하면 약한관계 입니다

실습 17. CCTV의 갯수와 고령자 비율의 상관관계를 분석하세요.

data_result[['소계','고령자비율']].corr()
소계 고령자비율
소계 1.000000 -0.280786
고령자비율 -0.280786 1.000000
sb.regplot(data = data_result,x='소계',y='고령자비율')
plt.show()

1

실습 18. CCTV의 갯수와 외국인 비율의 상관관계를 분석하세요.

data_result[['소계','외국인비율']].corr()
소계 외국인비율
소계 1.000000 -0.136074
외국인비율 -0.136074 1.000000
sb.regplot(data = data_result,x='소계',y='외국인비율')
plt.show()

2

실습 19. CCTV의 갯수와 인구수의 상관관계를 분석하세요.

data_result[['소계','인구수']].corr()
소계 인구수
소계 1.000000 0.306342
인구수 0.306342 1.000000
sb.regplot(data = data_result,x='소계',y='인구수')
plt.show()

41

실습 20. 각 구의 CCTV의 갯수를 bar로 나타내세요.

pandas dataframe.plot 함수 사용

data_result.head(5)
소계 최근증가율 인구수 한국인 외국인 고령자 외국인비율 고령자비율
구별
강남구 2780 1.506192 570500.0 565550.0 4950.0 63167.0 0.867660 11.072217
강동구 773 1.664908 453233.0 449019.0 4214.0 54622.0 0.929765 12.051638
강북구 748 1.252033 330192.0 326686.0 3506.0 54813.0 1.061806 16.600342
강서구 884 1.347938 603772.0 597248.0 6524.0 72548.0 1.080540 12.015794
관악구 1496 1.492908 525515.0 507203.0 18312.0 68082.0 3.484582 12.955291

실습 21. 각 구의 CCTV의 갯수를, 먼저 소팅(큰순)한 후, bar로 나타내세요.

# 데이터 프레임의 plot 함수는 x축에는 인덱스 셋팅 , y축에는 컬럼의 값을 세팅한다.
data_result.plot()

plt.show()

14

data_result['소계'].sort_values(ascending=False).plot(kind = 'bar')

plt.show()

132

plt.figure(figsize =(10,8))
data_result['소계'].sort_values(ascending=False).plot(kind = 'barh')

plt.show()

3441

# 한국인수와 고령자수를 바 차트로 표시
data_result[['한국인','고령자']].sort_values('한국인',ascending = False).plot(kind = 'bar')
plt.show()

341

실습 22. 인구 한명당 CCTV의 비율을 계산하고, 이를 각 구별로 CCTV비율이 얼마인지 bar로 나타내세요.

(data_result['소계'] / data_result['인구수']).sort_values(ascending=False).plot(kind = 'bar')

plt.show()

1sd

실습 23. 인구수와 CCTV갯수가 어떤 분포인지, scatter로 나타내세요.

plt.scatter(data = data_result,x='인구수',y='소계')

plt.show()

1fdd

sb.regplot(data = data_result, x= '인구수',y='소계')

plt.show()

1r11

댓글남기기