pop_Seoul["외국인비율"] = pop_Seoul["외국인"]/pop_Seoul["인구수"]*100
pop_Seoul["고령자비율"] = pop_Seoul["고령자"]/pop_Seoul["인구수"]*100
pop_Seoul.head()
서울 CCTV 데이터와 서울 인구현황 데이터 Merge
(*주의 Merge하는 기준 column 이름 동일하게 할 것)
data_result = pd.merge(CCTV_Seoul, pop_Seoul, on="구별")
모든 년도 데이터는 불필요하다 판단하여 삭제
#컬럼 삭제 방법 두가지 : del, drop()
del data_result["2013년도 이전"]
data_result.drop(["2014년", "2015년", "2016년"], axis =1, inplace=True)
#index를 "구별" 기준으로 변경한 후 저장:
data_result.set_index("구별", inplace=True)
각 구마다 인구 대비 별 몇대의 CCTV가 설치되어 있는지 확인
data_result["CCTV비율"]= data_result["소계"]/data_result["인구수"] * 100
#CCTV비율이 높은 상위 5개 구
data_result= data_result.sort_values(by="CCTV비율", ascending=True).head()
#CCTV비율이 낮은 하위 5개 구
data_result= data_result.sort_values(by="CCTV비율", ascending=False).head()
CCTV비율이 높은 상위 5개 구:
CCTV비율이 낮은 하위 5개 구:
가장 CCTV가 많은 구:
import matplotlib.pyplot as plt
from matplotlib import rc
plt.rcParams["axes.unicode_minus"] = False #마이너스 부호 때문에 한글이 깨질 수 있어서 주는 설정
rc("font", family="Arial Unicode MS") # Windows: Malgun Gothic
%matplotlib inline
def drawGraph():
data_result["소계"].sort_values().plot(
kind="barh",
title="가장 CCTV가 많은 구",
grid=True,
figsize=(10, 10)
);
drawGraph()
가장 CCTV비율이 높은 구
def drawGraph():
data_result["CCTV비율"].sort_values().plot(
kind = "barh",
title = "가장 CCTV비율이 높은 구",
grid = True,
figsize = (10, 10)
);
drawGraph()
데이터의 경향 표시
plt.figure(figsize=(14, 10))
plt.scatter(data_result["인구수"], data_result["소계"], s=50)
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.show()
import numpy as np
# 1차원 계수 계산
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
# 생성된 1차원에 계수 적용
f1 = np.poly1d(fp1)
# linearly spaced : 어느 위치(100000)에서 어느 위치(700000)까지 어느 정도의 간격(100)으로 포인트를 찍은 것인지
fx = np.linspace(100000, 700000, 100)/
# 그래프 그릴 크기 설정
plt.figure(figsize=(14, 10))
# .scatter(가로에 들어갈 데이터, 새로에 들어갈 데이터, scatter plot point size)
plt.scatter(data_result["인구수"], data_result["소계"], s=50)
# .plot(시작 위치, 계수가 적용된 1차함수, 라인 스타일, 라인 색)
plt.plot(fx, f1(fx), ls="--", lw=3, color="g")
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.grid(True)
plt.show()
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
f1 = np.poly1d(fp1)
fx = np.linspace(100000,700000, 100)
data_result["오차"] = data_result["소계"] - f1(data_result["인구수"])
data_result.head(2)
# 경향과 비교해서 데이터의 오차가 너무 나는 데이터
df_sort_f = data_result.sort_values(by="오차", ascending=False) #내림차순
df_sort_t = data_result.sort_values(by="오차", ascending=True) #오름차순
from matplotlib.colors import ListedColormap
color_step = ["#140511", "#002afc", "#a8fc00", "#fcbd00", "#fc7200", "#fc0000"]
my_cmap = ListedColormap(color_step)
plt.figure(figsize=(14, 10))
plt.scatter(data_result["인구수"], data_result["소계"], c=data_result["오차"], s = 50, cmap=my_cmap)
plt.plot(fx, f1(fx), ls="--", lw = 3, color = "g")
############
####
for n in range(5):
#상위 5개
plt.text(
df_sort_f["인구수"][n] * 1.02,
df_sort_f["소계"][n] * 0.98,
df_sort_f.index[n],
fontsize=15
)
#하위 5개
plt.text(
df_sort_t["인구수"][n] * 1.02,
df_sort_t["소계"][n] * 0.98,
df_sort_t.index[n],
fontsize=15
)
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.grid=True
plt.colorbar()
plt.show()