xinzipanghuang.net 近15天访客分析
数据获取于内置插件
最近15天(从2020/11/5开始)的访问记录有782条,也算访问量比较大了。
先统计这些部分,有意思的后面再玩。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import re
# 正常显示中文字符,macos
plt.rcParams['font.family'] = ['Arial Unicode MS']
# 正常显示中文字符,windows
plt.rcParams['font.family'] = ['SimHei']
instant_visitors=pd.read_csv('data/实时访客.csv',encoding='gbk')
instant_visitors.head(10)
id | 访问时间 | 地域 | 来源 | 入口页面 | 搜索词 | 访客标识码 | 访问时长 | 访问页数 | 最后停留在 | … | 浏览器 | 语言环境 | 屏幕分辨率 | 屏幕颜色 | Flash版本 | 是否支持Cookie | 是否支持JAVA | 打开时间 | 停留时长 | 页面地址 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1.0 | 2020/11/18 19:19 | 贵阳 | 百度 | https://www.xinzipanghuang.net/pandas-datafram… | DataFrame’ object has no attribute ‘drop_dupli… | 1.890000e+18 | 未知 | 1.0 | https://www.xinzipanghuang.net/pandas-datafram… | … | Microsoft Edge | NaN | 1536×864 | 24-bit | NaN | 支持 | 支持 | 19:19:22 | 未知 | https://www.xinzipanghuang.net/pandas-datafram… |
1 | 2.0 | 2020/11/18 18:53 | 其他 | 直接访问 | https://www.xinzipanghuang.net | — | 2.230000e+18 | 未知 | 1.0 | https://www.xinzipanghuang.net | … | Google Chrome | NaN | 800×600 | 24-bit | NaN | 支持 | 不支持 | 18:53:57 | 未知 | https://www.xinzipanghuang.net |
2 | 3.0 | 2020/11/18 17:06 | 深圳 | 直接访问 | https://www.xinzipanghuang.net | — | 8.830000e+18 | 未知 | 1.0 | https://www.xinzipanghuang.net | … | Chrome移动版 | NaN | 1054×659 | 32-bit | NaN | 支持 | 不支持 | 17:06:04 | 未知 | https://www.xinzipanghuang.net |
3 | 4.0 | 2020/11/18 17:03 | 北京 | https://www.xinzipanghuang.net/1415-2 | — | 2.300000e+18 | 2641s | 2.0 | https://www.xinzipanghuang.net/1415-2 | … | Google Chrome | NaN | 1280×800 | 24-bit | NaN | 支持 | 不支持 | 17:03:02 | 856s | https://www.xinzipanghuang.net/1415-2 | |
4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | … | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 17:17:18 | 1785s | https://www.xinzipanghuang.net/1415-2 |
5 | 5.0 | 2020/11/18 16:33 | 深圳 | https://mp.weixinbridge.com | https://www.xinzipanghuang.net/svd-singular-va… | — | 5.470000e+18 | 未知 | 1.0 | https://www.xinzipanghuang.net/svd-singular-va… | … | 微信浏览器 | NaN | 1054×659 | 32-bit | NaN | 支持 | 不支持 | 16:33:26 | 未知 | https://www.xinzipanghuang.net/svd-singular-va… |
6 | 6.0 | 2020/11/18 16:22 | 杭州 | 直接访问 | https://www.xinzipanghuang.net | — | 2.220000e+18 | 1958s | 13.0 | https://www.xinzipanghuang.net/blog | … | Google Chrome | NaN | 1920×1080 | 24-bit | NaN | 支持 | 不支持 | 16:22:56 | 3s | https://www.xinzipanghuang.net |
7 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | … | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 16:22:59 | 6s | https://www.xinzipanghuang.net/blog |
8 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | … | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 16:23:05 | 4s | https://www.xinzipanghuang.net/blog/page/2 |
9 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | … | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 16:23:09 | 285s | https://www.xinzipanghuang.net/svd-singular-va… |
10 rows × 25 columns
# 获取每列为空的数据的个数
print(instant_visitors.iloc[:,0].max(),instant_visitors.shape[0])
instant_visitors.isnull().sum()
428.0 783
id 355
访问时间 355
地域 355
来源 355
入口页面 355
搜索词 355
访客标识码 355
访问时长 355
访问页数 355
最后停留在 355
上一次访问时间 355
访问类型 355
访问频次 355
操作系统 355
网络服务商 630
浏览器 363
语言环境 783
屏幕分辨率 367
屏幕颜色 371
Flash版本 775
是否支持Cookie 355
是否支持JAVA 355
打开时间 0
停留时长 0
页面地址 0
dtype: int64
文件说明
该文件记录了距20201118最近的15天的访客记录,id该列记录了访客的ID,某些行比如ID为4的下一列为空,是因为记录时,该访客访问了不止一个页面,所以会有多条记录。
从上一个函数运行结果来看,该文件355行的数据是无效的。428+355=783
所以将数据分为两种情况讨论。
instant_visitors_all=instant_visitors.fillna(method='ffill')
instant_visitors_actual=instant_visitors.dropna(subset=[instant_visitors.columns[0]])
print(instant_visitors_all.shape[0],instant_visitors_actual.shape[0])
783 428
两周的访问情况
双11那天访问量多,也不知道为什么。。
instant_visitors_all['访问日期']=instant_visitors_all['访问时间'].apply(lambda x:str(x).split(' ')[0])
temp=instant_visitors_all['访问日期'].value_counts()
temp.index=pd.DatetimeIndex(temp.index)
temp.sort_index(inplace=True)
sns.countplot(data=instant_visitors_all,x='访问日期',alpha=0.5,order=[str(i).split(' ')[0].replace('-','/') for i in temp.index])
plt.xticks(rotation=45)
(array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]),
<a list of 14 Text major ticklabel objects>)

