数据分析案例

数据分析案例

数据分析案例要求

电商数据分析案例

电商数据分析案例
一.数据集介绍

此次的数据集来自kaggle的关于在线零售业务的交易数据,该公司主要销售礼品,大部分出售对象是面向批发商。

二.数据集字段介绍

数据包含541910行,8个字段,字段内容为:

InvoiceNo: 订单编号,每笔交易有6个整数,退货订单编号开头有字母’C’。
StockCode: 产品编号,由5个整数组成。
Description: 产品描述。
Quantity: 产品数量,有负号的表示退货
InvoiceDate: 订单日期和时间。
UnitPrice: 单价(英镑),单位产品的价格。
CustomerID:客户编号,每个客户编号由5位数字组成。
Country: 国家的名称,每个客户所在国家/地区的名称。

    
三.分析内容

1.购买商品数前十的国家是?	条形图
2.交易额前十的国家是?	 条形图	
3.哪些月份销量较佳?       
4.客单价多少?			总金额/总客户数
5.用户消费行为分析		   RFM


'''
    数据的来源:
        某英国的kaggle电商公司的数据,主要产品是零售批发

    数据的字段
    InvoiceNo:      订单号
    StockCode:      商品编号
    Description:    商品描述
    Quantity:       数量
    InvoiceDate      日期
    UnitPrice        单价
    CustomerID       客户id
    Country          国家

    分析的需求?
    1.购买商品数前十的国家是?
    2.交易额前十的国家是?
    3.哪些月份销量较佳?
    4.客单价多少?
    5.用户消费行为分析
'''
'''
    数据分析的基本步骤
    1、加载数据
    2、观察数据
    3、数据处理:数据清洗
    4、建模(完成KPI)
    5、可视化
    6、总结报告
'''
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['FangSong']
print('----------------step1:加载数据----------------')
df = pd.read_csv('data.csv', dtype=object)

print('----------------step2:观察数据----------------')
print('列名:\n', df.columns)
print()
print('数据类型:\n',df.dtypes)
print()
print('形状:\n',df.shape)
print()
print('索引:\n', df.index)
print()
print('非空统计-计数:\n', df.count())
print()
# 一般无效,数据的类型没有做转换,所以一般先对数据进行清洗
# print('描述性统计:\n', df.describe())
# print()
print('前5条数据:\n', df.head())
print()
print('数据的基本信息:\n',df.info())
'''
通过数据观察,初步了解以下问题
    问题:
    1、数据类型有问题
    2、数据存在缺失值
    3、数据有异常(有负数的数据,退货数据,不需要去分析)
    4、缺少金额一列
'''

print('----------------step3:数据处理-数据清洗----------------')
'''
    一般在做数据分析前,需要对数据进行处理操作,保证数据的准确性
    数据清洗主要包括:
    1、缺失值处理
    2、异常值处理
    3、重复值处理
    4、子集的选择
    5、类型的转换
    6、重命名
    7、数据排序
    8、字段统一化
'''
'''
    1、缺失值处理
'''
df.dropna(inplace=True)

'''
    2、类型转换
'''
df['Quantity'] = df['Quantity'].astype(float)
df['UnitPrice'] = df['UnitPrice'].astype(float)
df['InvoiceDate'] = pd.to_datetime(df['InvoiceDate'])
'''
    3、异常值处理:去除负数的数据
'''
df = df[ df['Quantity']>=0 ]
print(df.describe())
'''
    4、重命名:不需要
    df.rename(columns={旧名:新名...})
'''
'''
    5、排序
'''
df.sort_values(by='InvoiceDate', inplace=True, ignore_index=True)

'''
    6、子集的选择
'''
df['money'] = df['Quantity']*df['UnitPrice']
print(df.head())

'''
    7、字段统一化
    usa USA 是同一个国家,但是不进行同一化处理,会影响结果
     USA
    USA
    apply(处理函数)
    处理函数:去除前后空格,全部转换成大写
'''
df['Country'] = df['Country'].str.upper()
df['Country'] = df['Country'].str.strip()
print(df['Country'])

