数据可视化分析2015-2017年世界幸福指数

1.查看2015-2017年每年幸福指数Happiness Rank排名前5和后5的国家

所用的数据集2015、2016、2017.csv文件可以去百度,3个文件存放在4个代码所在目录code的同级目录data下

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False

#1.查看2015-2017年每年幸福指数Happiness Rank排名前5和后5的国家
def Happiness_Rank_5(year):
    if (2017==year):
        #2017年指标命名不同于其他2年
        columns=['Country','Happiness.Rank','Happiness.Score']
        load_data=pd.read_csv("../data/{}.csv".format(year))[columns]
        y1=load_data['Happiness.Score'][:5]
        y2=load_data['Happiness.Score'][-5:]
    else:
        #2015年和2016年
        columns=['Country','Happiness Rank','Happiness Score']
        load_data=pd.read_csv("../data/{}.csv".format(year))[columns]
        y1=load_data['Happiness Score'][:5]
        y2=load_data['Happiness Score'][-5:]
       
    data1_5=load_data[:5]
    data5_1=load_data[-5:]
    #可视化:幸福指数排名前5国家数据
    plt.figure(figsize=(15,6))
    ax=plt.subplot(1,2,1)
    plt.xlabel('Country',fontsize=20)
    plt.ylabel('Happiness Score',fontsize=20)
    plt.xticks(range(5),data1_5.Country,fontsize=15)
    plt.yticks(fontsize=15)
    plt.ylim((6,7.6))
    plt.bar(range(5),y1,width=0.5)
    plt.title('{}年幸福指数排名前5国家'.format(year),color='red',fontsize=20)
    plt.show()
    print("{}年幸福指数排名前5国家数据:\n".format(year),data1_5)
    #可视化:幸福指数排名后5国家数据
    p=plt.figure(figsize=(15,6))
    ax=plt.subplot(1,2,2)
    plt.xlabel('Country',fontsize=20)
    plt.ylabel('Happiness Score',fontsize=20)
    plt.xticks(range(5),data5_1.Country,fontsize=15)
    plt.yticks(fontsize=15)
    plt.ylim((2,3.6))
    plt.bar(range(5),y2,width=0.5,color='red')
    plt.title('{}年幸福指数排名后5国家'.format(year),color='green',fontsize=20)
    plt.show()
    print("{}年幸福指数排名后5国家数据:\n".format(year),data5_1)

#2015年前5和后5国家
Happiness_Rank_5(2015)
#2016年前5和后5国家
Happiness_Rank_5(2016)
#2017年前5和后5国家
Happiness_Rank_5(2017)

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

2.统计2015-2016年某区域区域幸福指标数据(可以传各个列名参数进行统计,不只限于幸福指数)

#2.统计2015-2016年某区域区域幸福指标数据(可以传各个列名参数进行统计,不只限于幸福指数)
def region_Happiness(year,name,area):
    if (2017==year):
        #2017年没有分区域,用国家先与2016年数据关联,这样就有了区域
        columns=['Country','Happiness.Score','Economy..GDP.per.Capita.','Family',\
             'Health..Life.Expectancy.','Freedom','Trust..Government.Corruption.','Generosity']
        data=pd.read_csv('../data/{}.csv'.format(year))[columns]
        columns2=['Country','Region','Happiness Score','Economy (GDP per Capita)','Family',\
             'Health (Life Expectancy)','Freedom','Trust (Government Corruption)','Generosity']
        data2=pd.read_csv('../data/2016.csv')[columns2]
        #将2017年与2016年合并,data2为2016年,相同列名会变成column_x和column_y
        data=pd.merge(data2,data,how='left',on='Country')
        #更改2017年的column_y为column
        data=data.rename(columns={'Family_y':'Family','Freedom_y':'Freedom','Generosity_y':'Generosity'})
    else:
        columns=['Country','Region','Happiness Score','Economy (GDP per Capita)','Family',\
             'Health (Life Expectancy)','Freedom','Trust (Government Corruption)','Generosity']
        data=pd.read_csv('../data/{}.csv'.format(year))[columns]
    #可视化:某区域幸福指标数据    
    plt.figure(figsize=(45,15))
    data=data[data['Region']==area]
    plt.xlabel('Country',fontsize=50)
    plt.ylabel(name,fontsize=50)
    plt.xticks(range(data.shape[0]),data.Country,fontsize=40,rotation='vertical')#让横轴的国家名竖着显示
    plt.yticks(fontsize=40)
    #这个y轴取值范围只针对Happiness Score,对于其他列不合适
    plt.ylim((4.5,7.75))
    plt.bar(range(data.shape[0]),data[name],width=0.5)
    plt.title('{}年{}的{}指标统计图'.format(year,area,name),color='red',fontsize=50)
    plt.show()
    #文字只输出国家、区域、指标数据
    columns3=['Country','Region',name]
    data=data[columns3]
    print("{}年{}的{}指标数据为:\n".format(year,area,name),data)       
         
