幸福指数报告 -- 数据可视化+聚类分析

幸福指数报告 – 数据可视化+聚类分析

背景描述

《世界幸福报告》是对全球幸福状况的具有里程碑意义的调查,根据其公民对自己的幸福程度对156个国家进行了排名。

《 2020年报告》首次通过主观幸福感对全球城市进行排名,并更深入地探讨了社会,城市和自然环境如何结合在一起影响我们的幸福。

数据说明

幸福分数和排名使用盖洛普世界民意调查的数据。分数基于对民意调查中提出的主要生活评估问题的答案。

这个问题称为Cantril阶梯,要求被调查者考虑一个阶梯,该阶梯的最长寿命是10,而最糟糕的寿命是0,并以此等级来评价自己当前的寿命。
分数来自2015-2020年全国代表性的样本,并使用盖洛普权重使估算值具有代表性。

幸福评分后面的各栏估算了六个因素(经济生产,社会支持,预期寿命,自由,没有腐败和慷慨)中每个因素在何种程度上有助于使每个国家的生活评价高于反乌托邦,一个假设的国家,其六个因素的价值均等于世界最低的国家平均值。

它们对每个国家/地区的总分数没有影响,但是确实解释了为什么某些国家的排名高于其他国家。

什么是残差?

每个国家的残差或无法解释的成分有所不同,反映出六个变量在2015-2016年平均寿命评估中超出或低于解释的程度。在整个国家中,这些残差的平均值约为零。我们将这些残差与估计的反乌托邦中的生活评估相结合,以便合并后的条形图始终具有正值。

主要内容

1、 对无用的数据进行删除

2、 对数据进行清洗

3、 对数据采用可视化方式显示数据的类别分布

4、 利用2015-2002年数据对国家进行聚类,看哪些国家的幸福程度是类似的

配置及代码核心实现

数据预处理

导入所需要的库及载入数据集

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 读入数据
df_2015 = pd.read_csv('datasets_652031_1153691_2015.csv')
df_2016 = pd.read_csv('datasets_652031_1153691_2016.csv')
df_2017 = pd.read_csv('datasets_652031_1153691_2017.csv')
df_2018 = pd.read_csv('datasets_652031_1153691_2018.csv') 
df_2019 = pd.read_csv('datasets_652031_1153691_2019.csv')
df_2020 = pd.read_csv('datasets_652031_1153691_2020.csv')
# 新增列-年份
df_2015["year"] = str(2015)
df_2016["year"] = str(2016)
df_2017["year"] = str(2017)
df_2018["year"] = str(2018)
df_2019["year"] = str(2019)
df_2020["year"] = str(2020)

将每年的幸福指数数据进行数据清洗

2015年数据

df1=df_2015.drop(labels=['Standard Error','Family','Dystopia Residual'],axis=1,inplace=False)
df1.isnull().sum().sort_values(ascending=False)#是否有缺失值
df1.dropna(how = 'all')#删除缺失值
df1.drop_duplicates()#删除重复值

2016年数据

df2=df_2016.drop(labels=['Lower Confidence Interval','Upper Confidence Interval','Family','Dystopia Residual'],axis=1,inplace=False)
df2.isnull().sum().sort_values(ascending=False)#是否有缺失值
df2.dropna(how = 'all')#删除缺失值
df2.drop_duplicates()#删除重复值

2017年数据

colNameDict = {'Happiness.Rank':'Happiness Rank','Happiness.Score':'Happiness Score','Economy..GDP.per.Capita.':'Economy (GDP per Capita)','Health..Life.Expectancy.':'Health (Life Expectancy)','Freedom to make life choices':'Freedom','Trust..Government.Corruption.':'Trust (Government Corruption)','Dystopia.Residual':'Dystopia Residual'}     
df_2017.rename(columns = colNameDict,inplace=True)
df3=df_2017.drop(labels=['Whisker.high','Whisker.low','Family','Dystopia Residual'],axis=1,inplace=False)
df3.isnull().sum().sort_values(ascending=False)#是否有缺失值
df3.dropna(how = 'all')#删除缺失值
df3.drop_duplicates()#删除重复值

2018年数据

colNameDict = {'Overall rank':'Happiness Rank','Score':'Happiness Score','GDP per capita':'Economy (GDP per Capita)','Healthy life expectancy':'Health (Life Expectancy)','Freedom to make life choices':'Freedom','Perceptions of corruption':'Trust (Government Corruption)','Country or region':'Country'}          
df_2018.rename(columns = colNameDict,inplace=True)
df4=df_2018.drop(labels='Social support',axis=1,inplace=False)

df4.isnull().sum().sort_values(ascending=False)
df4.dropna(how='any')
df4.drop_duplicates()#删除重复值

2019年数据

