如何用Python做AQI分析並視覺化?

鋒尼碎發表於2020-09-01

  

AQI  分析

1、背景資訊

  AOI( Air Quality Index),指空氣質量指數,用來衡量空氣清潔或汙染的程度。值越小,表示空氣質量越好。近年來,因為環境問題,空氣質量也越來越受到人們的重視。我們期望能夠運用資料分析的相關技術,對全國城市空氣質量進行研究與分析,希望能夠解決如下疑問:

  1. 哪些城市的空氣質量較好/較差?
  2. 空氣質量在地理位置分佈上,是否具有一定的規律性?
  3. 城市的空氣質量與是否臨海是否有關?
  4. 空氣質量主要受哪些因素影響?
  5. 全國城市空氣質量普遍處於何種水平?
  • 分析報告預覽.GIF
  •      現在獲取了2015年空氣質量指數集。該資料集包含全國主要城市的相關資料以及空氣質量指數。

    City

    AQI

    Precipitation

    GDP

    城市

    空氣質量指數

    降水量

    城市生產總值

    Longitude

    Latitude

    Altitude

    Population Density

    經度

    緯度

    海拔高度

    人口密集度

    Temperature

    Coastal

    Incineration (10,000ton)

    Green Coverage Rate

    溫度

    是否臨海

    焚燒量/10000噸

    綠化率

     

    2、資料分析流程

     

        在進行資料分析之前,我們需要清楚資料分析的基本流程。

     

    3、讀取資料

        匯入需要的庫並初始化一些設定。

    1 import numpy as np
    2 import pandas as pd
    3 import matplotlib.pyplot as plt
    4 import seaborn as sns
    5 import warnings
    6 sns.set(style="darkgrid") 7 plt.rcParams["font.family"]="simHei" #用於解決中文顯示不了的問題
    8 plt.rcParams["axes.unicode_minus"]=False
    9 warnings.filterwarnings("ignore")

     載入資料集  

     

    4、資料清洗

    4.1 缺失值

    對於缺失值的處理 。可以使用如下方式:

      • 刪除缺失值
        • 僅適用於缺失數量很少的情況
      • 填充缺失值
        • 數值變數
          • 均值填充
          • 中值填充
        • 類別變數
          • 眾數填充
          • 單獨作為一個類別
        • 其他

      先用info()或innull()檢視缺失值。

      再用skew()檢視偏度資訊,再畫個圖看看,注意distplot()不支援有空值資料繪製,所以必須先用dropna()將空值剔除。

     

       可以看出,我們的原始資料有點右偏,因為缺失值只有4個,缺失數量很少,可以直接刪除,,但我們這次用了中位數來填充。

     4.2 異常值

       異常值如何發現?我們有這幾種方法:

      • describe() 
      • 箱線圖
      • 3σ方式
      • 其他相關異常檢測演算法

    describe():

    呼叫dataframe物件的describe方法,會顯示資料的統計資訊,讓自己瞭解下資料

       可以看出GDP、Latitude、PopulationDensity的最大值與較大四分位數的差距異常巨大,存在右偏現象,即存在許多極大的異常值


      3σ即3倍標準差,根據正態分佈的特性,我們可以將3σ之外的資料視為異常值。以GDP為例,畫出GDP的偏度分佈情況:

       該資料出現嚴重右偏分佈,也就是說存在很多極大的異常值,通過3σ法獲取這些異常值:

    箱線圖

    通過箱線圖我們可以很直觀的看見存在很多極大的異常值,怎麼判斷的呢?

    箱線圖異常值的判斷依據:

    Q1、Q2、Q3分別表示1/4分位數、2/4分位數、3/4分位數,IQR=Q3-Q1

    若資料小於Q1-1.5IQR或大於Q3+1.5IQR則為異常值。

       找到異常怎麼處理,通常有以下幾種方式:

      • 刪除異常值(不常用)
      • 視為缺失值處理
      • 對數轉換(適用於右偏,建模)
      • 臨界值替換
      • 分箱法離散化處理(分成不同區間對映成離散值)

      以對數轉換為例。

     

     

      對數轉換適用於存在較大異常值的資料,即適用於右偏分佈,不適用於左偏分佈。

    4.3 重複值

      重複值的處理很簡單,使用duplicated查詢重複值,引數keep有三個值:"first"、False、"last".分別表示顯示第一條、所有、最後一天重複的記錄。

     

     

      清洗完的資料可以直接匯出。

     

     5 資料分析

    空氣質量的好壞有時候決定人的去留,擇校、就業、定居、旅遊等等。

    首先來看最好和最壞的幾個城市

    5.1 空氣質量最好&最壞的幾個城市

    空氣最好的5個城市

      先按AQI排序,預設升序,取前5條記錄;x軸上的城市名稱需要旋轉45°,這樣便於檢視。

     

      上圖可以看出,空氣質量好的前5個城市:1.韶關市,2.南平市,3.梅州市,4.基隆市(臺灣省),5.三明市。全是南方城市。

    空氣最差的5個城市

     

     

      上圖可以看出,空氣質量最差的前5個城市: 1.北京市,2.朝陽市,3.保定市,4.錦州市,5.焦作市。全是北方城市。

    5.2 全國部分城市的空氣質量

          5.2.1 空氣質量等級劃分:

     

        首先我們需要定義一個函式,寫一些if語句,通過AQI的值來判斷空氣質量等級,

       這裡需要用apply函式:申請呼叫我們自建的函式,返回值就是自建函式返回值。

      

           從圖中可以看出,我國主要城市的空氣質量主要以一級和二級為主,三級佔一部分,其他佔少數。

       5.2.2 空氣質量指數分佈情況

        呼叫scatterplot()繪製散點圖,以AQI區分,引數palette是調色,這裡是綠色到紅色。

       從圖中可以看出,從地理位置上來講,空氣質量南方城市優於北方城市,西部城市優於東部城市。

     5.3 城市的空氣質量與是否臨海是否有關?

        先來看看此資料中臨海與內陸城市的數量:

      

         內陸城市數量遠大於臨海城市,這沒什麼懸念,我們再來看下散點分佈情況:

      

      從圖中可以大概看出臨海城市空氣質量由於內陸。但是我們還是要靠資料說話,分組計算空氣質量的均值:

      要用到groupby()分組函式   

       

        臨海79,內陸64。但是資訊太少,我們再畫個箱線圖和小提琴圖,來了解更多資訊。

       

      從箱線圖可看出,臨海城市的AQI的四分位值,最大值都比內陸城市低,所以臨海城市空氣質量相對於內陸城市要好。但是箱線圖對於資料分佈密度不明顯。

      所以,繪製小提琴圖,既能展示箱線圖資訊,又能呈現分佈的密度。

      我們還可以將小提琴圖和分簇散點圖結合在一起看:

      

        inner=None表示把“琴絃”去除。

     

      到這裡我們能得出臨海城市空氣質量普遍好於內陸嗎?

      顯然是不能的,我們的資料只有幾百條,只是一個樣本,並不能代表總體,這是樣本與總體的差異性。

      那怎麼得到一個可靠的結論呢?   我們需要對樣本做差異檢驗:

        對兩樣本做 t 檢驗,來檢視臨海城市與內陸城市的均值差異是否顯著。在進行兩樣本檢驗時,我們需要知道兩樣本的方差是否一致才能進行後面的 t 檢驗

     

       先匯入相關庫,定義變數,stats.levene()方差齊性檢驗。返回兩個值:第一個是統計量不要看,,看第二個p值為0.77,說明接受原假設,方差是齊性的(原假設:兩樣本方差相等,備擇假設:方差不等),可以進行下一步了。

      

      進行t檢驗時,兩樣本的方差是否相等,對結果有影響!ttest_ind():兩獨立樣本t檢驗,返回結果的p值只有0.007,很小,拒絕原假設(兩樣本不相等)。

      從統計量為負數可以看出,inland是大於coastal的。怎麼算呢?在stats中提供的兩獨立樣本t檢驗是雙邊檢驗(=或≠),而現在我們要的是大於小於的關係(單邊檢驗),所以需要計算p值:stats.t.sf(),sf=1-cdf,cdf為累計分佈函式,sf為殘存函式,自由度df。p值0.99666,說明coastal越小。

      到此為止,我們有超過99%的機率可以認為空氣質量臨海城市普遍優於內陸。

    5.4 空氣質量主要受哪些因素影響?

    • 人口密度大是否對導致空氣質量低呢?
    • 綠化率高是否能提高空氣質量呢?

      先用pairplot()畫一個散點圖矩陣,取3列資料

         

      對於不同變數的繪製散點圖,同變數的繪製直方圖,只表示數量。從上圖並不能明顯地看出變數之間的相關性, 我們需要通過計算相關係數來了解。

         

          DataFrame物件提供了計算相關係數的方法,直接data.corr()即可    

        再將資料視覺化,更清晰的呈現資料:

     

         結果統計

    從結果中可知,空氣質量指數主要受降雨量(-0.40) 與緯度(0.55) 影響。

      • 降雨量越多,空氣質量越好。
      • 緯度越低,空氣質量越好。

    此外,我們還能夠發現其他一些明顯的細節:

    1. GDP (城市生產總值)與Incineration (焚燒量)正相關(0.90) 。
    2. Temperature (溫度)與Precipitation (降雨量) 正相關(0.69) 。
    3. Temperature (溫度)與Latitude (緯度)負相關(-0.81)。
    4. Longitude (經度) 與Altitude (海拔) 負相關(-0.74) 。
    5. Latitude (緯度)與Precipitation (降雨量)負相關(-0.66) 。
    6. Temperature (溫度)與Altitude (海拔)負相關(-0.46) 。
    7. Altitude (海拔)與Precipitation (降雨量)負相關(-0.32) 。

    5.5全國城市空氣質量普遍處於何種水平?

         據說2015年全國所有城市的空氣質量指數均值在71左右,真的假的?

        為了驗證這是否正確,我們先來看看均值:

      75?大於71了,說明訊息是假的?

      當然還不能這麼說,因為,它倆不對等,一個是總體均值,一個是樣本均值,所以需要驗證一下它們是否相等。我們可以用單樣本t經驗(ttest_lsamp),置信度為95%。

     

     

                        

     

      p值大於0.05,所以無法拒絕原假設,維持原假設,即維持2015年全國所有城市的空氣質量指數均值在71左右。

      呼叫函式stats.t.interval()得出置信區間。

            

        這樣我們就計算出2015年全國所有城市平均空氣質量指數95%的可能在70.63~80.04之間。

     

    6 總結 

    1.空氣質量總體分佈上來說,南方城市優於北方城市,西部城市優於東部城市。
    2.臨海城市的空質量整體上好於內陸城市。
    3.是否臨海,降雨量與緯度對空氣質量指數的影響較大。
    4.我國城市平均空氣質量指數有95%的可能性在(70.63 - 80.04)這個區間內。

     7 PPT展示

     

     

    相關文章