# 先拷贝元数据
kpi_df = df.copy()
print('----------------step4:建模,完成KPI----------------')
plt.figure('kaggle电商数据分析', figsize=(6.4*1.5,4.8*1.5))
# 封装代码
def kpi(column, i, kpi_title):
    # kpi1:购买商品数前十的国家是?
    # kpi2:交易额前十的国家是?
    kpi1_data = kpi_df.groupby(by='Country')[[column]].sum()
    kpi1_data.sort_values(by=column, ascending=False,inplace=True)
    top_ten_quantity = kpi1_data[:10]
    print(top_ten_quantity)
    plt.subplot(2,2,i)
    plt.title(kpi_title)
    if i in [1,3]:
        plt.xlabel('国家', fontsize=10)
        plt.ylabel('数量', fontsize=10)
        plt.xticks(rotation=90)
        plt.bar(top_ten_quantity.index, top_ten_quantity[column])
    else:
        plt.xlabel('数量', fontsize=10)
        plt.ylabel('国家', fontsize=10)
        plt.barh(top_ten_quantity.index, top_ten_quantity[column])

kpi('Quantity',1,'购买商品数前十的国家是?')
kpi('Quantity',2,'购买商品数前十的国家是?')
kpi('money', 3, '交易额前十的国家是?')
kpi('money', 4, '交易额前十的国家是?')
plt.show()

# kpi3:哪些月份销量较佳?
print('==============================3.哪些月份销量较佳?==================================')
kpi3_data = kpi_df.groupby(by=df['InvoiceDate'].dt.month)[['Quantity']].sum()
kpi3_data.sort_values(by='Quantity', ascending=False,inplace=True)
print(kpi3_data)

# 4.客单价多少?
# 计算出总的客户
# 计算出总的金额
print('==============================4.客单价多少?==================================')
new_df = kpi_df.drop_duplicates('CustomerID')
total_ct = new_df['CustomerID'].count()
print('总的客户量:',total_ct)
total_money = kpi_df['money'].sum()
print('总的金额:', total_money)
print('KPI4 客单价:',(total_money/total_ct))

print('==============================5.用户消费行为分析==================================')
# RFM模型
'''
    R:最近一次消费日期
'''
import datetime

print('============================R==========================')
R_DATA = kpi_df.groupby(by='CustomerID')[['InvoiceDate']].max()
R_DATA['天数'] = datetime.datetime.today()- R_DATA['InvoiceDate']
# step1:计算组距
max_time = R_DATA['天数'].max()
min_time = R_DATA['天数'].min()
R_ZJ = (max_time-min_time)/5
team1 = (min_time, min_time+R_ZJ)
team2 = (min_time+R_ZJ ,min_time+2*R_ZJ)
team3 = (min_time+2*R_ZJ, min_time+3*R_ZJ)
team4 = (min_time+3*R_ZJ, min_time+4*R_ZJ)
team5 = (min_time+4*R_ZJ, max_time)
R_DATA.loc[(R_DATA['天数']>=team1[0]) & (R_DATA['天数']<team1[1]), 'R'] = 5
R_DATA.loc[(R_DATA['天数']>=team2[0]) & (R_DATA['天数']<team2[1]), 'R'] = 4
R_DATA.loc[(R_DATA['天数']>=team3[0]) & (R_DATA['天数']<team3[1]), 'R'] = 3
R_DATA.loc[(R_DATA['天数']>=team4[0]) & (R_DATA['天数']<team4[1]), 'R'] = 2
R_DATA.loc[(R_DATA['天数']>=team5[0]) & (R_DATA['天数']<=team5[1]), 'R'] = 1
R_DATA['R_S'] = R_DATA['R'].mean()
R_DATA.loc[R_DATA['R']>=R_DATA['R_S'],'R价值评估'] = '高'
R_DATA.loc[R_DATA['R']<R_DATA['R_S'],'R价值评估'] = '低'
R_DATA['客户'] = R_DATA.index
'''
    F:消费频率
'''
print('============================F==========================')
F_DATA = kpi_df.groupby(by='CustomerID')[['CustomerID']].count()
max_ci = F_DATA['CustomerID'].max()
min_ci = F_DATA['CustomerID'].min()
F_ZJ = (max_ci-min_ci)/5
team1 = (min_ci, min_ci+F_ZJ)
team2 = (min_ci+F_ZJ ,min_ci+2*F_ZJ)
team3 = (min_ci+2*F_ZJ, min_ci+3*F_ZJ)
team4 = (min_ci+3*F_ZJ, min_ci+4*F_ZJ)
team5 = (min_ci+4*F_ZJ, max_ci)
F_DATA.loc[(F_DATA['CustomerID']>=team1[0]) & (F_DATA['CustomerID']<team1[1]),'F'] = 1
F_DATA.loc[(F_DATA['CustomerID']>=team2[0]) & (F_DATA['CustomerID']<team2[1]),'F'] = 2
F_DATA.loc[(F_DATA['CustomerID']>=team3[0]) & (F_DATA['CustomerID']<team3[1]),'F'] = 3
F_DATA.loc[(F_DATA['CustomerID']>=team4[0]) & (F_DATA['CustomerID']<team4[1]),'F'] = 4
F_DATA.loc[(F_DATA['CustomerID']>=team5[0]) & (F_DATA['CustomerID']<=team5[1]),'F'] = 5
F_DATA['F_S'] = F_DATA['F'].mean()
F_DATA.loc[F_DATA['F']>=F_DATA['F_S'],'F价值评估'] = '高'
F_DATA.loc[F_DATA['F']<F_DATA['F_S'],'F价值评估'] = '低'
F_DATA['客户'] = F_DATA.index

