本項目來自實驗樓《樓+ 數據分析與挖掘實戰》第6期學員 Miss_candy。《樓+數據分析與挖掘實戰》是實驗樓以知足數據分析或數據挖掘初級工程師職位需求而定製的課程內容。包含 35 個實驗,20 個挑戰,5 個綜合項目,1 個大項目。6 周時間,讓你入門數據分析與挖掘。html
數據是在2019-08-27日取得的,08-28~08-29號的酒店價格,酒店價格會隨着旅遊淡旺季有浮動變化,目前大連屬於季節轉換的交界處,價格水平趨於合理但仍比正常水平偏高。bash
import pandas as pd import jieba from tqdm import tqdm_notebook from wordcloud import WordCloud import numpy as np from gensim.models import Word2Vec import warnings warnings.filterwarnings('ignore') df = pd.read_csv('https://s3.huhuhang.com/temporary/b1vzDs.csv') df.shape 複製代碼
輸出:markdown
(2475, 7)
複製代碼
#獲取的數據會有重複的狀況,首先根據酒店的名字將一項,將名稱徹底相同的項從數據表中刪除 df = df.drop_duplicates(['HotelName']) df.info() 複製代碼
輸出:網絡
<class 'pandas.core.frame.DataFrame'> Int64Index: 2219 entries, 0 to 2474 Data columns (total 7 columns): Unnamed: 0 2219 non-null int64 index 2219 non-null int64 HotelName 2219 non-null object HotelLocation 2219 non-null object HotelCommentValue 2219 non-null float64 HotelCommentAmount 2219 non-null int64 HotelPrice 2219 non-null float64 dtypes: float64(2), int64(3), object(2) memory usage: 138.7+ KB 複製代碼
通過刪除重複項後,得到的酒店信息包含2219條有效信息, 其中5列有效信息分別爲:app
因爲一部分酒店因爲新開業(或其餘途徑緣由),暫時沒有評分數(沒有評分數的酒店在數據獲取的過程當中賦值」0「),所以,咱們將這部分數據單獨取出來,做爲new_hotel數據集,用於後續的一些分析和預測。echarts
df_new_hotel = df[df["HotelCommentValue"]==0].drop(['Unnamed: 0'], axis=1).set_index(['index']) df_new_hotel.head() 複製代碼
輸出dom
對於已有評分的酒店,也從原始數據集中分離出來,用於分析和建模。函數
df_in_ana = df[df["HotelCommentValue"]!=0].drop(["Unnamed: 0", "index"], axis=1) df_in_ana.shape 複製代碼
輸出:oop
(1669, 5)
複製代碼
import matplotlib.pyplot as plt import matplotlib import seaborn as sns %matplotlib inline plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標籤 plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號 sns.distplot(df_in_ana['HotelPrice'].values) 複製代碼
輸出:學習
<matplotlib.axes._subplots.AxesSubplot at 0x7f7353b9c240>
複製代碼
經過對酒店價格的分佈狀況進行可視化,大概可知, 大部分的酒店價格集中在500元/晚如下,其中以200-300元/每晚的價格最爲集中;500元/晚以上的酒店就不怎麼多了。 所以,這裏根據價格分佈以及實際的物價水平,將酒店根據價格狀況劃分爲如下幾個等級:
df_in_ana['HotelLabel'] = df_in_ana["HotelPrice"].apply(lambda x: '奢華' if x > 1000 else \ ('高端' if x > 500 else \ ('溫馨' if x > 300 else \ ('經濟' if x > 100 else '廉價')))) 複製代碼
劃分以後,先來大概瞭解一下不一樣類型的酒店的數量佔比狀況:
hotel_label = df_in_ana.groupby('HotelLabel')['HotelName'].count() plt.pie(hotel_label.values, labels=hotel_label.index, autopct='%.1f%%', explode=[0, 0.1, 0.1, 0.1, 0.1], shadow=True) 複製代碼
輸出:
([<matplotlib.patches.Wedge at 0x7f735196bf28>, <matplotlib.patches.Wedge at 0x7f7351974978>, <matplotlib.patches.Wedge at 0x7f735197d358>, <matplotlib.patches.Wedge at 0x7f735197dcf8>, <matplotlib.patches.Wedge at 0x7f73519096d8>], [Text(1.0995615668223722, 0.0310541586125, '奢華'), Text(0.8817809341165916, 0.813917922292212, '廉價'), Text(-1.1653378183544278, -0.28633506441395257, '經濟'), Text(0.9862461234793722, -0.6836070391108557, '溫馨'), Text(1.1898928807304072, -0.15541857156431768, '高端')], [Text(0.5997608546303848, 0.016938631970454542, '0.9%'), Text(0.5143722115680117, 0.47478545467045696, '21.9%'), Text(-0.679780394040083, -0.16702878757480563, '62.0%'), Text(0.5753102386963004, -0.3987707728146658, '11.0%'), Text(0.6941041804260709, -0.09066083341251863, '4.1%')]) 複製代碼
從餅圖的結果可知,有超過50%的酒店是經濟型的,21.9%的酒店則屬於廉價型,高端和奢華型的比例相應較少,比較符合旅遊城市的通常定位。
下面再來了解一下酒店的地理位置分佈狀況:
from pyecharts import Map map_hotel = Map("大連酒店區域分佈圖", width=1000, height=600) hotel_distribution = df_in_ana.groupby('HotelLocation')['HotelName'].count().sort_values(ascending=False) hotel_distribution = hotel_distribution[:8] h_values = list(hotel_distribution.values) district = list(hotel_distribution.index) map_hotel.add("", district, h_values, maptype='大連', is_visualmap=True, visual_range=([min(h_values), max(h_values)]), visual_text_color="#fff", symbol_size=20, is_label_show=True) map_hotel.render('dalian_hotel.html') 複製代碼
在這裏,因爲從網站獲取位置信息時,部分酒店的位置信息自己填寫並不規範,致使獲取獲得的信息呈現必定的差別化,因爲這些差別化的信息並不方便進行統一的規劃,而且其所佔比例不大,所以在sort以後處於比較靠後的位置,咱們只截取靠前的8個主要區域的信息,能夠看到,對於目前已經收集到酒店,大部分的酒店位於沙河口區,金州區,與大連主要景點的分佈直接相關,好比知名的星海廣場,跨海大橋位於沙河口區,金石灘以及發現王國則位於金州區。(實際上,高新園區在map上並無對應的內容,由於它不屬於行政區域,而是做爲甘井子區和沙河口區交接處的一個技術開發區,其佔比對沙河口區和甘井子區都沒有影響, 並不妨礙咱們對數據進行分析)。
大連是一個旅遊城市,不一樣行政區(地理位置),酒店的定位和水平應該也是不相同的,所以,瞭解各類檔次的酒店在不一樣區域的分佈是一個頗有意思的問題:
hotel_distribution = df_in_ana.groupby('HotelLocation')['HotelName'].count().sort_values(ascending=False) hotel_distribution = hotel_distribution[:8] hotel_label_distr = df_in_ana.groupby([ 'HotelLocation','HotelLabel'])['HotelName'].count().sort_values(ascending=False).reset_index() in_use_district = list(hotel_distribution.index) hotel_label_distr = hotel_label_distr[hotel_label_distr['HotelLocation'].isin(in_use_district)] fig, axes = plt.subplots(1, 5, figsize=(17,8)) hotel_label_list = ['高端', '溫馨', '經濟', '奢華', '廉價'] for i in range(len(hotel_label_list)): current_df = hotel_label_distr[hotel_label_distr['HotelLabel']==hotel_label_list[i]] axes[i].set_title('{}型酒店的區域分佈狀況'.format(hotel_label_list[i])) axes[i].pie(current_df.HotelName, labels=current_df.HotelLocation, autopct='%.1f%%', shadow=True) 複製代碼
經過各類檔次酒店在不一樣地區的分佈狀況可知,各種型酒店在沙河口區、金州區以及中山區都是優點分佈的,比較有趣的是,奢華型酒店在旅順口區是沒有分佈的,這種類型的酒店除了在沙河口區比較集中以外,還在中山區佔有至關大的比例,這和歷史地理緣由有很大的關係,大連人常說,中山區是傳說中的」富人區「,許多商務型出行的人會把住地選在中山區,也促進的這一地區在高端、奢華系酒店的投入增加。
除了對酒店價格(檔次)的要求以外,咱們在出行定酒店時也會考慮酒店的評價狀況,評分越高,評價越多的,咱們會更傾向於預訂,所以,針對有評分的數據集,咱們來看一看大連這些酒店的狀況。
首先根據評分狀況結合消費者對評分的通常認知,對於酒店進行一下標註:
df_in_ana['HotelCommentLevel'] = df_in_ana["HotelCommentValue"].apply(lambda x: '超棒' if x > 4.6 \ else ('還不錯' if x > 4.0 \ else ('通常般' if x > 3.0 else '差評' ))) 複製代碼
根據評分等級和酒店檔次聚類,咱們對數據進行可視化。
hotel_label_level = df_in_ana.groupby(['HotelCommentLevel','HotelLabel'])['HotelName'].count().sort_values(ascending=False).reset_index() fig, axes = plt.subplots(1, 5, figsize=(17,8)) for i in range(len(hotel_label_list)): current_df = hotel_label_level[hotel_label_level['HotelLabel'] == hotel_label_list[i]] axes[i].set_title('{}型酒店的評分狀況'.format(hotel_label_list[i])) axes[i].pie(current_df.HotelName, labels=current_df.HotelCommentLevel, autopct='%.1f%%', shadow=True) 複製代碼
由各種型酒店的評價分佈狀況可知, 差評主要出如今廉價型酒店和經濟型酒店,而其中以廉價型酒店爲差評重災區,對於每晚最低價格300以上的溫馨型,高端型和奢華型酒店,基本沒有差評的出現,也印證了「錢花在哪哪就好「的通常認知,其中以奢華型酒店的好評(」超棒「)比例最高。評價」超棒「的比例並無隨着酒店檔次的升高而提升,對於高端型酒店,其」超棒「評價的比例相對價格更低的溫馨型酒店反而有所降低,緣由也許是人們對酒店價格所對應的服務期待值大於酒店實際可以提供的服務水平,一方面提醒消費者不要盲目認爲貴就是好,一方面提醒酒店,有多少能耐就作多少能耐對應的事,價格虛高不可取。
根據目前的內容,咱們能夠製做一份」種草清單「和」防踩雷清單「:
」種草清單「主要收集各檔次酒店中評價好,評價條數多(多人檢驗,符合要求),價格相應合理的酒店名單,供各類不一樣出行需求的朋友選擇; 」防踩雷清單「則主要收集差評酒店,提醒你們不要敢於」試錯「」碰運氣「。
# 廉價酒店 df_pos_cheap = df_in_ana[(df_in_ana['HotelLabel']=='廉價') \ & (df_in_ana['HotelCommentValue']> 4.6) \ & (df_in_ana['HotelCommentAmount']> 500)].sort_values(by=['HotelPrice'], ascending=False) df_pos_cheap 複製代碼
輸出:
# 經濟型酒店 df_pos_economy = df_in_ana[(df_in_ana['HotelLabel']=='經濟') \ & (df_in_ana['HotelCommentValue']> 4.6) \ & (df_in_ana['HotelCommentAmount']> 2000)].sort_values(by=['HotelPrice']) df_pos_economy 複製代碼
輸出:
# 溫馨型酒店 df_pos_comfortable = df_in_ana[(df_in_ana['HotelLabel']=='溫馨') \ & (df_in_ana['HotelCommentValue']> 4.6) \ & (df_in_ana['HotelCommentAmount']> 1000)].sort_values(by=['HotelPrice']) df_pos_comfortable 複製代碼
輸出:
# 高端酒店 df_pos_hs = df_in_ana[(df_in_ana['HotelLabel']=='高端') \ & (df_in_ana['HotelCommentValue']> 4.6) \ & (df_in_ana['HotelCommentAmount']> 1000)].sort_values(by=['HotelPrice']) df_pos_hs 複製代碼
輸出:
# 奢華酒店 df_pos_luxury = df_in_ana[(df_in_ana['HotelLabel']=='奢華') \ & (df_in_ana['HotelCommentValue']> 4.6) \ & (df_in_ana['HotelCommentAmount']> 500)].sort_values(by=['HotelPrice']) df_pos_luxury 複製代碼
輸出:
df_neg = df_in_ana[(df_in_ana['HotelCommentValue'] < 3.0) \ & (df_in_ana['HotelCommentAmount'] > 50)].sort_values(by=['HotelPrice'], ascending=False) df_neg 複製代碼
輸出:
對於處於比較極端的酒店類型,好比很貴很貴的高端型酒店,通常是走商務典雅大氣風格,名字聽起來就會以爲很」貴「; 而便宜一些的,依靠價格走流量的,針對學生或經濟基礎比較差的人羣,名字要麼走小清新的路子,要麼就簡單粗暴,一聽就是」划算「,咱們經過詞雲來驗證一下,這個理論對於大連地區的酒店是否符合。
wget -nc "http://labfile.oss.aliyuncs.com/courses/1176/fonts.zip" unzip -o fonts.zip from wordcloud import WordCloud def get_word_map(hotel_name_list): word_dict ={} for hotel_name in tqdm_notebook(hotel_name_list): hotel_name = hotel_name.replace('(', '') hotel_name = hotel_name.replace(')', '') word_list = list(jieba.cut(hotel_name, cut_all=False)) for word in word_list: if word == '大連' or len(word) < 2: continue if word not in word_dict: word_dict[word] = 0 word_dict[word] += 1 font_path = 'fonts/SourceHanSerifK-Light.otf' wc = WordCloud(font_path=font_path, background_color='white', max_words=1000, max_font_size=120, random_state=42, width=800, height=600, margin=2) wc.generate_from_frequencies(word_dict) return wc 複製代碼
爲了保證繪製詞雲的數據量充足,這裏不按照原來的酒店檔次劃分標準來選取數據,而是選擇價格低於150的酒店和高於500的酒店,做爲兩個相對極端的類型,看看他們在起名上有沒有什麼典型的區別。
part1 = df_in_ana[df_in_ana['HotelPrice'] <= 150]['HotelName'].values part2 = df_in_ana[df_in_ana['HotelPrice'] > 500]['HotelName'].values fig, axes = plt.subplots(1, 2, figsize=(15, 8)) axes[0].set_title('價格較低酒店的名字詞雲') axes[0].imshow(get_word_map(part1), interpolation='bilinear') axes[1].set_title('價格較高酒店的名字詞雲') axes[1].imshow(get_word_map(part2), interpolation='bilinear') 複製代碼
輸出:
<matplotlib.image.AxesImage at 0x7f73515c1908>
複製代碼
從結果來看,兩類酒店的店名詞雲仍是有明顯差別的。 價格低廉的酒店,名字中出現」客舍「, 」主題「,」青年「,」快捷酒店「,」旅館「, 」旅店「等次的頻率較高,符合咱們對這類酒店的定位認知; 高端的酒店,名字中包含」星海「,」海景「,」溫泉「,」廣場「的頻率較高,因爲大連比較知名的地標是沙河口區的星海廣場,附近的酒店(特別是高檔酒店),很是喜歡在名字中體現」星海「這個詞,除了突出地理位置以外,彷佛也能經過這個詞給酒店增長一些格調。另外,高端酒店彷佛不太喜歡給本身起名字叫」xx賓館「,更喜歡叫」酒店「或」酒店式公寓「。 比較瘋狂的一點是,不管是便宜一些的酒店,仍是貴一點的酒店,都很喜歡」公寓「這個詞。這彷佛也是目前酒店事業發展的一種趨勢。
名字做爲人或事物的一種象徵,由它引發的第一印象是很是重要的,咱們剛剛分析了比較極端的酒店類型在名字上的特色,在必定程度上,能夠根據名字在判斷酒店是否處於必定的檔次,」三歲看一輩子」,對於剛剛開始運行,沒有評分的小白酒店,咱們能夠根據對其價格的預測結果判斷一下酒店的訂價方案是否符合其定位,以前咱們分析了不一樣檔次酒店的評價特色,結合這些已知結果,大概的瞭解一下這些小白酒店是否具備標價虛高,或者是否值得咱們當一次小白鼠,走一條「發現之路」。 不過這裏面另外涉及到一個問題,新開的酒店由於環境和時代緣由,在起名字的策略上會和以前的酒店產生差別,這種差別在建模預測的過程當中會產生比較顯著的影響,所以,這裏咱們只是利用學習過的方法,作一個有趣的實驗,結果不會準確,但過程是頗有趣的:)
df_in_ana['HotelPrice'].median() 複製代碼
輸出:
156.0
複製代碼
經過前面的詞雲分析和已有評價的酒店的價格中位數,咱們將價格150設爲劃分閾值,價格低於150元/晚的酒店,標註爲1,而高於這個價格的,標註爲0,這樣的劃分方式,使得兩部分的數據量基本均衡,也在必定程度上體現出酒店名稱的差別。
df_in_ana['PriceLabel'] = df_in_ana['HotelPrice'].apply(lambda x:1 if x <= 150 else 0) df_new_hotel['PriceLabel'] = df_new_hotel['HotelPrice'].apply(lambda x:1 if x <= 150 else 0) # 設定分詞方式 def word_cut(x): x = x.replace('(', '') # 去掉名稱中出現的() x = x.replace(')', '') return jieba.lcut(x) #設置訓練集和測試集 x_train = df_in_ana['HotelName'].apply(word_cut).values y_train = df_in_ana['PriceLabel'].values x_test = df_new_hotel['HotelName'].apply(word_cut).values y_test = df_new_hotel['PriceLabel'].values 複製代碼
訓練集包含1669條信息,標註爲1的數據共790條, 測試集包含550條信息,標註爲1的數據共195條。
# 經過Word2Vec方法創建詞向量淺層神經網絡模型,並對分詞以後的酒店名稱進行詞向量的求和計算 from gensim.models import Word2Vec import warnings warnings.filterwarnings('ignore') w2v_model = Word2Vec(size=200, min_count=10) w2v_model.build_vocab(x_train) w2v_model.train(x_train, total_examples=w2v_model.corpus_count, epochs=5) def sum_vec(text): vec = np.zeros(200).reshape((1, 200)) for word in text: try: vec += w2v_model[word].reshape((1, 200)) except KeyError: continue return vec train_vec = np.concatenate([sum_vec(text) for text in tqdm_notebook(x_train)]) # 構建神經網絡分類器模型,並使用training data對模型進行訓練 from sklearn.externals import joblib from sklearn.neural_network import MLPClassifier from IPython import display model = MLPClassifier(hidden_layer_sizes=(100, 50, 20), learning_rate='adaptive') model.fit(train_vec, y_train) # 繪製損失變化曲線,監控損失函數的變化過程 display.clear_output(wait=True) plt.plot(model.loss_curve_) 複製代碼
輸出:
[<matplotlib.lines.Line2D at 0x7f73400b8198>]
複製代碼
ps:由於數據量少,且數據自己所包含的信息相對不足,在這裏,訓練的結果並不太好。
# 以後對測試集進行詞向量求和 test_vec = np.concatenate([sum_vec(text) for text in tqdm_notebook(x_test)]) # 用訓練好的模型進行預測, 將結果倒入測試用表中 y_pred = model.predict(test_vec) df_new_hotel['PredLabel'] = pd.Series(y_pred) # 建模預測的結果 from sklearn.metrics import accuracy_score accuracy_score(y_pred, y_test) 複製代碼
輸出:
0.6163636363636363
複製代碼
實際上,預測的準確率只有60%左右,是一個至關不理想的結果,咱們將數據展開,主要的緣由在哪裏。
new_hotel_questionable = df_new_hotel[(df_new_hotel['PriceLabel'] ==0) & (df_new_hotel['PredLabel']==1)] new_hotel_questionable = new_hotel_questionable.sort_values(by='HotelPrice', ascending=False) new_hotel_questionable 複製代碼
輸出:
分歧比較明顯的結果顯示,不少新開的酒店,特別是價格很高的,都是「別墅」類型的度假型酒店,這一類型在已經評價的數據集中體現並不明顯,建模的分類器對其不敏感,錯分的可能就會大大增長。
plt.figure(figsize=(15, 7)) plt.imshow(get_word_map(new_hotel_questionable['HotelName'].values), interpolation='bilinear') 複製代碼
輸出:
<matplotlib.image.AxesImage at 0x7f7333b06d68>
複製代碼
繪製詞雲來看新開的酒店們,其在名稱上與建模所用的數據集相比,增長了一些原來沒有的詞,好比「號店」,「分店」,「別墅」等,致使預測的準確率降低。
除開對名字方面的認識,咱們還能夠了解一下新開的這些酒店在地理位置的分佈和均價的變化上有什麼體現。
new_hotel_distri = df_new_hotel.groupby('HotelLocation')['HotelName'].count().sort_values(ascending=False)[:7] plt.pie(new_hotel_distri.values, labels=new_hotel_distri.index, autopct='%.1f%%', shadow=True) 複製代碼
輸出;
([<matplotlib.patches.Wedge at 0x7f7333ae1240>, <matplotlib.patches.Wedge at 0x7f7333ae1c50>, <matplotlib.patches.Wedge at 0x7f7333ae9630>, <matplotlib.patches.Wedge at 0x7f7333ae9fd0>, <matplotlib.patches.Wedge at 0x7f7333af29b0>, <matplotlib.patches.Wedge at 0x7f7333afd390>, <matplotlib.patches.Wedge at 0x7f7333afdd30>], [Text(0.4952241217848982, 0.9822184427113841, '金州區'), Text(-1.0502523061308453, 0.32706282801144143, '甘井子區'), Text(-0.7189197652449374, -0.8325589295300148, '沙河口區'), Text(0.10878704263418966, -1.0946074087794706, '旅順口區'), Text(0.6457239222346646, -0.8905282793117135, '中山區'), Text(0.9702662169179598, -0.5182503915171803, '西崗區'), Text(1.0890040760087287, -0.1551454879665377, '普蘭店區')], [Text(0.2701222482463081, 0.5357555142062095, '35.1%'), Text(-0.5728648942531882, 0.17839790618805892, '20.1%'), Text(-0.39213805376996586, -0.4541230524709171, '16.8%'), Text(0.059338386891376174, -0.597058586606984, '9.0%'), Text(0.35221304849163515, -0.4857426978063891, '7.8%'), Text(0.5292361183188871, -0.2826820317366438, '6.6%'), Text(0.5940022232774883, -0.08462481161811146, '4.5%')]) 複製代碼
由餅圖能夠發現,有超過30%的新酒店選擇了金州區,沙河口區做爲老牌的酒店扎堆地,只有16%的從業者將新店選擇在這裏。
df_new_hotel['HotelLabel'] = df_new_hotel["HotelPrice"].apply(lambda x: '奢華' if x > 1000 \ else ('高端' if x > 500 \ else ('溫馨' if x > 300 \ else('經濟' if x > 100 \ else '廉價')))) new_hotel_label = df_new_hotel.groupby('HotelLabel')['HotelName'].count() plt.pie(new_hotel_label.values, labels=new_hotel_label.index, autopct='%.1f%%', explode=[0, 0.1, 0.1, 0.1, 0.1], shadow=True) 複製代碼
輸出:
([<matplotlib.patches.Wedge at 0x7f7333abbdd8>, <matplotlib.patches.Wedge at 0x7f7333a44828>, <matplotlib.patches.Wedge at 0x7f7333a4d208>, <matplotlib.patches.Wedge at 0x7f7333a4dba8>, <matplotlib.patches.Wedge at 0x7f7333a59588>], [Text(1.0859612910752763, 0.17518011955161772, '奢華'), Text(0.6137971106588083, 1.0311416522218948, '廉價'), Text(-1.1999216970224413, 0.01370842860376746, '經濟'), Text(0.46080283077562195, -1.1079985339111122, '溫馨'), Text(1.1494416996723409, -0.3446502271207151, '高端')], [Text(0.5923425224046961, 0.09555279248270056, '5.1%'), Text(0.3580483145509714, 0.6014992971294385, '22.7%'), Text(-0.6999543232630907, 0.007996583352197684, '44.0%'), Text(0.26880165128577943, -0.6463324781148153, '18.9%'), Text(0.6705076581421987, -0.20104596582041712, '9.3%')]) 複製代碼
除了適合大多數出行者會選擇的經濟實惠的低價酒店外,高端奢華型酒店的投入比例在新開酒店中也有明顯的提升,結合前面對新開酒店的詞雲分析,愈來愈多的酒店從業者投入了高端酒店的建設,以別墅型度假酒店爲主要體現,體現出人們對品質和更加溫馨的出行體驗的的追求。
價格上,也有一些比較有趣的結果:
df2 = df_new_hotel.groupby('HotelLabel')['HotelPrice'].mean().reset_index() df1=df_in_ana.groupby('HotelLabel')['HotelPrice'].mean().reset_index() price_change_percent = (df2['HotelPrice'] - df1['HotelPrice'])/df1['HotelPrice'] * 100 plt.title('新開各檔次酒店均價變化') plt.bar(df1['HotelLabel'] ,price_change_percent, width = 0.35) plt.ylim(-18, 18) for x, y in enumerate(price_change_percent): if y < 0: plt.text(x, y, '{:.1f}%'.format(y), ha='center', fontsize=12, va='top') else: plt.text(x, y, '{:.1f}%'.format(y), ha='center', fontsize=12, va='bottom') 複製代碼
新開酒店相對於已有評價的老牌酒店來講,均價的變化表如今:
兩個極端等級的酒店均以「下降身價」的方式得到關注度來博取入住率,以得到長足的發展, 而中間型酒店,以改變經營理念,順應時代潮流等方式得到漲價的資本,只是其最終的發展效果仍取決於旅客對其的認同。
本次實驗以大連地區的酒店做爲分析數據,挖掘了包括價格狀況、區域分佈狀況等信息,提供了已有評價的酒店的「種草清單」和「防踩雷清單」(媽媽不再用擔憂有朋友來大連煩惱定酒店的問題啦!),進行酒店店名的詞雲分析,挖掘了店名和酒店檔次的相關性,並創建分類模型,預測新開的、沒有評價的酒店的店名是否與其訂價標準相適宜,同時挖掘了新開酒店的區域分佈和檔次分佈狀況,對比了其與已有評價酒店的均價變化,側面瞭解了一些大連旅遊事業發展的狀況的思路。因爲數據量少,且酒店店名的命名方式與區域、時代環境等有較強的相關性,建模預測部分的效果並很差,但學習了這些內容,將其應用在不一樣的方面來加深對其的認識也是一件有趣的事情。