데이터 분석/jupyternotebook
Bike Sharing Demand
NIGHT_LOVE
2020. 7. 8. 18:08
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.ensemble import RandomForestClassifier
train=pd.read_csv('../bike-sharing-demand/train.csv',parse_dates=['datetime'])#컬럼이름
test=pd.read_csv('../bike-sharing-demand/test.csv',parse_dates=['datetime'])
#train.shape,
train.info() #datetime - object
#ms , us, ns(10의 -9승 초 ) , ps ...
# test.shape
train.info()
train['temp'].describe()
train.isnull().sum()
train['datetime']
"""
임의의 날짜 입력 => 자전거 대여수 예측모델
2011-01-20 00:00:00 -> 5(예측) 10(정답) 5오차
"""
train.columns
train['year']=train['datetime'].dt.year
train['month']=train['datetime'].dt.month
train['day']=train['datetime'].dt.day
train['hour']=train['datetime'].dt.hour
train['minute']=train['datetime'].dt.minute
train['second']=train['datetime'].dt.second
train.head()
train.info()
fig 영역으로 나눌때 subplot
import matplotlib
from matplotlib import font_manager, rc
import platform
if platform.system()=="Windows":
font_name=font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
matplotlib.rcParams['axes.unicode_minus']=False
import warnings
warnings.filterwarnings("ignore")
figure,((ax1,ax2,ax3),(ax4,ax5,ax6))=plt.subplots(nrows=2,ncols=3)
#6개의 axes 로 구성된figure생성
figure.set_size_inches(18,8)
sns.barplot(data=train, x='year',y='count',ax = ax1) #평균적인 값
sns.barplot(data=train, x='month',y='count',ax = ax2)
sns.barplot(data=train, x='day',y='count',ax = ax3)
sns.barplot(data=train, x='hour',y='count',ax = ax4)
sns.barplot(data=train, x='minute',y='count',ax = ax5)
sns.barplot(data=train, x='second',y='count',ax = ax6)
ax1.set(ylabel = 'Count',title = '연도별대여량')
ax2.set(ylabel = 'Count',title = '월별대여량')
ax3.set(ylabel = 'Count',title = '일별대여량')
ax4.set(ylabel = 'Count',title = '시간별대여량')
#이상치 : boxplot
fig,axes = plt.subplots(nrows = 2,ncols = 2)
fig.set_size_inches(12,10)
sns.boxplot(data = train,y='count',orient='v',ax=axes[0][0])
sns.boxplot(data = train,y='count',x='season',orient='v',ax=axes[0][1])
sns.boxplot(data = train,y='count',x='hour',orient='v',ax=axes[1][0])
sns.boxplot(data = train,y='count',x='workingday',orient='v',ax=axes[1][1])
train['dayofweek']=train['datetime'].dt.dayofweek
train['dayofweek'].value_counts() # 0월 6일
fig,(ax1,ax2,ax3,ax4,ax5)=plt.subplots(nrows=5)
fig.set_size_inches(18,25)
sns.pointplot(data = train,x = 'hour',y='count',ax=ax1)
sns.pointplot(data = train,x = 'hour',y='count',hue='workingday',ax=ax2)
sns.pointplot(data = train,x = 'hour',y='count',hue='dayofweek',ax=ax3)
sns.pointplot(data = train,x = 'hour',y='count',hue='weather',ax=ax4)
sns.pointplot(data = train,x = 'hour',y='count',hue='season',ax=ax5)
train.columns
corrMatt=train[['temp','atemp', 'casual', 'registered','humidity', 'windspeed','count']]
corrMatt=corrMatt.corr()
corrMatt
mask=np.array(corrMatt)
mask[np.tril_indices_from(mask)]=False
plt.subplot()
fig.set_size_inches(20,10)
sns.heatmap(corrMatt,mask=mask,square=True,annot=True)
fig,(ax1,ax2,ax3)=plt.subplots(ncols=3)
fig.set_size_inches(12,5)
sns.regplot(x='temp',y='count',data=train,ax=ax1)
sns.regplot(x='windspeed',y='count',data=train,ax=ax2)
sns.regplot(x='humidity',y='count',data=train,ax=ax3)
def myConcat(dtime):
return"{0}-{1}".format(dtime.year,dtime.month)
#myConcat 함수를 호출할때 datetime컬럼값을 전달,
#2011 -1 와 같이 '연도-월'을 문자열로 구성하여 리턴
train['year_month']=train['datetime'].apply(myConcat)
train[['datetime','year_month']]
fig,axes=plt.subplots()
fig.set_size_inches(18,4)
sns.boxplot(data = train,x = 'year_month',y = 'count',ax=axes)
train.shape
train=pd.read_csv('../bike-sharing-demand/train.csv',parse_dates=['datetime'])
test=pd.read_csv('../bike-sharing-demand/test.csv',parse_dates=['datetime'])
train.shape,test.shape
train['datetime']
#year,month,hour,dayofweek
train['year']=train['datetime'].dt.year
train['month']=train['datetime'].dt.month
train['hour']=train['datetime'].dt.hour
train['dayofweek']=train['datetime'].dt.dayofweek
test['year']=test['datetime'].dt.year
test['month']=test['datetime'].dt.month
test['hour']=test['datetime'].dt.hour
test['dayofweek']=test['datetime'].dt.dayofweek
train.shape,test.shape
from sklearn.ensemble import RandomForestRegressor
test.info()
# rfModel=RandomForestRegressor()
# rfModel.fit(xdata,label) x = 모델에 필요한 컬럼
# 예측결과=rf.Model.predict(xtest)
feature_names = ["season", "weather", "temp", "atemp", "humidity", "windspeed",
"year", "hour", "dayofweek", "holiday", "workingday"]
rfModel=RandomForestRegressor()
rfModel.fit(train[feature_names],train['count'])
predictions = rfModel.predict(test[feature_names])
predictions
res=pd.DataFrame({'datetime':test['datetime'],
'count':predictions})
res
res.to_csv('resultbike.csv',index=False) #0.41932
1.예측결과
2.제출
3.windspeed
4.모델링
train['windspeed'].value_counts()
trainwind=train[train['windspeed'] ==0]
trainwind=train['windspeed'].median
train['windspeed']
# # 그래서 머신러닝으로 예측을 해서 풍속을 넣어주도록 한다.
# from sklearn.ensemble import RandomForestClassifier
# def predict_windspeed(data):
# dataWind0 = data.loc[data['windspeed'] == 0]
# dataWindNot0 = data.loc[data['windspeed'] != 0]
# # 풍속을 예측할 피처를 선택한다.
# wCol = ["season", "weather", "humidity", "month", "temp", "year", "atemp"]
# # 풍속이 0이 아닌 데이터들의 타입을 스트링으로 바꿔준다.
# # 랜덤포레스트 분류기를 사용한다.
# rfModel_wind = RandomForestClassifier()
# # wCol에 있는 피처의 값을 바탕으로 풍속을 학습시킨다.
# rfModel_wind.fit(dataWindNot0[wCol], dataWindNot0["windspeed"])
# # 학습한 값을 바탕으로 풍속이 0으로 기록된 데이터의 풍속을 예측한다.
# wind0Values = rfModel_wind.predict(X = dataWind0[wCol])
# # 값을 다 예측 후 비교해 보기 위해
# # 예측한 값을 넣어 줄 데이터 프레임을 새로 만든다.
# predictWind0 = dataWind0
# predictWindNot0 = dataWindNot0
# # 값이 0으로 기록된 풍속에 대해 예측한 값을 넣어준다.
# predictWind0["windspeed"] = wind0Values
# # dataWindNot0 0이 아닌 풍속이 있는 데이터프레임에 예측한 값이 있는 데이터프레임을 합쳐준다.
# data = predictWindNot0.append(predictWind0)
# # 풍속의 데이터 타입을 float으로 지정해 준다.
# data.reset_index(inplace=True)
# data.drop('index', inplace=True, axis=1)
# return data
#0.41935