关于Gmail电子邮件使用数据分析
一、选题背景
随着时代的快速发展,互联网越来越发达,越来越多的人们开始抛弃传统的书信邮件,改用了电子邮件。电子邮件有很多的优点,例如发送邮件所需时间短,而且可以发送一些视频,图片还有链接,不怕丢失,操作简单不麻烦。电子邮件可以加深人与人之间的沟通,推进社会的发展。在公司里,上下级之间也通过电子邮件来完成一些工作事务,让公司运转得更加方便。我们可以从Gmail电子邮件数据集来分析电子邮件使用情况,对电子邮件更加了解。
二、大数据分析设计方案
1.本数据集的数据内容与数据特征分析
该数据集记录了近七万封电子邮件的详细信息,包括发出人、邮件种类、顾客定位、主题热度、邮件活动种类等信息,并记录了每一份邮件的状态、字数、是否包含链接或者图片等等具体情况。
字段名称 | 字段类型 | 字段说明 |
Email_ID | 字符型 | 邮件编码 |
Email_Type | 数值型 | 邮件类型 |
Subject_Hotness_Score |
数值型 | 主题热度 |
Email_Source_Type | 数值型 | 邮件发送方种类 |
Customer_Location | 字符型 | 潜在用户定位 |
Email_Campaign_Type | 数值型 | 邮件活动种类 |
Total_Past_Communications |
数值型 | 邮件来往次数 |
Time_Email_sent_Category |
数值型 | 发送邮件种类 |
Word_Count | 数值型 | 字数 |
Total_Links | 数值型 | 邮件含链接数 |
Total_Images | 数值型 | 邮件含图片数 |
Email_Status | 数值型 | 邮件状态 |
2.数据分析的课程设计方案概述
1.数据清洗:导入公开数据,查找缺省值,补充缺失值,对数值特征进处理
2.数据可视化:直方图、饼状图、分析电子邮件各个信息的具体情况,通过联合分布图、散点图、pairplot查看各个信息之间是否有联系,箱型图来查看是否有异常值的情况
三、数据分析的步骤
1.数据源
采用的数据源来自于爱数科平台
http://www.idatascience.cn/dataset-detail?table_id=100074
2.数据清洗
导入所需要的库
1 import warnings 2 warnings.filterwarnings("ignore") 3 import numpy as np 4 import pandas as pd 5 6 import matplotlib.pyplot as plt 7 import seaborn as sns 8 from pyecharts.charts import Bar 9 from pyecharts import options as opts 10 %matplotlib inline
导入数据集
1 data = pd.read_csv('F:/2023Python/email.csv')#导入数据 2 data.info()
查看前五条数据
对数值型变量进行统计
缺省值处理
1 #查找是否有缺省值 2 data.isnull().sum() 3 data = data.fillna(data.mean())#缺失数据填充 4 data['Customer_Location'] = data['Customer_Location'].fillna('none') 5 data.tail(10)#默认显示数据最后10行
数值特征化处理
1 num_features = [x for x in data.columns if data[x].dtype != object] 2 car_features = [x for x in data.columns if data[x].dtype == object] 3 num_features 4 car_features
3.数据可视化
1.不同邮件类型的发送量情况
1 pd.Series(data['Email_Type']).value_counts() 2 #value_counts 直接用来计算Series里面相同数据出现的频率 3 #通过直方图来研究不同邮件类型的发送量情况 4 plt.rcParams['font.sans-serif'] = ['SimHei'] 5 plt.rcParams['axes.unicode_minus'] = False 6 x1_lable = ('类型1') 7 x2_lable = ('类型2') 8 x1_number = [48866] 9 x2_number = [19487] 10 bar_width = 0.2 11 plt.bar(x=x1_lable, height=x1_number, width=bar_width, color=('#0066CC'),label=('类型1'),align='center') 12 plt.text('类型1',50000,'48866',va='center',ha='center') 13 plt.bar(x=x2_lable, height=x2_number, width=bar_width, color=('#339966'),label=('类型2'),align='center') 14 plt.text('类型2',21000,'19487',va='center',ha='center') 15 plt.legend() 16 plt.yticks(fontsize=16, color='#000000') 17 plt.title('两种不同邮件类型发送量情况') 18 plt.show() 19 #定义饼的标签 20 labels=['类型1','类型2'] 21 x=[48866,19487] 22 #饼状图分离 23 explode=(0.03,0.06) 24 plt.title("饼状图-两种不同邮件类型发送量情况") 25 plt.pie(x,labels=labels,autopct='%.1f%%',explode=explode)
通过两种类型的图观察到,人们在选择邮件类型的时候,大多数是选择第一种类型的邮件来发送占到了71.5%,而第二种类型的邮件却只有28.5%。
2.邮件所使用的主题的热度趋势
1 #通过直方图观察邮件所使用的主题的热度趋势 2 3 plt.figure(figsize=(15, 5)) 4 subject=pd.read_csv(open('F:\\2023Python\\email.csv')) 5 subject.head() 6 sns.distplot(subject.Subject_Hotness_Score,color='blue',label='主题热度') 7 my_x_ticks = np.arange(0,5,0.5) 8 plt.xticks(my_x_ticks) 9 plt.xlabel("主题") 10 plt.ylabel("热度") 11 plt.legend() 12 plt.grid() 13 plt.show()
观察图后,可以看到在主题的选择上人们更喜欢位置靠前的主题,人们在主题的选择上一般都选择前面的主题,并没有去花太多的时间去选择主题,而是选择了系统默认的主题,后面的主题只有少部分人会去选择。
3.邮件发送方男女分布情况
1 pd.Series(data['Email_Source_Type']).value_counts() 2 #value_counts 直接用来计算Series里面相同数据出现的频率 3 plt.rcParams['font.sans-serif'] = ['SimHei'] 4 plt.rcParams['axes.unicode_minus'] = False 5 x1_human = ('male') 6 x2_human = ('female') 7 x1_sum = [37149] 8 x2_sum = [31204] 9 bar_width = 0.2 10 plt.bar(x=x1_human, height=x1_sum, width=bar_width, color=('#99CCCC'),label=('male'),align='center') 11 plt.text('male',38000,'37149',va='center',ha='center') 12 plt.bar(x=x2_human, height=x2_sum, width=bar_width, color=('#FF6633'),label=('female'),align='center') 13 plt.text('female',32000,'31204',va='center',ha='center') 14 plt.legend() 15 plt.yticks(fontsize=16, color='#000000') 16 plt.title('邮件发送方男女分布情况') 17 plt.show() 18 #定义饼的标签 19 labels=['男性','女性'] 20 x=[37149,31204] 21 #饼状图分离 22 explode=(0.03,0.05) 23 plt.title("饼状图-邮件发送方男女分布情况") 24 plt.pie(x,labels=labels,autopct='%.1f%%',explode=explode)
通过两种类型图观察得到,在电子邮件的使用上男性与女性是差不多的,男性就比女性多了8.6%不会出现男性特别多,或者女性特别多这种情况。说明在生活中不管男性还是女性都在使用着电子邮件,享受着电子邮件的便利。
4.邮件编码的分析
1 pd.Series(data['Email_ID']).value_counts() 2 #value_counts 直接用来计算Series里面相同数据出现的频率
经过计算得到邮件编码等于邮件总数,所以每一份邮件都有属于它的独一无二的邮件编码。通过邮件编码可以来精确查到所需邮件,这体现了邮件编码的唯一性。
5.各类潜在用户分布
1 pd.Series(data['Customer_Location']).value_counts() 2 #value_counts 直接用来计算Series里面相同数据出现的频率 3 4 bar = Bar() 5 # 添加x轴坐标,括号中加入数据列表 6 bar.add_xaxis(['A类','B类','C类','D类','E类','F类','G类','其他类']) 7 # 添加y轴坐标,括号中加入数据列表 8 bar.add_yaxis("图注:潜在用户定位", [1454,4341,5758,7406,10193,4433,23173,11595]) 9 #标题配置项 10 bar.set_global_opts(title_opts=opts.TitleOpts( 11 title='各类潜在用户分布图' 12 )) 13 bar.render_notebook() 14 15 #定义饼的标签 16 labels=['A类','B类','C类','D类','E类','F类','G类','其他类'] 17 x=[1454,4341,5758,7406,10193,4433,23173,11595] 18 #饼状图分离 19 explode=(0.03,0.05,0.06,0.04,0.08,0.1,0.09,0.11) 20 plt.title("饼状图-潜在用户定位") 21 plt.pie(x,labels=labels,autopct='%.1f%%',explode=explode)
通过两种类型的图可以观察到Gmail把潜在用户分成了八类:(A类、B类、C类、D类、E类、F类、G类、其他类),其中G类是这几类中占比最多的,占了33.9%,A类最少,只占了2.1%,而那些其他类的却占了17.0%。
6.观察男女性在邮件类型和主题的选择上的情况
1 data_plot = data[['Email_Type','Subject_Hotness_Score','Email_Source_Type']] 2 data_plot 3 #把数值型变量转换成字符型变量 4 data_plot['Email_Source_Type'] = data_plot['Email_Source_Type'].map(str) 5 #为了方便观看,把列名换成中文的 6 data_plot.rename(columns={"Email_Type":"邮件类型", 7 "Subject_Hotness_Score":"主题热度", 8 "Email_Source_Type":"邮件发送方性别"},inplace=True) 9 kind_dict = { 10 "1":"male", 11 "2":"female" 12 } 13 data_plot["邮件发送方性别"]=data_plot["邮件发送方性别"].map(kind_dict) 14 data_plot.head()#修改后的数据集的内容如下 15 sns.pairplot(data_plot,hue="邮件发送方性别",markers=["s","D"])
通过上图的观察,我们可以得到在邮件类型的选择上第一种类型的邮件男性选择的更多,而第二种类型的邮件是女性的选择的更多,在主题的选择上男女性大多数都是选择前面的主题,后面的主题选的人比较少。
7.各类活动邮件的使用情况
1 pd.Series(data['Email_Campaign_Type']).value_counts() 2 #value_counts 直接用来计算Series里面相同数据出现的频率 3 4 plt.rcParams['font.sans-serif'] = ['SimHei'] 5 plt.rcParams['axes.unicode_minus'] = False 6 x1_type = ('1') 7 x2_type = ('2') 8 x3_type = ('3') 9 x1_ts = [736] 10 x2_ts = [48273] 11 x3_ts = [19344] 12 bar_width = 0.2 13 plt.bar(x=x1_type, height=x1_ts, width=bar_width, color=('#0066CC'),label=('1'),align='center') 14 plt.text('1',1200,'736',va='center',ha='center') 15 plt.bar(x=x2_type, height=x2_ts, width=bar_width, color=('#339966'),label=('2'),align='center') 16 plt.text('2',49500,'48273',va='center',ha='center') 17 plt.bar(x=x3_type, height=x3_ts, width=bar_width, color=('#ff0020'),label=('3'),align='center') 18 plt.text('3',21000,'19344',va='center',ha='center') 19 plt.legend() 20 plt.yticks(fontsize=16, color='#000000') 21 plt.title('各类活动邮件的使用情况') 22 plt.show() 23 24 #定义饼的标签 25 labels=['1类','2类','3类'] 26 x=[736,48273,19344] 27 #饼状图分离 28 explode=(0.03,0.05,0.06) 29 plt.title("饼状图-各类活动邮件的使用情况") 30 plt.pie(x,labels=labels,autopct='%.1f%%',explode=explode)
观察上面两种不同类型的图可以看出来,人们在选择活动邮件上特别偏爱选择第二类的活动邮件,占了三种活动邮件的70.6%,而第一类的活动邮件却少有人选择使用。
8.邮件来往次数分布
1 pd.Series(data['Total_Past_Communications']).value_counts() 2 #value_counts 直接用来计算Series里面相同数据出现的频率 3 4 data_etype=data[['Total_Past_Communications']] 5 plt.figure(figsize=(6,6)) 6 f = data_etype.boxplot(sym = 'o', 7 vert = True, 8 whis = 1.5, 9 patch_artist = True, 10 meanline = False,showmeans = True, 11 showbox = True, 12 showcaps = True, 13 showfliers = True, 14 notch =False, 15 return_type = 'dict') 16 plt.title('邮件来往次数分布') 17 for box in f['boxes']: #boxes,箱线 18 box.set(color = '#3333FF',linewidth=1) 19 box.set(facecolor = '#ff2000',alpha=0.5) 20 for whisker in f['whiskers']: #whiskers, 从box到error bar之间的竖线 21 whisker.set(color = '#66FF00',linewidth=0.5,linestyle='-') 22 for cap in f['caps']: # caps, error bar横线 23 cap.set(color='#FF6600',linewidth=2) 24 for median in f['medians']: # medians, 中位值的横线 25 median.set(color='#000000',linewidth=2) 26 for flier in f['fliers']: # fliers, 异常值 27 flier.set(marker='o',color='#FFFF00',alpha=0.5)
通过箱型图,我们可以知道在人们之间邮件往来次数还是挺多的,最高的可以达到67份邮件,大多数的人们邮件往来次数是在28、29次,0次出现的原因是因为数据集中该对象含有缺省值,进行缺省值补充时选择了0来补充。
9.观察邮件往来次数中主题的选择
1 #生成测试关系数据 2 data_st=data[['Total_Past_Communications','Subject_Hotness_Score']] 3 data_st.head(10) 4 sns.jointplot(x="Total_Past_Communications",y="Subject_Hotness_Score",data=data_st,color='r')
通过联合分布图,我们可以了解到在邮件往来次数比较少的时候人们还会去选择不同的主题来发送邮件,但随着邮件往来次数的增加,人们就不在过多时间去选择主题,对主题的热度下降了。这一种情况可能在工作中会出现的比较多。
10.不同发送邮件种类在主题的选择
1 pd.Series(data['Time_Email_sent_Category']).value_counts() 2 #value_counts 直接用来计算Series里面相同数据出现的频率 3 plt.figure(figsize=(20, 10)) 4 sns.pointplot(x = 'Subject_Hotness_Score', y = 'Total_Past_Communications', hue = 'Time_Email_sent_Category', data=data, 5 palette = 'hls', 6 dodge = True, #设置点是否分开 7 join = True, #是否连线 8 markers = ['o','x','+'],linestyles = ['-','--','--'],#设置点样式、线型 9 )
通过折线图,我们可以看到三种不同类型的发送邮件在主题的选择上都是一样的,大多数的邮件往来都是选择前面的主题,只有少部分的邮件会选择后面的主题。
11.邮件字数
1 #汇总邮件字数数据 2 word_message = data.groupby(['Word_Count']) 3 word_counts = word_message['Word_Count'].agg(['count']) 4 word_counts.reset_index(inplace=True) 5 wr = word_counts['Word_Count'] 6 v1 = word_counts['count'] 7 bar = Bar() 8 # 添加x轴坐标,括号中加入数据列表 9 bar.add_xaxis(list(wr)) 10 # 添加y轴坐标,括号中加入数据列表 11 bar.add_yaxis("图注:邮件字数分布",list(v1)) 12 #标题配置项 13 bar.set_global_opts(title_opts=opts.TitleOpts( 14 title='邮件字数分布' 15 ),datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")]) 16 bar.render_notebook()
经过分析,得到人们在写电子邮件时,会分情况来写多少字数,有的人会比较详细的描述事情,就会字数比较多,有的人只是想跟朋友分享美食、风景照片就会写得字数少。
12.邮件含链接数与含图片数的关系
1 #绘制散点图来观察邮件含链接数跟含图片数的关系 2 x=data[['Total_Images']] 3 y=data[['Total_Links']] 4 # 确定画布 5 plt.figure(figsize=(10, 6)) 6 7 plt.scatter(x, y)# x 代表x轴 y 代表y轴数据, 数据维度必须相同 8 plt.xlabel('含图片数') 9 plt.ylabel('含链接数') 10 plt.show()
通过散点图,我们可以看到邮件含链接数与含图片数有很大的关系,人们在发送邮件的时候插入图片,也会插入链接,这样做到防止图片无法查看时也可以通过链接来查看图片。
13.邮件的状态
1 pd.Series(data['Email_Status']).value_counts() 2 #value_counts 直接用来计算Series里面相同数据出现的频率 3 4 plt.rcParams['font.sans-serif'] = ['SimHei'] 5 plt.rcParams['axes.unicode_minus'] = False 6 x1_es = ('0') 7 x2_es = ('1') 8 x3_es = ('2') 9 x1_ec = [54941] 10 x2_ec = [11039] 11 x3_ec = [2373] 12 bar_width = 0.2 13 plt.bar(x=x1_es, height=x1_ec, width=bar_width, color=('#00FF00'),label=('0:成功接收'),align='center') 14 plt.text('0',56000,'54941',va='center',ha='center') 15 plt.bar(x=x2_es, height=x2_ec, width=bar_width, color=('#FF9900'),label=('1: 接收失败'),align='center') 16 plt.text('1',12000,'11039',va='center',ha='center') 17 plt.bar(x=x3_es, height=x3_ec, width=bar_width, color=('#33FFFF'),label=('2: 其他'),align='center') 18 plt.text('2',2600,'2373',va='center',ha='center') 19 plt.legend() 20 plt.yticks(fontsize=16, color='#000000') 21 plt.title('邮件状态') 22 plt.show() 23 24 #定义饼的标签 25 labels=['0:成功接收','1: 接收失败','2: 其他'] 26 x=[54941,11039,2373] 27 #饼状图分离 28 explode=(0.03,0.05,0.06) 29 plt.title("饼状图-邮件状态") 30 plt.pie(x,labels=labels,autopct='%.1f%%',explode=explode)
通过上面两种不同类型的图可以知道,电子邮件在使用时,也会出现一些错误,导致邮件的接收失败,所以人们在使用电子邮件时,还是要注意怎么才能正确使用电子邮件,让电子邮件可以成功发送出去。
四、程序源码
1 import numpy as np 2 import pandas as pd 3 import warnings 4 warnings.filterwarnings("ignore") 5 import matplotlib.pyplot as plt 6 import seaborn as sns 7 %matplotlib inline 8 data = pd.read_csv('F:/2023Python/email.csv')#导入数据 9 data.info() 10 data.shape 11 data.head()#显示前五条数据 12 data.describe()#对每个数值型变量进行统计信息 13 #查找是否有缺省值 14 data.isnull().sum() 15 data = data.fillna(data.mean())#缺失数据填充 16 data['Customer_Location'] = data['Customer_Location'].fillna('none') 17 data.tail(10)#默认显示数据最后10行 18 pd.Series(data['Email_Type']).value_counts() 19 #value_counts 直接用来计算Series里面相同数据出现的频率 20 num_features = [x for x in data.columns if data[x].dtype != object] 21 car_features = [x for x in data.columns if data[x].dtype == object] 22 num_features 23 car_features 24 #通过直方图来研究不同邮件类型的发送量情况 25 plt.rcParams['font.sans-serif'] = ['SimHei'] 26 plt.rcParams['axes.unicode_minus'] = False 27 x1_lable = ('类型1') 28 x2_lable = ('类型2') 29 x1_number = [48866] 30 x2_number = [19487] 31 bar_width = 0.2 32 plt.bar(x=x1_lable, height=x1_number, width=bar_width, color=('#0066CC'),label=('类型1'),align='center') 33 plt.text('类型1',50000,'48866',va='center',ha='center') 34 plt.bar(x=x2_lable, height=x2_number, width=bar_width, color=('#339966'),label=('类型2'),align='center') 35 plt.text('类型2',21000,'19487',va='center',ha='center') 36 plt.legend() 37 plt.yticks(fontsize=16, color='#000000') 38 plt.title('两种不同邮件类型发送量情况') 39 plt.show() 40 #定义饼的标签 41 labels=['类型1','类型2'] 42 x=[48866,19487] 43 #饼状图分离 44 explode=(0.03,0.06) 45 plt.title("饼状图-两种不同邮件类型发送量情况") 46 plt.pie(x,labels=labels,autopct='%.1f%%',explode=explode) 47 48 #通过直方图观察邮件所使用的主题的热度趋势 49 50 plt.figure(figsize=(15, 5)) 51 subject=pd.read_csv(open('F:\\2023Python\\email.csv')) 52 subject.head() 53 sns.distplot(subject.Subject_Hotness_Score,color='blue',label='主题热度') 54 my_x_ticks = np.arange(0,5,0.5) 55 plt.xticks(my_x_ticks) 56 plt.xlabel("主题") 57 plt.ylabel("热度") 58 plt.legend() 59 plt.grid() 60 plt.show() 61 pd.Series(data['Email_Source_Type']).value_counts() 62 #value_counts 直接用来计算Series里面相同数据出现的频率 63 plt.rcParams['font.sans-serif'] = ['SimHei'] 64 plt.rcParams['axes.unicode_minus'] = False 65 x1_human = ('male') 66 x2_human = ('female') 67 x1_sum = [37149] 68 x2_sum = [31204] 69 bar_width = 0.2 70 plt.bar(x=x1_human, height=x1_sum, width=bar_width, color=('#0066CC'),label=('male'),align='center') 71 plt.text('male',38000,'37149',va='center',ha='center') 72 plt.bar(x=x2_human, height=x2_sum, width=bar_width, color=('#339966'),label=('female'),align='center') 73 plt.text('female',32000,'31204',va='center',ha='center') 74 plt.legend() 75 plt.yticks(fontsize=16, color='#000000') 76 plt.title('邮件发送方男女分布情况') 77 plt.show() 78 #定义饼的标签 79 labels=['男性','女性'] 80 x=[37149,31204] 81 #饼状图分离 82 explode=(0.03,0.05) 83 plt.title("饼状图-邮件发送方男女分布情况") 84 plt.pie(x,labels=labels,autopct='%.1f%%',explode=explode) 85 pd.Series(data['Email_ID']).value_counts() 86 #value_counts 直接用来计算Series里面相同数据出现的频率 87 pd.Series(data['Customer_Location']).value_counts() 88 #value_counts 直接用来计算Series里面相同数据出现的频率 89 #定义饼的标签 90 labels=['A类','B类','C类','D类','E类','F类','G类','其他类'] 91 x=[1454,4341,5758,7406,10193,4433,23173,11595] 92 #饼状图分离 93 explode=(0.03,0.05,0.06,0.04,0.08,0.1,0.09,0.11) 94 plt.title("饼状图-潜在用户定位") 95 plt.pie(x,labels=labels,autopct='%.1f%%',explode=explode) 96 from pyecharts.charts import Bar 97 from pyecharts import options as opts 98 99 bar = Bar() 100 # 添加x轴坐标,括号中加入数据列表 101 bar.add_xaxis(['A类','B类','C类','D类','E类','F类','G类','其他类']) 102 # 添加y轴坐标,括号中加入数据列表 103 bar.add_yaxis("图注:潜在用户定位", [1454,4341,5758,7406,10193,4433,23173,11595]) 104 #标题配置项 105 bar.set_global_opts(title_opts=opts.TitleOpts( 106 title='各类潜在用户分布图' 107 )) 108 bar.render_notebook() 109 data_plot = data[['Email_Type','Subject_Hotness_Score','Email_Source_Type']] 110 data_plot 111 #把数值型变量转换成字符型变量 112 data_plot['Email_Source_Type'] = data_plot['Email_Source_Type'].map(str) 113 #为了方便观看,把列名换成中文的 114 data_plot.rename(columns={"Email_Type":"邮件类型", 115 "Subject_Hotness_Score":"主题热度", 116 "Email_Source_Type":"邮件发送方性别"},inplace=True) 117 kind_dict = { 118 "1":"male", 119 "2":"female" 120 } 121 data_plot["邮件发送方性别"]=data_plot["邮件发送方性别"].map(kind_dict) 122 data_plot.head()#修改后的数据集的内容如下 123 sns.pairplot(data_plot,hue="邮件发送方性别",markers=["s","D"]) 124 pd.Series(data['Email_Campaign_Type']).value_counts() 125 #value_counts 直接用来计算Series里面相同数据出现的频率 126 plt.rcParams['font.sans-serif'] = ['SimHei'] 127 plt.rcParams['axes.unicode_minus'] = False 128 x1_type = ('1') 129 x2_type = ('2') 130 x3_type = ('3') 131 x1_ts = [736] 132 x2_ts = [48273] 133 x3_ts = [19344] 134 bar_width = 0.2 135 plt.bar(x=x1_type, height=x1_ts, width=bar_width, color=('#0066CC'),label=('1'),align='center') 136 plt.text('1',1200,'736',va='center',ha='center') 137 plt.bar(x=x2_type, height=x2_ts, width=bar_width, color=('#339966'),label=('2'),align='center') 138 plt.text('2',49500,'48273',va='center',ha='center') 139 plt.bar(x=x3_type, height=x3_ts, width=bar_width, color=('#ff0020'),label=('3'),align='center') 140 plt.text('3',21000,'19344',va='center',ha='center') 141 plt.legend() 142 plt.yticks(fontsize=16, color='#000000') 143 plt.title('各类活动邮件的使用情况') 144 plt.show() 145 #定义饼的标签 146 labels=['1类','2类','3类'] 147 x=[736,48273,19344] 148 #饼状图分离 149 explode=(0.03,0.05,0.06) 150 plt.title("饼状图-各类活动邮件的使用情况") 151 plt.pie(x,labels=labels,autopct='%.1f%%',explode=explode) 152 153 pd.Series(data['Total_Past_Communications']).value_counts() 154 #value_counts 直接用来计算Series里面相同数据出现的频率 155 data_etype=data[['Total_Past_Communications']] 156 plt.figure(figsize=(6,6)) 157 f = data_etype.boxplot(sym = 'o', 158 vert = True, 159 whis = 1.5, 160 patch_artist = True, 161 meanline = False,showmeans = True, 162 showbox = True, 163 showcaps = True, 164 showfliers = True, 165 notch =False, 166 return_type = 'dict') 167 plt.title('活动邮件种类的数据分布') 168 for box in f['boxes']: #boxes,箱线 169 box.set(color = '#3333FF',linewidth=1) 170 box.set(facecolor = '#ff2000',alpha=0.5) 171 for whisker in f['whiskers']: #whiskers, 从box到error bar之间的竖线 172 whisker.set(color = '#66FF00',linewidth=0.5,linestyle='-') 173 for cap in f['caps']: # caps, error bar横线 174 cap.set(color='#FF6600',linewidth=2) 175 for median in f['medians']: # medians, 中位值的横线 176 median.set(color='#000000',linewidth=2) 177 for flier in f['fliers']: # fliers, 异常值 178 flier.set(marker='o',color='#FFFF00',alpha=0.5) 179 #生成测试关系数据 180 data_st=data[['Total_Past_Communications','Subject_Hotness_Score']] 181 data_st.head(10) 182 sns.jointplot(x="Total_Past_Communications",y="Subject_Hotness_Score",data=data_st,color='r') 183 pd.Series(data['Time_Email_sent_Category']).value_counts() 184 #value_counts 直接用来计算Series里面相同数据出现的频率 185 plt.rcParams['font.sans-serif'] = ['SimHei'] 186 plt.rcParams['axes.unicode_minus'] = False 187 x1_sent = ('1') 188 x2_sent = ('2') 189 x3_sent = ('3') 190 x1_tc = [13636] 191 x2_tc = [41129] 192 x3_tc = [13588] 193 bar_width = 0.2 194 plt.bar(x=x1_sent, height=x1_tc, width=bar_width, color=('#0066CC'),label=('1'),align='center') 195 plt.text('1',15000,'13636',va='center',ha='center') 196 plt.bar(x=x2_sent, height=x2_tc, width=bar_width, color=('#339966'),label=('2'),align='center') 197 plt.text('2',42000,'41129',va='center',ha='center') 198 plt.bar(x=x3_sent, height=x3_tc, width=bar_width, color=('#ff0020'),label=('3'),align='center') 199 plt.text('3',15000,'13588',va='center',ha='center') 200 plt.legend() 201 plt.yticks(fontsize=16, color='#000000') 202 plt.title('发送邮件种类使用情况') 203 plt.show() 204 #定义饼的标签 205 labels=['1','2','3'] 206 x=[13636,41129,13588] 207 #饼状图分离 208 explode=(0.03,0.05,0.06) 209 plt.title("饼状图-发送邮件种类使用情况") 210 plt.pie(x,labels=labels,autopct='%.1f%%',explode=explode) 211 212 plt.figure(figsize=(20, 10)) 213 sns.pointplot(x = 'Subject_Hotness_Score', y = 'Total_Past_Communications', hue = 'Time_Email_sent_Category', data=data, 214 palette = 'hls', 215 dodge = True, #设置点是否分开 216 join = True, #是否连线 217 markers = ['o','x','+'],linestyles = ['-','--','--'],#设置点样式、线型 218 ) 219 #汇总邮件字数数据 220 word_message = data.groupby(['Word_Count']) 221 word_counts = word_message['Word_Count'].agg(['count']) 222 word_counts.reset_index(inplace=True) 223 wr = word_counts['Word_Count'] 224 v1 = word_counts['count'] 225 bar = Bar() 226 # 添加x轴坐标,括号中加入数据列表 227 bar.add_xaxis(list(wr)) 228 # 添加y轴坐标,括号中加入数据列表 229 bar.add_yaxis("图注:邮件字数分布",list(v1)) 230 #标题配置项 231 bar.set_global_opts(title_opts=opts.TitleOpts( 232 title='邮件字数分布' 233 ),datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")]) 234 bar.render_notebook() 235 #汇总邮件含链接数数据 236 total_message = data.groupby(['Total_Links']) 237 total_links = total_message['Total_Links'].agg(['count']) 238 total_links.reset_index(inplace=True) 239 tr = total_links['Total_Links'] 240 v1 = total_links['count'] 241 bar = Bar() 242 # 添加x轴坐标,括号中加入数据列表 243 bar.add_xaxis(list(tr)) 244 # 添加y轴坐标,括号中加入数据列表 245 bar.add_yaxis("图注:邮件含链接数分布",list(v1)) 246 #标题配置项 247 bar.set_global_opts(title_opts=opts.TitleOpts( 248 title='邮件含链接数分布' 249 ),datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")]) 250 bar.render_notebook() 251 #汇总邮件含图片数数据 252 total_message = data.groupby(['Total_Images']) 253 total_images = total_message['Total_Images'].agg(['count']) 254 total_images.reset_index(inplace=True) 255 tir = total_images['Total_Images'] 256 v1 = total_images['count'] 257 bar = Bar() 258 # 添加x轴坐标,括号中加入数据列表 259 bar.add_xaxis(list(tir)) 260 # 添加y轴坐标,括号中加入数据列表 261 bar.add_yaxis("图注:邮件含图片数分布",list(v1)) 262 #标题配置项 263 bar.set_global_opts(title_opts=opts.TitleOpts( 264 title='邮件含图片数分布' 265 ),datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")]) 266 bar.render_notebook() 267 #绘制散点图来观察邮件含链接数跟含图片数的关系 268 x=data[['Total_Images']] 269 y=data[['Total_Links']] 270 # 确定画布 271 plt.figure(figsize=(10, 6)) 272 273 plt.scatter(x, y)# x 代表x轴 y 代表y轴数据, 数据维度必须相同 274 plt.xlabel('含图片数') 275 plt.ylabel('含链接数') 276 plt.show() 277 pd.Series(data['Email_Status']).value_counts() 278 #value_counts 直接用来计算Series里面相同数据出现的频率 279 plt.rcParams['font.sans-serif'] = ['SimHei'] 280 plt.rcParams['axes.unicode_minus'] = False 281 x1_es = ('0') 282 x2_es = ('1') 283 x3_es = ('2') 284 x1_ec = [54941] 285 x2_ec = [11039] 286 x3_ec = [2373] 287 bar_width = 0.2 288 plt.bar(x=x1_es, height=x1_ec, width=bar_width, color=('#00FF00'),label=('0:成功接收'),align='center') 289 plt.text('0',56000,'54941',va='center',ha='center') 290 plt.bar(x=x2_es, height=x2_ec, width=bar_width, color=('#FF9900'),label=('1: 接收失败'),align='center') 291 plt.text('1',12000,'11039',va='center',ha='center') 292 plt.bar(x=x3_es, height=x3_ec, width=bar_width, color=('#33FFFF'),label=('2: 其他'),align='center') 293 plt.text('2',2600,'2373',va='center',ha='center') 294 plt.legend() 295 plt.yticks(fontsize=16, color='#000000') 296 plt.title('邮件状态') 297 plt.show() 298 #定义饼的标签 299 labels=['0:成功接收','1: 接收失败','2: 其他'] 300 x=[54941,11039,2373] 301 #饼状图分离 302 explode=(0.03,0.05,0.06) 303 plt.title("饼状图-邮件状态") 304 plt.pie(x,labels=labels,autopct='%.1f%%',explode=explode)
五、总结
经过以上数据集的分析,可以知道电子邮件在人们的生活中使用是很便利的,不仅仅是在工作中使用电子邮件,在日常休息中也使用着电子邮件,人们越来越依赖于电子邮件,之间的交流合作也会越来越多。但人们对电子邮件的正确使用还是有待提高,减少一些错误操作可以让邮件使用的更加顺手。人们对于电子邮件主题的选择还是没有太多的要求,大多数都选择了系统默认的主题,少部分人对主题感兴趣。
在这次的课程设计中,我认识到了我对于python知识的了解还是不够多,对于数据可视化还是有一些问题,但经过上网查找资料解决了问题,让我对python产生了强烈的兴趣,在以后的日子里,我会学习更多与python相关的知识技术,让我的python技术得到提高。
标签:数据分析,plt,bar,center,width,电子邮件,data,邮件,Gmail From: https://www.cnblogs.com/glhh/p/16999851.html