Python数据分析实战之分布分析

统计与数据分析实战

共 3328字,需浏览 7分钟

 · 2020-09-12


◆ ◆ ◆  ◆ 



前言


分布分析法,一般是根据分析目的,将数据进行分组,研究各组别分布规律的一种分析方法。数据分组方式有两种:等距或不等距分组。

分布分析在实际的数据分析实践中应用非常广泛,常见的有用户性别分布,用户年龄分布,用户消费分布等等。

本文将进行如下知识点讲解:

1.数据类型的修改
2.新字段生成方法
3.数据有效性校验
4.性别与年龄分布


分布分析


1.导入相关库包
import pandas as pdimport matplotlib.pyplot as pltimport math
2.数据处理
>>> df = pd.read_csv('UserInfo.csv')>>> df.info()RangeIndex: 1000000 entries, 0 to 999999Data columns (total 4 columns):UserId        1000000 non-null int64CardId        1000000 non-null int64LoginTime     1000000 non-null objectDeviceType    1000000 non-null objectdtypes: int64(2), object(2)memory usage: 30.5+ MB

由于接下来我们需要做年龄分布分析,但是从源数据info()方法可知,并无年龄字段,需要自己生成。

# 提取出生日期需要先把身份证号码转换成字符串>>> df['CardId'] = df['CardId'].astype('str')
# 提取出生日期,并生成新字段>>> df['DateofBirth'] = df.CardId.apply(lambda x : x[6:10]+"-"+x[10:12]+"-"+x[12:14])
# 提取性别,待观察性别分布>>> df['Gender'] = df['CardId'].map(lambda x : 'Male' if int(x[-2]) % 2 else 'Female')
>>> df.head()


3.计算年龄

由于数据来源于线下,并未进行数据有效性验证,在进行年龄计算前,先针对数据进行识别,验证。

# 提取出生日期:月和日>>> df[['month','day']] = df['DateofBirth'].str.split('-',expand=True).loc[:,1:2]
# 提取小月,查看是否有31号>>> df_small_month = df[df['month'].isin(['02','04','06','09','11'])]
# 无效数据,如图所示>>> df_small_month[df_small_month['day']=='31']
# 统统删除,均为无效数据>>> df.drop(df_small_month[df_small_month['day']=='31'].index,inplace=True)
# 同理,校验2月>>> df_2 = df[df['month']=='02']
# 2月份的校验大家可以做的仔细点儿,先判断是否润年再进行删减>>> df_2[df_2['day'].isin(['29','30','31'])]
# 统统删除>>> df.drop(df_2[df_2['day'].isin(['29','30','31'])].index,inplace=True)


# 计算年龄# 方法一>>> df['Age'] = df['DateofBirth'].apply(lambda x : math.floor((pd.datetime.now() - pd.to_datetime(x)).days/365))
# 方法二>>> df['DateofBirth'].apply(lambda x : pd.datetime.now().year - pd.to_datetime(x).year)


4.年龄分布

# 查看年龄区间,进行分区>>> df['Age'].max(),df['Age'].min()# (45, 18)
>>> bins = [0,18,25,30,35,40,100]>>> labels = ['18岁及以下','19岁到25岁','26岁到30岁','31岁到35岁','36岁到40岁','41岁及以上']
>>> df['年龄分层'] = pd.cut(df['Age'],bins, labels = labels)

由于该数据记录的是用户登录信息,所以必定有重复数据。而Python如此强大,一个nunique()方法就可以进行去重统计了。

# 查看是否有重复值>>> df.duplicated('UserId').sum()    #47681
# 数据总条目>>> df.count() #980954


分组后用count()方法虽然也能够计算分布情况,但是仅限于无重复数据的情况。而Python这么无敌,提供了nunique()方法可用于计算含重复值的情况

>>> df.groupby('年龄分层')['UserId'].count()年龄分层18岁及以下      2526219岁到2525450226岁到3018175131岁到3518141736岁到4018158941岁及以上     156433Name: UserId, dtype: int64
# 通过求和,可知重复数据也被计算进去>>> df.groupby('年龄分层')['UserId'].count().sum()# 980954
>>> df.groupby('年龄分层')['UserId'].nunique()年龄分层18岁及以下 2401419岁到2524219926岁到3017283231岁到3517260836岁到4017280441岁及以上 148816Name: UserId, dtype: int64

>>> df.groupby('年龄分层')['UserId'].nunique().sum()933273  = 980954(总)-47681(重复)
# 计算年龄分布>>> result = df.groupby('年龄分层')['UserId'].nunique()/df.groupby('年龄分层')['UserId'].nunique().sum()>>> result
# 结果年龄分层18岁及以下 0.02573119岁到250.25951626岁到300.18518931岁到350.18494936岁到400.18515941岁及以上 0.159456Name: UserId, dtype: float64

# 格式化一下>>> result = round(result,4)*100>>> result.map("{:.2f}%".format)
年龄分层18岁及以下 2.57%19岁到2525.95%26岁到3018.52%31岁到3518.49%36岁到4018.52%41岁及以上 15.95%Name: UserId, dtype: object


通过以上结果及分布图可以知道,19到25岁年龄段的用户占比最高,为26%。

好了,就讲解到这了~END!

觉得不错的,记得点在看,如果可以转发一下朋友圈就更好了!


继续送书



回复:微信 获取

记得点在看~我是严小样儿


在看”的永远18岁~
浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报