python數據分析-紐約空氣污染

python數據分析-紐約空氣污染

來自專欄數據分析路

本篇是數據分析的第2作

不過也不是按照自己的思維或想法去做的,還是參照王大偉老師的思路去做的

Python數據分析系列(2)——美國紐約皇后區空氣質量分析?

mp.weixin.qq.com圖標

目前起步階段就這樣多參考別人寫的東西,學點分析思維(目前只能是這樣安慰自己[捂臉])


開始分析

本數據集是kaggle上的數據集,下面是地址:

kaggle.com/sogun3/uspol

U.S. Pollution Data | Kaggle?

www.kaggle.com

這個數據集比較大,總共差不多200W的數據,因為裡面包括了2000年-2016美國各個州和各縣區的空氣情況,本來想用Excel打開數據集先大概瀏覽一下數據的,發現太大,Excel載入不完全

總共有28個欄位:

州代碼:由美國環保局分配給每個州的代碼

縣代碼:由美國環保署分配的特定州的代碼

地點編號:由美國環保局分配的特定縣的地點編號

地址:監測站點的地址

狀態:監測點的狀態

縣:縣監測站點

城市:監測點的城市

日期本地:監視日期

四種污染物(NO2,O3,SO2和O3)各有5個專欄。 例如,對於NO2:

NO2單位:測量NO2的單位

NO2平均值:給定日內NO2濃度的算術平均值

NO2 AQI:一天內NO2計算的空氣質量指數

NO2第一最大值:給定日期的NO2濃度的最大值

NO2第1小時:指在某一天記錄的最大NO2濃度的小時數


載入數據

import pandas as pdimport numpy as npfrom matplotlib import pyplot as plt%matplotlib inlinedf = pd.read_csv(pollution_us_2000_2016.csv)df.head()

發現有一列索列 應該原數據集中應有的索引列,所以應該把這個列刪除

del df[Unnamed: 0]df.info()

這裡 Date Local列的日期值要處理下,這裡是字元串類型

df[Date Local] = pd.to_datetime(df[Date Local])df.isnull().any()

發現SO2 AQI ,CO AQI 列有空值,看看Excel

這裡引用推文裡面的圖片

發現每四個是重複的數據,看後面的欄位部分:

看到kaggle也有人發現這個情況並提問了,數據提供者回答了額

王老師推文裡面的去掉空值的行,我這裡按照回答的所說的按照通過分組來計算平均值。

我下面處理是按照通過每天和城市來合併分組求平均值,這樣的話應該會對數據造成一點影響,而且每個城市都有下屬的縣區,相當於同一城市的各縣區一起合併計算,所以下面的分析都是針對是城市,不針對於縣區。(剛拿到數據源的時候,想每個州每個州一起分析的,發覺數據量真是大,吃不消[捂臉])

grouped_city_day= df.groupby([City,Date Local]).mean().reset_index()grouped_city_day.head()

看到已進行對城市 當地時間進行分組了


數據可視化

我們以紐約為例

看一看NO2 AQI指數從2000-2016的趨勢變化

plt.figure(figsize = (20,20))grouped_city_day.query("City == New York")[NO2 AQI].plot(kind=scatter)

發現數據集太大,折線圖就過於密集了(本來一開始就打算直觀的從2000-2016 每天的指數都用來可視化,這樣就避免計算數據而帶來數據偏差,又開始直觀地看出大致趨勢)

所以就換了個思路,將每天計算出平均值作為每個月的AQI,15*12=180 個數據

#建立月欄位grouped_city_day[Month] = grouped_city_day[Date Local].values.astype(datetime64[M])grouped_month = grouped_city_day.groupby([City,Month]).mean().reset_index(City)plt.figure(figsize = (20,10))grouped_month.query("City == New York")[NO2 AQI].plot()

看得出,NO2 AQI值在這10多年來呈降低趨勢。我們再看看其他三污染物

plt.figure(figsize = (20,10))grouped_month.query("City == New York")[O3 AQI].plot()

O3 AQI值的波動比較大,看不出明顯趨勢

plt.figure(figsize = (20,10))grouped_month.query("City == New York")[SO2 AQI].plot()

SO2 AQI值一直也呈降低趨勢

plt.figure(figsize = (20,10))grouped_month.query("City == New York")[CO AQI].plot()

CO AQI值也在這10幾年降低

大致得出:

SO2,NO2,CO 這三樣污染物在紐約這10幾年都呈降低趨勢。


AQI空氣質量指數

發現AQI分為六級,值越大,空氣質量越差:

計算時按照如下方式:

各種污染物的AQI值分別算出來後,取數值最大的那個即為最終報告的AQI值。比如SO2濃度為20.5μg/m3,算出來對應的 AQI為29;PM10濃度為150.8μg/m3,對應的AQI為98;PM2.5濃度為130.7μg/m3,對應的AQI為190。最終報告的 AQI值就是190,而貢獻了那個最大值的PM2.5則稱為首要污染物。

