其他分享
首页 > 其他分享> > 数据分析-美国小孩英文名分析-可视化(含代码)

数据分析-美国小孩英文名分析-可视化(含代码)

作者:互联网

数据分析-美国小孩英文名分析


数据抓取

数据集的获取是我们进行数据分析的第一步。现在获取数据的主要途径一般为:现成数据;自己写爬虫去爬取数据;使用现有的爬虫工具爬取所需内容,保存到数据库,或以文件的形式保存到本地。
博主用的是现有的数据进行数据分析。
如果是想通过自己写爬虫来爬取数据,那么整体思路大致分为:确定爬取的内容、对主页面解析、子页面的获取、子页面的解析、数据的保存。现在的网站或多或少都有一些基本的反爬措施,那么,我们在写爬虫时就应针对该网站制定相应的反反爬策略,如请求头、IP代理、cookie限制、验证码限制等。这些常见的反爬机制要能够应用在你写的爬虫当中。
如果爬虫大致能够爬取我们所需的内容,下一步,我认为就是提高爬取速度,增加稳定性了。我们知道当request模块对页面发起请求时,整个程序是处于阻塞状态,在请求的这段时间后面的代码是无法运行的,所以说当我们需要对很多个页面发起请求时,我们可以通过使用异步协程的方式,使我们能够利用阻塞的这段时间去执行其他任务。由于requests模块是不支持异步协程的,我们需要使用aiohttp模块来对页面发起请求,再搭配asyncio来实现异步爬虫。
提高稳定性,就需要一些稳定的ip代理,防止爬虫运行期间ip被封,推荐自己爬取一些免费的ip代理的网站,通过代码测试一下,将能用的保存到数据库中,使用时直接通过类来使用即可。如果你对爬虫中的ip代理的使用还是很了解,不妨看下这篇文章(异步爬虫)requests和aiohttp中代理IP的使用。
数据爬取过程可以看博主之前的博客,里面有简单的爬虫,在这里就不介绍了。


数据导入

一、pandas是什么?

pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

二、使用步骤

1.引入库

代码如下(示例)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv('res.csv')
print(data.head())

该处使用的是现有的数据,也可以为自己爬取的数据。


数据分析

把所有州的姓名合在一起,查看所有州一起英文名使用情况,查看使用最高的前一百个名字:
代码如下(示例)

d=data.sort_values(by=['number'],ascending=False)
d #把所有州的所有名字按使用数量进行降序排序

dt=d.iloc[0:100]#前100行
dt#查看1910~2019使用的top100

结果如下:
按降序排序:
在这里插入图片描述

top100:
在这里插入图片描述

对每个姓名的使用长度的情况分析:

df=data.groupby('name').describe().reset_index(drop=None)
df

 

在这里插入图片描述

  1. 统计不同年份、不同性别分组下,各名字出现次数所占分组人数比例:
    这里我们先自定义了一个函数dd_pct,然后使用了groupby按年份、性别分组,最后分别对每个分组调用我们的自定义函数add_pct
#先自定义函数,统计分组中各名字占比
def add_pct(group):
    group["pct"]=group.frequency/group.frequency.sum()*100
    return group

baby_names=baby_names.groupby(["year","gender"]).apply(add_pct)
baby_names.head()

输出结果如下,可以看到,数据表中增加了一列pct,代表各名字出现次数在分组中的比例:
在这里插入图片描述

  1. 排名:给出不同年份、不同性别分组下,各名字在分组中出现频率的排名
    现将数据按年份、性别分组,然后对分组数据的number列调用rank()方法降序得到排名,并将排名赋到新增的“ranked”列
baby_names["ranked"]=baby_names.groupby(["year","gender"])["frequency"].rank(ascending=False)
baby_names.head()

 

结果如下:
在这里插入图片描述

数据分析及可视化

可视化:每年最流行的男孩女孩名字的使用次数所占当年出生男孩女孩总数的比例
首先使用布尔型索引将数据分为男孩数据、女孩数据(注意,这时的数据中已经有ranked排名这一列了),对于男孩数据,选出每年出现频率最高的名字(ranked==1),然后按照x-y=year-pct作图,女孩数据同理。

#布尔索引选取数据中的男孩女孩
dfm=baby_names[baby_names.gender=="M"]
dff=baby_names[baby_names.gender=="F"]

#每年最流行的男孩名字
rank1m=dfm[dfm.ranked==1]
#每年最流行的女孩名字
rank1f=dff[dff.ranked==1]


#绘制男生折线图
plt.plot(rank1m.year,rank1m.pct,color="blue",linewidth=2)

#plt.fill_between设置填充线与坐标轴之间的空间
plt.fill_between(rank1m.year,rank1m.pct,color="blue",alpha=0.2)

#设置坐标轴区间范围
plt.xlim(1880,2016)
plt.ylim(0,9)

#美化图:给图添加标题,调整字体大小等
plt.title("Popularity of 1# boys'name by year",size=18,color="blue")
plt.xlabel("Year",size=16)
plt.ylabel("% of male births",size=16)

#绘制女生折线图
plt.plot(rank1f.year,rank1f.pct,color="red",linewidth=2)

#plt.fill_between设置填充线与坐标轴之间的空间
plt.fill_between(rank1f.year,rank1f.pct,color="red",alpha=0.2)

#设置坐标轴区间范围
plt.xlim(1880,2016)
plt.ylim(0,9)

#美化图:给图添加标题,调整字体大小等
plt.title("Popularity of 1# girls'name by year",size=18,color="blue")
plt.xlabel("Year",size=16)
plt.ylabel("% of male births",size=16)

 

结果入下:
在这里插入图片描述
在这里插入图片描述
可视化:每年可选择的姓名数量趋势图

思路:按年份、性别分组,统计各分组下的姓名数量,然后根据按年份,绘制不同性别各年度可选姓名数量的趋势图
代码如下:

name_count=baby_names.groupby(["year","gender"]).size() #.size()返回一个series
#使用to_frame将series转换为dataframe
name_count=name_count.to_frame(name="name_count").reset_index()

#将数据按男女分组
name_countm=name_count[name_count.gender=="M"]
name_countf=name_count[name_count.gender=="F"]

plt.plot(name_countm.year,name_countm.name_count,color="blue",linewidth=2)
plt.fill_between(name_countm.year,name_countm.name_count,color="blue",alpha=0.2)
plt.xlim(1880,2016)
plt.ylim(0,17000)
plt.title("Number of boy's name by year",size=20,color="blue")
plt.xlabel("Year",size=18)
plt.ylabel("Number of names",size=18)


plt.plot(name_countf.year,name_countf.name_count,color="red",linewidth=2)
plt.fill_between(name_countf.year,name_countf.name_count,color="red",alpha=0.2)
plt.xlim(1880,2016)
plt.ylim(0,17000)
plt.title("Number of girl's name by year",size=20,color="blue")
plt.xlabel("Year",size=18)
plt.ylabel("Number of names",size=18)

 

结果如下:
在这里插入图片描述
在这里插入图片描述

总结

以上就是这次课程的内容,本文仅仅简单介绍了pandas和matplotlib的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

标签:数据分析,plt,name,color,英文名,可视化,names,year,size
来源: https://www.cnblogs.com/LJLHDH3/p/14243647.html