<jupyter_start><jupyter_text>![bike-img](https://kaggle2.blob.core.windows.net/competitions/kaggle/3948/logos/front_page.png)Data Fieldsfrom [Bike Sharing Demand | Kaggle](https://www.kaggle.com/c/bike-sharing-demand/data) Description* datetime - hourly date + timestamp  * season -  1 = spring, 2 = summer, 3 = fall, 4 = winter * holiday - whether the day is considered a holiday* workingday - whether the day is neither a weekend nor holiday* weather     - 1: Clear, Few clouds, Partly cloudy, Partly cloudy     - 2: Mist + Cloudy, Mist + Broken clouds, Mist + Few clouds, Mist     - 3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light Rain + Scattered clouds     - 4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog * temp - temperature in Celsius* atemp - "feels like" temperature in Celsius* humidity - relative humidity* windspeed - wind speed* casual - number of non-registered user rentals initiated* registered - number of registered user rentals initiated* count - number of total rentals EvaluationSubmissions are evaluated one the Root Mean Squared Logarithmic Error (RMSLE).  분류와 회귀중 회귀와 관련 된 문제=> 자전거 대여량을 예측하는 문제이기 때문에<jupyter_code>import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# 노트북 안에 그래프를 그리기 위해
%matplotlib inline

# 그래프에서 격자로 숫자 범위가 눈에 잘 띄도록 ggplot 스타일을 사용
plt.style.use('ggplot')

# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False
train = pd.read_csv("data/train.csv", parse_dates=["datetime"])
train.shape
# train.columns
# train.dtypes
train.info()
train.head()
train.temp.describe()
train['count'].describe()
train.isnull().sum()
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.shape
train.head()
figure, ((ax1,ax2,ax3), (ax4,ax5,ax6)) = plt.subplots(nrows=2, ncols=3)
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)

ax1.set(ylabel='Count',title="by year")
ax2.set(xlabel='month',title="by month")
ax3.set(xlabel='day', title="by day") # 19일까지밖에 없으므로 feature로 사용하면 안된다. 
ax4.set(xlabel='hour', title="by hour")<jupyter_output>c:\users\chlje\pycharmprojects\kaggle_bikeshare\venv\lib\site-packages\scipy\stats\stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval<jupyter_text>* 연도별 대여량은 2011년 보다 2012년이 더 많다.* 월별 대여량은 6월에 가장 많고 7~10월도 대여량이 많다. 그리고 1월에 가장 적다.* 일별대여량은 1일부터 19일까지만 있고 나머지 날짜는 test.csv에 있다. 그래서 이 데이터는 피처로 사용하면 안 된다.* 시간 대 대여량을 보면 출퇴근 시간에 대여량이 많은 것 같다. 하지만 주말과 나누어 볼 필요가 있을 것 같다.* 분, 초도 다 0이기 때문에 의미가 없다.<jupyter_code>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="month",orient="v",ax=axes[0][1]) # 매월 있다. 
sns.boxplot(data=train,y="count",x="workingday",orient="v",ax=axes[1][1])

axes[0][0].set(ylabel='Count',title="count")
axes[0][1].set(xlabel='Month', ylabel='Count',title="by month")
axes[1][1].set(xlabel='Working Day', ylabel='Count',title="by workingday")
train["dayofweek"] = train["datetime"].dt.dayofweek # Monday == 0, Sunday == 6
train.shape
train["dayofweek"].value_counts()
fig,(ax1,ax2,ax3,ax4)= plt.subplots(nrows=4)
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)
corrMatt = train[["temp", "atemp", "casual", "registered", "humidity", "windspeed", "count", 'month', 'season']]
corrMatt = corrMatt.corr()
print(corrMatt)

mask = np.array(corrMatt)
mask[np.tril_indices_from(mask)] = False
fig, ax = plt.subplots()
fig.set_size_inches(20,10)
sns.heatmap(corrMatt, mask=mask,vmax=.8, square=True,annot=True)<jupyter_output><empty_output><jupyter_text>* 온도, 습도, 풍속은 거의 연관관계가 없다. * 대여량과 가장 연관이 높은 건 registered 로 등록 된 대여자가 많지만, test 데이터에는 이 값이 없다.* atemp와 temp는 0.98로 상관관계가 높지만 온도와 체감온도로 피처로 사용하기에 적합하지 않을 수 있다.<jupyter_code>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)<jupyter_output><empty_output><jupyter_text>* 풍속의 경우 0에 숫자가 몰려 있는 것으로 보인다. 아마도 관측되지 않은 수치에 대해 0으로 기록된 것이 아닐까 추측해 본다.<jupyter_code>def concatenate_year_month(datetime):
    return "{0}-{1}".format(datetime.year, datetime.month)

train["year_month"] = train["datetime"].apply(concatenate_year_month)

print(train.shape)
train[["datetime", "year_month"]].head()
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2)
fig.set_size_inches(18, 4)

sns.barplot(data=train, x="year", y="count", ax=ax1)
sns.barplot(data=train, x="month", y="count", ax=ax2)

fig, ax3 = plt.subplots(nrows=1, ncols=1)
fig.set_size_inches(18, 4)

sns.barplot(data=train, x="year_month", y="count", ax=ax3)<jupyter_output><empty_output><jupyter_text>* 2011년보다 2012년의 대여량이 더 많다.* 겨울보다는 여름에 대여량이 많다.* 2011년과 2012년의 월별 데이터를 이어보면 전체적으로 증가하는 추세이다.<jupyter_code>a = train['count'].value_counts()
a[a==1].sort_index()

# a[a==2].sort_index()
# a[a==3].sort_index()
sns.distplot(train['count'], kde=True, rug=False)
train[train['count'] == 0]
# trainWithoutOutliers
trainWithoutOutliers = train[np.abs(train["count"] - train["count"].mean()) <= (3*train["count"].std())] # +=3sd 의 데이터는 지운다. 99.7%로, 양 옆의 0.15%씩 지운 것.

print(train.shape)
print(trainWithoutOutliers.shape)
train.shape[0] - trainWithoutOutliers.shape[0]
train[train['count']==1].count() #대부분의 lower tile 
# count값의 데이터 분포도를 파악

figure, axes = plt.subplots(ncols=2, nrows=2)
figure.set_size_inches(12, 10)

sns.distplot(train["count"], ax=axes[0][0])
print(stats.probplot(train["count"], dist='norm', fit=True, plot=axes[0][1]))
sns.distplot(np.log(trainWithoutOutliers["count"]), ax=axes[1][0])
(stats.probplot(np.log1p(trainWithoutOutliers["count"]), dist='norm', fit=True, plot=axes[1][1]))<jupyter_output>((array([-3.83154229, -3.60754977, -3.48462983, ...,  3.48462983,
        3.60754977,  3.83154229]), array([  1,   1,   1, ..., 968, 970, 977], dtype=int64)), (169.82942673231383, 191.5741319125482, 0.9372682766213171))
{'fraction_non_alphanumeric': 0.17253521126760563, 'fraction_numerical': 0.042546948356807515, 'mean_word_length': 6.130753138075314, 'pattern_counts': {'":': 0, '<': 20, '<?xml version=': 0, '>': 20, 'https://': 2, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '328616', 'license': 'MIT', 'n_tokens_mistral': 3266, 'n_tokens_neox': 3337, 'n_words': 607, 'path': 'bike-sharing-demand/bike-sharing-demand-EDA.ipynb', 'repo_name': 'jaepil-choi/Kaggle_bikeshare', 'size': '6816'}