简单数据分析
链接:数据集
提取码:ncu8
加载csv
- 原生的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")
- pandas 方式
import pandas as pd
df = pd.read_csv("data.csv",dtype="object")
- 调 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()
结论:
非流失用户中,绝大多数有剩余通话时间,基本上一半用户流量有少量剩余,一半用超少量流量
流失用户中,一部分用户流量用完,通话时间还剩很多,这部分用户可能偏向于喜欢上网;
一部分用户,通话时间用完了,流量还有很多,这部分则偏向于喜欢打电话;
还有一部分用户,通话 时间用完了,流量也超出了很多,这部分用户打电话,上网都很多