#统计2015年某区域幸福指标数据   
year=2015
area='Western Europe'
region_Happiness(year,'Happiness Score',area)
#region_Happiness(year,'Economy (GDP per Capita)',area)
#region_Happiness(year,'Family',area)
#region_Happiness(year,'Health (Life Expectancy)',area)
#region_Happiness(year,'Freedom',area)
#region_Happiness(year,'Trust (Government Corruption)',area)
#region_Happiness(year,'Generosity',area)

#统计2016年某区域幸福指标数据
year=2016
area='Western Europe'
region_Happiness(year,'Happiness Score',area)
#region_Happiness(year,'Economy (GDP per Capita)',area)
#region_Happiness(year,'Family',area)
#region_Happiness(year,'Health (Life Expectancy)',area)
#region_Happiness(year,'Freedom',area)
#region_Happiness(year,'Trust (Government Corruption)',area)
#region_Happiness(year,'Generosity',area)

#统计2017年某区域幸福指标数据
year=2017
area='Western Europe'
region_Happiness(year,'Happiness.Score',area)
#region_Happiness(year,'Economy..GDP.per.Capita.',area)
#region_Happiness(year,'Family',area)
#region_Happiness(year,'Health..Life.Expectancy.',area)
#region_Happiness(year,'Freedom',area)
#region_Happiness(year,'Trust..Government.Corruption.',area)
#region_Happiness(year,'Generosity',area)

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

3.2015-2016年幸福指数上升最快和下降最快的国家

#3.2015-2016年幸福指数上升最快和下降最快的国家
columns=['Country','Region','Happiness Rank','Happiness Score','Economy (GDP per Capita)','Family',\
             'Health (Life Expectancy)','Freedom','Trust (Government Corruption)','Generosity']
data_2015=pd.read_csv('../data/2015.csv')[columns]
data_2016=pd.read_csv('../data/2016.csv')[columns]
#将2015年与2016年合并,相同列名会变成column_x和column_y
data=pd.merge(data_2015,data_2016,how='left',on='Country')
#将2年的排名差放在Happiness Rank_x
data['Happiness Rank_x']=data['Happiness Rank_y']-data['Happiness Rank_x']
#找到差最大和最小的行
data1=data[data['Happiness Rank_x']==max(data['Happiness Rank_x'])]
data2=data[data['Happiness Rank_x']==min(data['Happiness Rank_x'])]  
#输出国家、排名差
print("2015-2016年上升最快的是:\n{}\n上升了{}名".format(data1['Country'],max(data['Happiness Rank_x'])))
print("2015-2016年下降最快的是:\n{}\n下降了{}名".format(data2['Country'],min(data['Happiness Rank_x'])))

#可视化:2015-2016年所有国家排名差数据
name='Happiness Rank_x'
plt.figure(figsize=(40,15))
plt.xlabel('Country',fontsize=50)
plt.ylabel(name,fontsize=50)
plt.xticks(range(data.shape[0]),data.Country,fontsize=20,rotation='vertical')
plt.yticks(fontsize=40)
plt.bar(range(data.shape[0]),data[name],width=0.5,color='red')
plt.title('2015-2016年幸福指数排名差图(以2015年索引为准)',color='green',fontsize=50)
plt.show()
#可视化:2015-2016年所有区域排名差
columns3=['Country','Region_x','Happiness Rank_x']
data2= data[columns3]
areas=set(data2['Region_x'])
for area in areas:
    plt.figure(figsize=(20,8))
    data3=data2[data2['Region_x'] == area]
    plt.bar(data3['Country'],data3['Happiness Rank_x'])
    plt.xticks(fontsize=15,rotation='vertical')
    plt.yticks(fontsize=15)
    plt.ylabel("Happiness Rank_x",fontsize=20)
    plt.xlabel("Country",fontsize=20)
    plt.title('2015-2016年{}的国家幸福指数排名差图'.format(area),color='red',fontsize=20)
    plt.show()