colNameDict = {'Overall rank':'Happiness Rank','Score':'Happiness Score','GDP per capita':'Economy (GDP per Capita)','Healthy life expectancy':'Health (Life Expectancy)','Freedom to make life choices':'Freedom','Perceptions of corruption':'Trust (Government Corruption)','Country or region':'Country'}
df_2019.rename(columns = colNameDict,inplace=True)
df5=df_2019.drop(labels='Social support',axis=1,inplace=False)
#df5.head()
df5.isnull().sum().sort_values(ascending=False)#是否有缺失值
df5.dropna(how = 'all')#删除缺失值
df5.drop_duplicates()#删除重复值

2020年数据

colNameDict = {'Overall rank':'Happiness Rank','Score':'Happiness Score','Healthy life expectancy':'Health (Life Expectancy)','Freedom to make life choices':'Freedom','Perceptions of corruption':'Trust (Government Corruption)','Explained by: Log GDP per capita':'Economy (GDP per Capita)','Country or region':'Country'}  
df_2020.rename(columns = colNameDict,inplace=True)
df6=df_2020.drop(labels=['Social support','Dystopia + residual','Logged GDP per capita','Explained by: Social support','Explained by: Healthy life expectancy','Explained by: Freedom to make life choices','Explained by: Generosity','Explained by: Perceptions of corruption','Regional indicator','Standard error of ladder score','upperwhisker','lowerwhisker','Ladder score in Dystopia'],axis=1,inplace=False)
#df6.head()
df6.isnull().sum().sort_values(ascending=False)#是否有缺失值
df6.dropna(how = 'all')#删除缺失值
df6.drop_duplicates()#删除重复值

数据处理完毕,将15年到20年的数据合并在一起

df_all = df1.append([df2, df3, df4, df5,df6], sort=False)
df_all.head()

最后检查数据是否还有缺失值,没有缺失值、空值则进行数据可视化

df_all.isnull().sum().sort_values(ascending=False)
数据可视化
def data_info():
    print(df1.info())
    print(df1.describe())
#区域内的平均幸福指数可视化
def country_score_of_every_region():
   #设置需要提取的数据的列名
    plt_cols = ['Region', 'Happiness Score', 'Country']
    plt_data = df1[plt_cols]#提取数据
    print(type(plt_da))
    regions = set(plt_da['Region'])#获取所有区域名称
    for item in regions:#分别获取一个区域内的所有国家信息
        plt.figure()#画图
        data = plt_da[plt_da['Region'] == item]
        print("{}.dataset is :".format(item))
       #plt.bar(data['Country'],data['Happiness Score'])
        sns.barplot(data['Country'],data['Happiness Score'])
        plt.xticks(rotation='vertical')#设置横坐标数据方向
        plt.ylabel("Happiness Score")
        plt.xlabel("Country")
        plt.title('{} is Happiness Score '.format(item))
        plt.show()#图片展示
#区域内的人均GDP分部、社会支援信息,预期健康寿命信息,人生抉择自由信息,免于贪腐自由信息,慷慨信息,可视化
#**参数**
   #'Economy (GDP per Capita)',
   # 'Family',
   # 'Health (Life Expectancy)',
   # 'Freedom',
   # 'Trust (Government Corruption)',
   # 'Generosity'
   #‘Happiness Rank’
def regions_country_Happiness_infos(table):
    plt_cols = ['Region','Country','Economy (GDP per Capita)','Family','Health (Life Expectancy)','Freedom','Trust (Government Corruption)','Generosity','Happiness Rank']
    plt_data = df_2015[plt_cols]
   # print(plt_data.info())
regions = set(plt_data['Region'])
for item in regions:
    plt.figure()
    dat = plt_data[plt_data['Region'] == item]
    sns.barplot(x='Country', y=table, data=dat)
    plt.title('{} in {}'.format(table,item))
    plt.xlabel('Country')
    plt.ylabel(table)
    plt.xticks(rotation='vertical')
    plt.show()
#排名前/后5个国家的幸福指数情况
def up_5_country_happiness():
    data = df1[:5]
    data2 = df1[-5:]
    cols = ['Region', 'Happiness Score', 'Country']
    info_up = data[cols]
    info_down = data2[cols]
    # info1 = data[['Region', 'Happiness Score', 'Country']]

    plt.figure()
    ax = plt.subplot(1,2,1)
    sns.barplot(x='Country',y='Happiness Score',data=info_up)
    plt.xticks(rotation='vertical')
    plt.title('Country Happiness Score')

