1. 程式人生 > 其它 >python資料探勘:能不能找出吃貨最佳住宿點?

python資料探勘:能不能找出吃貨最佳住宿點?

這次我爬出了哈爾濱市TOP285家好吃的店,包括燒烤的TOP,餃子的TOP,醬骨的TOP等等等等,在地圖上顯示,規劃熱點,再用聚類演算法計算下能不能找出吃貨最佳的住宿點,能夠距離吃的各個地方行程最近,吃貨們,準備好了嗎?

回覆公眾號"吃貨" 獲取更多原始碼。

目的

視覺化美食熱點,規劃各類美食聚集點,規劃行程。

準備食材

首先,我不對這次排行的可信度負責,我只是直接百度的top餐廳,裡面的水分大家自己掂量,甩鍋給哈爾濱美食最新榜出爐,史上最強300家美食滿足你各種挑剔!

http://www.360doc.com/content/16/0504/20/1097634_556278017.shtml

大概是這樣的

這次我用靜態爬發現被攔截了,mdzz,然後我就直接上selenium+Firefox,至於為什麼不上PhantomJS,我這裡說下,有時候PhantomJS爬的內容沒有Firefox全,或許有人跳出來說,你個sb,他兩是一樣的啊,而且PhantomJS更加省記憶體,呵呵,你自己去試試就知道了,我不止一次在爬動態的時候PhantomJS遇到問題而Firefox沒有問題的,連xpath都一樣,就換了個無頭,就不行了,我也有看到Stack Overflow上遇到同樣問題的,可能是我手法不夠吧,或許是我真的理解錯了,到時候我自來認錯。

清洗食材

剛爬下來的資料肯定不能直接用的,又是空格又是序列的,處理的方法很多,可以用正則,sub換空格,然後splite切割,組成列表再取,洗的方法很多,具體看資料是怎麼樣的,洗完後放進冰箱,啊不是,放進txt或者儲存為csv,xls都可以的呢~

注意點

有些資料,大概三四個,我清洗完之後發現有錯誤,比如洗出個空格,額。。。。我嘗試用try,except檢測錯誤,檢視原始資料,發現源連結中的js寫的不標準造成的,哎,手動改好,再清洗一遍,不要刻意為了這一兩個資料重寫清洗演算法,不就是sb了想著全自動一步成型,我咋不上天啊。。。


食材醃製-定位經緯度

通過地址轉換得到相應的經緯度,得到的資料格式有兩種如下所示

左一為地址+經緯度,逗號隔開,右一為經緯度,空格隔開,為什麼要生成兩個格式?因為我喜歡啊,哈哈哈


食材儲存–轉化CSV

直接右鍵另存為,然後儲存格式為.csv即可,有人說,為什麼不用csv的寫入方法啊,因為我懶啊,我懶得重新構造字典了,這裡甩上一段可以寫入中文的csv格式。

弄完之後大概是這樣的就可以下鍋了


烹飪食材–聚類處理

我們要用的資料集是空格隔開的,至於為什麼空格隔開的經緯度資料,因為我以前寫好的bikmeans裡面輸入項就是就是醬紫的,空格用正則比較好處理,用個list裝下Obj.[0],[1]立馬出來值了,至於Kmeans是啥,怎麼用,請看

【Python】爬蟲+ K-means 聚類分析電影海報主色

,這裡處理完後,我隨機設定了5,10,15,20四種聚類點,觀察各種效果。程式碼我在附錄放上,參考的可以直接取附錄找。聚類處理之後依舊儲存如上一步的一張圖形式,之後就可以開始可視化了!

佳餚擺上桌–資料視覺化

枯燥的資料讓人很難受,根本分析不出什麼來,而且看著枯燥,這裡我用了地圖無憂這個網頁版,雖然只有七天免費期,哎,辛辛苦苦畫的圖以後不能用了,(如果有誰知道還有類似的批量經緯度點轉化圖的軟體請告訴我一下)真蛋疼.

具體的操作,直接看教程很簡單的,我就是建圖層,然後圖層上批量放入經緯度,它就能轉化成地圖上的點,很好玩,看個動圖,這是我把點放上的效果。


享用佳餚–分析資料

  • 先看下各種分佈把,這個是熱力圖
  • 這個是點陣圖
  • 把聚類的點加上,選了聚類點為15個

