2. CCTV 데이터 훑어보기
import pandas as pd
CCTV_Seoul = pd.read_csv("../data/01. Seoul_CCTV.csv")
CCTV_Seoul.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 |
CCTV_Seoul.tail()
|
기관명 |
소계 |
2013년도 이전 |
2014년 |
2015년 |
2016년 |
20 |
용산구 |
2096 |
1368 |
218 |
112 |
398 |
21 |
은평구 |
2108 |
1138 |
224 |
278 |
468 |
22 |
종로구 |
1619 |
464 |
314 |
211 |
630 |
23 |
중구 |
1023 |
413 |
190 |
72 |
348 |
24 |
중랑구 |
916 |
509 |
121 |
177 |
109 |
CCTV_Seoul.sort_values(by="소계", ascending=True).head(5)
|
기관명 |
소계 |
2013년도 이전 |
2014년 |
2015년 |
2016년 |
9 |
도봉구 |
825 |
238 |
159 |
42 |
386 |
2 |
강북구 |
831 |
369 |
120 |
138 |
204 |
5 |
광진구 |
878 |
573 |
78 |
53 |
174 |
3 |
강서구 |
911 |
388 |
258 |
184 |
81 |
24 |
중랑구 |
916 |
509 |
121 |
177 |
109 |
CCTV_Seoul.sort_values(by="소계", ascending=False).head(5)
|
기관명 |
소계 |
2013년도 이전 |
2014년 |
2015년 |
2016년 |
0 |
강남구 |
3238 |
1292 |
430 |
584 |
932 |
18 |
양천구 |
2482 |
1843 |
142 |
30 |
467 |
14 |
서초구 |
2297 |
1406 |
157 |
336 |
398 |
4 |
관악구 |
2109 |
846 |
260 |
390 |
613 |
21 |
은평구 |
2108 |
1138 |
224 |
278 |
468 |
CCTV_Seoul["최근 증가율"] = (
(CCTV_Seoul["2016년"]+CCTV_Seoul["2015년"]+CCTV_Seoul["2014년"]) / CCTV_Seoul["2013년도 이전"] * 100
)
CCTV_Seoul.sort_values(by="최근 증가율", ascending=False).head(5)
|
기관명 |
소계 |
2013년도 이전 |
2014년 |
2015년 |
2016년 |
최근 증가율 |
22 |
종로구 |
1619 |
464 |
314 |
211 |
630 |
248.922414 |
9 |
도봉구 |
825 |
238 |
159 |
42 |
386 |
246.638655 |
12 |
마포구 |
980 |
314 |
118 |
169 |
379 |
212.101911 |
8 |
노원구 |
1566 |
542 |
57 |
451 |
516 |
188.929889 |
1 |
강동구 |
1010 |
379 |
99 |
155 |
377 |
166.490765 |
3. 인구현황 데이터 훑어보기
pop_Seoul = pd.read_excel(
"../data/01. Seoul_Population.xls", header=2, usecols="B, D, G, J, N "
)
pop_Seoul.rename(
columns={
pop_Seoul.columns[0]: "구별",
pop_Seoul.columns[1]: "인구수",
pop_Seoul.columns[2]: "한국인",
pop_Seoul.columns[3]: "외국인",
pop_Seoul.columns[4]: "고령자"
},
inplace=True
)
pop_Seoul.head()
|
구별 |
인구수 |
한국인 |
외국인 |
고령자 |
0 |
합계 |
10124579 |
9857426 |
267153 |
1365126 |
1 |
종로구 |
164257 |
154770 |
9487 |
26182 |
2 |
중구 |
134593 |
125709 |
8884 |
21384 |
3 |
용산구 |
244444 |
229161 |
15283 |
36882 |
4 |
성동구 |
312711 |
304808 |
7903 |
41273 |
pop_Seoul.drop([0], axis=0, inplace=True)
pop_Seoul.head()
|
구별 |
인구수 |
한국인 |
외국인 |
고령자 |
1 |
종로구 |
164257 |
154770 |
9487 |
26182 |
2 |
중구 |
134593 |
125709 |
8884 |
21384 |
3 |
용산구 |
244444 |
229161 |
15283 |
36882 |
4 |
성동구 |
312711 |
304808 |
7903 |
41273 |
5 |
광진구 |
372298 |
357703 |
14595 |
43953 |
- unique 메소드 : 한번이라도 등장한 데이터 어떤 것이 있는지 중복되지 않고 보여줌
pop_Seoul["구별"].unique()
array(['종로구', '중구', '용산구', '성동구', '광진구', '동대문구', '중랑구', '성북구', '강북구',
'도봉구', '노원구', '은평구', '서대문구', '마포구', '양천구', '강서구', '구로구', '금천구',
'영등포구', '동작구', '관악구', '서초구', '강남구', '송파구', '강동구'], dtype=object)
len(pop_Seoul["구별"].unique())
25
pop_Seoul["외국인 비율"]= pop_Seoul["외국인"] / pop_Seoul["인구수"] * 100
pop_Seoul["고령자 비율"]= pop_Seoul["고령자"] / pop_Seoul["인구수"] * 100
pop_Seoul.head()
|
구별 |
인구수 |
한국인 |
외국인 |
고령자 |
외국인 비율 |
고령자 비율 |
1 |
종로구 |
164257 |
154770 |
9487 |
26182 |
5.775705 |
15.939656 |
2 |
중구 |
134593 |
125709 |
8884 |
21384 |
6.600640 |
15.887899 |
3 |
용산구 |
244444 |
229161 |
15283 |
36882 |
6.252148 |
15.088118 |
4 |
성동구 |
312711 |
304808 |
7903 |
41273 |
2.527254 |
13.198448 |
5 |
광진구 |
372298 |
357703 |
14595 |
43953 |
3.920247 |
11.805865 |
pop_Seoul.sort_values(["인구수"], ascending=False).head()
|
구별 |
인구수 |
한국인 |
외국인 |
고령자 |
외국인 비율 |
고령자 비율 |
24 |
송파구 |
671173 |
664496 |
6677 |
76582 |
0.994825 |
11.410173 |
16 |
강서구 |
608255 |
601691 |
6564 |
76032 |
1.079153 |
12.500021 |
23 |
강남구 |
561052 |
556164 |
4888 |
65060 |
0.871220 |
11.596073 |
11 |
노원구 |
558075 |
554403 |
3672 |
74243 |
0.657976 |
13.303409 |
21 |
관악구 |
520929 |
503297 |
17632 |
70046 |
3.384722 |
13.446362 |
pop_Seoul.sort_values(["외국인 비율"], ascending=False).head()
|
구별 |
인구수 |
한국인 |
외국인 |
고령자 |
외국인 비율 |
고령자 비율 |
19 |
영등포구 |
402024 |
368550 |
33474 |
53981 |
8.326369 |
13.427308 |
18 |
금천구 |
253491 |
235154 |
18337 |
34170 |
7.233787 |
13.479769 |
17 |
구로구 |
441559 |
410742 |
30817 |
58794 |
6.979135 |
13.315095 |
2 |
중구 |
134593 |
125709 |
8884 |
21384 |
6.600640 |
15.887899 |
3 |
용산구 |
244444 |
229161 |
15283 |
36882 |
6.252148 |
15.088118 |
4. 두 데이터 합치기
pandas에서 데이터 프레임 병합하는 방법
- pd.concat()
- pd.merge()
- pd.join()
left = pd.DataFrame({
"key" : ["K0", "K4", "K2", "K3"],
"A" : ["A0", "A1", "A2", "A3"],
"B" : ["B0", "B1", "B2", "B3"]
})
left
|
key |
A |
B |
0 |
K0 |
A0 |
B0 |
1 |
K4 |
A1 |
B1 |
2 |
K2 |
A2 |
B2 |
3 |
K3 |
A3 |
B3 |
right = pd.DataFrame([
{"key": "K0", "C": "C0", "D":"D0"},
{"key": "K1", "C": "C1", "D":"D1"},
{"key": "K2", "C": "C2", "D":"D2"},
{"key": "K3", "C": "C3", "D":"D3"},
])
right
|
key |
C |
D |
0 |
K0 |
C0 |
D0 |
1 |
K1 |
C1 |
D1 |
2 |
K2 |
C2 |
D2 |
3 |
K3 |
C3 |
D3 |
pd.merge()
- 두 데이터 프레임에서 컬럼이나 인덱스를 기준으로 잡고 병합하는 바업ㅂ
- 기준이 되는 컬럼이나 인덱스를 key 값이라고 함.
- 기준이 되는 key 값은 두 데이터 프레임에 모두 포함되어 있어야 함.
pd.merge(left, right, on="key")
|
key |
A |
B |
C |
D |
0 |
K0 |
A0 |
B0 |
C0 |
D0 |
1 |
K2 |
A2 |
B2 |
C2 |
D2 |
2 |
K3 |
A3 |
B3 |
C3 |
D3 |
pd.merge(left, right, how="left", on="key")
|
key |
A |
B |
C |
D |
0 |
K0 |
A0 |
B0 |
C0 |
D0 |
1 |
K4 |
A1 |
B1 |
NaN |
NaN |
2 |
K2 |
A2 |
B2 |
C2 |
D2 |
3 |
K3 |
A3 |
B3 |
C3 |
D3 |
pd.merge(left, right, how="right", on="key")
|
key |
A |
B |
C |
D |
0 |
K0 |
A0 |
B0 |
C0 |
D0 |
1 |
K1 |
NaN |
NaN |
C1 |
D1 |
2 |
K2 |
A2 |
B2 |
C2 |
D2 |
3 |
K3 |
A3 |
B3 |
C3 |
D3 |
pd.merge(left, right, how="outer", on="key")
|
key |
A |
B |
C |
D |
0 |
K0 |
A0 |
B0 |
C0 |
D0 |
1 |
K4 |
A1 |
B1 |
NaN |
NaN |
2 |
K2 |
A2 |
B2 |
C2 |
D2 |
3 |
K3 |
A3 |
B3 |
C3 |
D3 |
4 |
K1 |
NaN |
NaN |
C1 |
D1 |
data_result = pd.merge(CCTV_Seoul, pop_Seoul, on="구별")
data_result.head()
|
구별 |
소계 |
2013년도 이전 |
2014년 |
2015년 |
2016년 |
최근 증가율 |
인구수 |
한국인 |
외국인 |
고령자 |
외국인 비율 |
고령자 비율 |
0 |
강남구 |
3238 |
1292 |
430 |
584 |
932 |
150.619195 |
561052 |
556164 |
4888 |
65060 |
0.871220 |
11.596073 |
1 |
강동구 |
1010 |
379 |
99 |
155 |
377 |
166.490765 |
440359 |
436223 |
4136 |
56161 |
0.939234 |
12.753458 |
2 |
강북구 |
831 |
369 |
120 |
138 |
204 |
125.203252 |
328002 |
324479 |
3523 |
56530 |
1.074079 |
17.234651 |
3 |
강서구 |
911 |
388 |
258 |
184 |
81 |
134.793814 |
608255 |
601691 |
6564 |
76032 |
1.079153 |
12.500021 |
4 |
관악구 |
2109 |
846 |
260 |
390 |
613 |
149.290780 |
520929 |
503297 |
17632 |
70046 |
3.384722 |
13.446362 |
년도 별 데이터 컬럼 삭제
del data_result["2013년도 이전"]
del data_result["2014년"]
data_result.head()
|
구별 |
소계 |
2015년 |
2016년 |
최근 증가율 |
인구수 |
한국인 |
외국인 |
고령자 |
외국인 비율 |
고령자 비율 |
0 |
강남구 |
3238 |
584 |
932 |
150.619195 |
561052 |
556164 |
4888 |
65060 |
0.871220 |
11.596073 |
1 |
강동구 |
1010 |
155 |
377 |
166.490765 |
440359 |
436223 |
4136 |
56161 |
0.939234 |
12.753458 |
2 |
강북구 |
831 |
138 |
204 |
125.203252 |
328002 |
324479 |
3523 |
56530 |
1.074079 |
17.234651 |
3 |
강서구 |
911 |
184 |
81 |
134.793814 |
608255 |
601691 |
6564 |
76032 |
1.079153 |
12.500021 |
4 |
관악구 |
2109 |
390 |
613 |
149.290780 |
520929 |
503297 |
17632 |
70046 |
3.384722 |
13.446362 |
data_result.drop(["2015년", "2016년"], axis=1, inplace=True)
data_result.head()
|
구별 |
소계 |
최근 증가율 |
인구수 |
한국인 |
외국인 |
고령자 |
외국인 비율 |
고령자 비율 |
0 |
강남구 |
3238 |
150.619195 |
561052 |
556164 |
4888 |
65060 |
0.871220 |
11.596073 |
1 |
강동구 |
1010 |
166.490765 |
440359 |
436223 |
4136 |
56161 |
0.939234 |
12.753458 |
2 |
강북구 |
831 |
125.203252 |
328002 |
324479 |
3523 |
56530 |
1.074079 |
17.234651 |
3 |
강서구 |
911 |
134.793814 |
608255 |
601691 |
6564 |
76032 |
1.079153 |
12.500021 |
4 |
관악구 |
2109 |
149.290780 |
520929 |
503297 |
17632 |
70046 |
3.384722 |
13.446362 |
인덱스 변경
- set_index()
- 선택한 컬럼을 데이터 프레임의 인덱스로 지정
data_result.set_index("구별", inplace=True)
data_result.head()
|
소계 |
최근 증가율 |
인구수 |
한국인 |
외국인 |
고령자 |
외국인 비율 |
고령자 비율 |
구별 |
|
|
|
|
|
|
|
|
강남구 |
3238 |
150.619195 |
561052 |
556164 |
4888 |
65060 |
0.871220 |
11.596073 |
강동구 |
1010 |
166.490765 |
440359 |
436223 |
4136 |
56161 |
0.939234 |
12.753458 |
강북구 |
831 |
125.203252 |
328002 |
324479 |
3523 |
56530 |
1.074079 |
17.234651 |
강서구 |
911 |
134.793814 |
608255 |
601691 |
6564 |
76032 |
1.079153 |
12.500021 |
관악구 |
2109 |
149.290780 |
520929 |
503297 |
17632 |
70046 |
3.384722 |
13.446362 |
상관계수
- corr()
- correlation의 약자
- 상관계수가 0.2이상인 데이터를 비교
- 문자열 포함 데이터는 연산 되지 않음
data_result.corr()
|
소계 |
최근 증가율 |
인구수 |
한국인 |
외국인 |
고령자 |
외국인 비율 |
고령자 비율 |
소계 |
1.000000 |
-0.264378 |
0.232555 |
0.227852 |
0.030421 |
0.163905 |
-0.045956 |
-0.267841 |
최근 증가율 |
-0.264378 |
1.000000 |
-0.097165 |
-0.086341 |
-0.156421 |
-0.072251 |
-0.047102 |
0.190396 |
인구수 |
0.232555 |
-0.097165 |
1.000000 |
0.998151 |
-0.167243 |
0.936737 |
-0.601076 |
-0.637414 |
한국인 |
0.227852 |
-0.086341 |
0.998151 |
1.000000 |
-0.226853 |
0.936155 |
-0.645463 |
-0.628360 |
외국인 |
0.030421 |
-0.156421 |
-0.167243 |
-0.226853 |
1.000000 |
-0.175318 |
0.838612 |
-0.021147 |
고령자 |
0.163905 |
-0.072251 |
0.936737 |
0.936155 |
-0.175318 |
1.000000 |
-0.620300 |
-0.348840 |
외국인 비율 |
-0.045956 |
-0.047102 |
-0.601076 |
-0.645463 |
0.838612 |
-0.620300 |
1.000000 |
0.242816 |
고령자 비율 |
-0.267841 |
0.190396 |
-0.637414 |
-0.628360 |
-0.021147 |
-0.348840 |
0.242816 |
1.000000 |
data_result["CCTV비율"] = data_result["소계"] / data_result["인구수"]
data_result["CCTV비율"] = data_result["CCTV비율"] * 100
data_result.head()
|
소계 |
최근 증가율 |
인구수 |
한국인 |
외국인 |
고령자 |
외국인 비율 |
고령자 비율 |
CCTV비율 |
구별 |
|
|
|
|
|
|
|
|
|
강남구 |
3238 |
150.619195 |
561052 |
556164 |
4888 |
65060 |
0.871220 |
11.596073 |
0.577130 |
강동구 |
1010 |
166.490765 |
440359 |
436223 |
4136 |
56161 |
0.939234 |
12.753458 |
0.229358 |
강북구 |
831 |
125.203252 |
328002 |
324479 |
3523 |
56530 |
1.074079 |
17.234651 |
0.253352 |
강서구 |
911 |
134.793814 |
608255 |
601691 |
6564 |
76032 |
1.079153 |
12.500021 |
0.149773 |
관악구 |
2109 |
149.290780 |
520929 |
503297 |
17632 |
70046 |
3.384722 |
13.446362 |
0.404854 |
data_result.sort_values(by="CCTV비율", ascending=False).head()
|
소계 |
최근 증가율 |
인구수 |
한국인 |
외국인 |
고령자 |
외국인 비율 |
고령자 비율 |
CCTV비율 |
구별 |
|
|
|
|
|
|
|
|
|
종로구 |
1619 |
248.922414 |
164257 |
154770 |
9487 |
26182 |
5.775705 |
15.939656 |
0.985651 |
용산구 |
2096 |
53.216374 |
244444 |
229161 |
15283 |
36882 |
6.252148 |
15.088118 |
0.857456 |
중구 |
1023 |
147.699758 |
134593 |
125709 |
8884 |
21384 |
6.600640 |
15.887899 |
0.760069 |
강남구 |
3238 |
150.619195 |
561052 |
556164 |
4888 |
65060 |
0.871220 |
11.596073 |
0.577130 |
금천구 |
1348 |
100.000000 |
253491 |
235154 |
18337 |
34170 |
7.233787 |
13.479769 |
0.531774 |