这篇文章主要介绍了Python如何实现分布分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
前言
分布分析法,一般是根据分析目的,将数据进行分组,研究各组别分布规律的一种分析方法。数据分组方式有两种:等距或不等距分组。
分布分析在实际的数据分析实践中应用非常广泛,常见的有用户性别分布,用户年龄分布,用户消费分布等等。
分布分析
1.导入相关库包
import pandas as pd import matplotlib.pyplot as plt import math
2.数据处理
>>> df = pd.read_csv('UserInfo.csv') >>> df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 1000000 entries, 0 to 999999 Data columns (total 4 columns): UserId 1000000 non-null int64 CardId 1000000 non-null int64 LoginTime 1000000 non-null object DeviceType 1000000 non-null object dtypes: int64(2), object(2) memory usage: 30.5+ MB
由于接下来我们需要做年龄分布分析,但是从源数据info()方法可知,并无年龄字段,需要自己生成。
# 查看年龄区间,进行分区 >>> 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)
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岁及以下 25262 19岁到25岁 254502 26岁到30岁 181751 31岁到35岁 181417 36岁到40岁 181589 41岁及以上 156433 Name: UserId, dtype: int64 # 通过求和,可知重复数据也被计算进去 >>> df.groupby('年龄分层')['UserId'].count().sum() # 980954 >>> df.groupby('年龄分层')['UserId'].nunique() 年龄分层 18岁及以下 24014 19岁到25岁 242199 26岁到30岁 172832 31岁到35岁 172608 36岁到40岁 172804 41岁及以上 148816 Name: UserId, dtype: int64 >>> df.groupby('年龄分层')['UserId'].nunique().sum() # 933273 = 980954(总)-47681(重复) # 计算年龄分布 >>> result = df.groupby('年龄分层')['UserId'].nunique()/df.groupby('年龄分层')['UserId'].nunique().sum() >>> result # 结果 年龄分层 18岁及以下 0.025731 19岁到25岁 0.259516 26岁到30岁 0.185189 31岁到35岁 0.184949 36岁到40岁 0.185159 41岁及以上 0.159456 Name: UserId, dtype: float64 # 格式化一下 >>> result = round(result,4)*100 >>> result.map("{:.2f}%".format) 年龄分层 18岁及以下 2.57% 19岁到25岁 25.95% 26岁到30岁 18.52% 31岁到35岁 18.49% 36岁到40岁 18.52% 41岁及以上 15.95% Name: UserId, dtype: object
感谢你能够认真阅读完这篇文章,希望小编分享的“Python如何实现分布分析”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。