空气质量指数(AQI)分析与预测

文章目录

  • 前言
  • 一、背景
    • Ⅰ数据来源
    • Ⅱ 数据背景
    • Ⅲ 分析目的
  • 二、数据探索性分析
    • Ⅰ 数据类型
    • Ⅱ 描述性统计
    • Ⅲ 数据预处理
      • 1.缺失值处理
        • 1)删除缺失值
        • 2)均值/中值填充
      • 2.异常值处理
      • 3.重复值处理
  • 三、数据分析
    • Ⅰ空气质量排名
    • Ⅱ 全国空气质量
      • 1.全国空气质量等级统计
      • 2.全国空气指数分布
    • Ⅲ 推断验证
      • 1.全国空气质量指数网传为72
      • 2.沿海城市是否空气质量更好
      • 3.空气质量受什么影响
    • Ⅳ 预测空气质量指数
  • 四、总结

前言

近年来,空气质量问题日益严峻,备受关注。对收集的有关空气质量指数相关的数据进行一个简单的分析。

一、背景

Ⅰ数据来源

数据来源于网络,数据下载,提取码:lrm8

Ⅱ 数据背景

该数据集是指2015年某些城市数据, 包含全国主要城市的相关数据及空气质量指数,其包含326个样本以及12个特征, 这10个特征分别为: 城市,空气质量指数,降雨量,城市生产总值,温度,经度,纬度,海拔高度,人口密度,是否沿海,绿化覆盖率,焚烧量(10000t).

Ⅲ 分析目的

分析目的

二、数据探索性分析

Ⅰ 数据类型

data.info()

数据信息
city特征为字符型, AQI、PopulationDensity、Coastal为64位整型, 其余为64位浮点型, 且均无缺失值.只有Precipitation缺少少量的数据。

Ⅱ 描述性统计

描述性统计

  • AQI平均水平;75.8,最高为296,最低为12。中位数与平均数相差不大,只存在少量极值,呈现右偏趋势。

Ⅲ 数据预处理

1.缺失值处理

1)删除缺失值

print(data.Precipitation.skew()) #skew求偏态系数
sns.distplot(data.Precipitation.dropna()) #dropna()删掉缺失的数据,displot不能处理缺失的数据

缺失值

2)均值/中值填充

data.fillna({'Precipitation':data['Precipitation'].median()},inplace=True)

2.异常值处理

利用Boxplot查看异常值

plt.figure(figsize=(15,4))
plt.xticks(rotation=45,fontsize=15)
sns.boxplot(data=data)

查看异常值
三个特征值存在明显的异常值,利用箱体图进行处理

t=data.copy()
for k in t:if pd.api.types.is_numeric_dtype(t[k]):o = t[k].describe()IQR = o["75%"] - o["25%"]lower = o["25%"] - 1.5 * IQRupper = o["75%"] + 1.5 * IQRt[k][t[k] < lower] = lowert[k][t[k] > lower] = upper
plt.figure(figsize=(15,4))
plt.xticks(rotation=45,fontsize=15)
sns.boxplot(data=t)

这里存在一点问题,第一次可以成功运行,第二次就不可以了。求大神指教🙊

3.重复值处理

#发现重复值
print(data.duplicated().sum())
#查看哪些记录出现了重复值
data[data.duplicated()]

重复值
存在两条重复值,由于数量小,可以直接删除。data.drop_duplicates(inplace=True)

三、数据分析

Ⅰ空气质量排名

plt.subplot(231)
#空气最好前五/最差五个的城市
best=data[['City','AQI']].sort_values(by=['AQI'])
print(best.head(5))
plt.xticks(rotation=45)
plt.title('空气质量最好排名')
sns.barplot(x='City',y='AQI',data=best.head(5))
plt.subplot(233)
low=data[['City','AQI']].sort_values(by=['AQI'],ascending=False)
print(best.head(5))
plt.xticks(rotation=45)
plt.title('空气质量最差排名')
sns.barplot(x='City',y='AQI',data=low.head(5))

空气质量排名
最好的为:韶关,南平,梅州,基隆,三明
最差的为:北京,朝阳,保定,锦州,焦作

Ⅱ 全国空气质量

1.全国空气质量等级统计

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)
print(level.value_counts())
sns.countplot(x=level,order=['一级','二级','三级','四级','五级','六级'])

等级统计
一二级空气质量等级最多,大部分城市的空气质量还是不错的,但是有18个属于四五级的城市需要重点改造。

2.全国空气指数分布

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

