這篇文章主要介紹了Python如何實現(xiàn)分布分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)是一家專業(yè)提供安國企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、HTML5建站、小程序制作等業(yè)務(wù)。10年已為安國眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
前言
分布分析法,一般是根據(jù)分析目的,將數(shù)據(jù)進(jìn)行分組,研究各組別分布規(guī)律的一種分析方法。數(shù)據(jù)分組方式有兩種:等距或不等距分組。
分布分析在實際的數(shù)據(jù)分析實踐中應(yīng)用非常廣泛,常見的有用戶性別分布,用戶年齡分布,用戶消費分布等等。
分布分析
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()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)
3.計算年齡
由于數(shù)據(jù)來源于線下,并未進(jìn)行數(shù)據(jù)有效性驗證,在進(jìn)行年齡計算前,先針對數(shù)據(jù)進(jìn)行識別,驗證。
# 提取出生日期:月和日 >>> 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'])] # 無效數(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) # 同理,校驗2月 >>> df_2 = df[df['month']=='02'] # 2月份的校驗大家可以做的仔細(xì)點兒,先判斷是否潤年再進(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)
# 計算年齡 # 方法一 >>> 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如此強大,一個nunique()方法就可以進(jìn)行去重統(tǒng)計了。
# 查看是否有重復(fù)值 >>> df.duplicated('UserId').sum() #47681 # 數(shù)據(jù)總條目 >>> df.count() #980954
分組后用count()方法雖然也能夠計算分布情況,但是僅限于無重復(fù)數(shù)據(jù)的情況。而Python這么無敵,提供了nunique()方法可用于計算含重復(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ì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ù)) # 計算年齡分布 >>> 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如何實現(xiàn)分布分析”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!