서울시 CCTV 현황 데이터 분석_2

YJ·2023년 3월 29일
0

▷ 오늘 학습 계획: EDA 강의(CCTV 3~5)

데이터 읽기

Pandas로 CSV(comma-separated variables) 파일 읽기

column의 이름 조회, 변경

Pandas로 엑셀 파일 읽기

  • 자료를 읽기 시작할 행(header)을 지정
  • 읽어올 엑셀의 칼럼 지정(usecols)

column의 이름 조회, 변경

데이터 훑어보기

CCTV 데이터 조회

CCTV_Seoul.head()
CCTV_Seoul.tail()

CCTV 개수 정렬

CCTV_Seoul.sort_values(by="소계", ascending=True).head(5)
CCTV_Seoul.sort_values(by="소계", ascending=False).head(5)

CCTV 증가율

CCTV_Seoul["최근증가율"]=(
(CCTV_Seoul["2016년"]+CCTV_Seoul["2015년"]+CCTV_Seoul["2014년"]) / CCTV_Seoul["2013년도 이전"] * 100
)

인구현황 데이터

pop_Seoul.head()
pop_Seoul.tail()

첫 행의 합계 데이터 지우기

pop_Seoul.drop([0], axis=0, inplace=True)

unique 조사

pop_Seoul["구별"].unique()
len(pop_Seoul["구별"].unique())

외국인비율, 고령자비율 컬럼 생성하기

pop_Seoul["외국인비율"]=pop_Seoul["외국인"] / pop_Seoul["인구수"] * 100
pop_Seoul["고령자비율"]=pop_Seoul["고령자"] / pop_Seoul["인구수"] * 100

인구수, 외국인, 고령자가 많은 구

pop_Seoul.sort_values(["인구수"], ascending=False).head(5)
pop_Seoul.sort_values(["외국인"], ascending=False).head(5)
pop_Seoul.sort_values(by="고령자", ascending=False).head(5)

외국인 비율, 고령자 비율이 높은 구

pop_Seoul.sort_values(["외국인비율"], ascending=False).head(5)
pop_Seoul.sort_values(by="고령자비율", ascending=False).head(5)

Pandas 데이터 합치기

"구별"을 키값으로 CCTV_Seoul, pop_Seoul 데이터 병합

data_result = pd.merge(CCTV_Seoul, pop_Seoul, on ="구별")

년도별 데이터 컬럼 삭제

del data_result["2013년도 이전"]
del data_result["2014년"]
data_result.drop(["2015년", "2016년"], axis = 1, inplace=True)

인덱스 변경

data_result.set_index("구별", inplace=True)

상관계수 구하기

data_result.corr()

CCTV비율 컬럼 만들기

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

인구 대비 CCTV 비율

data_result.sort_values(by="CCTV비율", ascending=False).head()
data_result.sort_values(by="CCTV비율", ascending=True).head()

그래프로 표현하기

'소계' 컬럼 시각화

data_result["소계"].plot(kind="barh", grid=True, figsize=(10,10));

한 눈에 보기 쉽게 정렬 후 시각화

def drawGraph():
    data_result["소계"].sort_values().plot(
        kind="barh", grid=True, title="가장 CCTV가 많은 구", figsize=(10,10));    
drawGraph()

'CCTV 비율' 컬럼 시각화

def drawGraph():
    data_result["CCTV비율"].sort_values().plot(
        kind="barh", grid=True, title="CCTV 비율이 높은 구", figsize=(10,10));    
drawGraph()

데이터 경향 그리기

인구수와 소계 컬럼으로 scatter plot 그리기

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

Numpy를 이용한 1차 직선 만들기

import numpy as np
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
f1 = np.poly1d(fp1)
# 경향선을 그리기 위한 x 데이터 생성
fx = np.linspace(100000, 700000, 100)
def drawGraph():
    plt.figure(figsize=(14,10))
    plt.scatter(data_result["인구수"], data_result["소계"], s=50)
    plt.plot(fx, f1(fx), ls="dashed", lw=3, color='g')
    plt.xlabel("인구수")
    plt.ylabel("CCTV")
    plt.grid(True)
    plt.show()
drawGraph()

경향에서 벗어난 데이터 강조하기

그래프 다듬기

경향(trenda)과의 오차 만들기: f1 함수에 해당 인구 입력

data result['오차'] = data_result['소계'] - f1(data_result['인구수'])

경향과 비교해서 데이터의 오차가 너무 나는 데이터를 계산하기

df_sort_f = data_result.sort_values(by="오차", ascending = False)
df_sort_t = data_result.sort_values(by="오차", ascending = True)

colormap 을 사용자 정의(user define)로 세팅

from matplotlib.colors import ListedColormap
color_step = ["#e74c3c", "#2ecc71", "#95a5a6", "#2ecc71", "#3498db", "#3498db"]
my_cmap = ListedColormap(color_step)

오차가 큰 데이터 상위/하위 5개 마커 옆에 구 이름 명시하기

  • plt.scatter()
    s: 마커의 크기
    c: color 세팅에 경향과의 오차를 적용
    cmap: 사용자 정의 맵 적용
  • plt.text(X, Y, Text, 설정)
    text: 그래프에 글자 그리기
    x, y 데이터에 1.02, 0.98 곱하기: 구 이름이 마커에 겹치지 않게

데이터 저장

data_result.to_csv("../data/01. CCTV_result.csv", sep=",", encoding="utf-8")

📝 생소해서 그런지 numpy의 polyfit, poly1d, linspace를 이용해서 데이터 경향을 나타내는 부분이랑 ListedColormap이 어려웠다.

▷ 내일 학습 계획: EDA 강의(범죄 1~3)

[이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.]

0개의 댓글