简单数据分析案例

链接:数据集
提取码:ncu8

加载csv

  1. 原生的python方式
import numpy as np

def load_data(filepath):
    """
        加载csv数据
        filepath: 文件路径,str
        return data: 2dim array
        
    """
    if filepath.endswith(".csv"):
        
        #打开文件
        f = open(filepath,"r")
        
        #遍历每一行
        header = []
        temp = []
        for idx,line in enumerate(f.readlines()):
            
            #第一行为表头
            if idx == 0:
                #line.strip() 去除两端的空格,\n也会去
                header.extend(line[:-1].split(","))
                
            else:
                #去除末尾的换行符
                temp.append(tuple(line[:-1].split(",")))
                
        #混合数据类型  必须是元组形式
        data = np.array(temp,dtype={
    
    "names":header,"formats":["f4","f4","f4","f4","f4","f4"]})

        return data
    else:
        raise ValueError("数据格式不是csv")
  1. pandas 方式
import pandas as pd
df = pd.read_csv("data.csv",dtype="object")
  1. 调 csv 包
import csv
f = open("data.csv","r")
reader = csv.reader(f)
for line in reader:
	print(line)

#line 是一个列表,不用自己划分每个值

统计最小、最大、平均值

#统计剩余通话时间、剩余流量、使用的月数 min max mean std
    time_left = data["extra_time"]
    flow_left = data["extra_flow"]
    month_used = data["use_month"]
    
    print("剩余通话:min %.2f max %.2f mean %.2f std %.2f"%(time_left.min(),\
                                                       time_left.max(),\
                                                       time_left.mean(),\
                                                       time_left.std()))
    print("剩余流量:min %.2f max %.2f mean %.2f std %.2f"%(flow_left.min(),\
                                                       flow_left.max(),\
                                                       flow_left.mean(),\
                                                       flow_left.std()))
    print("使用月数:min %.2f max %.2f mean %.2f std %.2f"%(month_used.min(),\
                                                       month_used.max(),\
                                                       month_used.mean(),\
                                                       month_used.std()))
    

统计有剩余通话,流量的用户占比

#统计通话、流量有剩余的占比
    has_time_rate = len(data[data["extra_time"]>0])/len(data)
    has_flow_rate = len(data[data["extra_flow"]>0])/len(data)
    print("\n")
    print("还有通话时间用户的占比:",has_time_rate)
    print("还有流量的用户占比:",has_flow_rate)
    #普遍对流量的使用比较多

统计每一种套餐的占比

#统计每一种套餐的用户占比
    pack1 = len(data[data["pack_type"] == 1]) / len(data)
    pack2 = len(data[data["pack_type"] == 2]) / len(data)
    pack3 = len(data[data["pack_type"] == 3]) / len(data)
    print("\n")
    print("套餐1用户占比:",pack1)
    print("套餐2用户占比:",pack2)
    print("套餐3用户占比:",pack3)

统计extra_flow vs loss

#分析extra_flow vs loss
    from matplotlib import pyplot as plt
   
    extra_flow_ = data["extra_flow"]
    loss_ = data["loss"]
    
    extra_flow_loss = extra_flow_[loss_ == 1]
    extra_flow_not_loss = extra_flow_[loss_ == 0]
    
#    plt.figure("extra_flow vs loss",facecolor="lightblue")
#    plt.title("extra_flow vs loss",fontsize=24)
    plt.rcParams["font.sans-serif"] = ["SimHei"]
    plt.rcParams["axes.unicode_minus"] = False
    
    #绘制流失用户
    fig,axes = plt.subplots(1,2,sharex=True,sharey=True,figsize=(8,6),facecolor="lightblue")
    axes[0].hist(extra_flow_loss,bins=10,normed=True,histtype="bar",color="orange")
    axes[0].set_title("流失用户的剩余流量",fontsize=20)
    
    #绘制非流失用户
#    fig,axes = plt.subplots(1,2,sharex=True,sharey=True,figsize=(8,6),facecolor="lightblue")
    axes[1].hist(extra_flow_not_loss,bins=10,normed=True,histtype="bar",color="lightgreen")
    axes[1].set_title("非流失用户的剩余流量",fontsize=20)

    plt.tight_layout()
    plt.show()

在这里插入图片描述
纵坐标 为相对频率—频率/组距

