跳到主要內容

澳門住宅成交統計可視化

澳門住宅成交統計可視化

 本文會使用python 中的pandas 和matplotlib 程式庫對澳門2019-2020住宅買賣成交的資料以圖像形式展示。 住宅每月的成交數目可以從財政局網下載 而本文中所有的程式碼及資料可在我的github下載。 整個數據可視化成果可在https://nbviewer.jupyter.org/github/Isaac234517/Macau-House-Analysis/blob/master/house_trending.ipynb 瀏覽。

資料下載

前往澳門財政局網站, 下載2019年全年及 2020 1-4月的住宅成交數據。



澳門財政局每月也會把上月登記的不動產轉移在每月月初及月中公布。 下載所有資料後 需要為資料檔案重命名並把檔案放在對應的資料夾下。 資料夾以年份命名,如(2019,2020..) 檔案名稱以月份_(上/下半月)命名,如2019資料夾下的1_1 excel 檔案 是2019 年1月上半月的住宅成交量數據。 

可視化工作安裝

在大家著手開始可視化工作前, 大家的電腦需要安裝Python 3.7, jupyter notebook, pandas numpy 和matplotlib。 最為簡單的方式是透過安裝Ananconda  套件一併安裝以上的程式。


可視化

下載數據後,首先先看看數據格式
我們這次是要把每月成交的數量以區域劃分圖表表示, 原則上只需要這需要區域及成交量便可。 但我們還是把區域、大廈名稱、成交量和平均樓價保留。 並把欄位名稱換成英文。 


為了統一處理每次匯入資料的方式給把資料的格式正規化, 我建立了get_dsf_building_df function。
函式會把資料表的欄位名稱更改及加入“year”和“month” 欄位。最後返回一個包含Year, month,Area, Building_Name, Volue, Price/㎡ 的data frame.

在jupter_notebook 中我還在檔案開端加入
matplotlib.rcParams['font.sans-serif'] = ['Microsoft JhengHei']
matplotlib.rcParams['font.family'] ='sans-serif'

主要目的是讓中文於由matplotlib Library 繪畫的圖的中文不會顯示亂碼。

然後,先查看返回的data frame的資料是否正確, 下圖是2020年1月上半月的數據。
2020年1月上半月

然後分別合併2020年1月上半月及下半月以及2019年1月上半月及下半月的資料至同一個dataframe中。
最後使用groupby 把成交量按區域劃分併加總。  及把2020年1月的資料合併至2019年的Dataframe中以便以圖表形式表示。
完成以上步驟, 可得出如下資料
最後使用matplotlib中的plot 函式繪畫出方形圖

我們把xtick 的label 旋轉25度原因是label太長不好顯示
成果圖如下:


接著, 我們重複上述的步驟,便可得出2月、3月及4月的成交量方形圖。


2月樓宇成交量

3月樓宇成交量


4月樓宇成交量

接著,繪畫出2019年全年樓宇成交量的線形圖。


首先列出2019全年的資料檔案。 然後構建一個空的Data frame。 再利用for loop 把資料讀出並存放在data frame中。 之後可使用groupby 計算出每月份的成交量

結果如下:










最後利用matplotlib中的plot繪圖

從上圖可見,總體成交量自5開始有下降趨勢。
最後,再比較一下2019年第一季與2020年第一季的樓宇成交量,並繪出線形圖

圖中橙色是2019年,藍色是2020年。 從圖中可見2019年第一季每月的樓宇成交量也比2020第一季的每月高。 2020年第一季相比2019年第一季的樓宇成交量是下降的。 可能是因為疫情關係吧!  但可見2020年三月份的樓宇成交量是高於首兩個月。


總結

本文簡單利用澳門財政局的資料把2019年及2020年的住宅成交量以圖表顯示出來。 而且也只是使用了較初階的函式。 應該適合剛開始著手使用Python實現數據可視化的讀者們。 最後以下會列出一些我覺得適合新手學習數據可視化Library的教學資源。

教學資料

留言

這個網誌中的熱門文章

如何使用Macbook 進行W-Fi 竊聽及信號分析

