01 前言
今天是学长带你手把手做数据分析的第一个案例,2018年的北京积分落户数据分析,通过分析在北京通过积分落户方式的落户者的数据,为指导落户申请提供决策依据。
案例的数据和编程实现并不复杂,作为第一个案例的重点是教会大家基本的数据分析思路,这个思路也是绝大多数数据分析任务所运用的思路,可以叫做“维度指标”分析。
第一步:确定分析维度和用来描述维度属性的指标
第二步:针对指标的数据类型,如果是
离散型的数据
,对指标
group by分类
后过滤分析特征,如果是
连续型的数据
,将数据切成几段
分析
。
当然,数据分析分析维度和指标的确立是建立在对业务的理解之上,首先需要对业务进行全面的了解,之后再做分析。
知识卡片
离散型数据:其数值只能用自然数或整数单位计算的数据,如:买了几件衣服,对面坐了几个人
连续型数据:一定区间内可以任意取值、数值是连续不断的、如:人的身高,体重,取值都是在一个区间内
02 数据源观察
首先,使用excel打开csv文件,发现有以下几个字段(列名):
id,name姓名,birthday生日,company公司名,score分数。
接下来,使用Python读取文件,对每个字段的内容进行描述分析。演示采用的编辑器是Jupyter Notebook.
importnumpyasnp
importpandasaspd
importmatplotlib.pyplotasplt
# 读取文件
luohu_data=pd.read_csv('./2018bj.csv',index_col='id')
# describe()展示一些基本信息
luohu_data.describe()
# 只有数值型的数据会被列出,score这一列的描述列出
# 均值95.65,最小值90.75,最大值122.6,标准差4.35
03维度分析-公司列
分析维度
# 分析时,以某个字段,或多个字段组合作为维度
# 姓名列没有数据参考价值,生日列可以转化成年龄
# 公司列,可以统计有多少人来自同一公司,得出落户较多人数的公司的名称和特点
# 首先选择公司列,作为维度进行分析,以公司分组,以每个公司的人数作为指标
luohu_data.groupby('company',as_index=False).count()
3430 rows × 4 columns
# 接下来需要根据人数排序,只需要company和name列(代表人数)分析
company_data=luohu_data.groupby('company',as_index=False).count()[['company','name']]
company_data
# 重命名 name列名称
company_data.rename(columns={'name':'people_count'},inplace=True)
# 按照某一列排序
company_sorted_data=company_data.sort_values('people_count',ascending=False)
company_sorted_data
# 我们对公司这个维度进行分析,指标是人数,用人数的分布来描述公司这一维度的一些特点和属性
# 按条件过滤,得到想要的特征信息
# 只有一人的公司
one_company=company_sorted_data[company_sorted_data['people_count'] ==1]
one_company
one_company.count()
company 2626
people_count 2626
dtype: int64
# 人数前50的公司
company_top50=company_sorted_data.head(50)
company_top50
# 添加一列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
# 通过阅读Top50落户数的所在的公司,大部分是国企、银行金融和信息技术公司。
04 维度分析-积分列
# 落户积分分数分布
# 对分数进行观察,可以将分数分成几个段位,观察每个段位里面的人数
# 按照步长5,分桶(分段),统计下分数的分布
bins=np.arange(90,125,5) # 创建bins桶,在观察数据中,分数列描述统计分析的最小值是90.75,最大是122.6,区间设在90-125
bins=pd.cut(luohu_data['score'],bins)# 将分数放进bins中
bins
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]]
# 每个bin的数量
bin_counts=luohu_data['score'].groupby(bins).count()
bin_counts
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
# 处理index 画出分布
bin_counts.index= [str(x.left)+'~'+str(x.right)forxinbin_counts.index]
bin_counts.plot(kind='bar',alpha=1,rot=)
plt.show()
# 分析结果得出,大部分申请的人积分在90-105,积分在90-95的落户人最多
# 大部分申请人都是在积分达到90的时候去申请;在下一年,如果申请人变多,名额数不变,想提高申请成功率,在95分以上申请落户更具竞争力。
04 维度分析-出生日期列
年龄分布
# 数据中只有出生年月,需要转为年龄
# 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()
# 同样的步骤,对年龄这种数值型的数据,由于是一个区间内连续型数据,进行cut分桶(段)
bins=np.arange(30,65,5)
bins=pd.cut(luohu_data['age'],bins)
bin_counts=luohu_data['age'].groupby(bins).count()
bin_counts
age
(30, 35] 35
(35, 40] 1449
(40, 45] 3637
(45, 50] 878
(50, 55] 16
(55, 60] 3
Name: age, dtype: int64
# 处理index 画出分布
bin_counts.index=[str(x.left)+'~'+str(x.right) forxinbin_counts.index]
bin_counts.plot(kind='bar',alpha=0.8,rot=)
plt.show()
# 可以得出落户的人的年龄大部分在35-50,40-45最多,在35之前落户的人少,因为积分不够;在35-45岁之间,落户更普遍。
# 注:为丰富图形的展示,也可以使用饼图画图,或设置条形的颜色和背景等
05 写在最后
今天的案例你掌握了数据分析的思维和方法了吗?这个案例的内容虽然不复杂,但是是一个很好地入门学习。维度和指标的确定,需要根据业务相结合,你能从数据中读出什么含义非常重要。无论使用Excel,SQL还是Python,它们都是工具,都可以实现数据分析的目的,但使用Python的优势在于数据转换和清洗,丰富的包可以拓展实现更多的功能,当业务中出现更多的数据可以结合更多的维度和指标进行分析,此外还可以建模,进行数据挖掘和预测分析。
总结:分析思路,根据业务确定维度和指标,根据指标数据类型判断采用分类并进行条件过滤或是分段分析。
学习后,别忘了在下方留言打卡~
在看和转发
都是一种支持
领取专属 10元无门槛券
私享最新 技术干货