日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python数据分析实战:上海二手房价分析

發(fā)布時(shí)間:2024/3/26 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python数据分析实战:上海二手房价分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1 數(shù)據(jù)搜集

使用 urllib 庫(kù)中的request 模塊爬取趕集網(wǎng)發(fā)布的上海二手房信息,包括包括戶(hù)型、面積、單價(jià)等,再使用BeautifulSoup 庫(kù)解析爬取的HTML數(shù)據(jù),最終將數(shù)據(jù)保存到CSV文件中。

import urllib.request from bs4 import BeautifulSoup import pandas as pd#爬取數(shù)據(jù) def request_Data(url):#創(chuàng)建requests對(duì)象req = urllib.request.Request(url)page_data_list = []with urllib.request.urlopen(req) as response:data = response.read()htmlstr = data.decode()L = parse_HTMLData(htmlstr)page_data_list.extend(L)return page_data_list#解析數(shù)據(jù) def parse_HTMLData(htmlstr):sp = BeautifulSoup(htmlstr,'html.parser')#獲得房子信息列表house_list = sp.select('#f_mew_list > div.f-main.f-clear.f-w1190 > div.f-main-left.f-fl.f-w980 > div.f-main-list > div > div')#當(dāng)前頁(yè)中的記錄列表page_list = []for house in house_list:#每一行數(shù)據(jù)rows_list = []#獲得房子標(biāo)題title = house.select('dl > dd.dd-item.title > a')title = (title[0].text).strip()rows_list.append(title)#獲得房子信息infos = house.select('dl > dd.dd-item.size > span')# 獲得房子戶(hù)型house_type = (infos[0].text).strip()rows_list.append(house_type)# 獲得房子面積house_area = (infos[2].text).strip()rows_list.append(house_area)# 獲得房子面積house_face = (infos[4].text).strip()rows_list.append(house_face)# 獲得房子樓層house_floor = (infos[6].text).strip()rows_list.append(house_floor)#獲得房子所在城區(qū)addr_dist = house.select('dl > dd.dd-item.address > span > a.address-eara')addr_dist = (addr_dist[0].text).strip()rows_list.append(addr_dist)#獲得房子所在小區(qū)addr_name = house.select('dl > dd.dd-item.address > span > a > span')addr_name = (addr_name[0].text).strip()rows_list.append(addr_name)#獲得房子總價(jià)total_price = house.select('dl > dd.dd-item.info > div.price')total_price = (total_price[0].text).strip()rows_list.append(total_price)#獲得房子單價(jià)price = house.select('dl > dd.dd-item.info > div.time')price = (price[0].text).strip()rows_list.append(price)page_list.append(rows_list)return page_listurl_temp = 'http://sh.ganji.com/ershoufang/pn{}/'data_list = []for i in range(1,71): #總共70頁(yè)url = url_temp.format(i)print(url)print('+++++第{}頁(yè)++++++'.format(i))try:L = request_Data(url)data_list.extend(L)except Exception as e:#不再循環(huán)print('不再有數(shù)據(jù),結(jié)束循環(huán)')breakprint(data_list)#保存數(shù)據(jù) #列名 colsname = ['標(biāo)題', '戶(hù)型', '面積', '朝向', '樓層', '城區(qū)', '小區(qū)名', '總價(jià)', '單價(jià)'] df = pd.DataFrame(data_list, columns = colsname) df.to_csv('data/house_data.csv',index = False,encoding='gbk')

2 數(shù)據(jù)清洗

import pandas as pd import numpy as np house_df = pd.read_csv('data/house_data.csv',encoding='gbk') house_df.rename(columns={'標(biāo)題': 'title', '戶(hù)型': 'type', '面積': 'area', '朝向': 'face', '樓層': 'floor', '城區(qū)': 'addr_dist', '小區(qū)名': 'addr_name', '總價(jià)': 'total_price', '單價(jià)': 'price'},inplace=True) house_df.head()

前5條房源記錄

2.1 處理缺失值

house_df.isnull().sum()

沒(méi)有缺失值,工作量減輕

2.2 刪除重復(fù)數(shù)據(jù)

刪除重復(fù)行

house_df.duplicated().sum()

有832條重復(fù)數(shù)據(jù)

house_df2 = house_df.copy() house_df2.drop_duplicates(inplace = True) house_df2.count()

去重后剩余2626條數(shù)據(jù)

刪除重復(fù)列

總價(jià)與單價(jià)重復(fù),因此刪除總價(jià)

house_df3 = house_df2.copy() house_df3.pop('total_price')

2.3 統(tǒng)一數(shù)據(jù)格式

