关注微信公共号:小程在线
关注CSDN博客:程志伟的博客
Python 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.
IPython 7.12.0 -- An enhanced Interactive Python.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
az = pd.read_excel(r'F:\Python\数据源整合.xlsx',sheet_name='安装信息')
zc = pd.read_excel(r'F:\Python\数据源整合.xlsx',sheet_name='注册信息')
print("查看安装信息:")
az.head()
查看安装信息:
Out[3]:
安装时间 渠道 子渠道 ... 系统 机型 操作系统版本
0 2020-04-26 15:59:27 渠道A site01 ... android samsung-SM-N900 5
1 2020-04-26 15:58:27 渠道A site02 ... android samsung-SM-N960F 10
2 2020-04-26 15:56:57 渠道A site01 ... android samsung-SM-A7050 9
3 2020-04-26 15:50:55 渠道A site03 ... android OPPO-CPH1721 7
4 2020-04-26 15:49:42 渠道A site04 ... android HUAWEI-LYA-L29 9
[5 rows x 9 columns]
print('查看注册信息:')
zc.head()
查看注册信息:
Out[4]:
用户类型 账号名称 安装时间 ... 系统 机型 地区
0 new code03 2020-04-19 23:58:18 ... android SM-G887F 地区A
1 old code15 2020-04-20 00:04:51 ... android SM-A730F 地区A
2 old code17 2020-04-20 00:18:30 ... android ASUS_I001DE 地区A
3 old code19 2020-04-20 00:20:36 ... android SM-G9880 地区B
4 old code27 2020-04-20 00:28:29 ... android SM-N9500 地区B
[5 rows x 11 columns]
print("安装信息表:")
print(az.info())
print("-"*30)
print(az.describe())
print("-"*30)
print('空值统计:\n',az.isnull().sum())
print("-"*30)
print('重复数据:',az.duplicated().sum())
安装信息表:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7438 entries, 0 to 7437
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 安装时间 7438 non-null datetime64[ns]
1 渠道 7438 non-null object
2 子渠道 7438 non-null object
3 地区 7438 non-null object
4 WIFI 7438 non-null bool
5 用户唯一ID 7438 non-null object
6 系统 7438 non-null object
7 机型 7438 non-null object
8 操作系统版本 7438 non-null int64
dtypes: bool(1), datetime64[ns](1), int64(1), object(6)
memory usage: 472.3+ KB
None
------------------------------
操作系统版本
count 7438.000000
mean 7.881958
std 1.505865
min 4.000000
25% 7.000000
50% 8.000000
75% 9.000000
max 10.000000
------------------------------
空值统计:
安装时间 0
渠道 0
子渠道 0
地区 0
WIFI 0
用户唯一ID 0
系统 0
机型 0
操作系统版本 0
dtype: int64
------------------------------
重复数据: 0
print("注册信息表:")
print(zc.info())
print("-"*30)
注册信息表:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5992 entries, 0 to 5991
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 用户类型 5992 non-null object
1 账号名称 5992 non-null object
2 安装时间 5992 non-null object
3 注册时间 5992 non-null object
4 注册渠道 5992 non-null object
5 子站 5992 non-null object
6 用户唯一ID 5992 non-null object
7 注册游戏 5992 non-null object
8 系统 5992 non-null object
9 机型 5992 non-null object
10 地区 5992 non-null object
dtypes: object(11)
memory usage: 515.1+ KB
None
------------------------------
print(zc.describe())
print("-"*30)
用户类型 账号名称 安装时间 ... 系统 机型 地区
count 5992 5992 5992 ... 5992 5992 5992
unique 2 5944 5555 ... 1 1053 3
top old code2577 2020-03-17 08:05:22 ... android CPH1879 地区A
freq 3022 5 33 ... 5992 117 4944
[4 rows x 11 columns]
------------------------------
print('空值统计:\n',zc.isnull().sum())
print("-"*30)
空值统计:
用户类型 0
账号名称 0
安装时间 0
注册时间 0
注册渠道 0
子站 0
用户唯一ID 0
注册游戏 0
系统 0
机型 0
地区 0
dtype: int64
------------------------------
print('重复数据:',zc.duplicated().sum())
重复数据: 0
print('安装信息表的安装时间范围:',az['安装时间'].min(),az['安装时间'].max())
print('注册信息表的安装时间范围:',zc['安装时间'].min(),zc['安装时间'].max())
安装信息表的安装时间范围: 2020-04-19 16:04:54 2020-04-26 15:59:27
注册信息表的安装时间范围: 2020-02-20 13:21:31 2020-04-26 23:44:39
####为了方便分析,选择安装时间在 2020-4-20——2020-04-26 的数据
az = az[az['安装时间']>'2020-04-19 23:59:59']
zc = zc[zc['安装时间']>'2020-04-19 23:59:59']
print('安装信息表的安装时间范围:',az['安装时间'].min(),az['安装时间'].max())
print('注册信息表的安装时间范围:',zc['安装时间'].min(),zc['安装时间'].max())
安装信息表的安装时间范围: 2020-04-20 00:02:15 2020-04-26 15:59:27
注册信息表的安装时间范围: 2020-04-20 00:04:51 2020-04-26 23:44:39
####选择注册信息表中'用户唯一ID'存在安装表中的数据
uid = az['用户唯一ID']
zc = zc[zc['用户唯一ID'].isin(uid)]
print('安装信息:',az.shape)
print('注册信息:',zc.shape)
安装信息: (7282, 9)
注册信息: (5125, 11)
print('注册信息重复ID:',zc['用户唯一ID'].duplicated().sum())
注册信息重复ID: 207
zc = zc.drop_duplicates('用户唯一ID')
print('去重后:',zc.shape)
去重后: (4918, 11)
####安装信息分析
####激活率=激活人数/安装人数(这里激活人数以注册人数代替)
print("安装人数:",az.shape[0])
print('注册人数:',zc.shape[0])
print('激活率:%.2f%%'%((zc.shape[0]/az.shape[0])*100))
安装人数: 7282
注册人数: 4918
激活率:67.54%
####日安装量、安装渠道、TOP15子渠道、安装地区、是否WiFi安装、安装的手机类型统计TOP15、系统版本
az['安装日期']=az['安装时间'].dt.date
print('日安装用户量:\n',az.groupby('安装日期').用户唯一ID.count())
日安装用户量:
安装日期
2020-04-20 947
2020-04-21 912
2020-04-22 1045
2020-04-23 1022
2020-04-24 915
2020-04-25 1278
2020-04-26 1163
Name: 用户唯一ID, dtype: int64
print("安装渠道:\n",az['渠道'].value_counts())
print('\n TOP 15子渠道:\n',az['子渠道'].value_counts()[:15])
安装渠道:
渠道B 5480
渠道A 1802
Name: 渠道, dtype: int64
TOP 15子渠道:
site251 1075
site249 1048
site250 1043
site247 458
site248 457
site253 430
site254 305
site258 274
site252 209
site11 207
site12 200
site03 154
site01 138
site255 115
site256 59
Name: 子渠道, dtype: int64
print('安装地区:\n',az['地区'].value_counts())
安装地区:
地区A 5663
地区B 1543
地区C 76
Name: 地区, dtype: int64
print('是否WiFi安装:\n',az['WIFI'].value_counts())
是否WiFi安装:
True 3938
False 3344
Name: WIFI, dtype: int64
'''
从机型属性中拆分手机类型属性,由于手机品牌名称存在大小写不一的情况(例如OPPO,oppo),因此将手机类型属性字段统一转换为首字母大写的格式:
PS :转换成以下模式再统计也是一样的,但必须先统一格式后再统计:
.lower() 将字符串中全部字符转换为小写
.upper() 将字符串中全部字符转换为大写
.title() 将字符串中每个单词的首字母转换为大写字母
'''
print("用户安装手机类型TOP 15:\n")
az['手机类型'] = az['机型'].str.split("-").str[0]
az['手机类型'] = az['手机类型'].str.title() #.title()将所有手机类型的名称转换为首字母大写的格式
az['手机类型'].value_counts()[:15]
用户安装手机类型TOP 15:
Out[21]:
Samsung 2577
Oppo 1125
Huawei 726
Xiaomi 610
Asus 576
Htc 281
Sony 275
Vivo 245
Lge 87
Galaxy 78
Realme 65
Honor 57
Redmi 53
Nokia 51
Xperia 45
Name: 手机类型, dtype: int64
print('系统:',az['系统'].value_counts())
print('\n操作系统版本:\n',az.groupby('操作系统版本').系统.count())
系统: android 7282
Name: 系统, dtype: int64
操作系统版本:
操作系统版本
4 83
5 313
6 1434
7 925
8 1251
9 2407
10 869
Name: 系统, dtype: int64
zc['注册日期'] = pd.to_datetime(zc['注册时间']).dt.date
print('日注册用户:\n',zc.groupby('注册日期').用户唯一ID.count())
日注册用户:
注册日期
2020-04-20 532
2020-04-21 579
2020-04-22 648
2020-04-23 731
2020-04-24 635
2020-04-25 864
2020-04-26 929
Name: 用户唯一ID, dtype: int64
print("用户类型:\n",zc['用户类型'].value_counts())
用户类型:
new 2565
old 2353
Name: 用户类型, dtype: int64
zc['注册时段'] = pd.to_datetime(zc['注册时间']).dt.hour
hzc = zc.groupby(['用户类型','注册时段']).用户唯一ID.count().reset_index(name='total')
sns.lineplot(data=hzc,x='注册时段',y='total',hue='用户类型')
plt.title('各时段的注册用户量',loc='left')
plt.show()
print("激活时间:\n")
zc['激活时间'] = pd.to_datetime(zc['注册时间']).dt.day-pd.to_datetime(zc['安装时间']).dt.day
jh = zc['激活时间'].value_counts().reset_index(name='total')
jh['percent'] =(jh['total']/7282).round(3)
print(jh)
激活时间:
index total percent
0 0 4655 0.639
1 1 208 0.029
2 2 33 0.005
3 3 16 0.002
4 4 3 0.000
5 6 2 0.000
6 5 1 0.000
print('日新增新用户:\n')
nzc = zc[zc['用户类型']=='new']
nzc.groupby('注册日期').用户唯一ID.count()
日新增新用户:
Out[27]:
注册日期
2020-04-20 296
2020-04-21 298
2020-04-22 343
2020-04-23 375
2020-04-24 324
2020-04-25 447
2020-04-26 482
Name: 用户唯一ID, dtype: int64