本篇分析出自《利用python进行数据分析》,为巩固学习成果,我对其进行了代码实践。
本数据记录了访问某时段内,访问网页的数据,包括所用系统型号,所在时区,访问的域名等数据。
import numpy as np
from numpy.random import randn
np.random.seed(123)
import os
import pandas as pd
import matplotlib.pyplot as plt
plt.rc('figure', figsize=(10, 6))
np.set_printoptions(precision=4)
pd.options.display.max_rows = 20
#导入模块,规定画布,规定小数位数,规定数据显示行数
path = 'datasets/bitly_usagov/example.txt'
a = open(path)
import json
my_dic = [json.loads(line) for line in a] #json数据的读取,弄进一个列表
my_dic[:10]
json数据读取出来是字典的形式,tz代表时区,我们想看看大家都在哪里进行的网上冲浪。
time_zones = [obj['tz'] for obj in my_dic if 'tz' in obj]#不是所有的字典都有tz字段,所以如果没有if就会报错。
time_zones[:10]
from collections import Counter
counts = Counter(time_zones)
#对列表进行计数,这里用了函数,也可以自己编写程序进行计数:
#for i in time_zones:
# zonescount = {}
# if i in zonescount:
# zonescount[i] += 1
# else:
# zonescount[i] = 1
#def sort_zones_values(group):
# sort_zones = [(value,key)for key,value in zonescount ]
# sort_zones = sort_zones.sort(reverse = True)
#返回的是一个装有各个元组的列表
counts.most_common(10)
看来纽约上网冲浪的人数最多。下面我们把my_dic整理成Datafram,更加便于统计操作
frame = pd.DataFrame(my_dic)
frame
tz_counts = frame['tz'].value_counts()
tz_counts.isnull().sum()
clean_tz = tz_counts.fillna('missing')
clean_tz
结果是有空值,有120个,我们用Missing字符串对其填充
clean_tz[clean_tz == ''] = 'unkown'
tz = clean_tz.value_counts()
tz
空白不会显示Null,我们对空白进行处理为unkown
import seaborn as sns
data = tz[:10]
sns.barplot(y=data.index,x=data.values)
我们知道了时区,下面我们对用户的系统进行统计,用户的系统储存在a里,并最后和时区组合起来,看看用户行为。我们先看一下a里面的信息
cframe = frame[frame.a.notnull()]
os = [x for x in cframe.a if 'Windows' in x]
os
添加一列os
cframe['os'] = np.where(cframe['a'].str.contains('Windows'),
'Windows', 'Not Windows')
#numpy.where相当于excel里的if
cframe['os'][:5]
对tz和os进行聚合
by_tz_os = cframe.groupby(['tz','os'])
agg_counts = by_tz_os.size().unstack().fillna(0)
agg_counts
选取最常出现的时区
agg_counts.sum(1).nlargest(10)
#排序然后取出前十的时区
下面我们把总数统计然后画图
count_subset = count_subset.stack()
count_subset.name = 'total'
count_subset = count_subset.reset_index()
sns.barplot(x='total', y='tz', hue='os', data=count_subset)
这张图与分析总统竞选时一样不容易看出基数小的对比效果,我们百分数一下
def norm_total(group):
group['normed_total'] = group.total / group.total.sum()
return group
results = count_subset.groupby('tz').apply(norm_total)
results
sns.barplot(x = 'normed_total',y = 'tz',hue='os',data = results)
这样我们就可以看出哪个时区的用户,分别用什么系统。