摘要:入門數據分析最好的實戰項目二數據初探首先導入要使用的科學計算包可視化以及機器學習包。檢查缺失值情況發現了數據集一共有條數據,其中特征有明顯的缺失值。
作者:xiaoyu
微信公眾號:Python數據科學
知乎:python數據分析師
目的:本篇給大家介紹一個數據分析的初級項目,目的是通過項目了解如何使用Python進行簡單的數據分析。數據源:博主通過爬蟲采集的鏈家全網北京二手房數據(公眾號后臺回復 二手房數據 便可獲取)。
下面是第二篇建模篇,看完這篇可繼續研究這篇。
入門Python數據分析最好的實戰項目(二)
數據初探首先導入要使用的科學計算包numpy,pandas,可視化matplotlib,seaborn,以及機器學習包sklearn。
import pandas as pd import numpy as np import seaborn as sns import matplotlib as mpl import matplotlib.pyplot as plt from IPython.display import display plt.style.use("fivethirtyeight") sns.set_style({"font.sans-serif":["simhei","Arial"]}) %matplotlib inline # 檢查Python版本 from sys import version_info if version_info.major != 3: raise Exception("請使用Python 3 來完成此項目")
然后導入數據,并進行初步的觀察,這些觀察包括了解數據特征的缺失值,異常值,以及大概的描述性統計。
# 導入鏈家二手房數據 lianjia_df = pd.read_csv("lianjia.csv") display(lianjia_df.head(n=2))
初步觀察到一共有11個特征變量,Price 在這里是我們的目標變量,然后我們繼續深入觀察一下。
# 檢查缺失值情況 lianjia_df.info()
發現了數據集一共有23677條數據,其中Elevator特征有明顯的缺失值。
lianjia_df.describe()
上面結果給出了特征值是數值的一些統計值,包括平均數,標準差,中位數,最小值,最大值,25%分位數,75%分位數。這些統計結果簡單直接,對于初始了解一個特征好壞非常有用,比如我們觀察到 Size 特征 的最大值為1019平米,最小值為2平米,那么我們就要思考這個在實際中是不是存在的,如果不存在沒有意義,那么這個數據就是一個異常值,會嚴重影響模型的性能。
當然,這只是初步觀察,后續我們會用數據可視化來清晰的展示,并證實我們的猜測。
# 添加新特征房屋均價 df = lianjia_df.copy() df["PerPrice"] = lianjia_df["Price"]/lianjia_df["Size"] # 重新擺放列位置 columns = ["Region", "District", "Garden", "Layout", "Floor", "Year", "Size", "Elevator", "Direction", "Renovation", "PerPrice", "Price"] df = pd.DataFrame(df, columns = columns) # 重新審視數據集 display(df.head(n=2))
我們發現 Id 特征其實沒有什么實際意義,所以將其移除。由于房屋單價分析起來比較方便,簡單的使用總價/面積就可得到,所以增加一個新的特征 PerPrice(只用于分析,不是預測特征)。另外,特征的順序也被調整了一下,看起來比較舒服。
數據可視化分析 Region特征分析對于區域特征,我們可以分析不同區域房價和數量的對比。
# 對二手房區域分組對比二手房數量和每平米房價 df_house_count = df.groupby("Region")["Price"].count().sort_values(ascending=False).to_frame().reset_index() df_house_mean = df.groupby("Region")["PerPrice"].mean().sort_values(ascending=False).to_frame().reset_index() f, [ax1,ax2,ax3] = plt.subplots(3,1,figsize=(20,15)) sns.barplot(x="Region", y="PerPrice", palette="Blues_d", data=df_house_mean, ax=ax1) ax1.set_title("北京各大區二手房每平米單價對比",fontsize=15) ax1.set_xlabel("區域") ax1.set_ylabel("每平米單價") sns.barplot(x="Region", y="Price", palette="Greens_d", data=df_house_count, ax=ax2) ax2.set_title("北京各大區二手房數量對比",fontsize=15) ax2.set_xlabel("區域") ax2.set_ylabel("數量") sns.boxplot(x="Region", y="Price", data=df, ax=ax3) ax3.set_title("北京各大區二手房房屋總價",fontsize=15) ax3.set_xlabel("區域") ax3.set_ylabel("房屋總價") plt.show()
使用了pandas的網絡透視功能 groupby 分組排序。區域特征可視化直接采用 seaborn 完成,顏色使用調色板 palette 參數,顏色漸變,越淺說明越少,反之越多。
可以觀察到:
二手房均價:西城區的房價最貴均價大約11萬/平,因為西城在二環以里,且是熱門學區房的聚集地。其次是東城大約10萬/平,然后是海淀大約8.5萬/平,其它均低于8萬/平。
二手房房數量:從數量統計上來看,目前二手房市場上比較火熱的區域。海淀區和朝陽區二手房數量最多,差不多都接近3000套,畢竟大區,需求量也大。然后是豐臺區,近幾年正在改造建設,有趕超之勢。
二手房總價:通過箱型圖看到,各大區域房屋總價中位數都都在1000萬以下,且房屋總價離散值較高,西城最高達到了6000萬,說明房屋價格特征不是理想的正太分布。
Size特征分析f, [ax1,ax2] = plt.subplots(1, 2, figsize=(15, 5)) # 建房時間的分布情況 sns.distplot(df["Size"], bins=20, ax=ax1, color="r") sns.kdeplot(df["Size"], shade=True, ax=ax1) # 建房時間和出售價格的關系 sns.regplot(x="Size", y="Price", data=df, ax=ax2) plt.show()
Size 分布:
通過 distplot 和 kdeplot 繪制柱狀圖觀察 Size 特征的分布情況,屬于長尾類型的分布,這說明了有很多面積很大且超出正常范圍的二手房。
Size 與 Price 的關系:
通過 regplot 繪制了 Size 和 Price 之間的散點圖,發現 Size 特征基本與Price呈現線性關系,符合基本常識,面積越大,價格越高。但是有兩組明顯的異常點:1. 面積不到10平米,但是價格超出10000萬;2. 一個點面積超過了1000平米,價格很低,需要查看是什么情況。
df.loc[df["Size"]< 10]
經過查看發現這組數據是別墅,出現異常的原因是由于別墅結構比較特殊(無朝向無電梯),字段定義與二手商品房不太一樣導致爬蟲爬取數據錯位。也因別墅類型二手房不在我們的考慮范圍之內,故將其移除再次觀察Size分布和Price關系。
df.loc[df["Size"]>1000]
經觀察這個異常點不是普通的民用二手房,很可能是商用房,所以才有1房間0廳確有如此大超過1000平米的面積,這里選擇移除。
df = df[(df["Layout"]!="疊拼別墅")&(df["Size"]<1000)]
重新進行可視化發現就沒有明顯的異常點了。
Layout特征分析f, ax1= plt.subplots(figsize=(20,20)) sns.countplot(y="Layout", data=df, ax=ax1) ax1.set_title("房屋戶型",fontsize=15) ax1.set_xlabel("數量") ax1.set_ylabel("戶型") plt.show()
這個特征真是不看不知道,各種廳室組合搭配,竟然還有9室3廳,4室0廳等奇怪的結構。其中,2室一廳占絕大部分,其次是3室一廳,2室2廳,3室兩廳。但是仔細觀察特征分類下有很多不規則的命名,比如2室一廳與2房間1衛,還有別墅,沒有統一的叫法。這樣的特征肯定是不能作為機器學習模型的數據輸入的,需要使用特征工程進行相應的處理。
df["Renovation"].value_counts()
精裝 11345
簡裝 8497
其他 3239
毛坯 576
南北 20
Name: Renovation, dtype: int64
發現Renovation裝修特征中竟然有南北,它屬于朝向的類型,可能是因為爬蟲過程中一些信息位置為空,導致“Direction”朝向特征出現在這里,所以需要清除或替換掉。
# 去掉錯誤數據“南北”,因為爬蟲過程中一些信息位置為空,導致“Direction”的特征出現在這里,需要清除或替換 df["Renovation"] = df.loc[(df["Renovation"] != "南北"), "Renovation"] # 畫幅設置 f, [ax1,ax2,ax3] = plt.subplots(1, 3, figsize=(20, 5)) sns.countplot(df["Renovation"], ax=ax1) sns.barplot(x="Renovation", y="Price", data=df, ax=ax2) sns.boxplot(x="Renovation", y="Price", data=df, ax=ax3) plt.show()
觀察到,精裝修的二手房數量最多,簡裝其次,也是我們平日常見的。而對于價格來說,毛坯類型卻是最高,其次是精裝修。
初探數據的時候,我們發現 Elevator 特征是有大量缺失值的,這對于我們是十分不利的,首先我們先看看有多少缺失值:
misn = len(df.loc[(df["Elevator"].isnull()), "Elevator"]) print("Elevator缺失值數量為:"+ str(misn))
Elevator 缺失值數量為:8237
這么多的缺失值怎么辦呢?這個需要根據實際情況考慮,常用的方法有平均值/中位數填補法,直接移除,或者根據其他特征建模預測等。
這里我們考慮填補法,但是有無電梯不是數值,不存在平均值和中位數,怎么填補呢?這里給大家提供一種思路:就是根據樓層 Floor 來判斷有無電梯,一般的樓層大于6的都有電梯,而小于等于6層的一般都沒有電梯。有了這個標準,那么剩下的就簡單了。
# 由于存在個別類型錯誤,如簡裝和精裝,特征值錯位,故需要移除 df["Elevator"] = df.loc[(df["Elevator"] == "有電梯")|(df["Elevator"] == "無電梯"), "Elevator"] # 填補Elevator缺失值 df.loc[(df["Floor"]>6)&(df["Elevator"].isnull()), "Elevator"] = "有電梯" df.loc[(df["Floor"]<=6)&(df["Elevator"].isnull()), "Elevator"] = "無電梯" f, [ax1,ax2] = plt.subplots(1, 2, figsize=(20, 10)) sns.countplot(df["Elevator"], ax=ax1) ax1.set_title("有無電梯數量對比",fontsize=15) ax1.set_xlabel("是否有電梯") ax1.set_ylabel("數量") sns.barplot(x="Elevator", y="Price", data=df, ax=ax2) ax2.set_title("有無電梯房價對比",fontsize=15) ax2.set_xlabel("是否有電梯") ax2.set_ylabel("總價") plt.show()
結果觀察到,有電梯的二手房數量居多一些,畢竟高層土地利用率比較高,適合北京龐大的人群需要,而高層就需要電梯。相應的,有電梯二手房房價較高,因為電梯前期裝修費和后期維護費包含內了(但這個價格比較只是一個平均的概念,比如無電梯的6層豪華小區當然價格更高了)。
grid = sns.FacetGrid(df, row="Elevator", col="Renovation", palette="seismic",size=4) grid.map(plt.scatter, "Year", "Price") grid.add_legend()
在Renovation和Elevator的分類條件下,使用 FaceGrid 分析 Year 特征,觀察結果如下:
整個二手房房價趨勢是隨著時間增長而增長的;
2000年以后建造的二手房房價相較于2000年以前有很明顯的價格上漲;
1980年之前幾乎不存在有電梯二手房數據,說明1980年之前還沒有大面積安裝電梯;
1980年之前無電梯二手房中,簡裝二手房占絕大多數,精裝反而很少;
Floor 特征分析f, ax1= plt.subplots(figsize=(20,5)) sns.countplot(x="Floor", data=df, ax=ax1) ax1.set_title("房屋戶型",fontsize=15) ax1.set_xlabel("數量") ax1.set_ylabel("戶型") plt.show()
可以看到,6層二手房數量最多,但是多帶帶的樓層特征沒有什么意義,因為每個小區住房的總樓層數都不一樣,我們需要知道樓層的相對意義。另外,樓層與文化也有很重要聯系,比如中國文化七上八下,七層可能受歡迎,房價也貴,而一般也不會有4層或18層。當然,正常情況下中間樓層是比較受歡迎的,價格也高,底層和頂層受歡迎度較低,價格也相對較低。所以樓層是一個非常復雜的特征,對房價影響也比較大。
本次分享旨在讓大家了解如何用Python做一個簡單的數據分析,對于剛剛接觸數據分析的朋友無疑是一個很好的練習。不過,這個分析還存在很多問題需要解決,比如:
解決爬蟲獲取的數據源準確度問題;
需要爬取或者尋找更多好的售房特征;
需要做更多地特征工程工作,比如數據清洗,特征選擇和篩選;
使用統計模型建立回歸模型進行價格預測;
更多內容會慢慢介紹和分享,敬請期待。
歡迎關注微信公眾號Python數據科學
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41919.html
摘要:作者微信公眾號數據科學知乎數據分析師上一篇和大家分享了一個入門數據分析的一個小項目北京二手房房價分析,鏈接如下入門數據分析最好的實戰項目一文章在發布之后看到有不少感興趣的朋友給我點了贊,感謝大家的支持了。 作者:xiaoyu 微信公眾號:Python數據科學 知乎:python數據分析師 上一篇和大家分享了一個入門數據分析的一個小項目 北京二手房房價分析,鏈接如下: 入門Python...
摘要:入門數據分析最好的實戰項目二數據初探首先導入要使用的科學計算包可視化以及機器學習包。檢查缺失值情況發現了數據集一共有條數據,其中特征有明顯的缺失值。 作者:xiaoyu 微信公眾號:Python數據科學 知乎:python數據分析師 目的:本篇給大家介紹一個數據分析的初級項目,目的是通過項目了解如何使用Python進行簡單的數據分析。數據源:博主通過爬蟲采集的鏈家全網北京二手房數據(...
摘要:大學,光學工程研究生畢業,和程序猿完全不搭邊。那怎么辦,試著學一學唄,學習才是程序猿的天性。所以我在想程序猿是不是都需要新知識刺激一下,才能保持興奮的頭腦。有句話說的很對程序猿就像好奇的貓,追著毛球的線頭玩,最后一個毛球在腦袋里攪漿糊。 說說我自己的經歷。211大學,光學工程研究生畢業,和程序猿完全不搭邊。 畢業后進了成都某國字頭研究所,在行業里摸爬滾打了四年,2018年機緣巧合在家養...
摘要:其他語言數據結構跟算法一樣是在開始寫代碼的時候用得很少,都有著包裝好的現成東西供你使用,但同樣是面試和崗位上升會用得到,我就不說數據結構對代碼有多少好處,請記住一句話能夠實現個功能和能夠最優地實現個功能,是完全不同級別的要求。 ...
閱讀 2019·2021-10-09 09:41
閱讀 1596·2021-09-28 09:36
閱讀 1100·2021-09-26 09:55
閱讀 1284·2021-09-10 11:17
閱讀 1140·2021-09-02 09:56
閱讀 2755·2019-08-30 12:58
閱讀 2927·2019-08-29 13:03
閱讀 1847·2019-08-26 13:40