參考:guokr.com/post/431588/f

所以我們取出2000-2016每天紐約的AQI值:

grouped_city_day[AQI] = grouped_city_day[[NO2 AQI,O3 AQI,SO2 AQI,CO AQI]].apply(lambda x:max(x),axis =1)AQI_month_nyc = grouped_city_day.query("City == New York").groupby(Month).mean()AQI_month_nyc.head()

plt.figure(figsize = (20,10))AQI_month_nyc[AQI].plot()

如果按照AQI的定義,以首要污染物的最大值為AQI值。

由上圖看到AQI的值其實也並不算是大程度的下降。會不會因為以最大值的情況使數據範圍變大了。

我們看一下美國標準的劃分:

我們使用map函數對pandas的AQI列分等級(依照實際AQI)

def AQI_level(x): if x <=50: return Good elif 50 < x<=100: return Moderate elif 100<x<=150: return Unhealthy for Sensitive Groups elif 150 <x<=200: return Unhealthy elif 200<x<=300: return Very Unhealthy else: return Harazdousgrouped_city_day[Grade] = grouped_city_day[AQI].apply(AQI_level)grouped_city_day.head()

grouped_city_day.query("City == New York")[Grade].value_counts()

以AQI為準,00-16年 大概有4900天為Good的情況,看來紐約的空氣也挺清新啊

grouped_city_day.query("City == New York")[Grade].value_counts().plot(kind = bar)

grouped_city_day.query("City == New York")[AQI].plot(kind = hist)

然後我們以一年為分組,看看一年裡面有多少的good等級的天數

grouped_city_day[Year] = grouped_city_day[Date Local].values.astype(datetime64[Y])grouped_city_day.query("(City == New York)&(Grade == Good)&(Year != 2016-01-01)").groupby(Year).Grade.count().plot()

這裡剔除2016的數據 是因為都kaggle上傳這個數據集為止是2016年4月,不足一年所以不作考慮

從上圖看出,good等級天數其實每年都在增加。

剛好最近也在看秦路的數據分析師教程,剛學到熱力圖 這個數據集又是時間序列的,就打算學以致用

nyc[Year] = nyc[Year].astype(str).apply(lambda x:x[0:4])nyc[Month] = nyc[Month].astype(str).apply(lambda x:x[5:7])nyc

我們以每個月AQI作每年的熱力圖

AQI_MONTH = pd.pivot_table(nyc,index= Year,columns = Month,values =AQI)plt.figure(figsize = (10,10))sns.heatmap(AQI_MONTH)

深色的為好的AQI,淺色為不好的AQI,剛學的熱力圖,但是不會調調色板的參數,改天過來填坑。

00-16年,越往下看,其實每行里深色的方格越來越多了,說明AQI的值是有好的趨勢

我們以每個月內等級的數目作每年的熱力圖

Grade_month = nyc.query("Grade == Good").groupby([Year,Month]).Grade.count().reset_index()Grade_month.head()

pt = pd.pivot_table(Grade_month,index =Year,columns=Month,values = Grade)plt.figure(figsize = (10,10))sns.heatmap(pt)

這裡就是越淺色的就表現good等級的天數越多,越深是good等級的天數越少

到近幾年,淺色格子在每行也是挺多的。證明紐約近幾年空氣情況的確變好


總結:

從數據集2000-2016,我這裡拿紐約為開刀對象,前面以各污染物AQI指數為可視化出來的圖表呈現出降低趨勢,到後面的分級機制而繪製出的熱力圖,雖然本來數據分等就存在缺陷,導致大部分數據被分散效應。但是大數據就這樣,以多概全。也算是比較客觀地證明紐約空氣也的確是在變好好。

心裡想法:

從17-5月接觸到數據分析,看到知乎上別人寫的簡單以數據集分組計算,繪製圖表啊,覺得這樣不太像數據分析,太過於簡單表層的東西,感覺分析不出什麼東西,畢竟這些人家那些表哥表姐也能做出來,到這兩周看了秦老師的後面的課程,接觸到商業數據,和商業模型,客戶行為這些, 我才覺得這才是數據分析,真真正正接觸到數據深處的東西。

到現在,我也在做我以前覺得簡單,無聊,沒太大作用的東西,原來我們很多東西其實也需要一步步來,奠定我們的基礎,我們不從簡單做起,怎能駕馭複雜的?到現在開專欄記錄點自己做過的東西,真的挺有想法,好多東西,自己不去做過,寫過,你真的不知道你自己真的不會!


推薦閱讀:

APP的DAU波動分析
數據分析,讓你成為人群中的1%
tableau Prep 體驗
POINT問答 | Out join
基於PowerBI構建動態客戶價值模型RFM驅動客戶營銷

TAG:數據分析 | 數據可視化 | 數據 |