【Python數據分析】用戶通話行為分析


主要工作:

1.對從網上營業廳拿到的用戶數據.xls文件,通過Python的xlrd進行解析,計算用戶的主叫被叫次數,通話時間,通話時段。

2.使用matplotlib畫圖包,將分析的結果直觀的繪制出來。

 

具體步驟:

1.分析須要的內容

excel文件中包含很多信息,我們分析的時候須要用到的包括,通話起始時間、通話時長、呼叫類型,號碼。

使用xlrd模塊,讀取excel中的數據,用列表的形式保存下來。

 1 #coding=utf-8
 2 import xlrd
 3 
 4 def readData(url):
 5     data=xlrd.open_workbook(url)
 6     table=data.sheets()[0]  #多張sheet的情況讀取第一張
 7     nrows=table.nrows
 8     ncols=table.ncols
 9     list=[]
10     for rownum in range(0,nrows):
11         row=table.row_values(rownum)
12         for i in range(0,ncols):        #轉碼unicode轉utf-8
13             row[i]=row[i].encode('utf-8')
14         if row:
15             list.append(row)
16     return list

 

2.設計用戶數據分析類

考慮分析用戶的哪些數據,做成一個什么樣的效果

 1 #coding=utf-8
 2 # 用戶通話信息類記錄
 3 class UserDataInfo(object):
 4     def __init__(self):
 5         self.calling_long = 0   #主叫時長
 6         self.called_long = 0    #被叫時長
 7         self.call_long = 0      #總時長
 8 
 9         self.calling_times = 0  #主叫次數
10         self.called_times = 0   #被叫次數
11         self.call_times = 0     #總次數
12 
13         self.time_intervel=[]   #通話時段
14         for i in range(0,12):
15             self.time_intervel.append(0)
16 
17         self.day_intervel=[]    #每日通話次數
18         for i in range(0,31):
19             self.day_intervel.append(0)
20 
21         self.call_freq= None       #通話最頻繁

 

3.對時間日期字符串解碼編碼

實用split函數對字符串分割,將x時x分x秒的格式解碼成  x秒的數據存儲下來

 1 #解碼時間
 2 def timeDecode(timeStr):
 3     hour = min = sec = 0
 4     if timeStr.find('小時') != -1:
 5         hour = timeStr.split('小時')[0]
 6         timeStr = timeStr.split('小時')[1]
 7     if timeStr.find('') != -1:
 8         min = timeStr.split('')[0]
 9         timeStr = timeStr.split('')[1]
10     if timeStr.find('') != -1:
11         sec = timeStr.split('')[0]
12 
13     timelong = int(sec) + int(min) * 60 + int(hour) * 60 * 60
14     return timelong
15 
16 #編碼時間
17 def timeEncode(time):
18     strtime=str(time%60)+""
19     time/=60
20     if(time!=0):
21         strtime=str(time%60)+""+strtime
22         time/=60
23         if (time != 0):
24             strtime = str(time % 60) + "小時"+strtime
25     return strtime
26 
27 #解碼日期
28 def dateDecode(dateStr):
29     dateStrlist=dateStr.split(' ')
30     dayStr=dateStrlist[0]
31     dayStrlist=dayStr.split('-')
32     day=dayStrlist[-1]
33 
34     timeStr=dateStrlist[-1]
35     timeStrlist=timeStr.split(':')
36     timeHour=timeStrlist[0]
37 
38     dayAndHour=[]
39     dayAndHour.append(day)
40     dayAndHour.append(timeHour)
41     return dayAndHour

 

4.用戶行為分析

對用戶的數據進行分類處理,計算出行為數據

 1 #行為分析
 2 def behavior_analysis(datalist):
 3     t=1
 4     for line in datalist:
 5         if(t==1):
 6             t=3
 7             continue
 8         dh=dateDecode(line[2])
 9         day=int(dh[0])
10         hour=int(dh[-1])
11 
12         user.day_intervel[day]+=1
13         user.time_intervel[hour/2]+=1
14 
15 
16         timeStr=line[3]
17         timelong = timeDecode(timeStr)
18 
19         if line[4]=='主叫':
20             user.calling_times+=1
21             user.calling_long+=timelong
22         if line[4]=='被叫':
23             user.called_times+=1
24             user.called_long+=timelong
25 
26 
27     user.call_times=user.calling_times+user.called_times    #總次數
28     user.call_long=user.calling_long+user.called_long       #總時長

 

5.實用matplotlib進行數據可視化

繪制折線圖,反應用戶的日常通話習慣。這里只畫了一個圖

1 #數據可視化
2 def dataVisualization(userinfo):
3     plt.plot(userinfo.day_intervel, 'k')
4     plt.plot(userinfo.day_intervel, 'bo')
5     plt.xlabel(u'日          期')
6     plt.ylabel(u'通話次數')
7     plt.title(u'每日通話分析')
8     plt.grid(color='#95a5a6', linestyle='--', linewidth=1, axis='y', alpha=0.4)
9     plt.show()

 

