幸福指数报告 -- 数据可视化+聚类分析
幸福指數報告 – 數據可視化+聚類分析
背景描述
《世界幸福報告》是對全球幸福狀況的具有里程碑意義的調查,根據其公民對自己的幸福程度對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.4da_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)+1y_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.4y_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 clusterdata =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)總結
以上是生活随笔為你收集整理的幸福指数报告 -- 数据可视化+聚类分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript实用功能代码片段
- 下一篇: mybatis、mysql使用函数实现英