去掉面積的單位:m2,去掉單價(jià)的單位:元/m2

house_df4 = house_df3.copy() house_df4['area'] = house_df4['area'].map(lambda x : float(x[0:-1])) house_df4['price'].map(lambda x : float(x[0:-3])).head() house_df5['price'] = house_df5['price'].map(lambda x : float(x[0:-3]))

2.4 過(guò)濾數(shù)據(jù)

過(guò)濾掉地址為“上海周邊”的房源記錄

house_df6 = house_df5[house_df5['addr_dist'] != '上海周邊'] house_df6.count()

數(shù)據(jù)清洗后剩余2484條數(shù)據(jù)
保存數(shù)據(jù)

house_df6.index = list(range(1,2485)) house_df6.to_csv('data/house_info.csv',encoding='gbk')

3 數(shù)據(jù)分析

house_df = pd.read_csv('data/house_info.csv',encoding='gbk') house_df.pop('Unnamed: 0') house_df.head()

3.1 數(shù)據(jù)分組和聚合

grouped_house_df = house_df.groupby(['addr_dist']) grouped_house_df.mean()


各區(qū)房屋平均面積、單價(jià)

3.2 數(shù)據(jù)透視

各區(qū)不同朝向的房屋平均單價(jià)

house_df.pivot_table(index = ['addr_dist'], columns = ['face'], values='price',fill_value=0)


各區(qū)不同戶(hù)型和朝向的房屋平均單價(jià)

house_df2.pivot_table(index = ['addr_dist'], columns = ['face','type'], values='price',fill_value=0)

4 數(shù)據(jù)可視化

import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['simhei'] # 指定默認(rèn)字體 mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問(wèn)題

4.1 各區(qū)二手房?jī)r(jià)格可視化

mean_price_district = house_df.groupby('addr_dist')['price'].mean().sort_values(ascending=False) mean_price_district.plot(kind='bar',color='b') plt.ylim(10000,80000,10000) plt.title("上海市各區(qū)二手房平均價(jià)格") plt.xlabel("上海市行政區(qū)劃") plt.ylabel("房屋平均價(jià)格(元/平方米)") plt.xticks(rotation = 360) plt.rcParams['figure.dpi'] = 300 plt.savefig('picture/上海市各區(qū)二手房平均價(jià)格.jpg')


可以看出黃浦區(qū)均價(jià)最貴,其次是徐匯、長(zhǎng)寧、虹口等,房?jī)r(jià)均價(jià)較高的前八名均屬于上海中心城區(qū)(黃浦、徐匯、長(zhǎng)寧、楊浦、虹口、普陀、靜安以及浦東新區(qū)的外環(huán)內(nèi)城區(qū));奉賢、金山、崇明等周邊城區(qū)的均價(jià)較低。

house_df.boxplot(column='price', by='addr_dist') plt.title("上海市各區(qū)二手房?jī)r(jià)格箱形圖") plt.suptitle("") plt.xlabel("上海市行政區(qū)劃") plt.ylabel("房屋單價(jià)(元/平方米)") plt.savefig('picture/上海市各區(qū)二手房?jī)r(jià)格箱形圖.jpg')

上海中心城區(qū)具有較多上側(cè)異常值,其中浦東最多,這與常識(shí)相符,如靠近知名商圈或豪宅小區(qū)的房?jī)r(jià)會(huì)特別貴。 相反,上海的周邊城區(qū)異常值極少,房?jī)r(jià)分布區(qū)間相對(duì)較小。

4.2 各區(qū)二手房?jī)r(jià)格受面積影響情況可視化

def plot_scatter():plt.figure(figsize=(10,8),dpi=256)colors = ['red', 'red', 'red', 'red','blue', 'blue', 'blue', 'blue','green', 'green', 'green', 'green','gray', 'gray', 'gray', 'gray']addr_dist = ['黃浦','徐匯','長(zhǎng)寧','虹口','普陀','楊浦','靜安','浦東','閔行', '寶山','松江','嘉定','青浦','奉賢', '金山', '崇明']markers = ['o','s','v','x','o', 's', 'v', 'x','o', 's', 'v', 'x','o', 's', 'v', 'x']print(addr_dist)for i in range(16):x = house_df.loc[house_df['addr_dist'] == addr_dist[i]]['area']y = house_df.loc[house_df['addr_dist'] == addr_dist[i]]['price']plt.scatter(x, y, c=colors[i], s=20, label=addr_dist[i], marker=markers[i])plt.legend(loc=1,bbox_to_anchor=(1.138,1.0),fontsize=12)plt.xlim(0,500)plt.ylim(0,200000)plt.title('上海各區(qū)二手房面積對(duì)房?jī)r(jià)的影響',fontsize=20)plt.xlabel('房屋面積(平方米)',fontsize=16)plt.ylabel('房屋單價(jià)(元/平方米)',fontsize=16)plt.savefig('picture/上海各區(qū)二手房面積對(duì)房?jī)r(jià)的影響.jpg')plot_scatter()


