分布分析在实际的数据分析实践中应用非常广泛,常见的有用户性别分布,用户年龄分布,用户消费分布等等。
本文将进行如下知识点讲解:
1.数据类型的修改
2.新字段生成方法
3.数据有效性校验
4.性别与年龄分布
分布分析
1.导入相关库包
import pandas as pd
import matplotlib.pyplot as plt
import math
2.数据处理
>>>df = pd.read_csv('UserInfo.csv')
>>>df.info()
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()方法可用于计算含重复值的情况
如果有对list里的元素按照某个字段进行分组的需求的话,可以通过itertools模块中的groupby实现。
举例,list中包含3个元素,希望通过country字段进行分组,再按组操作,通过itemgetter可以取dict中key。
效果:
也可以通过lambda取dict中的字段。
除此之外,还可以实现自定义分组
效果:
1、分组grouped = df['需要计算的列名'].groupby(df['需要分组的列名']).sum() --求和或者其他函数
小tips:数值区间筛选查询数量
小于10:
df[(df.列名<10)].count()
大于等于10,小于20:
df[(df.列名>=10)&(df.列名<20)].count() --重点:中间连接用 &
2、排序
df.sort_values(by='要排序的列',axis=0,ascending=False)
axis=0 按照列排序, =1 按照行排序
ascending=False 降序 , =True 升序