城市分布
大概可以看出南方好于北方,西方好于东方

Ⅲ 推断验证

1.全国空气质量指数网传为72

简单分析:
data['AQI'].mean()
计算出来为75.334。但是不能下网传不对的结论。如果数据是全国所有城市,那就可以下结论,因此从全国城市中进行抽样,使用抽样的均值来估计总体均值。

  • 中心极限定理:在适当的条件下,大量相互独立随机变量的均值经适当标准化后依分布收敛于正态分布。每次从这些总体中随机抽取 n 个抽样,一共抽 m 次。 然后把这 m 组抽样分别求出平均值, 这些平均值的分布接近正态分布。设从均值为μ、方差为(有限)的任意一个总体中抽取样本量为n的样本,当n充分大时,样本均值的抽样分布近似服从均值为μ、方差为的正态分布。
    中心极限定理告诉我们,当样本量足够大时,样本均值的分布慢慢变成正态分布
#定义总体数据
total=np.random.normal(loc=30,scale=80,size=10000)
#创建均值数据
mean=np.zeros(1000)
for i in range(len(mean)):mean[i]=np.random.choice(total,size=64,replace=False).mean()
print('样本均值:',mean.mean())
print('样本标准差:',mean.std())
print('偏度:',pd.Series(mean).skew())
sns.distplot(mean)

1

  • 置信区间
    根据正态分布特性,进行概率上的统计。标准正态分布数据分布比例如下图

标准正态分布
一般正态分布数据分布比例如下图
一般

#定义标准差
scale=50
#定义数据
x=np.random.normal(0,scale,size=100000)
#定义标准差的倍数,倍数从1到3
for times in range(1,4):y=x[(x>=-times*scale)&(x<=times*scale)]print(f'{times}倍标准差:')print(f'{len(y)*100/len(x)}%')

运行结果:1倍标准差:68.13%,2倍标准差:95.445%,3倍标准差:99.719%
通常我们以二倍标准差作为评定依据,则以均值为中心,正负二倍标准差构成的区间就是置信区间,而二倍标准差区间包含95%的数据,因此此时的置信区间为95%。换言之总体的均值有95%的可能在置信区间内。

  • 假设检验–t检验:统计量服从t分布,当自由度(样本容量-1)逐渐增大时,t分布近似于正态分布