'''
    M:消费金额
'''
print('============================M==========================')
M_DATA = kpi_df.groupby(by='CustomerID')[['money']].sum()
max_money = M_DATA['money'].max()
min_money = M_DATA['money'].min()
M_ZJ = (max_money-min_money)/5
team1 = (min_money, min_money+M_ZJ)
team2 = (min_money+M_ZJ ,min_money+2*M_ZJ)
team3 = (min_money+2*M_ZJ, min_money+3*M_ZJ)
team4 = (min_money+3*M_ZJ, min_money+4*M_ZJ)
team5 = (min_money+4*M_ZJ, max_money)

M_DATA.loc[(M_DATA['money']>=team1[0]) & (M_DATA['money']<team1[1]),'M'] = 1
M_DATA.loc[(M_DATA['money']>=team2[0]) & (M_DATA['money']<team2[1]),'M'] = 2
M_DATA.loc[(M_DATA['money']>=team3[0]) & (M_DATA['money']<team3[1]),'M'] = 3
M_DATA.loc[(M_DATA['money']>=team4[0]) & (M_DATA['money']<team4[1]),'M'] = 4
M_DATA.loc[(M_DATA['money']>=team5[0]) & (M_DATA['money']<=team5[1]),'M'] = 5
M_DATA['M_S'] = M_DATA['M'].mean()

M_DATA.loc[M_DATA['M']>=M_DATA['M_S'],'M价值评估'] = '高'
M_DATA.loc[M_DATA['M']<M_DATA['M_S'],'M价值评估'] = '低'
M_DATA['客户'] = M_DATA.index

rf_data = pd.merge(R_DATA,F_DATA)
RFM = pd.merge(rf_data, M_DATA)
NB_CUS = RFM[(RFM['R价值评估'] == "高") & (RFM['F价值评估'] == "高") & (RFM['M价值评估'] == "高")]
print('高价值客户')
print(NB_CUS)

医院数据分析案例

医院数据分析案例
	分析的需求:
    a、每日消费趋势
    b、每月消费趋势
    c、药品的消费趋势
    d、客单价
    注意:同一天同一个用户,代表一次消费
    
数据处理
    1、列名重命名
        购药时间 -> 销售日期
    2、缺失值处理
    3、类型转换
        读取数据时,需要以object类型读取数据(原样显示数据)
        001616528 - > 1e+xx
        销售日期 -> 日期格式
        销售数量:float
        应收金额:float
        实收金额:float
    4、异常值的处理
        df[df[销售数量]>0]
    5、选择子集(不需要)
    6、排序
        按照销售日期进行排序,重新定义索引
数据建模(kpi)
1、每日销售金额趋势图
	x:销售时间
    y:实收金额
    plot(x,y)
 
2、每月销售金额趋势图
	销售时间的月份进行分组聚合
    1	4444
    2	2222
    3	4444
    4	2222
    ...
    X: [1,2,3,4...]
    Y: [XX,XX,XX...]
 3、客单价
	df['实收金额'] = xxx
    同一天同一个人算作一次消费
    drop_去重(set=['销售日期','社保卡号'])
    总金额/总的消费次数
    
4、药品的销售趋势图(销量在前十的药品,并绘图)
	对药品进行分组聚合,计算销量
    排序分析
    [:10]
    		 销量
    阿司匹林   30
    九九感冒林  20
    y = df[销售数量]
	x = 药名
    bar(x,y)

车型数据分析案例

车型数据分析
	5个文件
    1、百度车型的真实搜索指数数据
    2、城市的id-城市名
    3、城市车型搜索指数的比重
    4、省份的id-省份名
    5、省份车型搜索指数的比重
 需求:
	计算各省每一个月的每一种车型的真是搜索指数
    901	山东	宾智 12	1000
    	     宾智 11  300
        计算出每一种车型的真是搜索指数
	902	贵州
	903	江西
    
    计算出每一种车型的真是搜索指数
	
    a.通过百度表计算出各种类型每一个月的真实搜索指数
    
    缤智 1 123
        2 456
        3 789
        4 110
    [keyword,month][[_index]].sum()
     
    b.通过省份比重表,计算占比值
       [keyword,month][prov_index].sum()
        2222
        901  12 272
             1  111
             2  333
                

