zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    SqlServer 查看数据库中所有存储过程
    SqlServer 查看数据库中所有视图
    SqlServer 查询表的详细信息
    SqlServer 遍历修改字段长度
    net core 操作Redis
    Tuning SharePoint Workflow Engine
    Open With Explorer
    Download language packs for SharePoint 2013
    Change Maximum Size For SharePoint List Template when Saving
    Six ways to store settings in SharePoint
  • 原文地址:https://www.cnblogs.com/SeekHit/p/6354576.html
Copyright © 2011-2022 走看看