案例:通過空氣質量指數AQI學習統計分析並進行預測(上)

本篇博客會帶你學習:

  1. 數據分析流程
  2. 特徵工程
  3. 缺失值、異常值、重複值的處理
  4. 箱線圖怎麼判斷異常值
  5. 觀察散點圖、箱型圖、箱線圖等進行分析
  6. 兩獨立樣本T檢驗

用到的庫:numpy 、pandas、 matplotlib、 seaborn

讓我們開始吧!!!
在這裏插入圖片描述

1、AQI 分析與預測

1.1 背景信息

AQI(空氣質量指數),用來衡量空氣清潔或者污染的程度。值越小,表示空氣質量越好。近年來,因爲環境問題,空氣質量也越來越受到人們的重視。
在這裏插入圖片描述

1.2 學習任務說明

我們期望能夠運用數據分析的相關技術,對全國城市空氣質量進行研究和分析,希望能夠解決以下疑問:
在這裏插入圖片描述

這裏整合用到了之前的一些統計學習相關的內容。
需要回顧學習的可以點擊以下內容:
描述性統計分析。
推斷統計分析包括參數估計假設檢驗兩塊內容。
線性迴歸。

1.3 數據集描述

數據集:獲取2015年空氣質量指數集。該數據集包括全國主要城市的相關數據以及空氣質量指數。
數據集百度雲鏈接,提取碼:j63l
數據集中字段(列名)詳情:

在這裏插入圖片描述

2、數據分析流程

在進行分析前我們先來了解下數據分析的流程:
在這裏插入圖片描述
什麼是特徵工程?

有這麼一句話在業界廣泛流傳:數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已。那特徵工程到底是什麼呢?顧名思義,其本質是一項工程活動,目的是最大限度地從原始數據中提取特徵以供算法和模型使用。通俗的說就是數據預處理的方式,從源數據當中提取相關數據可以放到模型當中。

通過總結和歸納,目前認爲特徵工程包括以下方面:
在這裏插入圖片描述
什麼是超參數調整?

模型參數通常是有數據來驅動調整。
超參數不需要數據來驅動,而是在訓練前或者訓練中人爲的進行調整的參數。

3、讀取數據

3.1 導入相關的庫

導入需要的庫,同時,進行一些初始化設置。

import numpy as np
import pandas as pd 
import matplotlib.pylab as plt
import seaborn as sns
import warnings

