数据分析-美国小孩英文名分析
数据抓取
数据集的获取是我们进行数据分析的第一步。现在获取数据的主要途径一般为:现成数据;自己写爬虫去爬取数据;使用现有的爬虫工具爬取所需内容,保存到数据库,或以文件的形式保存到本地。
博主用的是现有的数据进行数据分析。
如果是想通过自己写爬虫来爬取数据,那么整体思路大致分为:确定爬取的内容、对主页面解析、子页面的获取、子页面的解析、数据的保存。现在的网站或多或少都有一些基本的反爬措施,那么,我们在写爬虫时就应针对该网站制定相应的反反爬策略,如请求头、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
- 统计不同年份、不同性别分组下,各名字出现次数所占分组人数比例:
这里我们先自定义了一个函数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,代表各名字出现次数在分组中的比例:
- 排名:给出不同年份、不同性别分组下,各名字在分组中出现频率的排名
现将数据按年份、性别分组,然后对分组数据的number列调用rank()方法降序得到排名,并将排名赋到新增的“ranked”列
baby_names["ranked"]=baby_names.groupby(["year","gender"])["frequency"].rank(ascending=False)
baby_names.head()
结果如下: