前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Day01| 第四期-北京积分落户数据分析

Day01| 第四期-北京积分落户数据分析

作者头像
DataScience
发布2020-07-07 10:54:36
6110
发布2020-07-07 10:54:36
举报
文章被收录于专栏:A2DataA2Data

01 前言

今天是学长带你手把手做数据分析的第一个案例,2018年的北京积分落户数据分析,通过分析在北京通过积分落户方式的落户者的数据,为指导落户申请提供决策依据。

案例的数据和编程实现并不复杂,作为第一个案例的重点是教会大家基本的数据分析思路,这个思路也是绝大多数数据分析任务所运用的思路,可以叫做“维度指标”分析。

第一步:确定分析维度和用来描述维度属性的指标

第二步:针对指标的数据类型,如果是离散型的数据,对指标group by分类后过滤分析特征,如果是连续型的数据,将数据切成几段分析。

当然,数据分析分析维度和指标的确立是建立在对业务的理解之上,首先需要对业务进行全面的了解,之后再做分析。

知识卡片

离散型数据:其数值只能用自然数或整数单位计算的数据,如:买了几件衣服,对面坐了几个人

连续型数据:一定区间内可以任意取值、数值是连续不断的、如:人的身高,体重,取值都是在一个区间内

公众号回复“ DT15” 获取数据 “2018bj.csv” ;数据使用爬虫获取,整理过,无需进行清洗。

02 数据源观察

首先,使用excel打开csv文件,发现有以下几个字段(列名):

id,name姓名,birthday生日,company公司名,score分数。

接下来,使用Python读取文件,对每个字段的内容进行描述分析。演示采用的编辑器是Jupyter Notebook.

代码语言:javascript
复制
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
代码语言:javascript
复制
# 读取文件
luohu_data = pd.read_csv('./2018bj.csv', index_col='id')
代码语言:javascript
复制
# describe()展示一些基本信息
luohu_data.describe()
# 只有数值型的数据会被列出,score这一列的描述列出
# 均值95.65,最小值90.75,最大值122.6,标准差4.35

03 维度分析-公司列

代码语言:javascript
复制
分析维度
# 分析时,以某个字段,或多个字段组合作为维度
# 姓名列没有数据参考价值,生日列可以转化成年龄
# 公司列,可以统计有多少人来自同一公司,得出落户较多人数的公司的名称和特点
代码语言:javascript
复制
# 首先选择公司列,作为维度进行分析,以公司分组,以每个公司的人数作为指标
luohu_data.groupby('company', as_index=False).count()

3430 rows × 4 columns

代码语言:javascript
复制
# 接下来需要根据人数排序,只需要company和name列(代表人数)分析
company_data = luohu_data.groupby('company', as_index=False).count()[['company','name']]
company_data
代码语言:javascript
复制
# 重命名 name列名称
company_data.rename(columns={'name':'people_count'}, inplace=True)
# 按照某一列排序
company_sorted_data = company_data.sort_values('people_count', ascending=False)
company_sorted_data
# 我们对公司这个维度进行分析,指标是人数,用人数的分布来描述公司这一维度的一些特点和属性
代码语言:javascript
复制
# 按条件过滤,得到想要的特征信息
# 只有一人的公司
one_company = company_sorted_data[company_sorted_data['people_count'] == 1]
one_company
one_company.count()
代码语言:javascript
复制
company         2626
people_count    2626
dtype: int64
代码语言:javascript
复制
# 人数前50的公司
company_top50 = company_sorted_data.head(50)
company_top50
代码语言:javascript
复制
# 添加一列rank列 并显示标号
company_top50['people_num_rank'] = company_top50['people_count'].rank(ascending=False,method='first')
company_top50['people_num_rank'] = company_top50['people_num_rank'].astype(int) #float转int
company_top50_rank = company_top50.set_index(['people_num_rank'],drop=True) # 重设index
company_top50_rank
代码语言:javascript
复制
# 通过阅读Top50落户数的所在的公司,大部分是国企、银行金融和信息技术公司。

04 维度分析-积分列

代码语言:javascript
复制
# 落户积分分数分布
# 对分数进行观察,可以将分数分成几个段位,观察每个段位里面的人数
代码语言:javascript
复制
# 按照步长5,分桶(分段),统计下分数的分布
bins = np.arange(90,125,5)  # 创建bins桶,在观察数据中,分数列描述统计分析的最小值是90.75,最大是122.6,区间设在90-125
bins = pd.cut(luohu_data['score'],bins) # 将分数放进bins中
bins
代码语言:javascript
复制
id
1       (120, 125]
2       (120, 125]
3       (115, 120]
4       (115, 120]
5       (115, 120]
6       (115, 120]
7       (115, 120]
8       (115, 120]
9       (115, 120]
10      (115, 120]
11      (115, 120]
12      (115, 120]
13      (115, 120]
14      (115, 120]
15      (115, 120]
16      (110, 115]
17      (110, 115]
18      (110, 115]
19      (110, 115]
20      (110, 115]
21      (110, 115]
22      (110, 115]
23      (110, 115]
24      (110, 115]
25      (110, 115]
26      (110, 115]
27      (110, 115]
28      (110, 115]
29      (110, 115]
30      (110, 115]
           ...    
5990      (90, 95]
5991      (90, 95]
5992      (90, 95]
5993      (90, 95]
5994      (90, 95]
5995      (90, 95]
5996      (90, 95]
5997      (90, 95]
5998      (90, 95]
5999      (90, 95]
6000      (90, 95]
6001      (90, 95]
6002      (90, 95]
6003      (90, 95]
6004      (90, 95]
6005      (90, 95]
6006      (90, 95]
6007      (90, 95]
6008      (90, 95]
6009      (90, 95]
6010      (90, 95]
6011      (90, 95]
6012      (90, 95]
6013      (90, 95]
6014      (90, 95]
6015      (90, 95]
6016      (90, 95]
6017      (90, 95]
6018      (90, 95]
6019      (90, 95]
Name: score, Length: 6019, dtype: category
Categories (7, interval[int64]): [(90, 95] < (95, 100] < (100, 105] < (105, 110] < (110, 115] < (115, 120] < (120, 125]]
代码语言:javascript
复制
# 每个bin的数量
bin_counts = luohu_data['score'].groupby(bins).count()
bin_counts
代码语言:javascript
复制
score
(90, 95]      3344
(95, 100]     1757
(100, 105]     653
(105, 110]     218
(110, 115]      32
(115, 120]      13
(120, 125]       2
Name: score, dtype: int64
代码语言:javascript
复制
# 处理index 画出分布
bin_counts.index = [ str(x.left) + '~' + str(x.right) for x in bin_counts.index ]
bin_counts.plot(kind='bar', alpha=1, rot=0)
plt.show()
# 分析结果得出,大部分申请的人积分在90-105,积分在90-95的落户人最多
# 大部分申请人都是在积分达到90的时候去申请;在下一年,如果申请人变多,名额数不变,想提高申请成功率,在95分以上申请落户更具竞争力。

04 维度分析-出生日期列

代码语言:javascript
复制
 年龄分布
# 数据中只有出生年月,需要转为年龄
# pandas转换日期 得到天数 再除以365得到年龄
# 计算年龄的算式中采用的天数是pandas对象,以day为单位,所以365需要使用Timedelta函数转换成相应的pandas对象
luohu_data['age'] = ((pd.to_datetime('2018-07') - pd.to_datetime(luohu_data['birthday'])) / pd.Timedelta('365 days'))
luohu_data.describe()
代码语言:javascript
复制
# 同样的步骤,对年龄这种数值型的数据,由于是一个区间内连续型数据,进行cut分桶(段)
bins = np.arange(30,65,5)
bins = pd.cut(luohu_data['age'],bins)
bin_counts = luohu_data['age'].groupby(bins).count()
bin_counts
代码语言:javascript
复制
age
(30, 35]      35
(35, 40]    1449
(40, 45]    3637
(45, 50]     878
(50, 55]      16
(55, 60]       3
Name: age, dtype: int64
代码语言:javascript
复制
# 处理index 画出分布
bin_counts.index =[str(x.left)+'~'+str(x.right)  for x in bin_counts.index]
bin_counts.plot(kind='bar',alpha = 0.8, rot=0)
plt.show()
# 可以得出落户的人的年龄大部分在35-50,40-45最多,在35之前落户的人少,因为积分不够;在35-45岁之间,落户更普遍。
# 注:为丰富图形的展示,也可以使用饼图画图,或设置条形的颜色和背景等

05 写在最后

今天的案例你掌握了数据分析的思维和方法了吗?这个案例的内容虽然不复杂,但是是一个很好地入门学习。维度和指标的确定,需要根据业务相结合,你能从数据中读出什么含义非常重要。无论使用Excel,SQL还是Python,它们都是工具,都可以实现数据分析的目的,但使用Python的优势在于数据转换和清洗,丰富的包可以拓展实现更多的功能,当业务中出现更多的数据可以结合更多的维度和指标进行分析,此外还可以建模,进行数据挖掘和预测分析。

总结:分析思路,根据业务确定维度和指标,根据指标数据类型判断采用分类并进行条件过滤或是分段分析。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataScience 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档