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
  • 相关阅读:
    sql当前行数据和之前行数据相加减循环处理
    Sql 查询库、表、列名的语句
    sql 特殊字符替换
    pandas 篇
    JAVA学习--面向对象的特征二:继承性
    JAVA学习--super使用
    JAVA学习--方法的参数传递
    JAVA学习--可变个数的形参的方法
    JAVA学习--面向对象思想的落地法则
    JAVA学习--方法的重载
  • 原文地址:https://www.cnblogs.com/SeekHit/p/6354576.html
Copyright © 2011-2022 走看看