from scipy import stats
r=stats.ttest_1samp(data['AQI'],72)
print('t值',r.statistic)
print('p值',r.pvalue)`

计算结果:t值 1.393763441074581 p值 0.16435019471704654。P值大于0.05,故在显著度为0.05检验下无法拒绝原假设。

#计算全国平均空气质量指数均值
n=len(data)
df=n-1
left=stats.t.ppf(0.025,df=df)
right=stats.t.ppf(0.975,df=df)
print(left,right)
mean=data['AQI'].mean()
std=data['AQI'].std()
mean+left*(std/np.sqrt(n)),mean+right*(std/np.sqrt(n))

计算结果:-1.9673585853224684 1.967358585322468
(70.6277615675309, 80.0409690826239)
结论:全国空气质量指数所在区间大概在70.63-80.04之间,置信度为95%

2.沿海城市是否空气质量更好

plt.subplot(131)
#沿海\内陆城市数量
display(data['Coastal'].value_counts())
plt.title('沿海、内陆城市数量')
sns.countplot(x='Coastal',data=data)
plt.subplot(133)
#临海城市和内陆城市散点分布
plt.title('临海城市和内陆城市散点分布')
sns.swarmplot(x='Coastal',y='AQI',data=data)

沿海内陆

#分别计算均值
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='r',data=data)

均值
大致可得出结论:沿海城市空气质量普遍好于内陆城市

  • 两样本t检验验证
`coastal=data[data['Coastal']==1]['AQI']
inland=data[data['Coastal']==0]['AQI']
#进行方差齐性检验,为后续的两样本t检验服务
print(stats.levene(coastal,inland))
stats.ttest_ind(coastal,inland,equal_var=True)`

计算结果:LeveneResult(statistic=0.08825036641952543, pvalue=0.7666054880248168)
Ttest_indResult(statistic=-2.7303827520948905, pvalue=0.006675422541012958)
有99%的概率可以认为沿海空气质量比内陆好

3.空气质量受什么影响

AQI与人口密度,绿化覆盖率影响

sns.pairplot(data[['AQI','PopulationDensity','GreenCoverageRate']])

相关

plt.figure(figsize=(15,8))
sns.heatmap(data.corr(),cmap=plt.cm.RdYlGn,annot=True,fmt='.2f')

热力图
结论:空气质量主要受降水量和纬度影响。与降水量呈正比,纬度呈反比。ps:存在一个可疑相关系数,沿海空气质量好,但却只有-0.15。有需求可进行具体分析。

Ⅳ 预测空气质量指数

  • 线性回归预测
#对空气质量进行预测
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
X=data.drop(['City','AQI'],axis=1)
y=data['AQI']
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=0)
lr=LinearRegression()
lr.fit(X_train,y_train)
y_hat=lr.predict(X_test)
print(lr.score(X_train,y_train))
print(lr.score(X_test,y_test))
plt.figure(figsize=(15,6))
plt.plot(y_test.values,'-r',label='真实值',marker='o')
plt.plot(y_hat,'-g',label='预测值',marker='D')
plt.legend()
plt.title("线性回归预测结果",fontsize=20)

预测
但线性回归的拟合性不是很好,因为在高维空间中并没有呈现线性关系

  • 随机森林预测
from sklearn.ensemble import RandomForestRegressor
rf=RandomForestRegressor(n_estimators=500,random_state=0)
rf.fit(X_train,y_train)
y_hat=rf.predict(X_test)
print(rf.score(X_train,y_train))
print(rf.score(X_test,y_test))
plt.figure(figsize=(15,6))
plt.plot(y_test.values,'-r',label='真实值',marker='o')
plt.plot(y_hat,'-g',label='预测值',marker='D')
plt.legend()
plt.title("随机森林预测结果",fontsize=20)

随机森林

四、总结

空气总体质量南部好于北部,西部好于东部;沿海好于内地。
降雨量与纬度对空气质量影响较大,存在一个可以相关系数,即沿海。
我国城市平均质量指数在70.63到80.04之间,概率高达95%。
通过历史数据,可以进行预测。
虽然我国整体空气质量较好,但是一级的也不是最多的,且四五级占的比例也不低,因此需要加快整治步伐,同时大力宣传,提升国民的环保意识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode MySQL解题目录

已完成的 LeetCode MySQL 数据库题目。点击查看我的 LeetCode 算法解题目录。 已解决 123/123 - 简单 54 中等 51 困难 18 前置入门学习 MySQL 基本查询、条件查询、投影查询MySQL 排序、分页查询、聚合查询MySQL 多表查询、连接查询&#xff08;内连接、外连接&#xff09;…

数据分析方法--回归分析方法((SPSS建模:多元线性回归案例)

文章目录回归定义最常用回归方法一、线性回归(Linear Regression)二、逻辑回归(Logistic Regression)三、多项式回归(Polynomial Regression)四、逐步回归(Stepwise Regression)五、岭回归(Ridge Regression)六、套索回归(Lasso Regression)七、回归(ElasticNet)如何正确选择回…

LeetCode MySQL 1511. Customer Order Frequency

文章目录1. 题目2. 解题1. 题目 Table: Customers ------------------------ | Column Name | Type | ------------------------ | customer_id | int | | name | varchar | | country | varchar | ------------------------ customer_id is the p…

LeetCode MySQL 1075. 项目员工 I

文章目录1. 题目2. 解题1. 题目 项目表 Project&#xff1a; ---------------------- | Column Name | Type | ---------------------- | project_id | int | | employee_id | int | ---------------------- 主键为 (project_id, employee_id)。 employee_id 是员…

数据分析-书籍整理(一)

入门书籍 《谁说菜鸟不会数据分析》讲解了一些常见的分析技巧&#xff0c;并附带 Excel 的一些知识以及职场可使用的基础数据分析。 《MYSQL必知必会》对于有sql基础的人来说&#xff0c;可以快速复习知识点&#xff0c;小白也能学习到很多&#xff0c;不会打击自信心。我是用…

数据分析统计学基础一

文章目录数据分析方法分类1、单纯的数据加工方法2、基于数理统计的数据分析方法3、基于数据挖掘的数据分析方法4、基于大数据的数据分析方法描述性统计分析1、数据的计量尺度2、数据的集中趋势3、数据的离中趋势4、数据分布的测定正态分布a. 偏态系数b. 数据峰度c. 偏度与峰度的…

LeetCode MySQL 1435. 制作会话柱状图

文章目录1. 题目2. 解题1. 题目 表&#xff1a;Sessions ------------------------------ | Column Name | Type | ------------------------------ | session_id | int | | duration | int | ------------------------------ sessio…

SharePoint2010网站备份还原简单介绍

今天尝试了SharePoint2010网站的备份和还原&#xff0c;从网上搜一些文档看看&#xff0c;然后自己试试&#xff0c;感觉和2007的操作没什么太大的区别&#xff0c;跟大家分享下自己尝试的命令行方式和数据库的方式&#xff0c;2007自己常用的也是这两种方式。 1、 命令行的方式…

LeetCode MySQL 1211. 查询结果的质量和占比

文章目录1. 题目2. 解题1. 题目 查询表 Queries&#xff1a; ---------------------- | Column Name | Type | ---------------------- | query_name | varchar | | result | varchar | | position | int | | rating | int | ---------------------…

数据分析方法-聚类算法

文章目录一、定义二、聚类、分类区别分类三、聚类常用算法1.划分聚类 k-means、k-medoids、k-modes、k-medians、kernel k-means2.层次聚类 Agglomerative 、divisive、BIRCH、ROCK、Chameleon3.密度聚类 DBSCAN、OPTICS5.模型聚类 GMM6.图聚类 Spectral Clustering&#xff08…

Java6 WebService学习

参考了网络上中资料&#xff0c;自己学习实践了一个Java6 WebService. 首先&#xff0c;建立一个WebService: package garfield;import javax.jws.WebService;import javax.xml.ws.Endpoint;WebServicepublic class MyJ6WebService {public String SayHello(String strName) {r…

公司人员离职情况分析及预测(工具:python)

前言 目前社会上呈现出一种公司招不到人&#xff0c;大批失业人员的矛盾现象&#xff0c;且大部分公司的离职率居高不下&#xff0c;很多入职没多久就辞职&#xff0c;所花费的培训招聘等资源都浪费了。为了弄清楚公司员工离职原因&#xff0c;通过kaggle上某一家企业员工离职…

LeetCode MySQL 1241. 每个帖子的评论数

文章目录1. 题目2. 解题1. 题目 表 Submissions 结构如下&#xff1a; ------------------------- | 列名 | 类型 | ------------------------- | sub_id | int | | parent_id | int | ------------------------- 上表没有主键, 所以可能…

新浪微博数据网络舆情分析客户端软件

这是我们北邮某实验室完全自主开发的数据挖掘和分析软件&#xff0c;用于处理海量数据&#xff0c;建立从数据采集&#xff0c;整理&#xff0c;分析&#xff0c;可视化&#xff0c;存储的全部服务。目前程序正在不断开发中。将在后期发布其测试版本。 转载于:https://www.cnbl…

LeetCode MySQL 1141. 查询近30天活跃用户数

文章目录1. 题目2. 解题1. 题目 活动记录表&#xff1a;Activity ------------------------ | Column Name | Type | ------------------------ | user_id | int | | session_id | int | | activity_date | date | | activity_type | enum | ---…

(jquery插件)打造百分比动态色彩条

以前没写过jquery插件&#xff0c;在开发这个时&#xff0c;写一下代码&#xff0c;又看一下jquery插件的定义&#xff08;如何开发之类的东东&#xff09;&#xff0c;来来去去的。 之所以要写这个插件&#xff0c;主要是为了往后的项目中方便实现这类型的功能&#xff0c;在之…

LeetCode MySQL 1517. Find Users With Valid E-Mails(正则表达式)

文章目录1. 题目2. 解题1. 题目 Table: Users ------------------------ | Column Name | Type | ------------------------ | user_id | int | | name | varchar | | mail | varchar | ------------------------user_id is the primary ke…

数据分析-书籍整理(三)

《淘宝网店大数据营销》一套网店搭建的整体体系&#xff0c;从如何做好网店展开说&#xff0c;有很多实用方法&#xff0c;对运营有很大的帮助&#xff0c;方便数据分析人员理解业务 《京东平台数据化运营》讲解了一些京东的知识&#xff0c;很多更淘宝运营相似&#xff0c;只…

基于消息队列的日志组件

1 简介 1.1 类图 1.2 说明 日志支持的存储方式有&#xff1a;文本&#xff0c;xml,数据库三种。如果采用数据库方式&#xff0c;支持的数据库有sql server、oracle。日志采用读写分离的方式&#xff0c;客户端发送日志到消息队列&#xff0c;然后服务端程序读取消息队列&…

LeetCode MySQL 1495. Friendly Movies Streamed Last Month

文章目录1. 题目2. 解题1. 题目 Table: TVProgram ------------------------ | Column Name | Type | ------------------------ | program_date | date | | content_id | int | | channel | varchar | ------------------------ (program_date, conte…