前言
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
作者:CDA資料分析師
對于許多在一線城市打拼的人群而言,能夠在大城市安家,扎根下來都是為止奮斗的夢想,但一線城市的突破天際房價也讓很多人望而卻步,
轉眼間2020年已經過半,大家買房子、買房子的愿望實作了嗎?你關注的房子降價了嗎?
那么帝都的二手房市場又是怎樣的呢?這次我們用Python來分析下北京的二手房資料,
我們使用Python獲取了鏈家網上北京市16個區的二手房資料,首先匯入要使用的資料處理包pandas,可視化工具pyecharts和plotly,
# 匯入所需包 import numpy as np import pandas as pd import matplotlib.pyplot as plt import os from pyecharts.charts import Pie, Map, Bar, Line, Grid, Page from pyecharts import options as opts import plotly as py import plotly.graph_objs as go import plotly.express as px
資料讀入
使用回圈讀入資料集,然后進行去重處理,查看一下資料集大小,可以看到去重之后一共有4403條資料,
# 讀入資料 file_list = os.listdir('../data/') df_all = pd.DataFrame() for file in file_list: file_name = file.split('.')[0] df = pd.read_csv(f'../data/{file}') df['region_name'] = file_name df_all = df_all.append(df, ignore_index=True) # 去重 df_all = df_all.drop_duplicates() print(df_all.shape) (33509, 9)
預覽以下資料:
df_all.head(2)
資料預處理
我們對資料集的各個特征進行提取和處理,以便后續的資料分析作業,主要處理作業包含:
- title:無需分析,洗掉
- detail_url:無需分析,洗掉
- position:維度過細、洗掉
- houseInfo:提取室、廳、面積、方位、裝修、樓層(高中低)、建筑年份、板塔
- followInfo:無需分析,洗掉
- tag_info:提取是否靠近地鐵
- total_price:提取房屋總價
- unitPrice:房屋單價
- region_name:無需處理
# 洗掉列 df_all = df_all.drop(['title', 'detail_url', 'position', 'followInfo'], axis=1) # 提取室廳 df_all['halls'] = df_all['houseInfo'].str.split('|').str[0].str.extract(r'(\d+)室') df_all['bedrooms'] = df_all['houseInfo'].str.split('|').str[0].str.extract(r'\d室(\d+)廳') # 提取面積 df_all['area'] = df_all['houseInfo'].str.split('|').str[1].str.extract(r'(\d+.*\d+)平米') # 提取朝向 df_all['orient'] = df_all['houseInfo'].str.split('|').str[2] # 提取裝修型別 df_all['decorate_type'] = df_all['houseInfo'].str.split('|').str[3] # 提取樓層 df_all['floor'] = df_all['houseInfo'].str.split('|').str[4] # 提取建筑年份 df_all['built_year'] = df_all['houseInfo'].str.split('|').str[5].str.extract(r'(\d+)') # 提取板塔 df_all['banta'] = df_all['houseInfo'].str.split('|').str[6] # 洗掉houseInfo df_all = df_all.drop('houseInfo', axis=1) # 提取地鐵 df_all['subway'] = [1 if '地鐵' in i else 0 for i in df_all['tag_info']] # 洗掉tag_info df_all = df_all.drop('tag_info', axis=1) # 提取總價 df_all['total_price'] = df_all['total_price'].str.extract(r'(\d+)') df_all['unitPrice'] = df_all['unitPrice'].str.extract(r'(\d+)') # 空值-直接洗掉 df_all = df_all.dropna() # 轉換資料型別 df_all['total_price'] = df_all['total_price'].astype('int') df_all['unitPrice'] = df_all['unitPrice'].astype('int') df_all['halls'] = df_all['halls'].astype('int') df_all['bedrooms'] = df_all['bedrooms'].astype('int') df_all['area'] = df_all['area'].astype('float') df_all['built_year'] = df_all['built_year'].astype('int') df_all['subway'] = df_all['subway'].astype('int') df_all.head()
進一步處理樓層、建筑年份和房屋朝向欄位,
def transform_floor(x): if x == '高樓層' or x == '頂層' or x == '上疊': return '高層' elif x == '低樓層' or x == '底層' or x == '下疊' or x == '1層' or x == '2層' or x == '3層': return '低層' elif x == '中樓層' or x == '4層' or x == '5層' or x == '6層': return '中層' elif x == '地下室': return '地下室' else: # 其他歸為高層 return '高層' # floor一般化 df_all['floor_type'] = df_all['floor'].str.replace(r'\(.*?\)', '').str.strip() df_all['floor_type'] = df_all.floor_type.apply(transform_floor) df_all = df_all.drop('floor', axis=1) # orient-一般化 df_all['orient'] = df_all['orient'].str.extract(r'([\u4e00-\u9fa5])') # bulit_year df_all['built_year'] = 2020 - df_all['built_year'] # banta-一般化 df_all['banta'] = df_all.banta.str.strip() df_all.head()
資料探索和可視化
以下僅列出關鍵部分資料可視化分析代碼:
近一年北京二手房房價走勢圖
首先我們看到近一年來,北京二手房房價的走勢圖,可以看到有回呼的趨勢,目前的均價在每平方米57589的樣子,
北京不同區域的二手房房源數量
那么北京各個區域的二手房源分布如何呢?
經過統計可以看到,朝陽區的二手房數量遙遙領先,達到25648.其次是豐臺,共11094,之后海淀、昌平、大興緊隨其后,
北京不同區域的二手房均價
不同區域的二手房價又是怎樣的呢?西城區一馬當先,以114980元每平米的價格領跑北京的二手房市場,其次,東城區以97295每平米排在第二位,海淀區以85954每平米的價格排在第三位,
代碼如下:
# 產生資料 s_region = df_all.groupby('region_name')['unitPrice'].mean().sort_values(ascending=False) x_data = [i+'區' for i in s_region.index.tolist()] y_data = [round(i) for i in s_region.values.tolist()] data_pair = [list(z) for z in zip(x_data, y_data)] # 地圖 map1 = Map(init_opts=opts.InitOpts(width='1350px', height='750px')) map1.add('', data_pair, maptype='北京') map1.set_global_opts(title_opts=opts.TitleOpts(title='北京不同區域的二手房均價(元/平米)'), visualmap_opts=opts.VisualMapOpts(max_=114979)) map1.render() # 條形圖 bar2 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px')) bar2.add_xaxis(x_data) bar2.add_yaxis('', y_data) bar2.set_global_opts(title_opts=opts.TitleOpts(title='北京不同區域的二手房均價(元/平米)'), visualmap_opts=opts.VisualMapOpts(max_=114979)) bar2.render()
北京二手房都處在什么價位
那么在北京買一套二手房到底要花多少錢?接著我們分析了二手房的價位,從圖中可以看到總價在300-500萬內的最多,占比達到35.9%,500-800萬的占比26.54%,300萬以下的占比19.54%,
代碼如下:
bins = [74, 300, 500, 800, 1000, 8299] bins_label = ['300萬及以下', '300-500萬', '500-800萬', '800-1000萬', '1000萬以上'] # 新增欄位 df_all['price_cut'] = pd.cut(df_all['total_price'], bins=bins, labels=bins_label) price_num = df_all.price_cut.value_counts() # 資料對 data_pair = [list(z) for z in zip(price_num.index.tolist(), price_num.values.tolist())] # 繪制餅圖 pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px')) pie1.add('', data_pair=data_pair, radius=['30%', '60%'], rosetype='radius') pie1.set_global_opts(title_opts=opts.TitleOpts(title='北京二手房都處在哪些價位?'), legend_opts=opts.LegendOpts(orient='vertical', pos_top='15%', pos_left='2%')) pie1.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%")) pie1.set_colors(['#FF7F0E', '#1F77B4', '#2CA02C', '#D62728', '#946C8B']) pie1.render()
北京二手房房齡分布
那么這些二手房的房齡都有多久了呢?可以看到房齡在20年以上的最多,有10946套占比33.73%,其次房齡在15-20年的有7835套,占比24.15%,5年以內的僅有1441套,占比4.44%,
是否靠近地鐵和房屋單價的關系
一般來說,靠近地鐵越近的房子房價越高,從分布的箱線圖可以看出,以中位數來看,靠近地鐵的房子單價比不不靠近地鐵的房子每平米高12317元,
不同朝向的房屋數量分布
房屋朝向方面,朝南的自然是最多的,占比達到68.97%,其次是朝東的,占比18.25%,
不同房屋結構的數量分布
房屋結構方面,板樓是最多的占比64.39%,其次是塔樓,占比16.85%,板樓塔樓結合的占比16.45%,
房屋面積和房屋價格的關系
從散點圖可以看出,房屋的面積和房屋價格呈現正相關,計算皮爾遜相關系數的值為0.67,為強相關,
代碼如下:
# 添加軌跡 fig = px.scatter(df_all, x='area', y='total_price') fig.update_layout(title='房屋面積和房屋價格的關系(萬元)') py.offline.plot(fig, filename='房屋面積和房屋價格的關系.html')
臥室數量和房屋價格的關系
從分布的箱線圖可以看出,臥室數量越多,面積越大,則房屋總價越高,房價呈現右偏分布,且離群值較多,
客廳數量和房屋價格的關系
客廳和臥室一樣反映在房屋的面積上,客廳 數越多,則房屋總價越高,
代碼如下:
# 合并 df_all['halls'] = [i if i<=4 else '5及以上' for i in df_all['halls']] df_all['halls'] = df_all.halls.astype('str') # 添加資料 y1 = df_all[df_all['halls']=='1']['total_price'].values y2 = df_all[df_all['halls']=='2']['total_price'].values y3 = df_all[df_all['halls']=='3']['total_price'].values y4 = df_all[df_all['halls']=='4']['total_price'].values y5 = df_all[df_all['halls']=='5及以上']['total_price'].values # 實體Figure fig = go.Figure() # 添加軌跡 fig.add_trace(trace=go.Box(y=y1, name='1廳')) fig.add_trace(trace=go.Box(y=y2, name='2廳')) fig.add_trace(trace=go.Box(y=y3, name='3廳')) fig.add_trace(trace=go.Box(y=y4, name='4廳')) fig.add_trace(trace=go.Box(y=y5, name='5廳及以上')) # 配置項 fig.update_layout(title='客廳數量和房屋價格的關系(萬元)') py.offline.plot(fig, filename='客廳數量和房屋價格的關系.html')
裝修型別和房屋單價的關系
不同裝修型別花費的成本不同,從裝修型別看,精裝的房子單價最高,然后是簡裝、毛坯,
PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取
可以免費領取原始碼、專案實戰視頻、PDF檔案等
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61866.html
標籤:Python