结论:
流失用户中,绝大多数用户流量已经用完,少数用户已用超
非流失用户中,一大半用户流量用超,小半的用户流量有剩余

也可以extra_flow为横轴,以loss 为纵轴,画散点图分析

统计extra_time vs loss

from matplotlib import pyplot as plt
   
    extra_time_ = data["extra_time"]
    loss_ = data["loss"]
    
    extra_time_loss = extra_time_[loss_ == 1]
    extra_time_not_loss = extra_time_[loss_ == 0]
    
#    plt.figure("extra_flow vs loss",facecolor="lightblue")
#    plt.title("extra_flow vs loss",fontsize=24)
    plt.rcParams["font.sans-serif"] = ["SimHei"]
    plt.rcParams["axes.unicode_minus"] = False
    
    #绘制流失用户
    fig,axes = plt.subplots(1,2,sharex=True,sharey=True,figsize=(8,6),facecolor="lightblue")
    r1 = axes[0].hist(extra_time_loss,bins=10,density=True,histtype="bar",color="orange")
    
    #获取相对频率,计算频率
    group_range = r1[1][-1]-r1[1][-2]
    f1 = r1[0]*(group_range)
    for idx,f in enumerate(f1):
        axes[0].annotate(r"%1.f%%"%(f*100),xy=(r1[1][idx],r1[0][idx]+0.000005),xycoords="data",xytext=(0,0),textcoords="offset points",fontsize=20,arrowprops=dict(arrowstyle="->",connectionstyle="angle3"))
    
    axes[0].set_title("流失用户的剩余通话",fontsize=20)
    
    #绘制非流失用户
#    fig,axes = plt.subplots(1,2,sharex=True,sharey=True,figsize=(8,6),facecolor="lightblue")
    r2 = axes[1].hist(extra_time_not_loss,bins=10,density=True,histtype="bar",color="lightgreen")
    
    #计算频率
    group_range = r2[1][-1]-r2[1][-2]
    f2 = r2[0]*(group_range)
    for idx,f in enumerate(f2):
        axes[1].annotate(r"%1.f%%"%(f*100),xy=(r2[1][idx],r2[0][idx]+0.000005),xycoords="data",xytext=(0,0),textcoords="offset points",fontsize=20,arrowprops=dict(arrowstyle="->",connectionstyle="angle3"))
    axes[1].set_title("非流失用户的剩余时间",fontsize=20)

    plt.tight_layout()
#    print(r1)
#    print(r2)
    plt.show()	 

在这里插入图片描述
结论:
流失用户中,约73%的用户通话时间已用超,约27%的用户通话时间有剩余
非流失用户中,约88%的用户通话时间有 剩余

loss vs (extra_time,extra_flow)

extra_time = data["extra_time"]
    extra_flow = data["extra_flow"]
    loss = data["loss"]
    
    from matplotlib import pyplot as plt
    plt.rcParams["font.sans-serif"] = ["SimHei"]
    plt.rcParams["axes.unicode_minus"] = False
    
    fig,axes = plt.subplots(1,2,sharex=True,sharey=True,figsize=(8,6),facecolor="lightblue")
    colors = ["g","r"]
    txt = ["非流失","流失"]
    for i in range(2):
        axes[i].scatter(extra_time[loss==i],extra_flow[loss==[i]],s=100,c=colors[i],marker="*",edgecolors=None,label=txt[i])
        axes[i].set_title(txt[i],fontsize=20)
        axes[i].set_xlabel("剩余通话",fontsize=20)
        axes[i].set_ylabel("剩余流量",fontsize=20)
        
        ###设置网格 图例
        axes[i].grid()
        axes[i].legend()
    
    plt.show()

在这里插入图片描述
结论:
非流失用户中,绝大多数有剩余通话时间,基本上一半用户流量有少量剩余,一半用超少量流量
流失用户中,一部分用户流量用完,通话时间还剩很多,这部分用户可能偏向于喜欢上网;
一部分用户,通话时间用完了,流量还有很多,这部分则偏向于喜欢打电话;
还有一部分用户,通话 时间用完了,流量也超出了很多,这部分用户打电话,上网都很多

猜你喜欢

转载自blog.csdn.net/weixin_45228198/article/details/114398164
今日推荐