expedia = pd.read_csv('expedia_train.csv')
df = expedia.loc[expedia['prop_id'] == 104517]
df = df.loc[df['srch_room_count'] == 1]
df = df.loc[df['visitor_location_country_id'] == 219]
df = df[['date_time', 'price_usd', 'srch_booking_window', 'srch_saturday_night_bool']]
进行数据剪切后,我们将要适用的数据如下:
df.info()
df['price_usd'].describe()
至此,我们已经检测到一个极端异常,即最大price_usd是5584美元。
如果某单一数据点可被视为相应于其余数据的异常,我们则称之为Point Anomalies(例如,购买具有大的交易价值的物品)。我们可以回去检查搜索日志,看看它是什么。 经过一番调查后,我猜它要么是一个错误要么是用户偶然搜索了一个总统套房而无意预订或查看。为了找到更多不是极端的异常,决定删除这个点。
expedia.loc[(expedia['price_usd'] == 5584) &
(expedia['visitor_location_country_id'] == 219)]
df = df.loc[df['price_usd'] < 5584]
至此,我相信你已经发现我们遗漏了一些东西,也就是说,我们不知道用户搜索的房间类型,标准间的价格可能与大床海景房的价格有很大差异。请记住这一点,但为了示范目的,我们不得不继续。
时间序列可视化
df.plot(x='date_time', y='price_usd', figsize=(12,6))
plt.xlabel('Date time')
plt.ylabel('Price in USD')
plt.title('Time Series of room price by date time of search');
a = df.loc[df['srch_saturday_night_bool'] == 0, 'price_usd']
b = df.loc[df['srch_saturday_night_bool'] == 1, 'price_usd']
plt.figure(figsize=(10, 6))
plt.hist(a, bins = 50, alpha=0.5, label='Search Non-Sat Night')
plt.hist(b, bins = 50, alpha=0.5, label='Search Sat Night')
plt.legend(loc='upper right')
plt.xlabel('Price')
plt.ylabel('Count')
plt.show();
一般来说,搜索非周六晚上的价格会更稳定且更低,而周六晚上的价格通常会上涨,看来这家酒店在周末很受欢迎。
基于聚类算法的异常检测
k-means 算法
k-means是一种应用广泛的聚类算法。它创建了k个类似的数据点集(即聚类),不属于这些组的数据可能会被标记为异常。在我们开始应用k-means算法之前,先使用elbow方法来确定最佳聚类数。