plt.plot(t, t, 'r--')
plt.plot(t, t, 'bs')
plt.plot(t, t, 'g>')



0. 시작

conda activate ds_study
cd Documents
ls
cd ds_study
jupyter notebook
source_code>new file

1. 데이터 준비 및 가공

  1. CCTV_Seoul
import pandas as pd
CCTV_Seoul = pd.read_csv("../data/01. Seoul_CCTV.csv", encoding="utf-8")

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

CCTV_Seoul["최근증가율"] = (
    (CCTV_Seoul["2016년"] + CCTV_Seoul["2015년"] + CCTV_Seoul["2014년"]) / CCTV_Seoul["2013년도 이전"] * 100
)
CCTV_Seoul.sort_values(by="최근증가율", ascending=False).head()
  1. pop_Seoul
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.drop([0], axis=0, inplace=True)

# 외국인비율, 고령자비율
pop_Seoul["외국인비율"] = pop_Seoul["외국인"] / pop_Seoul["인구수"] * 100
pop_Seoul["고령자비율"] = pop_Seoul["고령자"] / pop_Seoul["인구수"] * 100
  1. data_result
data_result = pd.merge(CCTV_Seoul, pop_Seoul, on="구별")

# 년도별 데이터 컬럼 삭제
data_result.drop(["2013년도 이전", "2014년", "2015년", "2016년"], axis=1, inplace=True)

# 인덱스 변경
data_result.set_index("구별", inplace=True)

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

2. 데이터시각화

  1. 그래프 그리기
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc

plt.rcParams["axes.unicode_minus"] = False
rc("font", family="Arial Unicode MS")
%matplotlib inline
# 인구수 막대그래프
data_result["인구수"].plot(kind="bar", figsize=(6,4));

# 소계(CCTV 개수)
data_result["소계"].sort_values().plot(
    kind="barh", 
    grid=True, 
    title="CCTV가 가장 많은 구",
    figsize=(6,5));
    
# 인구수 대비 CCTV비율
data_result["CCTV비율"].sort_values().plot(
    kind="barh", 
    grid=True, 
    title="인구수 대비 CCTV비율",
    figsize=(6,5));  



  1. 인구수, 소계 scatter 그리기
# numpy를 이용한 1차직선 만들기
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
f1 = np.poly1d(fp1)

# 경향선 그리기 위한 x데이터 생성
fx = np.linspace(100000, 700000, 100)

# 데이터 강조
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", "#95a9a6", "#2ecc71", "#3498db", "#3498db"]
my_cmap = ListedColormap(color_step)
def drawGraph():
    plt.figure(figsize=(10,5))
    plt.scatter(data_result["인구수"],data_result["소계"], s=50, c=data_result["오차"], cmap=my_cmap)
    plt.plot(fx, f1(fx), ls="dashed", 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=10
        )
        
        # 하위 5개
        plt.text(
            df_sort_t["인구수"][n]*1.02,
            df_sort_t["소계"][n]*0.98,
            df_sort_t.index[n],
            fontsize=10
        )    
    
    plt.xlabel("인구수")
    plt.ylabel("소계")
    plt.grid(True)
    plt.colorbar()
    plt.show()

drawGraph() 

3. 데이터 저장

data_result.to_csv("../data/01. CCTV_result_practice2.csv", sep=",", encoding="utf-8")
profile
21세기 주인공

0개의 댓글