精华内容
下载资源
问答
  • 第二十四天: 摩拜单车数据分析项目

    摩拜单车数据分析项目
    有目标的去分析。
    一般地理geohash 7 用的比较多 一般来说是长150米,宽110米

    1.GeoHash将二维的经纬度转换成字符串,比如下图展示了北京9个区域的GeoHash字符串,分别是WX4ER,WX4G2、WX4G3等等,每一个字符串代表了某一矩形区域。也就是说,这个矩形区域内所有的点(经纬度坐标)都共享相同的GeoHash字符串,这样既可以保护隐私(只表示大概区域位置而不是具体的点),又比较容易做缓存,比如左上角这个区域内的用户不断发送位置信息请求餐馆数据,由于这些用户的GeoHash字符串都是WX4ER,所以可以把WX4ER当作key,把该区域的餐馆信息当作value来进行缓存,而如果不使用GeoHash的话,由于区域内的用户传来的经纬度是各不相同的,很难做缓存。
    2.字符串越长,表示的范围越精确。如图所示,5位的编码能表示10平方千米范围的矩形区域,而6位编码能表示更精细的区域(约0.34平方千米)
    3.字符串相似的表示距离相近,这样可以利用字符串的前缀匹配来查询附近的POI信息

    有项目目标然后去分析。

    train=train.sample(frac=0.5)   #吧原数据集随机%50 进行抽样
    
    s.weekday()  #Monday is 0 and Sunday is 6
    s.hour  #取出小时
    
    df["day"]=df["starttime"].apply(lambda s:srt(s)["10"])   #输出的格式的格式是2017-10-23
    
    
    def processdata(df):
        #time
        df["weekday"]=df["starttime"].apply(lambda s: s.weekday())
        df["hour"]=df["starttime"].apply(lambda s: s.hour())
        df["day"]=df["starttime"].apply(lambda s:srt(s)["10"])
        print("time process sucessful")
        
        
        #geohash
        df["star_loc_point"]=df["geohashed_start_loc"].apply(lambda s:geohash.decode(s))
        df["end_loc_point"]=df["geohashed_end_loc"].apply(lambda s:geohash.decode(s))
        df["start_neigh"]=df["geohashed_start_loc"].apply(lambda s:geohash.neighbors(s))
        
        df["star_loc_point_g6"]=df["geohashed_start_loc"].apply(lambda s:s[:6])
        df["end_loc_point_g6"]=df["geohashed_end_loc"].apply(lambda s:s[:6])
        df["star_neighbor_g6"]=df["star_loc_point_g6"].apply(lambda s:geohash.neighbors(s))
        
        
        #判断目的地是否在neihbors
        def ingeobashneg(start_geohash,end_geohash,names):
            names.append(start_geohash)
            if end_geohash in names:
                return 1
            else:
                return 0
            
        #判断geohash6
        
        df["inside"]=df.apply(lambda s:ingeobashneg(s["start_geohash"],s["end_geohash"],s["start_neigh"]),axis=1)
        df["inside_6"]=df.apply(lambda s:ingeobashneg(s["star_loc_point_g6"],s["end_loc_point_g6"],s["star_neighbor_g6"]),axis=1)
        print("geohash sucessful")
        
        #通过经纬度计算距离的函数
        def haversine(lon1, lat1, lon2, lat2): 
            """
            Calculate the great circle distance between two points 
            on the earth (specified in decimal degrees)
            """
            lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
            # haversine公式
            dlon = lon2 - lon1 
            dlat = lat2 - lat1 
            a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
            c = 2 * asin(sqrt(a)) 
            r = 6371 # 地球平均半径,单位为公里
            return c * r * 1000
        df["start_end_distance"] = df.apply(lambda s : haversine(s['start_lat_lng'][1],s['start_lat_lng'][0],s['end_lat_lng'][1],s['end_lat_lng'][0]),axis = 1)
        print("Distance process successfully!!!")
        
        return df
    
    
    ## 不同时间骑行的距离是否不一样呢
    hour_group=train.groupby("hour")
    hour_distance=hour_group["start_end_distance"].agg(np.mean).reset_index()
    sns.barplot(x='hour',y='start_end_distance',data=hour_distance)  
    
    展开全文
  • 数据分析项目总结

    2019-03-19 10:06:09
    数据分析项目总结(一)项目综述踩过的坑总结 项目综述 做的第一个数据分析的项目。项目背景是属于探索型项目,即有一些数据,想看看这些数据可以做些什么?当然是从业务的角度出发,想利用数据为业务决策提供数据...

    数据分析项目总结(一)

    项目综述

    做的第一个数据分析的项目。项目背景是属于探索型项目,即有一些数据,想看看这些数据可以做些什么?当然是从业务的角度出发,想利用数据为业务决策提供数据支撑。

    踩过的坑

    1. 首先要明确业务方想得到什么?
    2. 在确定完前期的目标及相关的基本统计量后,写报告时,出现得到的报告结果不是业务方想要的;
    3. 重新设计统计量。(一定要注意:在连成宽表之前,先看一下要统计的指标,是否可以先进行filter操作后,再连;对于数据量很大的情况,这样会节省大量连表的时间)
    4. 连成宽表之后,再统计指标。这样就不会出现,每统计一个统计量,都要将该统计量所关联的表都筛出,然后连起来。这样出错的几率很大。比如在sas中使用
    // An highlighted block
    proc sql;
    create table temp_1 as 
    select * from temp
    where var<3;
    quit;
    

    where语句则会将var变量为空的样本删了,再用temp_1与其他表相连时就会造成连接后表中的样本数量比实际的少,此时又需要关联temp表。这个过程很容易出错。
    5. 验证代码执行出来的数据是否我们想要的?
    首先,先看数据维度是否正确;
    其次,对表中的数据进行排序,看首尾极值的情况是否与我们设想的一致;
    第三,对有疑问的数据,拉出两条看看原始数据是否存在我们没有考虑到的情况。比方说,数据中有缺失值的问题,在求mean的过程中,对空值是如何计算的等都需要关注一下。
    6. 在写分析报告的过程中,可以采用先提假设、再摆事实、得出结论的思路写。注意抛出异常点,并分析产生这种异常点的原因;之后可以选择原因进行验证,当有两个原因时,选其中一个不成立的原因验证,然后说明另一个原因是结论;总结几个结论后,或许可以挖掘更深的东西。比方说,离行与附行存在某种距离上的关系,附行的某项指标会随着与离附行距离的变远而增加,换句话说,附行的某项指标会随着与离行距离的变近而减少,这是为什么呢?一方面是环境的因素,因为附行一般建立在人口较密集,需求较多的地方,而离行可能不是;另一方面,离行对附行分流了。然后设计实验验证,验证什么呢?刚刚两个可能的原因一个是环境因素导致,一个是很有结论性的原因。此时,可以选择判断是不是环境因素导致的上述结果的,如果是,则直接得出结论;如果不是,则是第二个原因,从而得出结论。
    7. 写作规范
    8. 讲述报告时要点:明确报告的目标、从哪几个方面考虑的?每个方面设计了哪些实验?得到了怎样的结论?

    总结

    明确目标,设计指标;
    统计时,划分几个部分,制作宽表;
    统计结果(画图,该部分还没系统学习);
    结果分析,先分后合;
    分析报告撰写,有理有据、循序渐进、抛出异常点。

    展开全文
  • 数据分析项目实战

    万次阅读 2018-03-19 18:48:30
    考虑到很多人想了解大数据,我们特地准备了一个关于大数据可视化分析的项目实战课,里面包含多个大数据分析项目的讲解和演示,每周两到三次。具体的信息说明在最后。在这里还是要推荐下我自己建的大数据...

    随着大数据相关技术的发展,大数据在行业内的应用越来越广泛,大数据又分为数据采集、数据清洗、数据存储、数据建模、数据呈现等多个环节。

    由于缺乏对应的大数据人才,以及国家对大数据的支持,目前很多人都开始关注大数据领域。考虑到很多人想了解大数据,我们特地准备了一个关于大数据可视化分析的项目实战课,里面包含多个大数据分析项目的讲解和演示,每周两到三次。具体的信息说明在最后。

    在这里还是要推荐下我自己建的大数据学习交流群:199427210,群里都是学大数据开发的,如果你正在学习大数据 ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有大数据软件开发相关的),包括我自己整理的一份2018最新的大数据进阶资料和高级开发教程,欢迎进阶中和进想深入大数据的小伙伴加入。

    往期大数据分析项目展示:

    大数据项目实战案例一:二手房交易数据分析

    大数据项目实战案例二:数据可视化职位分析


    大数据项目实战三:智慧城市运营中心项目


    大数据项目实战案例四:空气质量监测


    大数据项目实战案例五:全国IT行业招聘信息分析


    项目知识点:大数据分析,大数据可视化呈现

    大数据项目实战QQ群:199427210

    展开全文
  • 数据分析项目实战之用户消费行为分析

    千次阅读 多人点赞 2019-07-23 14:38:50
    数据分析项目中固然是用到很多的数据分析工具和技巧,但是业务知识也占比不小,本案例分析了来自CDNow网站的一份用户购买CD明细,业务结合技术进一步分析用户的消费行为,提高决策质量。CD数据包括用户ID,购买日期...

    数据分析项目中固然是用到很多的数据分析工具和技巧,但是业务知识也占比不小,本案例分析了来自CDNow网站的一份用户购买CD明细,业务结合技术进一步分析用户的消费行为,提高决策质量。CD数据包括用户ID,购买日期,购买数量,购买金额四个字段。

    数据下载:https://pan.baidu.com/share/init?surl=pL2qo1H  密码g6vv

    用到的工具,pycharm,python3.7

    项目的总体内容包括一下几个部分:

    1. 数据清洗:处理缺失值,数据类型转化,按照需要将数据整理好
    2. 按月对数据进行分析:每月用户消费次数,每月用户的购买量,每月用户的购买总金额以及每月用户数量对比这些图标分析数据是否存在误差
    3. 用户个体消费数据分析:用户个体消费金额与消费次数的统计描述,用户消费金额和消费次数的散点图,用户消费金额的分布图(符合二八法则),用户消费次数的分布图,用户累计消费金额的占比。
    4. 用户消费行为分析:用户第一次消费时间,用户最后一次消费时间,用户分层,新老客消费比,用户购买周期,用户生命周期

    一 数据清洗:

    拿到数据使用pandas的read_table读出txt文件,列名为'user_id','order_dt','order_products','order_amount',由于这里的txt文件不是逗号分割的,所以sep = ‘\s+’。

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    columns = ['user_id','order_dt','order_products','order_amount']
    # 用户id 购买日期 购买产品数 购买金额
    df = pd.read_table("master.txt",names = columns,sep = '\s+')
    #df.info() 检查数据是否存在空值
    print(df.head())

    数据读出无误时要检查数据中是否存在空值,并检查数据的数据类型。发现数据中并不存在空值,很干净的数据。那接下来既然我们需要每月这个数据,就要给order_dt这一列的数据进行适当的转换一下,转化成通常的时间格式,Y(年)m(月)D(日)。下面那句代码的意思是:在df里心增加一列列名是mounth,取出这一列的日期order_dt然后掉取这一列的值把值转换成以月为单位的,例如6月1号到30号统统属于6月1号即是六月。看第二个图结果:

    df['order_dt'] = pd.to_datetime(df.order_dt,format ='%Y%m%d')
    df['mouth'] = df.order_dt.values.astype('datetime64[M]')

     这时候可以对数据进行简单初步分析,用df.describe()。产品购买数量均值在2.4,中位数是2,其分位数是3,说明用户购买量大部分都不多,少部分购买量大的,最高购买量是99,其中存在一定的极致干扰。用户的订单金额比较稳定,人均购买CD金额在35,中位数在25元,存在极致干扰,很多销售行业都是类似这种分布,小额比较多,大额的较少,收入来源很大一部分是来自大额。也即是二八

    到这里数据都准备好了进行下一步分析。

    二 按月分析数据趋势:

    在这里用到了一个groupby,一个在数据分析中非常好用的函数,这一节是要按月分析用户行为,用groupby对用户按照月分分组。

    group_month = df.groupby('month')#按月对数据分组
    order_month_amount = group_month.order_amount.sum()# 每个月份的销售总额
    order_month_times = group_month.order_products.sum()# 每个月份的产品购买总数量
    order_month_persons = group_month.user_id.count() # 每个月份用户的数量统计
    order_mounth_amount.plot()
    # order_mounth_times.plot()
    # order_mounth_persons.plot()
    plt.show()
    

     分组完成之后得到一个新的dataframe叫group_month,然后直接取出组里的order_amount并求和可得到每个月份的销售总额,并且画出折线图,(控制折线图的三行代码挨个运行可得到仨图,一起运行的话就在一个图里展示三条线)

     

    每个月份的销售总额曲线图​​​​​
    每个月份的产品购买总数量曲线图

     

    每个月份用户数量统计

     

     从上面仨图可以看出数据没有什么问题,用户购买总额跟用户购买次数以及用户购买量走势是大致相同的,但是从四月份开始销量严重下滑,具体是原因是什么,我们可以再来看一下每个月的消费人数:

    df.groupby('month').user_id.nunique().plot()
    plt.show()
    每个月的消费人数

     

    每月的消费人数小于每月的消费次数,但是区别不大。前三个月每月的消费人数在8000—10000之间,后续月份,平均消费人数在2000不到。一样是前期消费人数多,后期平稳下降的趋势。

    三 用户个体消费数据分析:

    之前的都是看趋势,现在看个体的消费水平如何,

    主要分析的对象是:

    1. 用户消费金额和消费次数的统计以及散点图来观察用户的平均消费水平
    2. 用户消费金额的分布图(二八原则)
    3. 用户消费次数的分布图
    4. 用户累计消费金额的占比(百分之多的用户占了百分之多少的消费额)
    group_userID = df.groupby('user_id')
    print(group_user.sum().describe())

     以user_id为索引进行分组,在用户的角度来看,每位用户平均购买七张CD,最少的用户购买了一张,最多购买1033张,中位数是三张,反映出有些数据的波动还是挺大,用户购买的金额平均是106中位数是43,购买最大金额是13990,四分位数19,这些数据加上之前的按月分析,大致勾勒出CD销售大致趋势,在一段时间销量上升,突然在某时期不景气开始猛地下跌,但是大部分还都是处于平稳,销售额也低。

    group_userID = df.groupby('user_id')
    group_userID.sum().query("order_amount<3000").plot.scatter(x = 'order_amount',y = 'order_products')
    # group_userID.sum().order_amount. plot.hist(bins = 20)
    # group_userID.sum().query("order_products<100").order_products.plot.hist(bins = 40)
    #柱状图
    plt.show()

    上一段代码的意思是以user_id为索引进行分组但是分组之后可能会发现打印出来的是对象,因为需要对分组完的数据进行进一步操作,例如求和求均值等等。然后再这里用到的是对数据进行求和,然后调用quary方法规定x轴坐标order_amunt的值小于3000,调用plot里的scatter散点图,画出散点图。

    用户购买金额和购买数量的散点图

     

    用户消费金额分布
    用户消费次数分布

    从散点图中看出数据集中分布在购买金额小购买量少上, 数据基本成线性分布,购买CD金额大数量就多,金额少数量也少。

    从消费金额中可以看出消费金额偏向很低基本在0-1000元之间,可看出其主要还是面向低消费人群。从消费次数柱状图中可以看出,绝大部分用户消费次数并不多,甚至很少,消费次数基本在0-20次之间。

     

    cum1 = group_userID.sum().sort_values("order_amount").apply(lambda x:x.cumsum()/x.sum())
    cum1.reset_index().order_amount.plot()
    plt.show()

    上面这段代码的意思是求出用户的累计消费金额占比,cumsum方法是滚动求和,对求完占比之后的dataframe进行重置 索引,重置索引之后的索引是按照升序排列好的,所以画出的图横坐标就是索引,纵坐标就是消费额所占比例,可以反映出百分之多少的用户占了消费额的百分之多少。 

    用户消费额占比

     从消费额占比中看得出百分之五十的用户才占了百分之二十不到的消费额,排名前五百的用户占有了快百分之五十的消费额,消费还是主要集中在一些大客户上。

    三 用户消费行为分析:

    1. 用户第一次消费&用户最后一次消费
    2. 新老客消费比(多少客户仅消费一次,每月新客占比)
    3. 用户分层(RFM,新,老,活跃,流失)
    4. 用户消费周期
    5. 用户生命周期

    看一下用户本身第一次消费和最后一次消费都集中在几月

    print(group_userID.month.min().value_counts())
    print(group_userID.month.max().value_counts())
    # group_userID.month.min().value_counts().plot()
    # group_userID.month.max().value_counts().plot()
    # group_userID.order_dt.max().value_counts().plot()
    plt.show()

     

    第一次购买和最后一次购买的时间及数量对比
    最后一次购买的具体时间及客户数量

     首购都在一月到三月份,最后一次购买也基本集中在一月到三月份,长期活跃的客户不是很多,大部分用户是购买一次之后不在购买,随着时间的增长,最后一次购买的用户量也在不断增加

     

    new = group_userID.order_dt.agg(['min','max'])
    print((new['min']==new['max']).value_counts())
    exit()

     

    第一次消费时间等于最后一次消费时间的数量占到了一半,说明很多顾客仅消费一次不再消费。

    接下来对用户进行分层:

    将用户分成:

            111':'重要价值客户',
            '011':'重要保持客户',
            '101':'重要挽留客户',
            '001':'重要发展客户',
            '110':'一般价值客户',
            '010':'一般保持客户',
            '100':'一般挽留客户',
            '000':'一般发展客户'

    至于前面数字的意义等下会解释。到这里就开始使用一个新的函数,及python的透视函数,point_table此函数功能跟excel的透视表一样,但是比透视表更加灵活,pd.point_table(index = [],columns = [],values = [],aggfunc = [])这几个参数等会要用到,先来解释一下这几个参数的意思:

    index指的是分组的时候选择哪个字段作为索引,columns指的是指定的列名是什么,values可以决定保留哪些属性字段,aggfunc则是决定对每个字段执行的函数,不写默认执行sum

    rfm = df.pivot_table(index = 'user_id',
                        values = ['order_products','order_amount','order_dt'],
                        aggfunc = {'order_dt':'max','order_amount':'sum','order_products':'sum'})
    # 消费产品数 消费总金额 最近一次消费时间
    rfm["R"] = -(rfm.order_dt-rfm.order_dt.max())/np.timedelta64(1,'D')
    rfm.rename(columns = {'order_amount':'M','order_products':'F'},inplace=True)
    print(rfm)
    exit()

     

    用order_id(用户购买日期的最大值)减去截至到当前的时间,也就是1998-06-30 00:00:00(执行代码print(rfm.order_dt.max()查看),那就要假设我,们现在处于1998-06-30 00:00:00这个时间,用户购买的最后一次时间到这个时间的时间间隔就是用户最近一次交易时间间隔。F的值越大说明交易的越频繁,M的值越大说明交易金额月大,用户的价值就越高。

    在这里呢可以思考一下怎样可以让客户分组呢,什么样的客户是重要客户呐!!当然肯定是消费产品多,消费金额高,消费距今时间短的了。但是这些指标怎样能体现出来呢,这就要用到均值,如果这个值跟均值相减是负数说明消费水平不高,但是又分成几种情况。

    print(rfm[["R", 'F', "M"]].apply(lambda x: x - x.mean()))

     均值相减之后分成了这样几种情况 可以判断一下假设每个值正数就是“1”,负数就是“0”:

            111':'重要价值客户',
            '011':'重要保持客户',
            '101':'重要挽留客户',
            '001':'重要发展客户',
            '110':'一般价值客户',
            '010':'一般保持客户',
            '100':'一般挽留客户',
            '000':'一般发展客户'

    def aggfc(k):
        level = k.apply(lambda x:'1' if x >0 else '0')
        leable = level.R+level.M+level.F
        d = {
            '111': '重要价值客户',
            '011': '重要保持客户',
            '101': '重要挽留客户',
            '001': '重要发展客户',
            '110': '一般价值客户',
            '010': '一般保持客户',
            '100': '一般挽留客户',
            '000': '一般发展客户'
        }
        result = d[leable]
        return result
    rfm['lable'] = rfm[["R",'F',"M"]].apply(lambda x:x-x.mean()).apply(aggfc,axis=1)
    print(rfm.groupby('lable').sum())
    print(rfm.groupby('lable').count())

    实现了对用户的分层 ,重要爆出客户的总消费金额达到159万,重要保持客户的人数达到了4554人

    rfm.loc[rfm.lable == '重要价值客户','color'] = 'g'
    rfm.loc[~(rfm.lable == '重要价值客户'),'color'] = 'r'
    rfm.plot.scatter("F",'R',c = rfm.color)
    plt.show()
    exit()

    从RFM分层可知,大部分用户为重要保持客户,但是这是由于极致的影响,所以RFM的划分应该尽量以业务为准。尽量用小部分的用户覆盖大部分的额度,不要为了数据好看划分等级。

    RFM是人工使用象限法把数据划分为几个立方体,立方体对应相应的标签,我们可以把标签运用到业务层面上。比如重要保持客户贡献金额最多159203.62,我们如何与业务方配合把数据提高或者维护;而重要发展客户和重要挽留客户他们有一段时间没有消费了,我们如何把他们拉回来

    col = ['1997-01-01', '1997-02-01', '1997-03-01', '1997-04-01',
                   '1997-05-01', '1997-06-01', '1997-07-01', '1997-08-01',
                   '1997-09-01', '1997-10-01', '1997-11-01', '1997-12-01',
                   '1998-01-01', '1998-02-01', '1998-03-01', '1998-04-01',
                   '1998-05-01', '1998-06-01']
    def active_status(data):
        status = []
        for i in range(18):
            
            #若本月没有消费
            if data[i] == 0:
                if len(status) > 0:
                    if status[i-1] == 'unreg': # unreg未注册用户
                        status.append('unreg')
                    else:
                        status.append('unactive') # 不活跃用户
                else:
                    status.append('unreg')
                        
            #若本月消费
            else:
                if len(status) == 0:
                    status.append('new')
                else:
                    if status[i-1] == 'unactive':
                        status.append('return')# 回流用户
                    elif status[i-1] == 'unreg':
                        status.append('new')# 新用户
                    else:
                        status.append('active') # 活跃用户
        return pd.Series(status,index = col)
    
    pivoted_status = df_purchase.apply( active_status,axis = 1)
    pivoted_status.head()

     

    对于以上代码分析一下:首先对于参数data,data是单独的一行,也即是secris类型的数据apply方法默认取出的数据是一列,但是在后面直接明确了取数据的方式axis=1,代表每次取一行,一行进行函数中间的逻辑运算。既然是一行数据了,一行里有十八中类型,则需要遍历循环十八次,所以for i in range(18):默认从0到十八,但是包括0不包括十八(python的半包)。先定义一个空数组status,然后开始讨论本月是否有消费,假设本月没有消费,那么data[i]==0,判断status里是否有值即判断data[i-1],如果status里有值,看他里边的值是什么状态,如果说值等于unreg那本月依然是未注册。就往status里加入“unreg”,如果上个月是不活跃或者回流,这个月不消费依然是不活跃,status加入“unactive”。其他如果本身status里都没有值,这个月又不消费那么就是还没开始注册。假设本月已经消费那么data[i-1]==1,看一下status的状态,如果len(status)>0即是status里有值就要判断一下这里边值的状态了,如果这里边data[i-1]==‘unreg’就是说上个月就没注册,这个月突然消费了,那他就是新客啦!如果上个月是不活跃那这个月就是回流用户了,其他情况都是活跃用户。这一块码有点多,不过逻辑上还是很清晰的。

     

    接下来就来看一下每个月的新用户,未注册用户,活跃用户回流用户有多少,由于没注册的用户在数据里是干扰项,则直接让没注册的用户为NaN,这样的话看起来应该会好看一些。用replace函数,用np.NaN进行替代apply在这里默认每次取出一列进行逻辑运算,用到lambda匿名函数,以及panads的计数函数value_counts。对每一列的不同情况值进行计数。然后生成下图;

    print(pivoted_status.replace('unreg',np.NAN).apply(lambda x:pd.value_counts(x)))

    上面的仅仅看数据的话不够直观,我们就给他在图上展示出来,先将NaN用0填充一下,然后再进行转置把月份当作索引,等下画图的时候会生成横坐标各个区域的数据大小会生成不同的面积显示出来。

    从这幅图上可以清晰的看出,不活跃用户,也就是红色区域占了大部分面积,新客主要还是集中在1到3月份,活跃的用户和回流在四月份之后就比较稳定总量不多。

    再来看一下新增用户比,

    pivoted_status = df_purchase.apply(active_status, axis=1)
    new_point = pivoted_status.replace('unreg',np.NAN).apply(lambda x:pd.value_counts(x))
    print(new_point.fillna(0).T.apply(lambda x:x/x.sum(),axis = 1))

    由上表可知,每月用户的消费状态变化。活跃用户、持续消费的用户对应的是消费运营质量。回流用户,之前不消费本月才消费对应的是唤回运营。不活跃的用户对应的是流失,这里可以针对业务模型下个定义:流失用户增加,回流用户正在减少

    group_ID = df.groupby('user_id')
    order = group_ID.apply(lambda x: x.order_dt-x.order_dt.shift())
    print(order)
    print(order.describe())

    从用户购买周期的均值中可以看出,平均消费周期为68天,中位数是31天,可以根据用户的购买周期对用户进行定期召回。

    依然是用图来更直观的看一下消费周期的分布:基本用户的消费周期都集中在100天一下,平均消费周期就一个月。

    group_ID = df.groupby('user_id')
    order = group_ID.apply(lambda x: x.order_dt-x.order_dt.shift())
    # print(order)
    # print(order.describe())
    # x.order_dt-x.order_dt.shift()
    (order/np.timedelta64(1,'D')).hist(bins = 20)
    plt.show()

    再来看一下用户的生命周期:也就是用户的最后一笔订单时间减去第一笔订单时间就是用户的生命周期。

    purchase_r = word.applymap(lambda x : 1 if x > 1 else np.NaN if x == 0 else 0)
    (purchase_r.sum()/purchase_r.count()).plot()
    plt.show()
    随着时间的变化复购率的变化图

    显而易见,前三个月复购率一直在猛增,但是慢慢复购率有下降但是基本在保持在包分之19以上,在百分之二十上下波动。再来看一下回购率:

    pivoted_amount = df.pivot_table(index = 'user_id',columns = 'month',values = 'order_amount',aggfunc = 'mean').fillna(0)
    pivoted_purchase = pivoted_amount.applymap(lambda x:1 if x>0 else 0)
    columns_mounth = df.month.sort_values().astype('str').unique()
    pivoted_amount.columns = columns_month
    def purchase_return(data):
        status = []
        for i in range(17):
            if data[i] == 1:
                if data[i+1] ==1:
                    status.append(1)
                if data[i+1] == 0:
                    status.append(0)
            else:
                status.append(np.NaN)
        status.append(np.NaN)
        return pd.Series(status,index=col)
    pivoted_purchase_return = pivoted_purchase.apply(purchase_return,axis = 1)
    (pivoted_purchase_return.sum()/pivoted_purchase_return.count()).plot()
    plt.show()

     

    0代表当月消费过次月没有消费过,1代表当月消费过次月依然消费

    新建一个判断函数。data是输入数据,既用户在18个月内是否消费的记录,status是空列表,后续用来保存用户是否回购的字段。因为有18个月,所以每个月都要进行一次判断,需要用到循环。if的主要逻辑是,如果用户本月进行过消费,且下月消费过,记为1,没有消费过是0.本月若没有进行过消费,为NAN,后续的统计中进行排除。apply函数应用在所有行上,获得想要的结果。

    最后计算和复购率大同小异,用count和sum求出,从图中可以看出,用户的回购率高于复购,约在30%左右,和老客户差异不大。从回购率和复购率综合分析可以得出,新客的整体质量低于老客,老客的忠诚度(回购率)表现较好,消费频次稍次,这是CDNow网站的用户消费特征。

    里边有些地方的“month”写错了,由于之前写的时候没发现(捂脸)如果大家这一块有错了,统一改一下就行啦!

     

    展开全文
  • 分析步骤Kaggle TMDB电影数据分析项目实战数据集分析结果 Kaggle TMDB电影数据分析项目实战 注:该项目为博主第一次数据分析项目,代码部分参考了:这篇文章。 希望大家支持一下原作者。从下一篇开始将全部为原创...
  • 摩拜共享单车数据分析项目报告

    千次阅读 2020-09-29 21:23:39
    文章目录摩拜共享单车数据分析项目报告项目背景数据探索数据挖掘数据分析时间维度空间维度用户维度 摩拜共享单车数据分析项目报告 项目背景 随着智能手机的普及和手机用户的激增,共享单车作为城市交通系统的一个...
  • 如何写数据分析项目

    千次阅读 2019-06-03 14:55:12
    数据分析项目的主要流程以及用到的工具如下: 提需求 爬虫 2.1 抓取网页文本 urllib requests scrapy selenium 2.2 提取内容 正则 beautifulsoup xpath selenium 2.3 存储 txt csv excel mysql mongodb 数据...
  • 开始一个数据分析项目,首先需要做的就是get到原始数据,获得原始数据的方法有多种途径。比如: 获取数据集(dataset)文件 使用爬虫采集数据 直接获得excel、csv及其他数据文件 其他途径… 本次福布斯系列数据分析...
  • 七、八月份的时候,笔者看完了《Python for Data Analysis》和另外一本《Python 数据分析实战》,当时就想着接下来做一个数据分析项目来练练手,但由于种种原因,最终没能及时付诸行动,后面又因为要学...
  • 数据分析项目一“探索未来气候发展趋势” 一、概览 概览 在这个项目中,我们将分析本地和全球的气温数据,并比较你居住地的气温走向与全球气温走向。作者位于云南昆明。 使用的工具 整个项目使用的工具包括SQL...
  • 考虑到很多人想了解大数据,我们特地准备了一个关于大数据可视化分析的项目实战课,里面包含多个大数据分析项目的讲解和演示,每周两到三次。具体的信息说明在最后。 在这里还是要推荐下我自己...
  • 数据分析项目实战

    万次阅读 2018-03-14 16:55:39
    数据获取:1.主动获取--》爬虫 2.被动。api接口 股票市场分析实战 通过pandas_datareader来获取数据import pandas_datareader as p...
  • 【Python有趣打卡】数据分析pandas完成数据分析项目 今天依然是跟着罗罗攀学习数据分析,原创:罗罗攀(公众号:luoluopan1)学习Python有趣|数据分析三板斧。今天是在DD大数据团队实习的第一天,正式开始数据分析...
  • 对于那些对数据,数据分析或数据科学感兴趣的人,提供一份可以利用业余时间完成的数据科学项目清单,一共14个!项目分为三种类型:可视化项目探索性数据分析(EDA)项目预测建模可视化项目最容易...
  • 数据分析项目流程

    千次阅读 2015-10-29 16:37:56
    最初的阶段集中在理解项目目标和从业务的角度理解需求,同时将这个只是转化为数据挖掘问题的定义和完成目标的初步计划。 2、数据理解 数据理解阶段从初始数据收集开始,通过一些活动的处理,目的是熟悉数据,识别...
  • 背景介绍 ...随着我国的经济迅速发展,...# 数据分析与可视化2 Data_Analysis_and_Visualization_hour ( bikedata1 ) if __name__ == '__main__' : main ( ) 可视化结果: 源码链接: ...
  • 数据分析项目生命周期

    千次阅读 2019-04-12 23:36:04
    这里说的分析是狭义上的数据分析,并不包含数据挖掘,它们之间具体的区别后续文章会详细描述 这里只做一个简单的总结如下表: 差异角度 数据分析 数据挖掘 定义 描述和探索性分析,评估现状和修正不足 技术...
  • 淘宝的XX店铺女装信息已经都放到数据库里了,这篇主要是记录一下把得到的数据合理整合分析。 读完本文可以了解到: 店铺的的销售额在哪个价位相对稳定的,如果有不稳定的有改进的方式吗? 不同商品的价格区间的...
  • apache日志hadoop大数据分析项目: 数据时如何导入hbase与hive的到了这里项目的基本核心功能已经完成。这里介绍一下hive以及hbase是如何入库以及代码实现。首先我们将hbase与hive整合,详细参考about云分析discuz...
  • 网站点击流数据分析项目

    万次阅读 多人点赞 2017-08-07 15:05:24
    什么是点击流数据 ...通过分析这些数据,可以获知许多对网站运营至关重要的信息。采集的数据越全面,分析就能越精准。 日志的生成渠道: 1)是网站的web服务器所记录的web访问日志; 2)是通过在页
  • 福布斯每年都会发布福布斯全球上市企业2000强排行榜(Forbes Global 2000),这个排行榜每年...在准备做这个小小的项目前,先理了一下整个思路,大概可以分为下面这几个步骤: - 数据采集 - 数据清洗、整理 ......
  • 最近有很多人在问,我是如何收集网络的数据,如何进行数据处理、数据分析以及可视化呈现的。也有人问的更具体,关于Python数据分析的一些问题。到底应该怎么学?如何快速入门,...
  • 数据分析项目(一)——爬虫篇

    千次阅读 2018-11-30 10:38:03
    想做一个数据分析项目,需要数据,刚好前些天学了爬虫,突然想自己爬取数据了,我爬取的是前程无忧网。用的是scrapy框架爬取的。下面是代码: 首先是创建工程:scrapy startproject 工程名 我的是:scrapy ...
  • 1 项目背景 我们可以预测预订的可能性吗? 任务详情 我们是否可以基于previous_cancellation作为目标来预测预订酒店的可能性? 预期提交 两列->酒店名称和Booking_Possibility(0或1) 数据来源:...
  • 项目背景: 因信用卡使用给人们带来便利,越来越多的人使用信用卡。...本文主要从分析框架、数据处理和建立预测模型等几个方面进行分析和介绍: 1、明确分析需求 1.1数据介绍 本数据来kaggle数据集: 提
  • 通过爬虫得到的数据,对北京链家网的租房信息进行了数据分析
  • 数据分析项目中的风险管理

    千次阅读 2004-06-25 11:32:00
    随着我国各部门、各行业信息化建设的推进,面向操作层和管理层的各种运营支撑...而数据分析项目的建设不仅需要克服一般软件项目的常见风险,而且数据分析项目由于以下两个原因,相对一般面向操作层、管理层的信息系统
  • 淘宝京东电商数据的获取

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,000
精华内容 18,800
关键字:

数据分析项目