#2016-2017幸福指数上升最快和下降最快的国家
columns2=['Country','Happiness.Rank','Happiness.Score','Economy..GDP.per.Capita.','Family',\
             'Health..Life.Expectancy.','Freedom','Trust..Government.Corruption.','Generosity']
data_2017=pd.read_csv('../data/2017.csv')[columns2]
#将2016年与2017年合并,相同列名会变成column_x和column_y
data=pd.merge(data_2016,data_2017,how='left',on='Country')
#将2年的排名差放在Happiness Rank
data['Happiness Rank']=data['Happiness.Rank']-data['Happiness Rank']
#找到差最大和最小的行
data1=data[data['Happiness Rank']==max(data['Happiness Rank'])]
data2=data[data['Happiness Rank']==min(data['Happiness Rank'])]  
#输出国家、排名差
print("\n2016-2017年上升最快的是:\n{}\n上升了{}名".format(data1['Country'],max(data['Happiness Rank'])))
print("2016-2017年下降最快的是:\n{}\n下降了{}名".format(data2['Country'],min(data['Happiness Rank'])))

#可视化:2016-2017年所有国家排名差数据
name='Happiness Rank'
plt.figure(figsize=(40,15))
plt.xlabel('Country',fontsize=50)
plt.ylabel(name,fontsize=50)
plt.xticks(range(data.shape[0]),data.Country,fontsize=20,rotation='vertical')
plt.yticks(fontsize=40)
plt.bar(range(data.shape[0]),data[name],width=0.5,color='red')
plt.title('2016-2017年幸福指数排名差图(以2016年索引为准)',color='green',fontsize=50)
plt.show()
#可视化:2016-2017年所有区域排名差
columns3=['Country','Region','Happiness Rank']
data2= data[columns3]
areas=set(data2['Region'])
for area in areas:
    plt.figure(figsize=(20,8))
    data3=data2[data2['Region'] == area]
    plt.bar(data3['Country'],data3['Happiness Rank'])
    plt.xticks(fontsize=15,rotation='vertical')
    plt.yticks(fontsize=15)
    plt.ylabel("Happiness Rank",fontsize=20)
    plt.xlabel("Country",fontsize=20)
    plt.title('2016-2017年{}的国家幸福指数排名差图'.format(area),color='red',fontsize=20)
    plt.show()

在这里插入图片描述
最后的图太多了,就不复制了

4.中国3年的幸福指数变化

#4.中国3年的幸福指数变化
def China_Happiness():
    columns=['Country','Region','Happiness Score','Economy (GDP per Capita)','Family',\
             'Health (Life Expectancy)','Freedom','Trust (Government Corruption)','Generosity']
    columns2=['Country','Happiness.Score','Economy..GDP.per.Capita.','Family',\
             'Health..Life.Expectancy.','Freedom','Trust..Government.Corruption.','Generosity']
    data_2015=pd.read_csv("../data/2015.csv")[columns]
    data_2016=pd.read_csv("../data/2016.csv")[columns]
    data_2017=pd.read_csv("../data/2017.csv")[columns2]
    data_2015=data_2015[data_2015['Country']=='China']
    data_2016=data_2016[data_2016['Country']=='China']
    data_2017=data_2017[data_2017['Country']=='China']
    #将Happiness.Score改为Happiness Score,方便之后的数据堆叠
    data_2017=data_2017.rename(columns={'Happiness.Score':'Happiness Score'})
    
    columns=[ 'Country','Happiness Score' ]
    data_2015=data_2015[columns]
    data_2016=data_2016[columns]
    data_2017=data_2017[columns]
    #将3年China的数据堆叠
    data=pd.concat([data_2015,data_2016,data_2017])
    print("2015-2017年China的幸福指数:\n",data)
    plt.figure(figsize=(10,7))
    plt.xlabel('Happiness Score',fontsize=20)
    plt.ylabel('China',fontsize=20)
    plt.ylim((4.5,5.5))
    plt.xticks(range(data.shape[0]),['2015','2016','2017'],fontsize=15)
    plt.yticks(fontsize=15)
    plt.bar(range(data.shape[0]),data['Happiness Score'],width=0.3,color='red')
    plt.title('2015-2017年China幸福指数变化图',fontsize=20,color='green')
    plt.show()
    

China_Happiness()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值