1、AQI分析與預測
1.1、背景資訊
AQI(Air Quality Index),指空氣品質指數,衡量空氣清潔或污染的程度,值越小,表示空氣品質越好。
1.2、分析目标
運用分析解決以下問題:
1、哪些城市的空氣品質較好/較差【描述性統計分析】
2、空氣品質在地理位置分布上,是否具有一定的規律性?【描述性統計分析】
3、臨海城市的空氣品質是否有别于内陸城市?【推斷統計分析】
4、全國城市空氣品質普遍處于何種水準?【區間估計】
5、怎樣預測一個城市的空氣品質?【統計模組化】
1.3、資料集描述
本次分析的資料集,包涵全國主要城市的相關資料及空氣品質指數。
city:城市名
AQI:空氣品質指數
Precipitation:降雨量
GDP:城市生産總值
Temperature:溫度
Longitude:經度
Latitude:次元
Aititude:海拔高度
PopulationDensity:人口密度
Coastal:是否沿海
GreenCoverageRate:綠化覆寫率
Incineration(10,000ton):焚燒量(10000噸)
2、資料分析流程
2.1、基本流程
1、明确需求與目的
2、資料收集
(1)内部資料
(2)購買資料
(3)爬取資料
(4)調查問卷
(5)其他收集
3、資料預處理
(1)資料整合:橫向整合、縱向整合
(2)資料清洗:缺失值、異常值、重複值
(3)資料轉換
4、資料分析
(1)描述分析
(2)推斷分析
(3)資料模組化:特征工程、超參數調整
(4)資料可視化
5、編寫報告
3、讀取資料
3.1、導入相關的庫
import numpy as np
import pandas as pd
import matplotlib.pyplot 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")
3.2、資料集加載
data = pd.read_csv("data.csv")
print(data.shape)

資料加載之後,可以用head/tail/sample等方法檢視資料的大緻情況
4、資料清洗
4.1、缺失值
4.1.1、缺失值探索
可使用如下方法檢視缺失值:info、isnull
data.isnull().sum(axis=0)
#data.info()
可以看出Precipitation(降雨量)列存在缺失值,需進行處理。
4.1.2、缺失值處理
對缺失值的處理方式主要有以下幾種:
1、删除缺失值:僅适合于缺失數量很少的情況;
2、填充缺失值
(1)數值變量:均值填充、中值填充;
(2)類别變量:衆數填充、單獨作為一個類别;
(3)額外處理說明:
a.缺失值小于20%,直接填充;
b.缺失值在20%-80%,填充變量後,同時增加一列,标記該列是否缺失,參與後續模組化;
c.缺失值大于80%,不使用原始列,而是增加一列,标記該列是否缺失,參與後續模組化。
4.1.2.1、資料分布
print(data["Precipitation"].skew())
sns.distplot(data["Precipitation"].dropna())
看出資料存在右偏狀态
4.1.2.2、資料填充
降雨量屬于數值型,這裡采用中值對其缺失值進行填充
data.fillna({"Precipitation":data["Precipitation"].median()},inplace=True)
data.isnull().sum()
填充後檢查缺失值,均為0.
4.2、異常值
4.2.1、異常值探索
可使用如下方式,發現異常值:
1、通過describe檢視數值資訊;
2、3σ方式;
3、使用箱線圖輔助;
4、相關異常檢測算法。
4.2.1.1、describe方法
僅能作為一種簡單的異常探索方式
4.2.1.2、3σ方法
依賴于正态分布的原理,在以均值為中心,3倍标準差以内,可以涵蓋99.7%,在3σ以外僅存在0.3%的資料。我們可以将3σ之外的資料,視為異常值。這裡以GDP為例,首先繪制GDP的分布情況。
sns.distplot(data["GDP"])
print(data["GDP"].skew())
從結果可以看出,GDP屬于嚴重的右偏型資料,也就是存在很多極大的異常值,我們可以擷取這些異常值。
mean,std=data["GDP"].mean(),data["GDP"].std()
lower,upper=mean-3*std,mean+3*std
print("均值:",mean)
print("标準差:",std)
print("下限:",lower)
print("上限:",upper)
data["GDP"][(data["GDP"]<lower)|(data["GDP"]>upper)]
存在以上八條在3σ以外的異常值
4.2.1.3、箱線圖
IQR=Q3-Q1,如果一個值小于(Q1-1.5IQR)或者大于(Q3+1.5IQR),則為箱線圖會檢測出來的異常值
4.2.2、異常值處理
可采取如下方式對異常值進行處理:
1、删除異常值
2、視為缺失值處理
3、對數轉換
4、使用臨界值填充
5、使用分箱法離散化處理
4.2.2.1、對數轉換
如果資料中存在較大的異常值,可以通過取對數來進行轉換,可得到一定的緩解。如GDP的右偏分布
fig,ax=plt.subplots(1,2)
fig.set_size_inches(15,5)
sns.distplot(data["GDP"],ax=ax[0])
sns.distplot(np.log(data["GDP"]),ax=ax[1])
取對數的方式比較簡單,但也存在一些局限:
1、僅适合右偏分布,不适合左偏分布;
2、取對數隻能針對正數操作,不夠可以通過轉換方式實作:
np.sign(X)*np.log(np.abs(X)+1)
4.2.2.2、使用邊界值替換
可以對異常值進行“截斷”處理,使用臨界值替換異常值。例如在3σ與箱線圖,就可采用此種方法處理。
4.2.2.3、分箱離散化
适用于資料為非線性的影響,而為階梯式的影響。
4.3、重複值
删!使用duplicate檢查重複值,可配合keep參數進行調整。
4.3.1、重複值探索
#發現重複值
print(data.duplicated().sum())
#檢視哪些記錄出現了重複值
data[data.duplicated(keep=False)]
4.3.2、重複值處理
直接删除重複值
data.drop_duplicates(inplace=True)
data.duplicated().sum()
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,可以對空氣品質進行等級劃分,劃分标準如下:
根據該标準,這裡統計下全國空氣品質每個等級的數量。
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、空氣品質指數分布
從大緻的地理位置看,南部優于北部,西部優于東部
5.3、臨海城市是否空氣品質優于内陸城市?
5.3.1、數量統計
首先統計下臨海城市與内陸城市數量
display(data["Coastal"].value_counts())
sns.countplot(x="Coastal",data=data)
5.3.2、分布統計
散點分布
分組計算空氣品質的均值
display(data.groupby("Coastal")["AQI"].mean())
sns.barplot(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檢驗,用于檢驗兩個獨立樣本背後總體的均值是否是一緻。
看所有内陸城市和總體臨海城市均值差異是否顯著。