這篇使用的範例資料為 台北市的不動產買賣資料
然後試著分析台北市房價 和 資料中其他變數關係
資料的取得可以參考 之前的文章
[免費的分析資料來源1] : "政府開放資料平台"
本篇的大綱為:
1.套件的設 => 2.讀入資料與了解資料=> 3.資料的預處理
1.套件的設定
###新手小白在做迴歸的的起手式 一定會有下面3個
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#plt 之前介紹不多 但這是繪圖的重要套件
#下邊的幾個關於plt的指令 新手小白建議大家是直接貼上就好
#這是一個很好的預設了~~
%matplotlib inline #這個一定要打喔 這樣畫的圖才會都在 JUPYTER上
# 作圖風格 其實就是圖的 背框阿 顏色阿 樣式等等的
# 我是喜歡用ggplot 這個
plt.style.use('ggplot')
plt.rcParams['font.family']='DFKai-SB' #顯示中文其中包含字體名稱 (for Win10)
plt.rcParams['axes.unicode_minus']=False #正常顯示負號
#另外是 pd的設定
pd.set_option("display.max_columns",30) #設定pandas最多顯示出30個欄位資訊
#這個之前有介紹過了 如果你要處理的資料欄位很多 那python裡會自動在中間幫你用{...}跳欄
#所以可以設display.max_columns 顯示最大的欄位到第幾欄
#但這些都是有好有壞的 如果cut到你想要的欄位就糟了
#最好的方法還是 讀完資料後 用df.columns 來看看有那些欄位是你想要的
2.讀入資料與了解資料
#簡單的read_csv 然後 encoding='big5' 讓欄位可以顯示中文
df = pd.read_csv('A_LVR_LAND_A.csv', encoding='big5') #這要自己去看CSV檔喔 A_LVR_LAND_A 是台北市
df.sample(5) #隨機取其中5筆資料 #或我們可以用 df.head()
###下邊只是貼了一下圖 給大家對照一下
### 有趣的是 我們發現欄位中有一項 叫做"交易標的"
### 我做了一個簡單的事情來觀察一下
df.groupby('交易標的').mean() #這會根據相同的交易標的合併成一個group 再算他的mean
### 這才想到.....
### 這份資料有包含土地和車位的交易 但我們只想分析房價
### 所以我們要進行一些資料的預處理囉~~
3.資料的預處理
### 去除土地和車位兩種交易資料
df = df[(df['交易標的']!='土地') & (df['交易標的']!='車位')].reset_index(drop=True)
# 說一下這段 再做什麼
# df[(df['交易標的']!='土地') & (df['交易標的']!='車位')]
# 這句就是把 df 裡交易標的是 "土地"和"車位" 的資料取出來
# 因為會刪掉一些row 所以 index 就需要reset 所以有 resrt_index 這句
# 那當中的drop=True 指的是說 舊的index 不要保留 ( 不然會多出一行舊的index... )
# 新手小白 是認為 reset_index(drop=True) 這句算是固定用法 就先記起來吧~~
### 方便顯示資料 稍微把單位換一下
df.loc[:,'總價元'] = df.loc[:,'總價元']/10000 #把總價除以10000 改成以萬為單位,方便圖表顯示
df.groupby('交易標的').mean() # 確認一下我們更改完的資料吧~
## 可以看到 車位和土地被我們刪掉了~~總價也改成不是這麼大的單位(數字都除1000)
### 最後本篇文章要談的資料預處理是關於資料格式的
### 我們大概都想得到 新的房屋貴 舊的房子便宜 (房價跟時間會是相關的)
### 所以我們來看一下資料中跟時間有關的變數
### 其中就是 交易年 跟 屋齡 了
print(df.loc[0,'交易年月日'])
print(type(df.loc[0,'交易年月日'])) #看看是怎麼樣的資料格式
### 可以發現 他指的是 104年 03 月 03 日
### 但要特別注意!!! 他的資料格式是 int
### 也就是整數的意思 對於py來講 它會視為是 一百萬零四萬三百零三!!
### 如果要把它變成交易年要怎麼做呢??
### 其實就把它除以一萬就好了~~
for i in range(len(df)):
df.loc[i,'交易年'] = round(df.loc[i,'交易年月日']/10000) #除以一萬變成年
#這邊 round 就是取整數的意思
### 至於要怎麼得到屋齡呢 我們需要多幾個步驟
### 首先還是看一下 資料格式
print(df.loc[0,'建築完成年月'])
print(type(df.loc[0,'建築完成年月']))
### 雖然建築完成的年月 資料格式是float64
### 但在這邊處理方式也是一樣除以10000就可以得到年了
### 而再來屋齡的計算 就是用 (今年 - 建築完成年)
### 所以我們引進一個函數 datetime.now()
### 來得知今年是幾年
from datetime import datetime
now = datetime.now()
now.year # 今年是西元幾年
### 最後 用一個 for loop 搞定
for i in range(len(df)):
df.loc[i,'建築完成年'] = round(df.loc[i,'建築完成年月']/10000)
df.loc[i,'屋齡'] = now.year - 1911 - round(df.loc[i,'建築完成年月']/10000) #要記得先扣掉1911
### 讓我們看看結果吧~~
df.loc[0:5,['屋齡','交易年']]
#### 以上就是今天的分享 謝謝大家收看^^
後記:
最近很多事情有新的進展,所以比較忙,網誌更新就覺得懶了...
但新手小白的學習之路一定不停止~~ 持續更新! keep fighting!!
留言列表