ax1 = plt.subplot(1,2,2,sharey=ax)
sns.barplot(x='Country', y='Happiness Score', data=info_down)
plt.xticks(rotation='vertical')
plt.title('Country Happiness Score')
plt.show()
#三年内幸福指数变化情况
def happiness_change_in_6_years():
    cols = ['Region', 'Happiness Score', 'Country']
    da_2015 = df_2015[cols]
    print(da_2015)
    width = 0.4
    da_2016 = df_2016[cols]
    #da_2017 = df_2017[cols]
    regions = set(da_2015['Region'])
    for item in regions:
        da_15 = df_2015[da_2015['Region'] == item]#获取15/16年的数据
        da_16 = df_2016[da_2016['Region'] == item]
        x_15 = len(da_15['Country'])
        x1_15 = np.arange(x_15)+1
        y_15 = list(da_15['Happiness Score'])
        height_15 = np.array(y_15)

    x_16 = len(da_16['Country'])
    x1_16 = np.arange(x_16) + 1+0.4
    y_16 = list(da_16['Happiness Score'])
    height_16 = np.array(y_16)
    plt.figure()
   #画图
    a = plt.bar(x=x1_15, height=height_15,width=width,label='2015')
    b = plt.bar(x=x1_16, height=height_16,width=width,label='2016',tick_label = da_16['Country'])
    plt.xticks(rotation='vertical')
    plt.title('{} Happiness Score'.format(item))
    plt.legend()
    plt.show()
if __name__ == '__main__':
    data_info()
   #区域
    regions_country_Happiness_infos('Economy (GDP per Capita)')
    #regions_country_Happiness_infos('Family')
    regions_country_Happiness_infos('Health (Life Expectancy)')
    regions_country_Happiness_infos('Freedom')
    regions_country_Happiness_infos('Trust (Government Corruption)')
    regions_country_Happiness_infos('Generosity')
    #regions_country_rank()
    #regions_country_pie()
    up_5_country_happiness()
   #国家
   # every_regions_country_num()
   #幸福指数
    happiness_change_in_6_years()

部分可视化图片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

聚类分析
subDataDF1=df1[["Country","Happiness Score"]]
subDataDF1
import numpy as np
import PIL.Image as image
from sklearn.cluster import KMeans
from sklearn import cluster

data =subDataDF1.drop('Country',axis=1)
k_means = cluster.KMeans(n_clusters=2, max_iter=50, random_state=1)
k_means.fit(data) 
labels = k_means.labels_
pd.DataFrame(labels, index=subDataDF1.Country, columns=['Country ID'])
centroids = k_means.cluster_centers_
pd.DataFrame(centroids,columns=data.columns)
print('查看聚类中心:\n',k_means.cluster_centers_)
print('查看样本的类别标签:\n',k_means.labels_)    #查看样本的类别标签
labels_series=pd.Series(k_means.labels_)   #将标签转化为series
s1=labels_series[labels_series.values==0]   #幸福得分的分类中心点3
s2=labels_series[labels_series.values==1]   #幸福得分类中心点2
DF2=pd.DataFrame(subDataDF1.Country)
print('第一个簇地区为:',set(df2.iloc[s1.index]['Country']))
print('第二个簇地区为:',set(df2.iloc[s2.index]['Country']))
num=pd.Series(k_means.labels_).value_counts()
print('每个幸福得分分类群的数目为:\n',num)

在这里插入图片描述

  • 4
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
k-means聚类是一种常用的无监督学习算法,用于将数据集分为k个不同的类别。聚类分析通常用于数据的探索和可视化,以了解数据的结构和模式。 k-means聚类数据可视化可以通过不同的方法来实现。首先,可以使用散点图来显示数据点和它们的聚类分配。对于二维数据集,可以在二维坐标系上绘制数据点,不同的颜色或符号代表不同的聚类。这样,我们可以直观地观察到每个簇内的数据点的紧密性和相似性。 其次,可以使用轮廓图来评估聚类的质量并进行可视化。轮廓系数是一种度量聚类结果的方法,它衡量了聚类中样本的紧密性和分离度。对于每个数据点,轮廓系数为(s[i]-a[i])/max(s[i],a[i]),其中s[i]是与样本i同一簇中所有其他点的平均距离,a[i]是样本i与最近簇中所有点的平均距离。当轮廓系数接近1时,说明聚类结果具有较好的紧密性和分离度。 另外,还可以使用热图来可视化聚类结果。热图可以显示数据点之间的相似性,其中相似性可以使用距离或相似性度量来定义。通过热图,我们可以清楚地看到聚类结果中潜在的模式和结构。 最后,通过降维技术(如主成分分析或t-SNE)将高维数据可视化到二维或三维空间。降维可以将数据点映射到具有较低维度的新空间中,从而方便可视化。这可以帮助我们确定在较低维度空间中是否存在明显的聚类结构。 综上所述,k-means聚类数据可视化可以通过散点图、轮廓图、热图和降维技术等方法来实现,从而帮助我们更好地理解数据的结构和模式。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChlinRei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值