OS X 中的Wi-Fi Analyzer 工具 要對無線網絡進行分析及診斷, 首先要在PC中安裝Wi-Fi Analyzer 應用程式。 Wi-Fi Analyzer是一種可以檢察Wi-Fi 信號強弱,找出適合架設Wi-Fi 的Channel , 搜尋附近Wi-Fi 接點及竊聽經Wi-Fi 傳送的網絡封包(這功能要視乎你的網卡是否支援監控模式)的工具。  在網絡上有不同的Wi-Fi Analyzer 供大家下載。 而在OS X 系統中, 其實已預設安裝了Wireless Diagnostics 程式。   在本文中, 會假定讀者對Wi-Fi 的專業名詞(如noise, ssid bssid 等)有基本的認識。 因此, 只會展示Wireless Diagnostics 的操作方法 。  Wireless Diagnostics  Wireless Diagnostics  是一個預設安裝在 OS X 系統的Wi-Fi 分析工具。 用戶可透過它的GUI 介面操作。  在主畫面中,按下option 鍵並點擊在上角的Wi-fi標記會出現Open Wireless Diagnostics。 然後點選它。 點擊工具列中的Window。 並會出現以下選項 如圖 1. Info     點取Info, 會顯示你現在所使用的Wi-fi資訊。 包括它的BSSID,Mac Address,Channel, Network Interface  等等資訊。 如下圖 2. Logs 點選Logs的話, 你可以選取想要收集的網絡介面日誌資訊。 要注意這設定需要重啓電腦才能生效。 並且它是會把收集到的資訊紀錄在電腦中。 因此當你不需要使用時,請記得把它關閉, 以免造成資源浪費。 3.Scan    點選Scan 的話,系統會立即掃描附近的AccessPoint  並列出它們的資料,包括SSID,Mac Address, Noise,RSSI,Channel 等等 資訊。另外系統也會對系統的現時環境作出評估, 列出最合適架設Wi-Fi 的 Channel。 以下圖 圖中的Summary, 就是系統對現在環境的評估。 Total 是系統偵擦到的AccessPoint 數目。 而Best 2.4GHz和Be

C# XML(輸出教學)

C# XML 輸出教學 XML 是其中一種主流的數據儲存格式之一, 在C# 中, 大概有3種不同的寫法把數據輸出成XML 文件。 在本文中, 我會利用一個簡單的Window form 程式介紹這3種不同的寫法。  以下是範例的XML 格式 <Im>    <Number>xx</Number>    <Name> xxx</Name>    <Type> xxx <Type>    <Data> xxx </Data> </Im> 從以上的結構可輕易看得出, 這個範例是把一張圖片輸出成XML 格式。 這是範例中使用的圖片 成功輸出的XML 文件 在Chrome 中顯示 Window form 程式 XML 輸出方法 方法一 首先要介紹的寫法是利用XMLElement 的操作, 在XmlDocument 中構建XML 節點。 上述程式碼先構建一個全新的XmlDocument, 然後逐一構建節點。 最後把構建的節點放到對應的節點或XML Root 節點下。 成功構建後便使用XmlDocument 中的save 方法輸出XML 文件。 以上要注意的事是使用這種方法生成XML 的話, 如遇到要處理圖片的情況。 請先把圖片轉換成base64 字串後, 再放到節點的inner Text 中。 方法二 第二種方法是利用XmlTextWriter 把xml node 按順序寫入Filestream 中。 最後輸出成XML 文件。 程序碼如下, 和方法1相比, 如遇到要處理圖片的情況下, 則只需把圖片的binary data  放到byte 類型的數組中, 再利用XmlTextWriter中的WriteBase64 方法便可。 不用自行轉換成base64字串。 但要留意的事是 由於是使用XmlTextWriter 是把text 以串流的型式輸出。 所以寫入資料流 時最好要按Xml結構的順序寫入。 因為在串流中append 結構是比較困難的事。 方法三 最後一種方法是使用XML.Serialization 空間下的方法, 個人比

C# 的Dynamic Object

C# 的Dynamic Object  介紹 在 .Net 4.0 版本 , C# 引入了動態編程。 實則上它並不是C# 語言的一部分 , 因為它是通過引入Dynamic Language Runtime(DLR library) 來實現的 。 對DLR Library 有興趣的話 可瀏覽( https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/dynamic-language-runtime-overview )  但對於編譯語言(Compiled Language) 來說 ,  引入Dynamic 特性在當時(.Net 4.0 是在2010 發佈的)是一種大躍進 。 雖然 C# 中已有支援動態特性 , 但C# 始終是一種編譯語言 。所以我還是建議如非必要的話,還是不要使用動態編程 。 如果靜態編譯是可以做到這個效果的話就用靜態編譯實現 。 因為使用動態編程的話 , 在編譯時是不會提示你的程式碼會不會有錯誤 , 因此大大增加了執行時出現錯誤的風險 。 而且由於動態編程是late-binding. 所以物件的類別在執行時才會決定 。這種做法相對於靜態編譯是會有執行效率低的問題。 因此 編寫C# 程式應該以靜態編程的方式為主 。 但在以下情況 ,  用動態編程來編寫會較為合適 需要興COM Object 互動 Duck typing 需要與dynamic script language 如IronPython 或Ironruby 等互動 。 以上的情況, 有興趣的讀者可從互聯網中參考,  本文的以下部分會集中 說明C# 中 動態編程的基本語法, 介紹ExpandObject, DynamicObject 和 IDynamicMetaObject 及ExpandoObject 和DynamicObject 的用法。 Dynamic Keyword 若要在C# 中使用dynamic object, dynamic 這個keyword 你是絕對需要知道的 。 當一個變量以dynamic 作為它的型態 。 便代表它是late-binding. 編譯器在執行編譯時不會判斷它的型態 。 因此