프로젝트 1 - 서울시 CCTV 현황 분석 (2)

Jungmin·2022년 10월 12일
1

데이터 분석

목록 보기
2/24

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()   #데이터 25개 파악
기관명 소계 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
# 소계 부분 기준 확인-오름차순  #ascending=True는 디폴트 값
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값 기준 병합 , 공통된 값만 출력 / how="inner" (교집합 출력)은 디폴트 값
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")  #left의 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")  #right의 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")  #how="outer" : 합집합으로 모든 값 출력
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
  • drop()
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
profile
데이터분석 스터디노트🧐✍️

0개의 댓글