鏈家網二手房資料分析(承接上篇爬蟲)
阿新 • • 發佈:2019-02-20
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')