有些點不錯,但是有些點太扯了把,貌似不是kmeans的宗旨的,他是為了找距離各熱點最近的平衡點啊,是聚類點啊,但是有幾個點明顯不是了,檢視原因。

問題所在:可以看出來,上面的點分佈原因因為這些離散點的存在,我看了最遠的點,亞布力滑雪場,的確有家店不錯,額,可是我不考慮,我要是在市區玩,我還想去那麼遠的地方?明顯不合理,所以我需要的是真的熱點區域,也就是第二幅的那樣,所以又要重新洗一下資料了,把離散點也就是噪聲去掉!

燒糊了–重新來

雖然整體上來說,這個演算法沒錯,但是如果對具體問題,比如說,我就想知道哈爾濱市內有什麼比較好吃的,我懶得動,不會跑到江北或者更遠的地方去吃,而且交通不方便,所以就要對經緯度集合進行切割,我找了合適返回,規定為經度範圍126.56571~126.706807,緯度返回45.706283~45.802307,主程式中新增LockHotArea子函式,進行再一次過濾即可。

之後步驟重回前面的,最後的效果就是這樣的


回鍋肉–再分析資料

這回應該沒有問題了,所以開始分析圖吧


  • 這裡上20個聚類點的情況
  • 可以看出,聚類點的分佈基本都在熱點區域,說明比較符合情況,但是K的值並不很能確定,需要多次試驗k值

  • cluster15,這些點就有點尷尬了。能說明什麼?可能是住宿的最佳點把,因為離各個好吃的距離是比較近的,這本來就是kmeans的核心。

  • cluster10的時候,聚類點就開始有點誇張了,雖說很多仍在熱力分佈上,但是,有一些明顯不在熱力輻射返回內,但對於能吃遍各個周圍美食的人來說,仍然值得參考(這裡不涉及代步工具)

  • cluster5的時候,只能算是顧全大局式的選擇離熱點最近的點了,好壞需要自己判斷

回鍋肉上的一顆花椒–單點分析

這裡我把24個TOP資料都擺上了圖層,可以清晰的看出這些好吃的都分佈在哪,這裡放上幾張示範圖,具體自己想看的,可以自己吃貨的地圖自己定位

以包子TOP為例

  • 把包子的經緯度單獨拿出來做聚類,分析出,喜歡吃包子的人住在哪才能更方便的吃上包子!
  • 從上面的聚類點也可以看出,道外區是最多包子鋪的,張包鋪我也去吃過,排骨包裡面真的有排骨!差點沒把牙磕壞了,,,,跑題了,距離更多包子鋪最近的點已經給出,和輻射區範圍接近,這裡更適合做中轉站,因為去各個包子鋪都是最近的!
  • 可以從影象自帶緩衝區看重疊部分,看包子熱點

所以綜上所述,喜歡吃包子的吃貨,可以選擇以上的點當做中轉點或者住宿點,到哪個包子鋪都是比較近的,但是!!!誰會一天三餐加夜宵都吃包子??開個玩笑哈

更多組合

喜歡吃什麼,任君挑選,比如說,你又喜歡吃餃子又喜歡串串香,沒問題,看看他們都在哪。聚類我沒做,懶。和做包子聚類點類似,先把餃子的經緯度和串串香經緯度挑出來,再進行聚類即可


  • 再比如包子和扒肉你都喜歡,那麼看看重合區,不愧是老道外,真的是美食天堂啊!

  • 人氣最高&口味最好~這個,額,我一家都沒去過。。。。不做分析。。。

  • 當然,你還有不可兼得的燒烤&酸菜,哭

圖就到這,更多美食大家自己去發現,點開圖層就可以了~

Pay Atterntion

1.再進行對熱點區域的切割的時候,需要比較閾值,出現了錯誤,測試發現原來型別錯誤,比較錯誤,如下演示。

2.呼叫API經度誤差的問題,具體演示這裡,誤差我看了一下。能呼叫的API精度誤差大概百米多,沒辦法,能免費呼叫的API大家都懂的。

當然,很多都是比較準確的,比如這些。

總結

最終住哪,這不是我能決定的,主要還是靠交通,住宿環境和個人心情,推薦住在地鐵附近,吃貨可以選擇在中央大街附近,最繁華,也里老道外很近,好吃的很多~誒,等等,我不是在做學術研究麼。。

附錄–程式碼

這是核心程式,呼叫的API_get子程式太長了.

回覆公眾號"吃貨" 獲取更多原始碼。