sns.set(style="darkgrid")
plt.rcParams["font.family"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
warnings.filterwarnings("ignore")

warnings.filterwarnings("ignore") python通過調用warnings模塊中定義的warn()函數來發出警告。我們可以通過警告過濾器進行控制是否發出警告消息。
“ignore”表示忽略匹配的警告。

3.2 加載數據集

data = pd.read_csv("data.csv")
print(data.shape)

結果:(325, 12)(325行12列的形式)
加載之後,可以使用head / tail / sample等方法查看數據的大致情況。

data.head()

結果:
在這裏插入圖片描述
數據集我們大致查看後,現在要來對數據進行清洗的操作:

4、數據清洗

4.1 缺失值

4.1.1 缺失值探索

我們可以使用如下方法查看缺失值:

  • info
  • isnull
data.info()

結果:
在這裏插入圖片描述

data.isnull().sum(axis=0)
# 用sum 統計每一列有多少個缺失值

結果:
在這裏插入圖片描述
通過查看發現降雨量Precipitation 有4個缺失值。

4.1.2 缺失值處理

對於缺失值,我們可以使用如下的方式處理:
在這裏插入圖片描述
均值填充:

如果是正態分佈用均值填充也可以,但是如果是右偏分佈就不可以用均值填充了,因爲會受到極值的影響。

中值填充:

中位數不太受異常值或者極值的影響。 類別變量中,單獨作爲一個類別這種方法用的比較多些。

4.1.2.1 數據分佈
print(data["Precipitation"].skew())
# skew 查看下偏度信息
sns.distplot(data["Precipitation"].dropna())

skew() 查看下偏度信息
注意:
seaborn不支持空值繪製圖形,所以需要使用dropna()將空值剔除掉。

結果:
在這裏插入圖片描述
從圖中可以看到,分佈多少有些右偏,所以我們可以使用中值對其進行一個填充。

4.1.2.2 填充數據
data.fillna({"Precipitation":data["Precipitation"].median()},inplace=True)
data.isnull().sum()

median()中位數
inplace=True對當前對象進行修改
結果:
在這裏插入圖片描述
從圖中可以看出,已經填充完成,現在沒有缺失值了。
接着我們再來看下有沒有異常值。

4.2 異常值

4.2.1 異常值探索

發現異常值:
在這裏插入圖片描述

4.2.1.1 describe 方法

調用DataFrame對象的describe方法,可以顯示數據的統計信息,不過,此種方法僅能作爲一種簡單的異常探索方式。

data.describe()

在這裏插入圖片描述

4.2.1.2 3σ

根據正態分佈的特性,我們可以將3σ之外的數據,視爲異常值。

我們以GDP爲例,首先繪製GDP的分佈。

sns.distplot(data["GDP"])
print(data["GDP"].skew())

結果:
3.7614282419643033
在這裏插入圖片描述
可以看出,該數據呈現嚴重的右偏分佈。也就是存在很多極大的異常值,我們可以獲取這些異常值。

#均值mean,標準差std
mean,std = data["GDP"].mean(),data["GDP"].std()
lower,upper = mean - 3 * std,mean + 3 * std

print("均值:",mean)
print("標準差:",std)
print("下限:",lower)
print("上限:",upper)
# 拿出均值加減3倍標準差後得出的異常值
data["GDP"][(data["GDP"] < lower)  | (data["GDP"] > upper )]

代碼解析:
lower,upper = mean - 3 * std,mean + 3 * std 算出上限和下限
data["GDP"][(data["GDP"] < lower) | (data["GDP"] > upper )] 拿出上限和下限之外的值,即3σ。

結果:
在這裏插入圖片描述

4.2.1.3 箱線圖

箱線圖是一種常見的異常檢測方式。

箱形圖可以用來觀察數據整體的分佈情況,利用中位數,25/%分位數,75/%分位數,上邊界,下邊界等統計量來來描述數據的整體分佈情況。通過計算這些統計量,生成一個箱體圖,箱體包含了大部分的正常數據,而在箱體上邊界和下邊界之外的,就是異常數據。
畫箱線圖:

sns.boxplot(data=data["GDP"])

在這裏插入圖片描述
在這裏插入圖片描述
注意:
箱線圖中的上限(最大值)和下限(最小值)不是數據集中的最大值和最小值,指的是合理範圍之內的最大值和最小值,合理範圍是什麼呢?

Q1-1.5IQR > 合理範圍 > Q3+1.5IQR

其中上下邊界的計算公式如下:
在這裏插入圖片描述

箱線圖怎麼判斷異常值?

如果一個異常值比Q1-1.5IQR還要小的話,或者它比Q3+1.5IQR還要大的話,就把這樣的值看成異常值。(超出上邊界或下邊界的值就是異常值)
Q1-1.5IQR > 異常值
異常值 > Q3+1.5IQR在這裏插入圖片描述

IQR

什麼是IQR?
IQR可以用來識別異常值。
IQR是兩個四分位之間的間距。

IQR = Q3 − Q1

4.2.2 異常值處理

對於異常值,我們可以採用以下方式進行處理:
在這裏插入圖片描述

4.2.2.1 對數轉換

如果數據中存在較大的異常值,我們可以通過取對數來進行轉換,這樣可以得到一定的緩解。

例如,GDP變量呈現右偏分佈,我們可以進行取對數轉換。

# 創建子圖,一行兩列兩個圖
fig,ax = plt.subplots(1,2)
fig.set_size_inches(15,5)
# ax指的是子繪圖的對象在那個位置進行繪製
sns.distplot(data["GDP"],ax=ax[0])
sns.distplot(np.log(data["GDP"]),ax=ax[1])

在這裏插入圖片描述
左側的子圖是嚴重的右偏分佈,在取對數後基本上趨於正態分佈。
在這裏插入圖片描述

4.2.2.2 使用邊界值替換

我們可以對異常值進行截斷處理,即使用臨界值替換異常值。
例如,在3σ與箱線圖中,就可以這樣來處理。

4.2.2.3 分箱離散化

有時候,特徵對目標值存在一定的影響,但是,這種影響可能未必是線性的增加,此時,我們就可以使用分箱方式,對特徵進行離散化處理。

4.3 重複值

4.3.1 重複值探索

使用duplicate檢查重複值。

可配合keep參數進行調整。

# 發現重複值
print(data.duplicated().sum())
# 查看哪些記錄出現了重複值
data[data.duplicated(keep=False)]

duplicated( )函數:df.duplicated(subset=None, keep=‘first’/‘last’/False)
參數解析:

subset:對應值是列名,表示只考慮寫的列,將列對應值相同的行進行去重,默認值None,即考慮所有列;
keep='first/last/False’:first:默認值,除了第一次出現外,其餘相同的被標記爲重複;last:除了最後一次出現外,其餘相同的被標記爲重複;False:即所有相同的都被標記爲重複;
使用duplicated()函數檢測標記Series中的值、DataFrame中的記錄行是否是重複,重複爲True,不重複爲False。

結果:
在這裏插入圖片描述

4.3.2 重複值處理

重複值對數據分析通常沒有作用,直接刪除即可。

data.drop_duplicates(inplace=True)
data.duplicated().sum()

對重複值進行刪除後,現在結果查看重複值爲0。
數據處理後,現在我們進行一個簡單的分析。

5、數據分析

5.1 空氣質量最好/最差的5個城市

5.1.1 最好的5個城市
t=data[["City","AQI"]].sort_values("AQI")
display(t.iloc[:5])
plt.xticks(rotation=45)
sns.barplot(x="City",y="AQI",data=t.iloc[:5])

在這裏插入圖片描述
在這裏插入圖片描述
我們發現,空氣質量最好的5個城市爲:韶關市,南平市,梅州市,基隆市,三明市。

5.1.2 最差的5個城市
display(t.iloc[-5:])
plt.xticks(rotation=45)
sns.barplot(x="City",y="AQI",data=t.iloc[-5:])

在這裏插入圖片描述
在這裏插入圖片描述
空氣最差的5個城市分別爲:北京市,朝陽市,保定市,錦州市,焦作市。

5.2 全國城市空氣質量

5.2.1 城市空氣質量等統計

對於AQI,可以對空氣質量進行等級劃分,劃分標準如下表所示:
在這裏插入圖片描述
根據核標準,我們來統計下,全國空氣質量每個等級的數量。

# 編寫函數,將AQI轉換爲對應的等級
def value_to_level(AQI):
    if AQI >= 0 and AQI <= 50:
        return "一級"
    elif AQI >=51 and AQI <=100:
        return "二級"
    elif AQI >=101 and AQI <=150:
        return "三級"
    elif AQI >=151 and AQI <=200:
        return "四級"
    elif AQI >=201 and AQI <=300:
        return "五級"
    else:
        return "六級"
    
level = data["AQI"].apply(value_to_level)
display(level.value_counts())
sns.countplot(x=level,order=["一級","二級","三級","四級","五級","六級"])	

在這裏插入圖片描述
在這裏插入圖片描述
可見,我們城市的空氣質量主要以一級(優)與二級(良)爲主,三級(輕度污染)佔一部分,更高污染的城市佔少數。

5.2.2 空氣質量指數分佈

我們來繪製一下全國各城市的空氣質量指數分佈圖。

sns.scatterplot(x="Longitude",y="Latitude",hue="AQI",palette=plt.cm.RdYlGn_r,data=data)

在這裏插入圖片描述
從結果圖中我們可以看到,從大致的地理位置上看,西部城市好於東部城市,南部城市好於北部城市。

5.3 臨海城市是否空氣質量優於內陸城市?

5.3.1 數量統計

我們首先來統計下臨海城市與內陸城市的數量。

display(data["Coastal"].value_counts())
sns.countplot(x="Coastal",data=data)

在這裏插入圖片描述
在這裏插入圖片描述
內陸城市明顯多於沿海城市。

5.3.2 分佈統計

我們來觀察下內陸城市和沿海城市的散點分佈。

sns.stripplot(x="Coastal",y="AQI",data=data)

在這裏插入圖片描述

sns.swarmplot(x="Coastal",y="AQI",data=data)

在這裏插入圖片描述
然後我們再來分組計算空氣質量的均值。

display(data.groupby("Coastal")["AQI"].mean())
sns.barplot(x="Coastal",y="AQI",data=data)

在這裏插入圖片描述
在這裏插入圖片描述
以上柱形圖中的兩條線指的是什麼?
指的是置信區間,默認爲95%的置信度,總體均值在95%的概率下是不會超過線(置信區間)的。
在柱形圖中,僅顯示了內陸城市和沿海城市空氣質量指數(AQI)的均值對比,我們可以使用箱線圖來顯示更多的信息。

sns.boxplot(x="Coastal",y="AQI",data=data)

在這裏插入圖片描述
我們還可以繪製小提琴圖,除了能夠展示箱線圖的信息外,還能呈現出分佈的密度。

sns.violinplot(x="Coastal",y="AQI",data=data)

在這裏插入圖片描述
我們還可以將散點與箱線圖或小提琴圖結合在一起進行繪製,下面以小提琴圖爲例。

sns.violinplot(x="Coastal",y="AQI",data=data,inner=None)
sns.swarmplot(x="Coastal",y="AQI",color="g",data=data)

在這裏插入圖片描述
從以上信息(樣本)數據中可以得出沿海城市的空氣質量要比內陸城市的好很多,但是這不能代表全國空氣質量檢測的最終數據,因爲我們目前查看的就是樣本中幾百條數據的信息,我們還沒有總體上去比較沿海和內陸城市對於空氣質量的差別。

5.3.3 差異檢驗

這裏,我們可以進行兩樣本 t 檢驗,來查看臨海城市與內陸城市的均值差異是否顯著。
兩樣本t檢驗:

是指兩個獨立的樣本,又稱爲成組t檢驗,根據樣本數據對兩個樣本來自的兩個獨立總體的均值是否有顯著差異進行判斷。

檢驗兩樣本背後的均值是否一致:
原假設:均值一致
備擇假設:均值不一致

from scipy import stats
coastal = data[data["Coastal"]=="是"]["AQI"]
inland = data[data["Coastal"]=="否"]["AQI"]
#進行方差齊性檢驗,爲後續的兩樣本t檢驗服務
stats.levene(coastal,inland)

stats.levene利用levene檢驗,檢驗兩總體是否具有方差齊性。
結果:

結果中的統計量我們不用看,我們只需要看p值,從p值可以看到是有76%是支持原假設的,也就是方差是齊性的。

# 進行兩樣本t檢驗,注意:兩樣本的方差相同與不相同 ,取得的結果是不同的。
r = stats.ttest_ind(coastal,inland,equal_var=True)
print(r)
p = stats.t.sf(r.statistic,df=len(coastal)+len(inland)-2)
print(p)

equal_var=True 表示方差是相等的。
結果:有99%的機率可以認爲沿海城市的空氣質量普遍好於內陸城市。
在這裏插入圖片描述

兩獨立樣本T檢驗補充筆記:

在這裏插入圖片描述

使用邊界值替換與分箱離散化在AQI分析與預測下部分會詳細講解。
期待AQI 分析與預測下部分的學習吧,包括散點圖矩陣、相關係數等。

在這裏插入圖片描述

引用相關學習鏈接:
https://www.jianshu.com/p/7066558bd386
https://www.cnblogs.com/IvyWong/p/10134012.html

未完待續!!!
案例:通過空氣質量指數AQI學習統計分析並進行預測(下)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章