每天的访问情况
先排除国外的。
9点上班,11点吃饭,12点上班,18点不知道咋回事,晚上再奋斗会。
instant_visitors_all['访问时刻']=instant_visitors_all['访问时间'].apply(lambda x:int(str(x).split(' ')[-1].split(':')[0]))
temp=instant_visitors_all[instant_visitors_all['地域']!='其他']
sns.countplot(data=temp,x='访问时刻',alpha=0.5,order=sorted(temp['访问时刻'].unique()))
<matplotlib.axes._subplots.AxesSubplot at 0x1c4eae6e148>

访问时长
先排除没记录上的
大部分时间还是比较短,看完解决问题就走。
temp=instant_visitors_all[instant_visitors_all['访问时长']!='未知']
temp['访问时长']=temp['访问时长'].apply(lambda x:int(str(x)[:-1]))
res=temp.groupby('id')['访问时长'].sum()
sns.boxenplot(y=np.log2(res))
d:\program files\python\lib\site-packages\ipykernel_launcher.py:2: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
<matplotlib.axes._subplots.AxesSubplot at 0x1c4eaf15f88>

访客来源分析
很明显,直接访问的最多,当然是因为我自己点的不少,也是因为发送给他人都是以链接为主,所以这一部分可以代表我和我周围人的访问量。
其次是google和百度,主要是因为博客内容写的是一些教程或笔记,用于解决写代码时遇到的部分问题。
ax = sns.countplot(y="来源", data=instant_visitors_actual)
ax.set_yticklabels([re.split(r'[/:]',i.get_text())[3] if 'http' in i.get_text() else i.get_text() for i in ax.get_yticklabels()])
plt.show()

## 用df.plot也可以做
ax=instant_visitors_actual['来源'].value_counts().plot(kind='barh')
ax.set_yticklabels([re.split(r'[/:]',i.get_text())[3] if 'http' in i.get_text() else i.get_text() for i in ax.get_yticklabels()])
plt.xticks(rotation=45)
plt.show()

新老访客对比
比之前好多了,以前都是老访客(我)比访客客多。当然,现在一些老访客也不仅仅是我了。
ax = sns.countplot(x="访问类型", data=instant_visitors_actual)
plt.show()

看下入口页面是哪些
直接访问www.xinzipanghuang.net 当然最多,其次由于1415-2在google中搜索version_info, _mysql.version_info, _mysql.__file__ NameError: name '_mysql' is not defined
排名靠前,也是因为该问题遇到的人比较多,所以受访次数最多。
其他的就还好。
# 导入模块对url进行解码
from urllib.parse import unquote
plt.figure(figsize=(8,18))
ax = sns.countplot(y="入口页面", data=instant_visitors_actual)
ax.set_yticklabels([unquote(re.split(r'net/',i.get_text())[-1], 'utf-8')[:50] if 'http' in i.get_text() else i.get_text() for i in ax.get_yticklabels()])
plt.show()

访客来源地域分析
很明显,从其他访问的最多,因为不能记录国外的IP,所以只要是国外的都是其他
,所以网站面向国外用户[手动?]。其次杭州访问的最多,不必多说,大部分我和周围的人访问的。其他的较多的都是来自北上广深,中国发达地方。这些地方互联网行业发达,也是因为网站所发内容也主要是计算机方向。
plt.figure(figsize=(8,10))
ax = sns.countplot(y="地域", data=instant_visitors_actual)

看看其他方面的对比
- 操作系统
PC端会比移动端的访客要多一倍以上,也是因为大家一般很少用手机搜索办公问题。PC端主要就是win10和macos,按照macos的市场占比,也是说明了访客中用mac的比例较windows多。
移动端,最多的就是iPhone,用手机访问网站的一般都是我周围的人,所以周围同志们基本上都是iPhone。里头的Android 4.0较高是因为网页安装的google插件访问所致。
ax = sns.countplot(y="操作系统", data=instant_visitors_actual)

## 根据PC和移动进行分类
PC=['Linux','Win','Mac']
instant_visitors_actual['移动端访问']=instant_visitors_actual['操作系统'].apply(lambda x:all([not i.lower() in str(x).lower() for i in PC]))
sns.countplot(x="移动端访问", data=instant_visitors_actual,hue='操作系统',alpha=0.5)
sns.countplot(x="移动端访问", data=instant_visitors_actual,alpha=0.3)
plt.legend(loc='lower left', bbox_to_anchor=(1,0.1),ncol=1,fancybox=True,shadow=True)
d:\program files\python\lib\site-packages\ipykernel_launcher.py:3: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
This is separate from the ipykernel package so we can avoid doing imports until
<matplotlib.legend.Legend at 0x1c4eb628988>

看看大家使用浏览器的差别
PC里头Google Chrome 一骑绝尘,程序员为什么爱用Chrome。其次是qq浏览器和edge,这两个就还好。
移动端Chrome的使用率高一部分原因也是因为网站的google插件,其次是微信浏览器和Safari,这两个一个是我周围人访问的,一个是我访问的。
sns.countplot(x="移动端访问", data=instant_visitors_actual,hue='浏览器',alpha=0.5)
sns.countplot(x="移动端访问", data=instant_visitors_actual,alpha=0.3)
plt.legend(loc='lower left', bbox_to_anchor=(1,0.1),ncol=1,fancybox=True,shadow=True)
<matplotlib.legend.Legend at 0x1c4eb50ad88>

0 Comments