按照平均房?jī)r(jià)的順序排列,紅色為價(jià)格第一梯隊(duì),藍(lán)色為價(jià)格第二梯隊(duì),綠色為價(jià)格第三梯隊(duì),灰色為價(jià)格第四梯隊(duì),每個(gè)梯度包含四個(gè)行政區(qū)劃。從散點(diǎn)圖中可以觀察到第一梯隊(duì)的紅色散點(diǎn)相對(duì)偏向左上方,各個(gè)梯隊(duì)相比于上一梯隊(duì)整體向下偏移。

4.3 各區(qū)二手房?jī)r(jià)受朝向影響情況可視化

df = (house_df['face'].value_counts()).to_frame() plt.figure(figsize=(15,15)) plt.pie(df['face'], labels=df.index.values, autopct='%.1f%%', pctdistance=0.9) plt.title('上海市二手房朝向',fontsize=20) plt.savefig('picture/上海市二手房朝向.jpg')

朝向主要是南和南北朝向,接下來(lái)針對(duì)這兩種朝向展開(kāi)分析。

house_df2 = house_df.rename(columns={'price': '房屋價(jià)格(元/平方米)', 'addr_dist': '上海市行政區(qū)劃', 'face': '朝向'}) house_df2 = house_df2[house_df2['朝向'].isin(['南','南北'])] g = sns.catplot(data=house_df2,x='朝向',y='房屋價(jià)格(元/平方米)',col='上海市行政區(qū)劃',kind='swarm',col_wrap=4,aspect=1.2) plt.savefig('picture/上海市各區(qū)二手房朝向?qū)Ψ績(jī)r(jià)影響.jpg')

規(guī)律不是很明顯,總體上,各區(qū)南朝向的房屋數(shù)量更多,最高價(jià)格更高。

4.4 各區(qū)二手房?jī)r(jià)受戶(hù)型影響情況可視化

df = (house_df['type'].value_counts())[:16].to_frame() plt.figure(figsize=(15,15)) plt.pie(df['type'], labels=df.index.values, autopct='%.1f%%') plt.title('上海市二手房戶(hù)型',fontsize=20) plt.savefig('picture/上海市二手房戶(hù)型.jpg')


戶(hù)型主要是1室1廳1衛(wèi)、2室1廳1衛(wèi)、2室2廳1衛(wèi)、3室2廳1衛(wèi)、3室2廳2衛(wèi),接下來(lái)針對(duì)這5種戶(hù)型展開(kāi)分析。

house_df2 = house_df.rename(columns = {'type':'戶(hù)型','price': '房屋平均價(jià)格(元/平方米)','addr_dist': '城區(qū)'}) house_df2 = house_df2[house_df2['戶(hù)型'].isin(['1室1廳1衛(wèi)','2室1廳1衛(wèi)','2室2廳1衛(wèi)','3室2廳1衛(wèi)','3室2廳2衛(wèi)'])] g = sns.catplot(kind="bar",data=house_df2, x='戶(hù)型', y='房屋平均價(jià)格(元/平方米)', col='城區(qū)', col_wrap=4, aspect=1.2, order = ['1室1廳1衛(wèi)','2室1廳1衛(wèi)','2室2廳1衛(wèi)','3室2廳1衛(wèi)','3室2廳2衛(wèi)']) plt.savefig('picture/上海市各區(qū)二手房戶(hù)型對(duì)房?jī)r(jià)影響.jpg')


隨著戶(hù)型的增大,平均價(jià)格也基本增大;在部分區(qū)存在1室1廳1衛(wèi)、2室2廳1衛(wèi)這兩種戶(hù)型價(jià)格較高的現(xiàn)象。

個(gè)人練手項(xiàng)目,以上代碼有參考來(lái)自CSDN的[Python數(shù)據(jù)分析實(shí)戰(zhàn)篇:從數(shù)據(jù)搜集到數(shù)據(jù)可視化一步一步完成二手房?jī)r(jià)數(shù)據(jù)分析]以及[Python數(shù)據(jù)分析——上海市二手房?jī)r(jià)格分析](放鏈接審核不通過(guò),說(shuō)有廣告,我也是醉了)。

總結(jié)

以上是生活随笔為你收集整理的Python数据分析实战:上海二手房价分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。