溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python如何實(shí)現(xiàn)分布分析

發(fā)布時(shí)間:2021-11-25 14:50:40 來源:億速云 閱讀:142 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要介紹了Python如何實(shí)現(xiàn)分布分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

前言

分布分析法,一般是根據(jù)分析目的,將數(shù)據(jù)進(jìn)行分組,研究各組別分布規(guī)律的一種分析方法。數(shù)據(jù)分組方式有兩種:等距或不等距分組。

分布分析在實(shí)際的數(shù)據(jù)分析實(shí)踐中應(yīng)用非常廣泛,常見的有用戶性別分布,用戶年齡分布,用戶消費(fèi)分布等等。

分布分析

1.導(dǎo)入相關(guān)庫包

import pandas as pd
import matplotlib.pyplot as plt
import math

2.數(shù)據(jù)處理

>>> 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

由于接下來我們需要做年齡分布分析,但是從源數(shù)據(jù)info()方法可知,并無年齡字段,需要自己生成。

# 查看年齡區(qū)間,進(jìn)行分區(qū)
>>> 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如何實(shí)現(xiàn)分布分析

3.計(jì)算年齡

由于數(shù)據(jù)來源于線下,并未進(jìn)行數(shù)據(jù)有效性驗(yàn)證,在進(jìn)行年齡計(jì)算前,先針對數(shù)據(jù)進(jìn)行識(shí)別,驗(yàn)證。

# 提取出生日期:月和日
>>> df[['month','day']] = df['DateofBirth'].str.split('-',expand=True).loc[:,1:2]

# 提取小月,查看是否有31號(hào)
>>> df_small_month = df[df['month'].isin(['02','04','06','09','11'])]

# 無效數(shù)據(jù),如圖所示
>>> df_small_month[df_small_month['day']=='31']

# 統(tǒng)統(tǒng)刪除,均為無效數(shù)據(jù)
>>> df.drop(df_small_month[df_small_month['day']=='31'].index,inplace=True)

# 同理,校驗(yàn)2月
>>> df_2 = df[df['month']=='02']

# 2月份的校驗(yàn)大家可以做的仔細(xì)點(diǎn)兒,先判斷是否潤年再進(jìn)行刪減
>>> df_2[df_2['day'].isin(['29','30','31'])]

# 統(tǒng)統(tǒng)刪除
>>> df.drop(df_2[df_2['day'].isin(['29','30','31'])].index,inplace=True)

Python數(shù)據(jù)分析實(shí)戰(zhàn)之分布分析

# 計(jì)算年齡
# 方法一
>>> 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.年齡分布

# 查看年齡區(qū)間,進(jìn)行分區(qū)
>>> 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)

由于該數(shù)據(jù)記錄的是用戶登錄信息,所以必定有重復(fù)數(shù)據(jù)。而Python如此強(qiáng)大,一個(gè)nunique()方法就可以進(jìn)行去重統(tǒng)計(jì)了。

# 查看是否有重復(fù)值
>>> df.duplicated('UserId').sum()    #47681

# 數(shù)據(jù)總條目
>>> df.count()    #980954

Python如何實(shí)現(xiàn)分布分析

分組后用count()方法雖然也能夠計(jì)算分布情況,但是僅限于無重復(fù)數(shù)據(jù)的情況。而Python這么無敵,提供了nunique()方法可用于計(jì)算含重復(fù)值的情況

>> df.groupby('年齡分層')['UserId'].count()
年齡分層
18歲及以下      25262
19歲到25歲    254502
26歲到30歲    181751
31歲到35歲    181417
36歲到40歲    181589
41歲及以上     156433
Name: UserId, dtype: int64

# 通過求和,可知重復(fù)數(shù)據(jù)也被計(jì)算進(jìn)去
>>> 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(重復(fù))

# 計(jì)算年齡分布
>>> result = df.groupby('年齡分層')['UserId'].nunique()/df.groupby('年齡分層')['UserId'].nunique().sum()
>>> result

# 結(jié)果
年齡分層
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

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Python如何實(shí)現(xiàn)分布分析”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI