Python数据分析实战——杭州租房数据统计分析
本案例將租房網站上的杭州地區的租房數據作為參考,運用所學到的數據分析知識來分析真實數據,并以圖表的形式得到以下指標:
一 、數據來源
目前有很多的網絡租房平臺,如鏈家、房天下、安居客、貝殼等等,通過八爪魚采集器,共爬取到貝殼網上列出的租房信息18828條(去重后),采集信息包括所屬區域、面積、朝向、戶型、價格。
將采集到的數據保存為 csv 格式(貝殼杭州總租房信息.csv),采集結束時間為2020年3月10日。
二、數據讀取
(本文章所有代碼均在 Anaconda下運行)
數據準備好后,使用Pandas讀取保存在本地的CSV數據,并將其轉換成DataFrame對象展示,方便后續操作這些數據。
三、數據預處理
盡管采集到的數據大部分是比較完整的,但或多或或少還會存在一些問題,不能直接用于數據分析。因此 , 在進行數據分析前需要進行一系列的檢測與處理,包括重復值和缺失值的處理、統計數據類型等,以保證數據具有更多的完整性。
3.1 重復值和空值的處理
(由于已經在excel表格中對數據的重復值和缺失值進行了處理,所以以下的處理會看到數據的總數不變)
查看數據中是否存在重復值,可以通過Pandas中的duplicated() 方法完成 ,只要有重復的數據就會映射為True ,具體代碼如下
這里對于重復數據的處理是將其刪除,接下來使用 drop_duplicates() 方法直接刪除重復數據,具體代碼如下
# 刪除重復數據,并對file_data 重新賦值 file_data=file_data.drop_duplicates() file_data地區 面積 朝向 戶型 價格 0 上城 18 南 7室2廳 1800 1 上城 18 南 4室1廳 1860 2 上城 18 北 5室1廳 2000 3 上城 11 南 2室1廳 2230 4 上城 15 南 3室1廳 1800 ... ... ... ... ... ... 18823 余杭 116 南 3室2廳 2500 18824 余杭 101 南北 3室1廳 2500 18825 余杭 119 南 4室2廳 2000 18826 余杭 126 南 3室2廳 2000 18827 余杭 15 南 4室1廳 1530 18828 rows × 5 columns對數據的重復值處理完成后,便開始檢測缺失值,這里可以使用 dropna() 方法檢測缺失值并將檢測到的缺失數據刪除。
# 刪除缺失數據,并對file_data 重新賦值 file_data=file_data.dropna() file_data地區 面積 朝向 戶型 價格 0 上城 18 南 7室2廳 1800 1 上城 18 南 4室1廳 1860 2 上城 18 北 5室1廳 2000 3 上城 11 南 2室1廳 2230 4 上城 15 南 3室1廳 1800 ... ... ... ... ... ... 18823 余杭 116 南 3室2廳 2500 18824 余杭 101 南北 3室1廳 2500 18825 余杭 119 南 4室2廳 2000 18826 余杭 126 南 3室2廳 2000 18827 余杭 15 南 4室1廳 1530 18828 rows × 5 columns3.2 數據類型轉換
在這套租房數據中,“價格” 一列的數據中含有中文字符和回車符,說明這一列的數據都是字符串類型的。為了方便后面對價格數據進行數學運算,需要將 “價格” 一列的數據類型轉換為數字類型,具體代碼如下
list1=[] for i in file_data['價格'].values:list1.append("".join(filter(str.isdigit, i))) # 去除掉字符串中的非數字字符 numbers = [ int(x) for x in list1 ]# 字符串類型轉換成 int 類型 # 用新的數據替換 file_data.loc[:,'價格']=numbers file_data地區 面積 朝向 戶型 價格 0 上城 18 南 7室2廳 1800 1 上城 18 南 4室1廳 1860 2 上城 18 北 5室1廳 2000 3 上城 11 南 2室1廳 2230 4 上城 15 南 3室1廳 1800 ... ... ... ... ... ... 18823 余杭 116 南 3室2廳 2500 18824 余杭 101 南北 3室1廳 2500 18825 余杭 119 南 4室2廳 2000 18826 余杭 126 南 3室2廳 2000 18827 余杭 15 南 4室1廳 1530 18828 rows × 5 columns四、圖表分析
數據經過預處理之后便可以用它來進行分析了,為了更加直觀地看到數據的變化,這里采用圖表的方式進行輔助分析。
4.1、房源數量分析
為了統計杭州各個區域的房源數量,這里只需要展示 ”地區” 與 “數量” 兩列的數據即可。因此先創建一個DataFrame 對象,然后將各個區域計算的總房源數量作為該對象的數據進行展示,具體代碼如下
# 創建一個dataframe 對象,該對象只有兩列數據 :區域和數量 new_df=pd.DataFrame({'地區':file_data['地區'].unique(),'數量':[0]*len(file_data['地區'].unique())}) new_df地區 數量 0 上城 0 1 濱江 0 2 蕭山 0 3 富陽 0 4 臨安 0 5 錢塘新區 0 6 西湖 0 7 下城 0 8 拱墅 0 9 江干 0 10 余杭 0接下來通過 Pandas的groupby() 方法將 file_data 對象按照 “地區” 一列進行分組,并用 count() 方法統計每個分組的數量
# 按”區域“列將file_data分組,并統計每個分組的數量 groupy_area=file_data.groupby(by='地區').count() new_df['數量']=groupy_area.values new_df地區 數量 0 上城 1618 1 濱江 2405 2 蕭山 466 3 富陽 1992 4 臨安 481 5 錢塘新區 2324 6 西湖 2224 7 下城 679 8 拱墅 2210 9 江干 2381 10 余杭 2048通過 sort_values() 方法對 new_df 對象進行排序,并按照從大到小的順序進行排列,具體代碼如下
# 按“數量”一列從大到小排列 new_df.sort_values(by=['數量'],ascending=False)地區 數量 1 濱江 2405 9 江干 2381 5 錢塘新區 2324 6 西湖 2224 8 拱墅 2210 10 余杭 2048 3 富陽 1992 0 上城 1618 7 下城 679 4 臨安 481 2 蕭山 466通過輸出的排序結果可以看出,杭州租房房源數據位于前三的地區分別是濱江區、江干區、錢塘新區。
4.2、戶型數量分析
接下來我們分析下戶型,統計出租房市場中哪種戶型的房源數量比較多,并篩選出數量大于50的戶型。
首先,定義一個函數來計算各種戶型的數量。
程序輸出了一個字典,其中,字典的鍵表示戶型的各類,值表示該戶型的數量。
現在使用字典推導式將戶型數量大于50的戶型篩選出來,并將篩選后的結果轉換成DataFrame 對象,具體代碼如下
為了能夠更加直觀地看到戶型數量間的差異,可以使用條形圖進行展示。
import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.sans-serif']=['SimHei'] matplotlib.rcParams['axes.unicode_minus']=False house_type=show_houses['戶型'] house_type_num=show_houses['數量'] plt.barh(range(15),house_type_num,height=0.7,color='steelblue',alpha=0.8) plt.yticks(range(15),house_type) plt.xlim(0,3800) plt.xlabel('數量') plt.ylabel('戶型種類') plt.title('杭州地區各戶型房屋數量') for x,y in enumerate(house_type_num):plt.text(y+0.2,x-0.1,'%s'%y) plt.show()可以清晰地看出,整個租房市場中戶型數量較多分別為 “2室1廳”、“1室1廳”、“3室1廳”。“2室1廳”戶型的房屋是整個租房市場中數量最多的。
4.3、平均租金分析
為了進一步剖析房屋的情況,接下來分析各地區目前的平均租金情況。計算各地區房租的平均價格與計算各地區的戶型數量的方法差不多,具體代碼如下:
# 創建一個dataframe 對象, df_all=pd.DataFrame({'地區':file_data['地區'].unique(),'房租總金額':[0]*len(file_data['地區'].unique()),'總面積':[0]*len(file_data['地區'].unique())}) df_all地區 房租總金額 總面積 0 上城 0 0 1 濱江 0 0 2 蕭山 0 0 3 富陽 0 0 4 臨安 0 0 5 錢塘新區 0 0 6 西湖 0 0 7 下城 0 0 8 拱墅 0 0 9 江干 0 0 10 余杭 0 0按照 ”地區“ 一列進行分組,然后調用sum() 方法分別對價格和面積執行求和運算
# 求總金額和總面積 sum_price=file_data['價格'].groupby(file_data['地區']).sum() sum_area=file_data['面積'].groupby(file_data['地區']).sum() df_all['房租總金額']=sum_price.values df_all['總面積']=sum_area.values df_all地區 房租總金額 總面積 0 上城 8721856 187774 1 濱江 10100330 139402 2 蕭山 1110950 51465 3 富陽 3559163 126435 4 臨安 1241946 47447 5 錢塘新區 9233878 142617 6 西湖 9054939 136073 7 下城 2483328 30072 8 拱墅 6522415 138026 9 江干 8185825 134994 10 余杭 6827318 146827計算出各地區房租總金額和總面積之后,便可以對每平方米的租金進行計算。在 df_all 對的基礎上增加一列 ”每平方米租金“,數據為求得的每平方米的平均價格。
# 計算各區域每平方米房租價格,并保留兩位小數 df_all['每平方米租金']=round(df_all['房租總金額']/df_all['總面積'],2) df_all地區 房租總金額 總面積 每平方米租金 0 上城 8721856 187774 46.45 1 濱江 10100330 139402 72.45 2 蕭山 1110950 51465 21.59 3 富陽 3559163 126435 28.15 4 臨安 1241946 47447 26.18 5 錢塘新區 9233878 142617 64.75 6 西湖 9054939 136073 66.54 7 下城 2483328 30072 82.58 8 拱墅 6522415 138026 47.25 9 江干 8185825 134994 60.64 10 余杭 6827318 146827 46.50為了更加全面地了解到各個區域的租房數量和平均租金,這里將之前創建 的 new_df對象(各地區房源數量)與 df_all 對象進行合并,通過 merge() 函數來實現。
# 合并new_df與df_all df_merge=pd.merge(new_df,df_all) df_merge地區 數量 房租總金額 總面積 每平方米租金 0 上城 1618 8721856 187774 46.45 1 濱江 2405 10100330 139402 72.45 2 蕭山 466 1110950 51465 21.59 3 富陽 1992 3559163 126435 28.15 4 臨安 481 1241946 47447 26.18 5 錢塘新區 2324 9233878 142617 64.75 6 西湖 2224 9054939 136073 66.54 7 下城 679 2483328 30072 82.58 8 拱墅 2210 6522415 138026 47.25 9 江干 2381 8185825 134994 60.64 10 余杭 2048 6827318 146827 46.50數據合并完成后,借用圖表來展示各地區的房屋信息,房源數量可以用柱狀圖表示,每平方米租金可以用拆線圖來表示,具體代碼如下
import matplotlib.ticker as mtick from matplotlib.font_manager import FontProperties num=df_merge['數量'] price=df_merge['每平方米租金'] l =[i for i in range(11)] plt.rcParams['font.sans-serif']=['SimHei'] lx=df_merge['地區'] fig=plt.figure() ax1=fig.add_subplot(111) ax1.plot(l,price,'or-',label='價格') for i,(_x,_y) in enumerate(zip(l,price)):plt.text(_x,_y,price[i],color='black',fontsize=10) ax1.set_ylim([0,200]) ax1.set_ylabel("價格") plt.legend(prop={'family':'SimHei','size':8},loc='upper left')ax2=ax1.twinx() plt.bar(l,num,alpha=0.3,color='red',label='數量') ax2.set_ylabel('數量') ax2.set_ylim([0,2800]) plt.legend(prop={'family':'SimHei','size':8},loc='upper right') plt.xticks(l,lx) plt.show()從圖中可以看出,濱江區、下城區、江干區、拱墅區的房租價格相對較高,這主要是因為濱江區、拱墅區和下城區聚集了大量的新興互聯網公司,而江干區又是學區房火熱的地帶,這里包含了幾十所高校,俗稱大學城,因此這四個區域的房租相對其他區域較高。
4.4、面積區間分析
下面將房屋的面積數據按照一定的規則劃分為多個區間,看看這面積 區間的占比情況,便于分析要租房市場中哪種房屋類型更好出租,哪個面積區間的租房人數最多。
首先使用max() 和 min() 方法計算出面積的最大值和最小值,
使用Pandas中的 cut() 方法將房屋面積劃分為5個區間,然后使用 describe() 方法顯示各個區間出現的次數(counts)和頻率(freqs)具體代碼如下
# 面積劃分 area_divide=[0,30,60,100,150] area_cut=pd.cut(list(file_data['面積']),area_divide) area_cut_data=area_cut.describe() area_cut_datacounts freqs categories (0.0, 30.0] 5330 0.283089 (30.0, 60.0] 5373 0.285373 (60.0, 100.0] 5149 0.273476 (100.0, 150.0] 2420 0.128532 NaN 556 0.029530接著,使用餅圖來展示 各面積區間的分布情況
import numpy as np area_percentage=(area_cut_data['freqs'].values)*100 #保留兩位小數 np.set_printoptions(precision=2) labels=['30平方米以下','30-60平方米','60-100平方米','100-150平方米','150平方米以上'] # 設置圖片大小 plt.figure(figsize = (6,7)) plt.axes(aspect=1) plt.pie(x=area_percentage,labels=labels,autopct='%.2f %%',#shadow=True,labeldistance=1.2,startangle=90,pctdistance=0.8)#plt.legend(loc='upper right') plt.show()從圖中可以看出,市場占有率前三的分別是30~60平方米、30平方米以下、60 ~100平方米。總體來看,租客主要以100平方米以下的房屋為租住對象,其中30 ~60平方米的房屋更受歡迎。
小結
本文章運用所學的知識,開發了一個相對比較完整的數據分析項目,旨在通過本次的學習,能夠更加熟練地掌握的數據分析工具的使用,讓自己所學知識有個輸出。
總結
以上是生活随笔為你收集整理的Python数据分析实战——杭州租房数据统计分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: youknowiwill用计算机数字,高
- 下一篇: 拓嘉启远电商:拼多多选词怎样选