제로베이스 데이터 취업 스쿨 과정 학습 내용을 정리한 포스팅입니다.

 

📍 분석용 데이터 준비

데이터셋 : 서울시 구별 CCTV 수, 서울시 구별 인구수

import pandas as pd
cctv_df = pd.read_csv("/content/drive/MyDrive/zerobase/seoul/01. Seoul_CCTV.csv", encoding="utf-8")

cctv_df.head()

 

cctv_df.rename(columns={cctv_df.columns[0]: "구별"},inplace=True)

- df.rename 이용하여 첫번째 컬럼명을 "구별"로 바꾼다.

 

 

pop_df = pd.read_excel(
    "/content/drive/MyDrive/zerobase/seoul/01. Seoul_Population.xls", header=2, usecols="B, D, G, J, N" 
)

pop_df.head()

 

 

pop_df.rename(
    columns={
        pop_df.columns[0] : "구별",
        pop_df.columns[1] : "인구수",
        pop_df.columns[2] : "한국인",
        pop_df.columns[3] : "외국인",
        pop_df.columns[4] : "고령자",  
    },
    inplace=True
)

- 인구수 데이터에도 컬럼명을 변경해준다.

 

 

data_result = pd.merge(cctv_df, pop_df, on="구별") # how="inner" 가 기본값

data_result.head()

- pd.merge 로 "구별"을 기준으로 두 데이터셋을 합쳐준다.

 


 

📍 데이터 분석 시각화

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

- df.sort_values() 로 내림차순 정렬하고, kind='barh'로 막대 수평그래프를 그려준다.

- CCTV 수 그래프로 시각화

 

 

import numpy as np

fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1) # y절편과, 기울기를 구해줌 (1 차식)

f1 = np.poly1d(fp1)

- np.polyfit은 x, y 값을 넣으면 y절편과 기울기를 반환해준다.

- np.poly1d()를 하면 그 y절편과 기울기를 바탕으로 직선 함수를 반환한다.

 

 

 

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)

df_sort_f.head()

- f1()에 인구수 컬럼을 넣어 직선(경향)을 구해주고, 실제 소계값에서 이 f1 값을 뺀 "오차" 컬럼을 만든다.

- 전체 데이터셋을 오차를 기준으로 정렬한 데이터프레임을 선언해준다.

 

 

from matplotlib.colors import ListedColormap

color_step = ['#e74c3c', '#2ecc71', '#95aa56', '#2ecc71', '#3498db', '#3498db']
my_cmap = ListedColormap(color_step)

- 그래프를 그릴 때, 색상을 설정하는 부분이다. 이 컬러맵을 my_cmap으로 저장해둔다.

 

 

 

def drawGraph():
  plt.figure(figsize=(14, 10))
  plt.scatter(data_result["인구수"], data_result["소계"], 
              c=data_result["오차"], s=50, cmap=my_cmap) # c= 색깔을 다르게 할 기준 설정, cmap = 색깔 종류
              
  plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g")
  
  for n in range(5):
    plt.text(
        df_sort_f["인구수"][n] * 1.02,
        df_sort_f["소계"][n] * 0.98,
        df_sort_f.index[n],
        fontsize=15,
    )

    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.colorbar()
  plt.grid()
  plt.show()

drawGraph()

 

- plt.scatter로 x, y값의 산포도를 그린다.

- c=오차, cmap=my_cmap 으로 설정하면 산포도의 점들을 오차를 기준으로 색을 달리해 표현한다. (색을 6개 저장했으므로 6개 구역으로 표현)

- plt.text 를 이용해 오차 순위가 높은 5개 구, 낮은 5개 구에 구 이름을 적는다.

 

 

이로써 서울시의 구별 CCTV 수 경향성, 그리고

구 중에서 인구대비 CCTV 수가 많은 구와 적은 구를 파악할 수 있다.

 

+ Recent posts