完整代碼:

  1 #coding=utf-8
  2 import xlrd
  3 import matplotlib.pyplot as plt
  4 import UserDataInfo
  5 
  6 def readData(url):
  7     data=xlrd.open_workbook(url)
  8     table=data.sheets()[0]  #多張sheet的情況讀取第一張
  9     nrows=table.nrows
 10     ncols=table.ncols
 11     list=[]
 12     for rownum in range(0,nrows):
 13         row=table.row_values(rownum)
 14         for i in range(0,ncols):        #轉碼unicode轉utf-8
 15             row[i]=row[i].encode('utf-8')
 16         if row:
 17             list.append(row)
 18     return list
 19 
 20 #行為分析
 21 def behavior_analysis(datalist):
 22     t=1
 23     for line in datalist:
 24         if(t==1):
 25             t=3
 26             continue
 27         dh=dateDecode(line[2])
 28         day=int(dh[0])
 29         hour=int(dh[-1])
 30 
 31         user.day_intervel[day]+=1
 32         user.time_intervel[hour/2]+=1
 33 
 34 
 35         timeStr=line[3]
 36         timelong = timeDecode(timeStr)
 37 
 38         if line[4]=='主叫':
 39             user.calling_times+=1
 40             user.calling_long+=timelong
 41         if line[4]=='被叫':
 42             user.called_times+=1
 43             user.called_long+=timelong
 44 
 45 
 46     user.call_times=user.calling_times+user.called_times    #總次數
 47     user.call_long=user.calling_long+user.called_long       #總時長
 48 
 49 #解碼時間
 50 def timeDecode(timeStr):
 51     hour = min = sec = 0
 52     if timeStr.find('小時') != -1:
 53         hour = timeStr.split('小時')[0]
 54         timeStr = timeStr.split('小時')[1]
 55     if timeStr.find('') != -1:
 56         min = timeStr.split('')[0]
 57         timeStr = timeStr.split('')[1]
 58     if timeStr.find('') != -1:
 59         sec = timeStr.split('')[0]
 60 
 61     timelong = int(sec) + int(min) * 60 + int(hour) * 60 * 60
 62     return timelong
 63 
 64 #編碼時間
 65 def timeEncode(time):
 66     strtime=str(time%60)+""
 67     time/=60
 68     if(time!=0):
 69         strtime=str(time%60)+""+strtime
 70         time/=60
 71         if (time != 0):
 72             strtime = str(time % 60) + "小時"+strtime
 73     return strtime
 74 
 75 #解碼日期
 76 def dateDecode(dateStr):
 77     dateStrlist=dateStr.split(' ')
 78     dayStr=dateStrlist[0]
 79     dayStrlist=dayStr.split('-')
 80     day=dayStrlist[-1]
 81 
 82     timeStr=dateStrlist[-1]
 83     timeStrlist=timeStr.split(':')
 84     timeHour=timeStrlist[0]
 85 
 86     dayAndHour=[]
 87     dayAndHour.append(day)
 88     dayAndHour.append(timeHour)
 89     return dayAndHour
 90 
 91 
 92 def printout():
 93     print "被叫次數:", user.called_times
 94     print "被叫時長:", timeEncode(user.called_long)
 95 
 96     print "主叫次數:", user.calling_times
 97     print "主叫時長:", timeEncode(user.calling_long)
 98 
 99     print "總次數:",user.call_times
100     print "總時長:",timeEncode(user.call_long)
101 
102     print "日期",user.day_intervel
103     print "時段",user.time_intervel
104 
105 #數據可視化
106 def dataVisualization(userinfo):
107     plt.plot(userinfo.day_intervel, 'k')
108     plt.plot(userinfo.day_intervel, 'bo')
109     plt.xlabel(u'日          期')
110     plt.ylabel(u'通話次數')
111     plt.title(u'每日通話分析')
112     plt.grid(color='#95a5a6', linestyle='--', linewidth=1, axis='y', alpha=0.4)
113     plt.show()
114 
115 url="/Users/SeeKHit/Downloads/2017年01月語音通信.xls"
116 datalist=readData(url)
117 
118 user=UserDataInfo.UserDataInfo()
119 behavior_analysis(datalist)
120 
121 printout()
122 dataVisualization(user)
View Code

用戶通話信息類

 1 #coding=utf-8
 2 # 用戶通話信息類記錄
 3 class UserDataInfo(object):
 4     def __init__(self):
 5         self.calling_long = 0   #主叫時長
 6         self.called_long = 0    #被叫時長
 7         self.call_long = 0      #總時長
 8 
 9         self.calling_times = 0  #主叫次數
10         self.called_times = 0   #被叫次數
11         self.call_times = 0     #總次數
12 
13         self.time_intervel=[]   #通話時段
14         for i in range(0,12):
15             self.time_intervel.append(0)
16 
17         self.day_intervel=[]    #每日通話次數
18         for i in range(0,31):
19             self.day_intervel.append(0)
20 
21         self.call_freq= None       #通話最頻繁
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM