您的位置:首页 > 编程语言 > Python开发

1.小试数据统计分析

2017-12-28 13:07 253 查看

初探皇包车旅游数据分析

本文数据来自精品旅行服务成单预测的算法比赛数据源 。

目录

初探皇包车旅游数据分析
目录

皇包车注册用户分析
1 性别比例

2 年龄分布

3 省份分布

订单数据分析
1 订单类型

2 精品订单用户分析

3 订单目的地国家分布图

评价信息分析
1 评论数据分析

总结
遇到的困难

解决方法

本次练习主要使用python3的pandas模块进行数据处理,matplotlib模块进行可视化显示图表。代码习惯使用面向对象写,但是这个分析不适合用这个,用 jupyter更好。最终用jupyter写完后,又改为面向对象代码,以下每小节代码可以写在对象的方法中单独运行。

下面为开头通用代码

import pandas as pd
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']    # 画图中文显示

class Huangbc():
def __init__(self):
# 用户信息表
self.userProfile = pd.read_csv('userProfile_train.csv')
# 用户评论表
self.userComment = pd.read_csv('userComment_train.csv')
# 订单信息表
self.orderHistory = pd.read_csv('orderHistory_train.csv')


1. 皇包车注册用户分析

用户个人信息:userProfile_train.csv

数据共有四列,分别是用户id、性别、省份、年龄段。注:信息会有缺失。

例如:

useridgenderprovinceage
100000000231北京70后
该用户数据共40308人,但性别,省份,年龄信息都完整的为3578人,基于这些数据信息完整的用户,进行了性别、年龄和省份的统计分析。

1.1 性别比例

# 去除含空值行
userprofile_df = self.userProfile.dropna(axis=0)
'统计不同性别用户数量'
gender_group = userprofile_df.groupby('gender', as_index=False).count()
# 画图
gender_labels = [gender_group.loc[0, 'gender'],gender_group.loc[1, 'gender']]
plt.pie(gender_group.loc[:, 'userid'],labels=gender_labels, autopct='%1.1f%%')
plt.title('注册用户性别比例')
plt.show()


注册用户中,男性用户为2020人,女性用户为1558人,如下图所示,男性所占比例为56.5%,女性为43.5%,男性比女性高出13%。



1.2 年龄分布

'统计年龄分布情况'
userprofile_df = self.userProfile.dropna(axis=0)
age_group = userprofile_df.groupby('age', as_index=False).count().sort_values('userid', ascending=False)    # 按年龄分组
x1 = age_group.loc[:, 'age']
x2 = age_group.loc[:, 'userid']
plt.bar(range(len(x1)), x2)
plt.xticks(range(len(x1)),x1)
plt.title('注册用户年龄分布')
plt.show()


在注册用户中,不同年龄层的顾客对企业的服务要求可能会有不同,所以进行了注册用户年龄分布的统计分析。



从上图可以看出,注册用户中,80后是主力军,但和70后,60后用户数量差距不大。出国旅游的大多数应该是有了一定工作时间和积蓄的人群,而90后属于刚工作,薪酬不高,正是努力奋斗的时期,人数较少情有可原,但随着90后工作经验的增加,薪酬的增长,其用户占比上升也是正常的事情。而00后属于无收入人群,订车应该也是父母的事,所以最少也是预料之中。

1.3 省份分布

'统计注册用户区域分布情况'
userprofile_df = self.userProfile.dropna(axis=0)
province_group = userprofile_df.groupby('province', as_index=False).count().sort_values('userid', ascending=False)  # 按省份分组
x2 = province_group.loc[:, 'province']
y2 = province_group.loc[:, 'userid']
# 为了解决根据y值大小依次显示问题
plt.barh(range(len(x2)),y2)
plt.yticks(range(len(x2)),x2, fontsize=8)
plt.title('注册用户区域分布')
plt.show()




从图中可以看出,注册用户区域分布差异很大,其中排名较前的前5位分别为上海、北京、广东、江苏、浙江,均是经济水平较高的地区。

2 订单数据分析

用户历史订单数据:orderHistory_train.csv

该数据描述了用户的历史订单信息。数据共有7列,分别是用户id,订单id,订单时间,订单类型,旅游城市,国家,大陆。其中1表示购买了精品旅游服务,0表示普通旅游服务。

例如:

useridorderidorderTimeorderTypecitycountrycontinent
100000000371100070915034435850东京日本亚洲

2.1 订单类型

'统计不同旅游类型数量'
ordertype_df = self.orderHistory.dropna().groupby('orderType', as_index=False).count()
y = ordertype_df['userid']
labels = ordertype_df['orderType']
plt.pie(y, labels=labels, autopct='%1.1f%%')
plt.title('订单类型分布图')
plt.show()


不同订单类型的数量比例,其中1表示精品包车服务订单,0表示普通包车服务订单



从图中可以看出,精品订单较少仅为15.3%,普通订单相对就很多,为84.7%,是高端的5.5倍之多。精品订单的附加值高,着重提高精品订单的比例应该是企业关注的问题。

2.2 精品订单用户分析

