본문 바로가기

Python-머신러닝

범죄율 예측: pd.to_datetime(), dt.weekday,

반응형

데이터 출처:  https://www.kaggle.com/currie32/crimes-in-chicago

ㄴ 2005-2007만 작업하기로 함.

ㄴ 구글 드라이브 Colab Notebook에 파일 업로드 해놓음.

 

작업확경: Colab Notebook

 

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt
import random
import seaborn as sns
from fbprophet import Prophet

from google.colab import drive
drive.mount('/content/drive')

 

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')

 

chicago_df_1 =  pd.read_csv('Chicago_Crimes_2005_to_2007.csv',  error_bad_lines = False,index_col= 'Unnamed: 0')
chicago_df_2 =  pd.read_csv('Chicago_Crimes_2008_to_2011.csv',  error_bad_lines = False,index_col= 'Unnamed: 0')
chicago_df_3 =  pd.read_csv('Chicago_Crimes_2012_to_2017.csv',  error_bad_lines = False,index_col= 'Unnamed: 0')

error_bad_lines

 

 

chicago_df =  pd.concat([chicago_df_1,chicago_df_2,chicago_df_3])
# 위의 3개 데이터프레임을 하나로 합친다. 

# 컬럼('Case Number', 'Case Number', 'IUCR', 'X Coordinate', 'Y Coordinate','Updated On','Year', 'FBI Code', 'Beat','Ward','Community Area', 'Location', 'District', 'Latitude' , 'Longitude')을 삭제하시오. 
a = ['Case Number', 'Case Number', 'IUCR', 'X Coordinate', 
     'Y Coordinate','Updated On','Year', 'FBI Code', 'Beat','Ward',
     'Community Area', 'Location', 'District', 'Latitude' , 'Longitude']
chicago_df = chicago_df.drop(a,axis=1)

# Date 컬럼을 보니, 날짜 형식으로 되어있다. 이를 파이썬이 이해할 수 있는 날짜로 바꿔서 다시 Date 컬럼에 저장하시오
chicago_df.info()
# 타입 확인 

ㄴ Object: 스트링

 

—-(파이썬이 알아보게 만드는 날짜 표기방법)---

 

판다스:파이썬이 이해가능한 여러 날짜를 str(스트링) -> 날짜로 바꾸는 방법

chicago_df['Date'] = pd.to_datetime(chicago_df['Date'], format= '%m/%d/%Y %I:%M:%S %p')

pd.to_datetime(데이터프레임[컬럼이름], format= '%m/%d/%Y %I:%M:%S %p')

ㄴ 마지막에 dtype 보면 제대로 바뀌었는지 확인 가능하다. 

 

판다스 시리즈에서 요일 구하는 방법

chicago_df['Date'].dt.weekday

ㄴ  date타임 타입이라서, dt

 

chicago_df['weekday'] = chicago_df['Date'].dt.weekday
chicago_df['weekday'].value_counts()

 

판다스: 컬럼을 인덱스로 설정하는 방법

chicago_df.index = chicago_df['Date']

데이터프레임.index = 데이터프레임[컬럼이름]

ㄴ 컬럼은 유지한채, 해당 컬럼을 인덱스로 만들라는 뜻

ㄴ set_index와는 다른 개념

 

- 그룹바이 함수(groupby())로는, 지금 있는 데이터를 년 단위, 월 단위, 일 단위, 시 단위, 분 단위, 초 단위등으로 묶으라고는 할 수가 없다.

- 따라서, 먼저, Date 컬럼을 인덱스로 만들어 주면, resample 함수를 사용할 수 있게 된다.

- 이 함수를 통해서, 년단위, 월단위 등으로 묶어서 처리가 가능해진다. 

 

 

chicago_df.index

 

# resample  'Y' 는 년도다. 년도로 리샘플한 후, 각 년도별 몇개의 범죄 데이터를 가지고 있는지 확인한다.
#YS: yeer start 연도의 시작
# #Y: yeer 연도의 끝
# size() : 행의 갯수


df_year = chicago_df.resample('YS').size()

 

 

ex) 위의 데이터를 plot 으로 시각화 한다. 범죄횟수를 눈으로 확인하자.

 

plt.plot(df_year)
plt.show()


# 이것도 된다.
df_year.plot()
plt.show()

 

ex) 월별 범죄 발생 건수를 확인 및 시각화하자. 

# 인덱스가 시간(datetype)라서, resample 함수를 사용할 수 있다.


df_month = chicago_df.resample('M').size()


df_month.plot()
plt.show()

 

ex) 분기별 범죄 발생 건수를 확인 및 시각화하자. 

df_q = chicago_df.resample('Q').size()


df_q.plot()

....

 

 

ex) 월별로(매달 말일) 주기로 하여 데이터프레임을 만들고, 인덱스를 리셋하시오.

chicago_prophet =  chicago_df.resample('M').size()

 


chicago_prophet = pd.DataFrame(chicago_prophet).reset_index()


chicago_prophet.columns = ['ds','y']
# 프로펫 라이브러리를 사용하려면, 날짜 컬럼은 'ds'로, 예측하려는 수치는 'y'로 바꿔야한다.


# 프로펫으로 예측하기(Prophet)으로 예측하기.
prophet = Prophet()
prophet.fit(chicago_prophet)

 

- frequ 조절가능한 문자: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases

 

- 페이스북 프로펫 페이지 예시

https://facebook.github.io/prophet/docs/non-daily_data.html

 

ex) 36개월로 해서 예측해보자.

future = prophet.make_future_dataframe( periods = 36 , freq = 'M')
forecast = prophet.predict(future)

 

prophet.plot(forecast)
plt.savefig('chart1.jpg')

 

prophet.plot_components(forecast)
plt.savefig('chart1.jpg')

 

반응형