当前位置:   article > 正文

Python数据分析案例03——天气K均值聚类分析_python 天气现象聚类分析

python 天气现象聚类分析

聚类常用的算法肯定是K均值聚类了,本次案例采用陕西的十个地区的天气数据,构建特征,进行聚类分析。

首先数据都装在‘天气数据’这个文件夹里面,如图:

打开其中一个excel,长这个样子

 

 下面开始数据处理。需要数据的同学可以参考:天气数据


数据预处理 

导入包

  1. import os
  2. import matplotlib.pyplot as plt
  3. import seaborn as sns
  4. import numpy as np
  5. import pandas as pd
  6. import datetime as dt
  7. import re
  8. #from sklearn.preprocessing import MinMaxScaler
  9. %matplotlib inline
  10. pd.options.display.float_format = '{:,.4f}'.format
  11. np.set_printoptions(precision=4)
  12. plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
  13. plt.rcParams ['axes.unicode_minus']=False               #显示负号

获取文件和地区名称

  1. file_name=os.listdir(f'./天气数据')
  2. print(file_name)
  3. region_name=[i[:2] for i in file_name]
  4. region_name

 定义一些函数,用来处理数据

  1. def date_transform(x) :
  2. a= x.split(' ')[0]
  3. a = pd.to_datetime(a, format='%Y-%m-%d')
  4. return a
  5. def C_check(C):
  6. a=C.split('℃')
  7. return int(a[0])
  8. def tianqi_check1(txt):
  9. if '转' in txt:
  10. a=re.findall('\w{1,5}转',txt)
  11. a=a[0].split('转')
  12. a=a[0]
  13. elif '~' in txt:
  14. a=re.findall('\w{1,5}~',txt)
  15. a=a[0].split('~')
  16. a=a[0]
  17. else:
  18. a=txt
  19. return a
  20. def tianqi_check2(txt):
  21. if '到' in txt:
  22. a=re.findall('到\w{1,5}',txt)
  23. a=a[0].split('到')
  24. a=a[1]
  25. else:
  26. a=txt
  27. return a
  28. df_最高气温=pd.DataFrame()
  29. df_最低气温=pd.DataFrame()
  30. df_天气=pd.DataFrame()
  31. dic_天气={'晴':0,'晴到多云':0.5,'晴间多云':0.5,'局部多云':0.5,'多云':1,'少云':1.5,'阴':2,'阴天':2,'雾':2.5,'霾':2.5,'小雨':3,'雨':3,'阴到小雨':2.5,
  32. '小到中雨':3.5,'小雨到中雨':3.5,'阵雨':3.5,'中雨':4,'小雨到大雨':4,'雷阵雨':4,'雷雨':4,'中到大雨':4.5,'大雨':5,'大到暴雨':5.5,
  33. '暴雨':6,'暴风雨':6.5,'小雪':7,'雨夹雪 ':7,'雪':7,'中雪':8,'大雪':9,'浮尘':2.5,'扬沙':2.5,'风':2.5}

开始读取和处理

  1. for i,f in enumerate(file_name):
  2. #print(i)
  3. file_path = f'./天气数据/{f}'
  4. data=pd.read_excel(file_path,usecols=['日期','最高气温','最低气温','天气'])
  5. data['日期']=data['日期'].apply(date_transform)
  6. data['最高气温']=data['最高气温'].apply(C_check)
  7. data['最低气温']=data['最低气温'].apply(C_check)
  8. data['天气']=data['天气'].astype(str).apply(tianqi_check1)
  9. data['天气']=data['天气'].astype(str).apply(tianqi_check2)
  10. data.loc[:,'天气']=data['天气'].map(dic_天气)
  11. data['天气'].fillna(data['天气'].mean)
  12. data=data.set_index('日期').resample('M').mean()
  13. #print(len(data))
  14. df_最高气温[region_name[i]]=data['最高气温']
  15. df_最低气温[region_name[i]]=data['最低气温']
  16. df_天气[region_name[i]]=data['天气']

最后是形成了三个数据框,最高温和最低温,还有天气情况(比如下雨还是晴天等等),天气情况我用map进行了映射,都变成了数值型变量。


描述性统计

df_最高气温.plot(title='各地区每月最高温变化图',figsize=(14,5),xlabel='日期',ylabel='最高温')

df_最低气温.plot(title='各地区每月最低温变化图',figsize=(14,5),xlabel='日期',ylabel='最低温')

df_天气.plot(title='各地区每月天气变化图',figsize=(14,5),xlabel='日期',ylabel='天气')

 都具有很明显的周期性,天气因为是自己映射的数值型数据,所以有点杂乱。

然后画出最高温的箱线图:

  1. column = df_最高气温.columns.tolist() # 列表头
  2. fig = plt.figure(figsize=(20, 8), dpi=128) # 指定绘图对象宽度和高度
  3. for i in range(len(column)):
  4. plt.subplot(2,5, i + 1) # 2行5列子图
  5. sns.boxplot(data=df_最高气温[column[i]], orient="v",width=0.5) # 箱式图
  6. plt.ylabel(column[i], fontsize=16)
  7. plt.title(f'{region_name[i]}每月最高温箱线图',fontsize=16)
  8. plt.tight_layout()
  9. plt.show()

 最低温和天气也是一样画,数据框名称改一下就行。

