1. 程式人生 > >鏈家網二手房資料分析(承接上篇爬蟲)

鏈家網二手房資料分析(承接上篇爬蟲)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#用來正常顯示中文標籤

path='F:/python/從零開始學python網路爬蟲/鏈家網/lianjia-3.xls'
lj=pd.read_excel(path)
'''
對整體資料預覽,做個大概統計
'''
print(lj.head())#前5行
print(lj.tail())#後5行
print(lj.columns)#列序列
print(lj.index)#行索引
print(lj.values)#值 print(lj.describe())#彙總統計 print(lj[['面積(平方)','元每平方','價格(萬)']])#提取某幾列 print(lj[5:9])#切片提取某一段行 print(lj.duplicated())#是否是重複行 print(lj.drop_duplicates())#去重(其實沒有重複的) ''' 單獨對價格(萬)分析,平均值,排序 散點圖,價格區間-數量直方圖 ''' print(lj['價格(萬)'])#提取列,Series格式 print(lj['價格(萬)'].mean())#平均房價536.01萬 print(lj['價格(萬)'
].max())#最高房價6480萬 print(lj['價格(萬)'].idxmax())#在第644行(最先出現的) print(lj.iloc[644])#調取第644行 print(lj['價格(萬)'].min())#最低140萬 print(lj['價格(萬)'].idxmin())#在第579行(最先出現的) print(lj.iloc[579])#調取第579行 print(lj['價格(萬)'].count())#非nan值的數量 print(lj['價格(萬)'].value_counts())#360萬出現次數最多 print(lj['價格(萬)'].sort_values())#按值排序
print(lj.sort_values(by='價格(萬)'))#通過價格(萬)排序 print(lj['價格(萬)'].sort_values(ascending=False))#按值排序(降序) print(lj['價格(萬)'][lj['價格(萬)']==1620])#提取所有價格為1620萬 print(lj[lj['價格(萬)']==1620])#提取所有價格為1620萬 a=lj['價格(萬)'] plt.scatter(np.arange(1197),a[a<3000].values,s=2,c='r',label='價格(萬)')#小於3000萬價格散點圖 plt.axhline(200,color='k',alpha=0.4)#200萬處畫條線 plt.axhline(400,color='k',alpha=0.4) plt.axhline(600,color='k',alpha=0.4) plt.xlim([0,1200]) plt.yticks([0,200,400,600,800,1000,1500,2000,2500,3000]) plt.xlabel('索引') plt.ylabel('價格(萬)') plt.title('價格(萬)散點圖') plt.legend(loc='best') fig=plt.figure() ax=fig.add_subplot(111) a[a<1500].hist(bins=20,color='g')#價格區間與區間內數量 ax.set_xticks([100,200,300,400,500,600,700,800,900,1000,1500]) plt.xlabel('價格(萬)') plt.ylabel('數量') plt.title('不同區間價格(萬)數量直方圖') plt.legend(loc='best') ''' 單獨對面積每平方分析,均值,最大最小值,排序 元每平方散點圖,元每平方價格區間-價格數量直方圖 ''' print(lj['元每平方'])#提取列,Series格式 print(lj['元每平方'].mean())#平均價格65452.785元/平方 print(lj['元每平方'].max())#最高價格157828元/平方 print(lj['元每平方'].idxmax())#在第184行(最先出現的) print(lj.iloc[184])#調取第15行 print(lj['元每平方'].min())#最低價格29032元/平方 print(lj['元每平方'].idxmin())#在第193行(最先出現的) print(lj.iloc[193])#調取第193行 print(lj['元每平方'].count())#非nan值的數量 print(lj['元每平方'].value_counts())#83333出現次數最多 print(lj['元每平方'].sort_values())#按值排序 print(lj.sort_values(by='元每平方').head(10)) print(lj.sort_values(by='元每平方',ascending=False).head(10)) print(lj['元每平方'][lj['元每平方']==83333])#提取所有價格為36288元/平方 print(lj[lj['元每平方']==83333])#提取所有價格為36288元/平方 b=lj['元每平方'] fig=plt.figure() ax=fig.add_subplot(111) plt.scatter(np.arange(1200),b.values,s=4,c='r',label='元每平方')#部分價格散點圖 plt.axhline(30000,color='k',alpha=0.5)#30000處畫條線 plt.axhline(40000,color='k',alpha=0.5) plt.axhline(60000,color='k',alpha=0.5) plt.axhline(80000,color='k',alpha=0.5) plt.xlim([0,1200]) plt.xlabel('索引') plt.ylabel('元每平方') plt.title('元每平方價格散點圖') plt.legend(loc='best') fig=plt.figure() ax=fig.add_subplot(111) b.hist(bins=20,color='g')#元每平方價格區間-價格數量 ax.set_xticks([30000,40000,50000,60000,70000,80000,90000,100000,110000,120000,130000]) ax.set_xticklabels(['3萬','4萬','5萬','6萬','7萬','8萬','9萬','10萬','11萬','12萬','13萬'],rotation=30) plt.xlabel('元每平方') plt.ylabel('數量') plt.title('元每平方價格區間-價格數量直方圖') plt.legend(loc='best') ''' 對地區及不同地區出售二手房數量統計分析 ''' print(lj['地區'])#提取列 print(lj['地區'].value_counts())#按出現頻次 c=lj['地區'].value_counts() fig=plt.figure() ax=fig.add_subplot(111) rect=c.plot(kind='bar',color='y')#地區與房數量的柱狀圖 plt.xlabel('地區') plt.ylabel('數量') plt.title('不同地區出售二手房數量柱狀圖') #上面不會在條形圖上標數值,下面方法可以標數值 fig=plt.figure() ax=fig.add_subplot(111) x=np.arange(14) y=c.values rect=ax.bar(x,y) for rec in rect: xx=rec.get_x() hh=rec.get_height() ax.text(xx+0.05,1.02*hh,str(int(hh))) ax.set_xticks(x) ax.set_xticklabels(c.index,rotation=30) ax.set_xlabel('地區') ax.set_ylabel('數量') ax.set_title('不同地區出售二手房數量柱狀圖') ''' 單獨對二手房面積統計分析,平均值,最大最小值,排序, 面積散點圖,面積區間-二手房數量直方圖 ''' print(lj['面積(平方)'])#提取列,Series格式 print(lj['面積(平方)'].mean())#平均面積79.49平方米 print(lj['面積(平方)'].max())#最大面積740.75平方米 print(lj['面積(平方)'].idxmax())#在第644行(最先出現的) print(lj.iloc[644])#調取第644行 print(lj['面積(平方)'].min())#最小面積25.2平方米 print(lj['面積(平方)'].idxmin())#在第1026行(最先出現的) print(lj.iloc[1026])#調取第1026行 print(lj['面積(平方)'].count())#非nan值的數量 print(lj['面積(平方)'].value_counts())#44出現次數最多 print(lj['面積(平方)'].sort_values())#按值排序 print(lj['面積(平方)'][lj['面積(平方)']==44])#提取所有面積為44平方米 print(lj[lj['面積(平方)']==44])#提取所有面積為44平方米 d=lj['面積(平方)'] fig=plt.figure() ax=fig.add_subplot(111) plt.scatter(np.arange(1200),d.values,s=4,c='r',label='面積(平方)')#部分面積散點圖 plt.axhline(25,color='k',alpha=0.5)#50處畫條線 plt.xlim([0,1200]) plt.ylim([0,400]) plt.xlabel('索引') plt.ylabel('面積(平方)') plt.title('二手房面積散點圖') plt.grid(True) plt.legend(loc='best') fig=plt.figure() ax=fig.add_subplot(111) d[d<350].hist(bins=30,color='g')#價格區間及出現頻次 ax.set_xticks([25,50,75,100,125,150,175,200,250,300,350]) plt.axvline(40,color='k',alpha=0.4) plt.axvline(70,color='k',alpha=0.4) plt.xlabel('面積(平方)') plt.ylabel('數量') plt.title('二手房面積-數量直方圖') plt.legend(loc='best') ''' 面積與總價格多項式擬合曲線 ''' e=lj[lj['面積(平方)']<250] x=e['面積(平方)'] y=e['價格(萬)'] z1 = np.polyfit(x, y, 2)#多項式係數 p1 = np.poly1d(z1)#多項式方程 x1=np.linspace(x.min(),x.max(),1000) pp1=p1(x1)#代入數值繪製曲線 fig=plt.figure() ax=fig.add_subplot(111) plt.scatter(x,y,color='b',label='散點圖',s=1,alpha=0.5)#x,y散點圖 #plt.plot(x,y,color='r',label='連線圖')#x,y線形圖 plt.plot(x1,pp1,color='k',label='擬合圖')#100個x及對應y值繪製的曲線 plt.xlabel('面積(平方)') plt.ylabel('價格(萬)') plt.title('面積與總價格多項式擬合曲線') plt.legend(loc='best') ''' 各地區價格、數量統計 ''' f=lj[['價格(萬)','地區']] total=[] diqus=['浦東','楊浦','徐匯','閔行','寶山','普陀','長寧','閘北','虹口','黃浦','松江','靜安','嘉定','青浦'] for i in diqus: diqu=f[f['地區']==i]['價格(萬)'] shuliang=len(diqu) zuida=diqu.max() zuixiao=diqu.min() pingjun=int(diqu.mean()) total.append({'地區':i,'數量(套)':shuliang,'最大(萬)':zuida,'最小(萬)':zuixiao,'平均(萬)':pingjun}) print(total) diqu_jiage=pd.DataFrame(total) qudiqu=diqu_jiage.iloc[:,1:5].values gediqu=pd.DataFrame(qudiqu,index=diqus,columns=['平均(萬)','數量(套)','最大(萬)','最小(萬)']) gediqu.plot() fig=plt.figure() ax=fig.add_subplot(111) gediqu['平均(萬)'].plot(xticks=range(14),style='go-',label='均價(萬)') ax.set_xticklabels(diqus,rotation=30) ax.set_xlabel('地區') ax.set_ylabel('價格(萬)') ax.set_title('不同地區-價格(萬)') ax.legend(loc='best') g=lj[['元每平方','地區']] total2=[] diqus2=['浦東','楊浦','徐匯','閔行','寶山','普陀','長寧','閘北','虹口','黃浦','松江','靜安','嘉定','青浦'] for ii in diqus2: diqu2=g[g['地區']==ii]['元每平方'] pingjun2=int(diqu2.mean()) total2.append({'地區':ii,'平均元每平方':pingjun2}) print(total2) diqu_yuan=pd.DataFrame(total2) fig=plt.figure() ax=fig.add_subplot(111) diqu_yuan['平均元每平方'].plot(xticks=range(14),style='bo-',label='元每平方') ax.set_xticklabels(diqus2,rotation=30) ax.set_xlabel('地區') ax.set_ylabel('平均元每平方') ax.set_title('不同地區-平均元每平方') ax.legend(loc='best')