用 Python 画如此漂亮的插图 ,So easy!

本文介绍了如何使用Python(seaborn和matplotlib)绘制全球预期寿命与人均GDP的散点图,涉及数据清洗、处理、统计分析和可视化,以及使用KNN算法和ElasticNet进行回归预测。
摘要由CSDN通过智能技术生成

今天我们进行一次实战案例分享,以全球预期寿命与人均 GPD数据为例,写一篇 Python 中漂亮散点图的快速指南。除了正常的数据清洗/处理、还会进行简单的统计分析,实现数据处理-统计分析-可视化一条龙。

你会发现,用 Python 画如此漂亮的专业插图 ,So easy!

数据处理

所用数据:全球预期寿命与人均 GPD数据(已校正通货膨胀和跨国价格差异)

数据来源:https://ourworldindata.org/

本文所用数据和代码已打包,获取方式见文末。

导入数据:

import pandas as pd  
  
expectancy_data = pd.read_csv("life-expectancy-vs-gdp-per-capita.csv")  
  
# 为方便起见,重命名列  
expectancy_data.rename(columns={"Entity":"Country",   
                                "Life expectancy at birth (historical)": "Expectancy",  
                                "GDP per capita": "GDP",   
                                "Population (historical estimates)": "Population"}, inplace=True)  
expectancy_data  

输出:

该数据表中的最新数据是2021年,但由于“均国内生产总值”这列数据只有到2018年的,所以我们本文便以2018年的数据为基础进行分析和可视化。同时,由于我们无法对缺失值进行分析,注意删除缺失值。

GDP_data = expectancy_data[~expectancy_data["GDP"].isna()]  
GDP_data = GDP_data[GDP_data["Year"] == 2018]  
GDP_data = GDP_data[GDP_data["Country"] != "World"]  
GDP_data  

输出:

这样我们便完成了最基本的数据处理工作。

可视化

今天的可视化还会用到seaborn,它是一个调用 matplotlib 的统计绘图库

(https://github.com/mwaskom/seaborn)

导入所需Python库:

import numpy as np   
import seaborn as sns  
import matplotlib.pyplot as plt   
from matplotlib.lines import Line2D  
import matplotlib.patches as mpatches  
  
sns.set_style('darkgrid', {'font.sans-serif': ['simhei','FangSong']})  

注意,上述代码最后一行是为了解决中文乱码。

接下来我们便可以使用Matplotlib+seaborn制作漂亮的散点图,其中重要的一步是我们将Population列缩放一百万倍并乘以 2,这可以在绘制散点图时控制点的大小,人口越多,点越大。此外,我们还可以注释人口密度高的点,我们可以使用该plt.annotate()方法来完成。

df_new = pd.DataFrame(imputted_data, columns=["Expectancy", "GDP", "Population"])  
df_new["Country"] = GDP_data.Country.tolist()  
df_new = df_new[["Country", "Expectancy", "GDP", "Population"]]  
for col in df_new.columns:   
    if col != "Country":   
        df_new[col] = df_new[col].apply(lambda x: round(x, 3))  
df_country = df_new.groupby("Country").mean().reset_index()  
df_country = df_country[["Country", "Expectancy", "GDP", "Population"]]  
country = df_country["Country"]  
GDP = df_country["GDP"]  
life_exp = df_country["Expectancy"]  
factor = 1000000  
population = (df_country["Population"]/factor)*2  
plt.figure(figsize=(15, 8))   
plt.scatter(GDP, life_exp, s = population, alpha=0.9)  
df_high_pop = df_country[df_country["Population"] >= 100000000]  
for row in df_high_pop.to_dict(orient="records"):   
    plt.annotate(row["Country"], (row["GDP"], row["Expectancy"]+0.3), fontsize=10)  
plt.xscale('log')   
plt.xlabel('人均国内生产总值(美元)(对数尺度)')   
plt.ylabel('预期寿命[以年计]')   
plt.title('全球GDP与预期寿命(2018)',fontweight="bold")  
plt.show() 

输出结果:

接下来还可以继续优化我们的散点图。比如在我们的数据中对每个国家/地区的人口密度点进行颜色编码,然后根据人数分配不同的颜色;

此外,我们还可以使用plt.legend()增加图例,如下图所示。

回归

进一步优化:基于KNN算法的新方法使得我们现在可以更便捷地处理缺失值,并且与直接用均值、中位数相比更为可靠。利用“近朱者赤”的KNN算法原理,这种插补方法借助其他特征的分布来对目标特征进行缺失值填充。

# sklearn   
from sklearn.impute import KNNImputer   
from sklearn.linear_model import ElasticNetCV  
  
imputer = KNNImputer(n_neighbors=3)   
imputted_data = imputer.fit_transform(df[["Expectancy", "GDP", "Population"]]) 

我们另外还想在散点图上画一条非常漂亮的线,用于帮助我们提供一种快速评估各个国家相对于总体趋势的状况的方法。我们可以使用Scikit-learn中的ElasticNet,它是一个使用 L1 和 L2 正则化训练的线性回归模型。它是 LASSO 和岭回归技术的混合体,因此它也非常适合显示严重多重共线性(特征彼此高度相关)的模型。

部分代码(完整下载见文末):

if regression:   
    reg = ElasticNetCV(cv=5, random_state=0)  
    X, y = np.array(GDP).reshape(-1, 1), life_exp  
    reg.fit(X,y)   
    y_pred = reg.predict(X)   
    reg_data = pd.DataFrame(X, columns=["X"])   
    reg_data["y_pred"] = y_pred   
    reg_data = reg_data.sort_values(by="X").reset_index().drop("index", axis=1)  
    reg_data = reg_data[reg_data["y_pred"] <= 90]  

使用训练好的模型,绘制一条拟合曲线:

人生苦短,快学Python!

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

点击免费领取《CSDN大礼包》:Python入门到进阶资料 & 实战源码 & 兼职接单方法 安全链接免费领取

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值