python數據分析-紐約空氣污染
來自專欄數據分析路
本篇是數據分析的第2作
不過也不是按照自己的思維或想法去做的,還是參照王大偉老師的思路去做的
Python數據分析系列(2)——美國紐約皇后區空氣質量分析目前起步階段就這樣多參考別人寫的東西,學點分析思維(目前只能是這樣安慰自己[捂臉])
開始分析
本數據集是kaggle上的數據集,下面是地址:
https://www.kaggle.com/sogun3/uspollution
U.S. Pollution Data | Kaggle
這個數據集比較大,總共差不多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則稱為首要污染物。
參考:https://www.guokr.com/post/431588/focus/0143499827/
所以我們取出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驅動客戶營銷