下面画出最低温的核密度图(同理最高温和天气也是一样的)

  1. fig = plt.figure(figsize=(20, 8), dpi=128) # 指定绘图对象宽度和高度
  2. for i in range(len(column)):
  3. plt.subplot(2,5, i + 1) # 2行5列子图
  4. ax = sns.kdeplot(data=df_最低气温[column[i]],color='blue',shade= True)
  5. plt.ylabel(column[i], fontsize=16)
  6. plt.title(f'{region_name[i]}每月最低温核密度图',fontsize=16)
  7. plt.tight_layout()
  8. plt.show()

 画出天气的相关性热力图

  1. fig = plt.figure(figsize=(8, 8), dpi=128)
  2. corr= sns.heatmap(df_天气[column].corr(),annot=True,square=True)

最高温和最低温也是一样,改一下数据框名称就行。可以看到哪些地区的天气相关性高


 K均值聚类

因为本次构建了三个特征,可以进行三次K均值聚类,我们可以比较一下聚类的结果,首先使用最高温进行聚类:

最高温的聚类

  1. from sklearn.cluster import KMeans
  2. kmeans_model = KMeans(n_clusters=3, random_state=123, n_init=20)
  3. kmeans_model.fit(df_最高气温.T)
  4. kmeans_model.inertia_ #组内平方和
  5. # kmeans_cc=kmeans_model.cluster_centers_ # 聚类中心
  6. # kmeans_cc
  7. kmeans_labels = kmeans_model.labels_ # 样本的类别标签
  8. kmeans_labels
  9. pd.Series(kmeans_labels).value_counts() # 统计不同类别样本的数目

 映射一下类别的数值

  1. dic_rusult={}
  2. for i in range(10):
  3. dic_rusult[df_最高气温.T.index[i]]=kmeans_labels[i]
  4. dic_rusult

 统计一下,打印结果

  1. 第一类地区=[]
  2. 第二类地区=[]
  3. 第三类地区=[]
  4. for k,v in dic_rusult.items():
  5. if v==0:
  6. 第一类地区.append(k)
  7. elif v==1:
  8. 第二类地区.append(k)
  9. elif v==2:
  10. 第三类地区.append(k)
  11. print(f'从最高气温来看的聚类的结果,将地区分为三个地区,\n第一个地区为:{第一类地区},\n第二个地区为:{第二类地区},\n第三个地区为:{第三类地区}')

 可以去地图上看看,聚类的结果还是很有道理的,聚类出来的地区都是挨得很近的地方。


最低温度K均值聚类

  1. kmeans_model = KMeans(n_clusters=3, random_state=123, n_init=20)
  2. kmeans_model.fit(df_最低气温.T)
  3. kmeans_labels = kmeans_model.labels_ # 样本的类别标签
  4. kmeans_labels
  5. pd.Series(kmeans_labels).value_counts() # 统计不同类别样本的数目
  6. dic_rusult2={}
  7. for i in range(10):
  8. dic_rusult2[df_最低气温.T.index[i]]=kmeans_labels[i]
  9. dic_rusult2
  10. 第一类地区=[]
  11. 第二类地区=[]
  12. 第三类地区=[]
  13. for k,v in dic_rusult2.items():
  14. if v==2:
  15. 第一类地区.append(k)
  16. elif v==1:
  17. 第二类地区.append(k)
  18. elif v==0:
  19. 第三类地区.append(k)
  20. print(f'从最低气温来看的聚类的结果,将地区分为三个地区,\n第一个地区为:{第一类地区},\n第二个地区为:{第二类地区},\n第三个地区为:{第三类地区}')

 和最高温的聚类结果差不多

第一个地区对应的关中

第二个地区对应的陕北

第三个地区对应的陕南


天气K均值聚类

  1. kmeans_model = KMeans(n_clusters=3, random_state=123, n_init=20)
  2. kmeans_model.fit(df_天气.T)
  3. kmeans_labels = kmeans_model.labels_ # 样本的类别标签
  4. pd.Series(kmeans_labels).value_counts() # 统计不同类别样本的数目
  5. dic_rusult3={}
  6. for i in range(10):
  7. dic_rusult3[df_天气.T.index[i]]=kmeans_labels[i]
  8. dic_rusult3
  9. 第一类地区=[]
  10. 第二类地区=[]
  11. 第三类地区=[]
  12. for k,v in dic_rusult3.items():
  13. if v==1:
  14. 第一类地区.append(k)
  15. elif v==2:
  16. 第二类地区.append(k)
  17. elif v==0:
  18. 第三类地区.append(k)
  19. print(f'从天气来看的聚类的结果,将地区分为三个地区,\n第一个地区为:{第一类地区},\n第二个地区为:{第二类地区},\n第三个地区为:{第三类地区}')

 天气的效果和气温差不多。

第一个地区对应的关中

第二个地区对应的陕北

第三个地区对应的陕南

说明地理位置近的地区的天气更加相似(算法说的)

创作不易,看官觉得写得还不错的话点个关注和赞吧,本人会持续更新python数据分析领域的代码文章~(需要定制代码可私信)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/737579
推荐阅读
相关标签
  

闽ICP备14008679号