'不同年龄层选择高端旅游的比例'
orderhis_userpro_df = pd.merge(self.orderHistory,         self.userProfile, on='userid').dropna()
age_group = orderhis_userpro_df.groupby('age', as_index=False)
x3 = age_group.count()['age']   # 年龄
y3 = [] # 不同年龄段高端消费比例
# 遍历每个年龄组,计算高端消费比例
for index, row in age_group:
x3.append(row['age'])
num_type_1 = len(row[row['orderType']==1])
percent_1 = float(num_type_1)/len(row)*100
y3.append(percent_1)
plt.bar(x3,y3)
plt.title('不同年龄层选择高端旅游的比例')
plt.show()




虽然在注册用户中00后和90后的数量位于后两位,但在不同年龄层选择高端旅游的比例中,二者位于前两位,可以看出00后和90后有高端消费的潜力。

2.3 订单目的地国家分布图

'不同国家订单数量'
orderhis_userpro_df = pd.merge(self.orderHistory,         self.userProfile, on='userid').dropna()
country_df = orderhis_userpro_df.groupby('country', as_index=False).count().sort_values('userid', ascending=False)  # 按国家分组排序
x4 = country_df['country'].head(10)
y4 = country_df['userid'].head(10)
plt.bar(range(len(x4)), y4)
plt.xticks(range(len(x4)), x4, fontsize=8)
plt.title('订单目的地国家分布图')
plt.show()


下面进行了订单在不同国家的分布情况



从图中可以看出,用户首选的国家为日本,这符合中国人赴日购买马桶盖的潮流。接下来为美国,澳大利亚。美国排在前三是理所当然,而澳大利亚位居第三的原因可能是留学、和北半球季节相反的气候,以及优美的自然环境。

3.评价信息分析

评论数据:userComment_train.csv

共有5个字段,分别是用户id,订单id,评分,标签,评论内容。

其中受数据保密性约束,评论内容仅显示一些关键词。

useridorderidratingtagscommentsKeyWords
1004400063710019305.0主动热情|提前联系|景点介绍详尽|耐心等候[‘平稳’, ‘很好’]

3.1 评论数据分析

# 评论信息分析
def userComment_analyze(self):
# 平均分以及总评论数
mean_rating = self.userComment['rating'].mean()
num = len(self.userComment)
print(mean_rating, num)

'字符串处理为字段'
tags_list_df = pd.DataFrame(self.userComment['tags'].str.split('|'))
# print(tags_list_df)
m = []
for index,row in tags_list_df.iterrows():
new = {}
# 该字段下存在list和空值两种类型
if type(row['tags'])==list:
for tag in row['tags']:
new[tag]=1
m.append(new)
m_df = pd.DataFrame(m).fillna(0).astype(int)    # 空值填充0
total_df = pd.merge(self.userComment, m_df, left_index=True, right_index=True)
rating_df = total_df.groupby('rating', as_index=False).sum().sort_values('rating')  # 按照评分从小到大排序

# 评分为5分的评论分布
rating_5 = rating_df[rating_df['rating']==5]
x0 = rating_5.loc[:, '不协助搬运行李':'驾驶鲁莽'].T.sort_values(6)
x0 = x0[x0[6]>10]   # 提取出现次数较大的评价
labels = x0.index
plt.pie(x0, labels=labels, autopct='%1.1f%%')
plt.title('5分评分的评论分布图')
plt.show()


评价信息表中共有9863条数据,5分制打分的评分平均分为4.91。



从图中可以看出,在打分为5分的评论中,前五位分别为提前联系、主动热情、耐心等候、主动搬运行李和驾驶平稳,可以看出在顾客心中这些方面的服务质量尤为重要。

总结

这次练习主要是对pandas和matlibplot模块进行练习,最终也起到了相应的作用。了解到python相对excel在处理数据中的优势,首先是字符串处理,只有语言工具才能处理,而且在表之间的合并等类似sql中的关联数据处理中,python的pandas包可以高效处理这些数据合并。

遇到的困难

直方图不能有序的按照y值从大到小排列

统计加和数据为单行df,取单行数据时只能取出标签字段名

字符串处理,tags字段元素为字符串,怎样把字符串分割后作为标签字段作为列添加在原df中

解决方法

直方图默认的排序是按照x轴排序,当x轴是字符串时,顺序就乱七八糟,不能按照传入列表的y值顺序显示。后来通过先把y值有序排列,先用range()数字占位,再用真正的字符串标签标注上

plt.barh(range(len(x2)),y2)

plt.yticks(range(len(x2)),x2)

来解决了问题

把原df转置,变成单列DataFrame对象,再取单列数据即可

首先了解到pd.DataFrame()可以传入列表嵌套字典的数据类型来转化为DataFrame对象,而且列表中的字典不需要拥有相同的键,最后生成的DataFrame对象的字段是列表中所有字典中的键的加和(键不重复)。所以采用pandas中的str中的方法对字符串进行分割为字典,再遍历每行的列表处理为字典,最终处理为理想的列表嵌套字典的数据类型,转化为DataFrame对象,和原df进行合并即可获得。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息