1、百度的真实搜索指数
2、省份搜索指数比重
	BMW  12月  广东  600
         1月   山东  500
         1月   广东  400 
         ...
分析:计算每一种汽车每一个月各省的搜索指数(真实的数据)
思路:
	根据真实搜索指数,计算其比重占得数据值
    1、BMW   110000
             25000
    2、计算比例值
       BMW  1月  广东  700   700/1800=0.3    10000*0.3=3000
            1月  山东  500
            1月  江苏  600
  		    、、、
      1月总比重=700+500+600=1800      
    
3、城市搜索指数比重
	BMW  12  广东 深圳  400   400/3000
         12  广东 广州  500
        ...
    BMW  12 广东  3000  20000



import pandas as pd
import os
'''
    根据真实搜索指数表,计算每一种汽车每一个月的真实数据
'''
os.chdir('车辆数据')
print('--------------------1、真实搜索数据---------------')
baidu_df = pd.read_excel('baidu_index_0625.xlsx')
print(baidu_df.head())
print(baidu_df.info())
print('----------------------------------------')
baidu_df.dropna(inplace=True)
'''
    apply() 数据处理用的比较常见的函数
def chuli(x):
    return x.strip().upper()
    
lambda 匿名函数
    参数:返回值
lambda x:x.strip().upper()
'''
baidu_df['keyword'] = baidu_df['keyword'].apply(lambda x: x.strip().upper())
print(baidu_df.head())
baidu_df['date'] = baidu_df['date'].dt.strftime('%B')
print(baidu_df['date'])
print('--------------------------------------')
# 计算每一种汽车每一个月的真实搜索指数
# 方式1:分组聚合
# 方式2:透视表
baidu_index = baidu_df.groupby(by=['keyword', 'date'])[['_index']].sum()
print(baidu_index.head(10))
# baidu_index = baidu_df.pivot_table(values=['_index'],index=['keyword',baidu_df['date'].dt.month], aggfunc ="sum",)
# print(baidu_index.head(10))
print('--------------------2、省份比重数据---------------')
prov_df = pd.read_excel('province_index_0625.xlsx')
print(prov_df.info())
print(prov_df.count())
print(prov_df.shape)
# 字段统一化、日期处理
prov_df['keyword'] = prov_df['keyword'].apply(lambda x: x.strip().upper())
prov_df['date'] = prov_df['date'].apply(lambda x: x.split("|")[0])
prov_df['date'] = pd.to_datetime(prov_df['date']).dt.strftime('%B')
# 按照汽车品牌、月份,计算总比重
prov_sum = prov_df.groupby(by=['keyword', 'date'])[['prov_index']].sum()
# 表关联
prov_index = pd.merge(prov_df, prov_sum, on=['keyword', 'date'])
# 计算出pct:比例值
prov_index['pct'] = prov_index['prov_index_x']/prov_index['prov_index_y']
# 将百度真实搜索指数merge
prov_index_final = pd.merge(prov_index, baidu_index, on=['keyword', 'date'])
# 计算省份真实搜索指数
prov_index_final['prov_index_final'] = prov_index_final['pct']*prov_index_final['_index']
# 省份名字
prov_id = pd.read_excel('province_id.xlsx')
prov_index_final = pd.merge(prov_index_final, prov_id, left_on='prov', right_on='id')
# prov_index_final.to_excel('prov_index_final.xlsx')

print('--------------------3、城市比重数据---------------')
city_df = pd.read_excel('city_index_0625.xlsx')
# 字段统一化、日期处理
city_df['keyword'] = city_df['keyword'].apply(lambda x:x.strip().upper())
city_df['date'] = city_df['date'].apply(lambda x:x.split("|")[0])
city_df['date'] = pd.to_datetime(city_df['date']).dt.strftime('%B')

city_index = city_df.groupby(by=['keyword', 'date', 'prov'])[['city_index']].sum()

city_index2 = pd.merge(city_df, city_index, on=['keyword', 'date', 'prov'])

city_index_final = pd.merge(city_index2, prov_index_final, on=['keyword', 'date', 'prov'])
city_index_final.to_excel('test.xlsx')
# pct
# 真实指数

数据分析流程

数据清洗

1、子集的选择(选择列、添加列)
	
2、类型转换

3、异常值处理

4、缺失值处理

5、列名重命名

6、数据排序

7、字段统一化
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值