
【서울시 CCTV 현황 데이터 분석】
실습 목표
import pandas as pd
CCTV_Seoul = pd.read_csv("../data/01. Seoul_CCTV.csv")
encoding='utf-8'로 옵션을 설정해 준다. CCTV_Seoul.rename(columns={"기관명": "구별"}, inplace=True)
CCTV_Seoul.head()

popul_seoul = pd.read_excel(
"../data/01. Seoul_Population.xls", header=2, usecols="B, D, G, J, N"
)

header는 자료를 읽기 시작할 행을 지정한다. popul_seoul.rename(
columns={
popul_seoul.columns[0]: "구별",
popul_seoul.columns[1]: "인구수",
popul_seoul.columns[2]: "한국인",
popul_seoul.columns[3]: "외국인",
popul_seoul.columns[4]: "고령자"
},
inplace=True
)

CCTV_Seoul.sort_values(by='소계', ascending=False).head()

CCTV_Seoul["최근증가율"] = (
(CCTV_Seoul["2014년"] + CCTV_Seoul["2015년"] + CCTV_Seoul["2016년"]) / CCTV_Seoul["2013년도 이전"] * 100
)
CCTV_Seoul.sort_values(by='최근증가율', ascending=False).head()

popul_seoul.drop([0], inplace=True)
popul_seoul.head()

popul_seoul["외국인비율"] = popul_seoul["외국인"] / popul_seoul["인구수"] * 100
popul_seoul["고령자비율"] = popul_seoul["고령자"] / popul_seoul["인구수"] * 100
popul_seoul.head()

merge_data = pd.merge(CCTV_Seoul, popul_seoul, on="구별")

del merge_data["2013년도 이전"]
del merge_data["2014년"]
merge_data.drop(["2015년", "2016년"], axis=1, inplace=True)
set_index()이다. merge_data.set_index("구별", inplace=True)
merge_data.head()

merge_data.corr()

merge_data["CCTV비율"] = merge_data["소계"] / merge_data["인구수"] * 100

merge_data["인구수"].plot(kind="bar", figsize=(10, 6))
merge_data["인구수"].plot(kind="barh", figsize=(10, 9))

def drawGraph():
merge_data["소계"].sort_values().plot(
kind="barh", grid=True, title="가장 CCTV가 많은 구", figsize=(10, 9)
)
drawGraph()
def drawGraph():
merge_data["CCTV비율"].sort_values().plot(
kind="barh", grid=True, title="인구대비 CCTV비율이 가장 높은 구", figsize=(10, 9)
)
drawGraph()

def drawGraph():
plt.figure(figsize=(14, 10))
plt.scatter(merge_data["인구수"], merge_data["소계"], s=50)
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.grid(True)
plt.show()
drawGraph()

numpy를 이용해 1차 직선 만들기
np.polyfit() : 직선을 구성하기 위한 계수(기울기와 y절편)를 계산np.poly1d(): polyfit으로 찾은 계수로 파이썬에서 사용할 수 있는 함수로 만들어주는 역할 import numpy as np
pf1 = np.polyfit(merge_data["인구수"], merge_data["소계"], 1)
// array([1.11155868e-03, 1.06515745e+03])
f1 = np.poly1d(pf1)
// poly1d([1.11155868e-03, 1.06515745e+03])
인구가 40만인 구에서 서울시의 전체 경향에 맞는 적당한 CCTV 수는?
np.linspace(a, b, n): a부터 b까지 n개의 등간격 데이터 생성 fx = np.linspace(100000, 700000, 100) // 100,000과 700,000 사이에 100개의 수 생성
def drawGraph():
plt.figure(figsize=(14, 10))
plt.scatter(merge_data["인구수"], merge_data["소계"], s=50)
plt.plot(
fx, f1(fx), ls="dashed", lw=3, color="g"
)
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.grid()
plt.show()
drawGraph()

그래프 다듬기
merge_data["오차"] = merge_data["소계"] - f1(merge_data["인구수"])
df_sort_desc = merge_data.sort_values(by="오차", ascending=False)
df_sort_asc = merge_data.sort_values(by="오차")
경향에서 벗어난 데이터 강조하기
text() : 그래프에 글자를 그리는 함수 from matplotlib.colors import ListedColormap
#colormap 을 사용자 정의(user define)로 세팅
color_step = ["#e74c3c", "#2ecc71", "#95a9a6", "#2ecc71", "#3498db", "#3498db"]
my_cmap = ListedColormap(color_step)
def drawGraph():
plt.figure(figsize=(14, 10))
plt.scatter(
merge_data["인구수"], merge_data["소계"],
s=50, c=merge_data["오차"], cmap=my_cmap
)
plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g")
for n in range(5):
// 상위 5개 (text가 점을 가리지 않도록 살짝 우측(*1.02) 아래(*0.98)로 이동)
plt.text(
df_sort_desc["인구수"][n] * 1.02, # x 좌표
df_sort_desc["소계"][n] * 0.98, # y 좌표
df_sort_desc.index[n], # title
fontsize=15,
)
// 하위 5개
plt.text(
df_sort_asc["인구수"][n] * 1.02,
df_sort_asc["소계"][n] * 0.98,
df_sort_asc.index[n],
fontsize=15
)
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.colorbar()
plt.grid()
plt.show()
drawGraph()
