
正文
【Python数据分析】用户通话行为分析
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
主要工作:
1.对从网上营业厅拿到的用户数据.xls文件,通过Python的xlrd进行解析,计算用户的主叫被叫次数,通话时间,通话时段。
2.使用matplotlib画图包,将分析的结果直观的绘制出来。
具体步骤:
1.分析须要的内容
excel文件中包含很多信息,我们分析的时候须要用到的包括,通话起始时间、通话时长、呼叫类型,号码。
使用xlrd模块,读取excel中的数据,用列表的形式保存下来。
#coding=utf-8
import xlrd def readData(url):
data=xlrd.open_workbook(url)
table=data.sheets()[0] #多张sheet的情况读取第一张
nrows=table.nrows
ncols=table.ncols
list=[]
for rownum in range(0,nrows):
row=table.row_values(rownum)
for i in range(0,ncols): #转码unicode转utf-8
row[i]=row[i].encode('utf-8')
if row:
list.append(row)
return list
2.设计用户数据分析类
考虑分析用户的哪些数据,做成一个什么样的效果
#coding=utf-8
# 用户通话信息类记录
class UserDataInfo(object):
def __init__(self):
self.calling_long = 0 #主叫时长
self.called_long = 0 #被叫时长
self.call_long = 0 #总时长 self.calling_times = 0 #主叫次数
self.called_times = 0 #被叫次数
self.call_times = 0 #总次数 self.time_intervel=[] #通话时段
for i in range(0,12):
self.time_intervel.append(0) self.day_intervel=[] #每日通话次数
for i in range(0,31):
self.day_intervel.append(0) self.call_freq= None #通话最频繁
3.对时间日期字符串解码编码
实用split函数对字符串分割,将x时x分x秒的格式解码成 x秒的数据存储下来
#解码时间
def timeDecode(timeStr):
hour = min = sec = 0
if timeStr.find('小时') != -1:
hour = timeStr.split('小时')[0]
timeStr = timeStr.split('小时')[1]
if timeStr.find('分') != -1:
min = timeStr.split('分')[0]
timeStr = timeStr.split('分')[1]
if timeStr.find('秒') != -1:
sec = timeStr.split('秒')[0] timelong = int(sec) + int(min) * 60 + int(hour) * 60 * 60
return timelong #编码时间
def timeEncode(time):
strtime=str(time%60)+"秒"
time/=60
if(time!=0):
strtime=str(time%60)+"分"+strtime
time/=60
if (time != 0):
strtime = str(time % 60) + "小时"+strtime
return strtime #解码日期
def dateDecode(dateStr):
dateStrlist=dateStr.split(' ')
dayStr=dateStrlist[0]
dayStrlist=dayStr.split('-')
day=dayStrlist[-1] timeStr=dateStrlist[-1]
timeStrlist=timeStr.split(':')
timeHour=timeStrlist[0] dayAndHour=[]
dayAndHour.append(day)
dayAndHour.append(timeHour)
return dayAndHour
4.用户行为分析
对用户的数据进行分类处理,计算出行为数据
#行为分析
def behavior_analysis(datalist):
t=1
for line in datalist:
if(t==1):
t=3
continue
dh=dateDecode(line[2])
day=int(dh[0])
hour=int(dh[-1]) user.day_intervel[day]+=1
user.time_intervel[hour/2]+=1 timeStr=line[3]
timelong = timeDecode(timeStr) if line[4]=='主叫':
user.calling_times+=1
user.calling_long+=timelong
if line[4]=='被叫':
user.called_times+=1
user.called_long+=timelong user.call_times=user.calling_times+user.called_times #总次数
user.call_long=user.calling_long+user.called_long #总时长
5.实用matplotlib进行数据可视化
绘制折线图,反应用户的日常通话习惯。这里只画了一个图
#数据可视化
def dataVisualization(userinfo):
plt.plot(userinfo.day_intervel, 'k')
plt.plot(userinfo.day_intervel, 'bo')
plt.xlabel(u'日 期')
plt.ylabel(u'通话次数')
plt.title(u'每日通话分析')
plt.grid(color='#95a5a6', linestyle='--', linewidth=1, axis='y', alpha=0.4)
plt.show()
完整代码:
#coding=utf-8
import xlrd
import matplotlib.pyplot as plt
import UserDataInfo def readData(url):
data=xlrd.open_workbook(url)
table=data.sheets()[0] #多张sheet的情况读取第一张
nrows=table.nrows
ncols=table.ncols
list=[]
for rownum in range(0,nrows):
row=table.row_values(rownum)
for i in range(0,ncols): #转码unicode转utf-8
row[i]=row[i].encode('utf-8')
if row:
list.append(row)
return list #行为分析
def behavior_analysis(datalist):
t=1
for line in datalist:
if(t==1):
t=3
continue
dh=dateDecode(line[2])
day=int(dh[0])
hour=int(dh[-1]) user.day_intervel[day]+=1
user.time_intervel[hour/2]+=1 timeStr=line[3]
timelong = timeDecode(timeStr) if line[4]=='主叫':
user.calling_times+=1
user.calling_long+=timelong
if line[4]=='被叫':
user.called_times+=1
user.called_long+=timelong user.call_times=user.calling_times+user.called_times #总次数
user.call_long=user.calling_long+user.called_long #总时长 #解码时间
def timeDecode(timeStr):
hour = min = sec = 0
if timeStr.find('小时') != -1:
hour = timeStr.split('小时')[0]
timeStr = timeStr.split('小时')[1]
if timeStr.find('分') != -1:
min = timeStr.split('分')[0]
timeStr = timeStr.split('分')[1]
if timeStr.find('秒') != -1:
sec = timeStr.split('秒')[0] timelong = int(sec) + int(min) * 60 + int(hour) * 60 * 60
return timelong #编码时间
def timeEncode(time):
strtime=str(time%60)+"秒"
time/=60
if(time!=0):
strtime=str(time%60)+"分"+strtime
time/=60
if (time != 0):
strtime = str(time % 60) + "小时"+strtime
return strtime #解码日期
def dateDecode(dateStr):
dateStrlist=dateStr.split(' ')
dayStr=dateStrlist[0]
dayStrlist=dayStr.split('-')
day=dayStrlist[-1] timeStr=dateStrlist[-1]
timeStrlist=timeStr.split(':')
timeHour=timeStrlist[0] dayAndHour=[]
dayAndHour.append(day)
dayAndHour.append(timeHour)
return dayAndHour def printout():
print "被叫次数:", user.called_times
print "被叫时长:", timeEncode(user.called_long) print "主叫次数:", user.calling_times
print "主叫时长:", timeEncode(user.calling_long) print "总次数:",user.call_times
print "总时长:",timeEncode(user.call_long) print "日期",user.day_intervel
print "时段",user.time_intervel #数据可视化
def dataVisualization(userinfo):
plt.plot(userinfo.day_intervel, 'k')
plt.plot(userinfo.day_intervel, 'bo')
plt.xlabel(u'日 期')
plt.ylabel(u'通话次数')
plt.title(u'每日通话分析')
plt.grid(color='#95a5a6', linestyle='--', linewidth=1, axis='y', alpha=0.4)
plt.show() url="/Users/SeeKHit/Downloads/2017年01月语音通信.xls"
datalist=readData(url) user=UserDataInfo.UserDataInfo()
behavior_analysis(datalist) printout()
dataVisualization(user)
用户通话信息类
#coding=utf-8
# 用户通话信息类记录
class UserDataInfo(object):
def __init__(self):
self.calling_long = 0 #主叫时长
self.called_long = 0 #被叫时长
self.call_long = 0 #总时长 self.calling_times = 0 #主叫次数
self.called_times = 0 #被叫次数
self.call_times = 0 #总次数 self.time_intervel=[] #通话时段
for i in range(0,12):
self.time_intervel.append(0) self.day_intervel=[] #每日通话次数
for i in range(0,31):
self.day_intervel.append(0) self.call_freq= None #通话最频繁







