




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python程序设计工作手册式教材教案专业名称:课程名称:Python程序设计任课班级:教师姓名:所属院系:职称:课时:64使用教材:
情景一获取电子商务数据教学课题电子商务爬虫基础序号1课时2教学手段多媒体、板书、实训室教学方法讲授法、演示法、案例法教学课型□理论□实训√一体化□(其它)教学目标能力目标:了解urllib、Requests后,抓取一个静态网页并保存。知识目标:认识网络爬虫、了解基于urllib库的网络爬虫和应用范围。素质目标:接受新知识、自主学习的能力。教学重点urllib模块教学难点request的构造方法教学过程设计备注一、电子商务数据获取方法概述介绍数据相关知识;介绍电子商务爬虫的作用;介绍爬虫框架以及爬虫的限制等。二、教学内容(一)爬虫的流程爬虫就是一个获取网页的自动化程序。1.获取网页爬虫首先要做的工作就是获取网页,这里就是获取网页的源代码。源代码里包含了网页的部分有用信息,所以只要把源代码获取下来,就可以从中提取想要的信息了。2.提取信息获取网页的源代码后,接下来就是分析网页的源代码,从中提取我们想要的数据。首先,最通用的方法便是采用正则表达式提取,这是一个万能的方法,但是在构造正则表达式时比较复杂且容易出错。3.保存数据提取信息后,我们一般会将提取到的数据保存到某处以便后续使用。这里保存形式有多种多样,如可以简单保存为TXT文本或JSON文本,也可以保存到数据库,如MySQL和MongoDB等,还可保存至远程服务器,如借助SFTP进行操作等。4.自动化程序说到自动化程序,意思是说爬虫可以代替人来完成这些操作。(二)能爬怎样的数据在网页中都有各自的URL,是基于HTTP或HTTPS协议的,只要是这种数据,爬虫都可以抓取。1.urllib模块Pythonurllib库用于操作网页URL,并对网页的内容进行抓取处理。urllib库的基本模块如图7-1所示。图7-1urllib库模块urllib每个模块的基本功能如表7-1所示。表7-1urllib模块功能序号方法功能1urllib.request打开和读取URL2urllib.error包含urllib.request抛出的异常3urllib.parse解析URL4urllib.robotparser解析robots.txt文件(1)发送请求使用urllib的request模块,可以方便地实现请求的发送并得到响应。urlopenurllib.request模块提供了最基本的构造HTTP请求的方法。格式:urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)参数说明data参数是可选的。如果要添加该参数,需要使用
bytes
方法将参数转化为字节流编码格式的内容,即
bytes
类型。另外,如果传递了这个参数,则它的请求方式就不再是GET方式,而是POST方式。【实例】读取重庆城市职业学院主页html源码fromurllib.requestimporturlopenmyURL=urlopen("/")print(myURL.read().decode('utf-8'))运行结果如图7-2所示。图7-2读取主页html源码的运行结果每次调用urllib.requests请求方法之后,会返回一个response对象,该对象包含了具体的响应信息如表7-2所示。表7-2响应信息属性或方法说明apparent_encoding编码方式close()关闭与服务器的连接content返回响应的内容,以字节为单位cookies返回一个CookieJar对象,包含了从服务器发回的cookieelapsed返回一个timedelta对象,包含了从发送请求到响应到达之间经过的时间量,可以用于测试响应速度。比如r.elapsed.microseconds表示响应到达需要多少微秒。encoding解码r.text的编码方式headers返回响应头,字典格式history返回包含请求历史的响应对象列表(url)is_permanent_redirect如果响应是永久重定向的url,则返回True,否则返回Falseis_redirect如果响应被重定向,则返回True,否则返回Falseiter_content()迭代响应iter_lines()迭代响应的行json()返回结果的JSON对象(结果需要以JSON格式编写的,否则会引发错误)links返回响应的解析头链接next返回重定向链中下一个请求的PreparedRequest对象ok检查"status_code"的值,如果小于400,则返回True,如果不小于400,则返回Falseraise_for_status()如果发生错误,方法返回一个HTTPError对象reason响应状态的描述,比如"NotFound"或"OK"request返回请求此响应的请求对象status_code返回http的状态码,比如404和200(200是OK,404是NotFound)text返回响应的内容,unicode类型数据url返回响应的URLRequest利用
urlopen
方法可以实现最基本请求的发起,但这几个简单的参数并不足以构建一个完整的请求。更多说明参考官方文档/3/library/urllib.request.html。Request常见方法如表7-3所示。表7-3Request常见方法方法描述delete(url,
args)发送DELETE请求到指定urlget(url,
params,args)发送GET请求到指定urlhead(url,
args)发送HEAD请求到指定urlpatch(url,
data,args)发送PATCH请求到指定urlpost(url,
data,json,args)发送POST请求到指定urlput(url,
data,args)发送PUT请求到指定urlrequest(method,
url,
args)向指定的url发送指定的请求方法【实例】使用request读取重庆城市职业学院主页html代码importurllib.requestrequest=urllib.request.Request('/')response=urllib.request.urlopen(request)print(response.read().decode('utf-8'))Request的构造方法如下:classurllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)第一个参数
url
用于请求URL,这是必传参数,其他都是可选参数。第二个参数
data
如果要传,必须传
bytes(字节流)类型的。如果它是字典,可以先用
urllib.parse
模块里的
urlencode()
编码。第三个参数
headers
是一个字典,它就是请求头。我们在构造请求时,既可以通过
headers
参数直接构造,也可以通过调用请求实例的
add_header()
方法添加。添加请求头最常用的方法就是通过修改
User-Agent
来伪装浏览器。默认的
User-Agent
是
Python-urllib,可以通过修改它来伪装浏览器。第四个参数
origin_req_host
指的是请求方的host名称或者IP地址。第五个参数
unverifiable
表示这个请求是否是无法验证的,默认是
False,表示用户没有足够权限来选择接收这个请求的结果。第六个参数
method
是一个字符串,用来指示请求使用的方法,比如GET、POST和PUT等。【实例】利用测试网站检测post方法fromurllibimportrequest,parseurl='/post'headers={'User-Agent':'Mozilla/4.0(compatible;MSIE5.5;WindowsNT)','Host':''}dict={'name':'germey'}data=bytes(parse.urlencode(dict),encoding='utf-8')req=request.Request(url=url,data=data,headers=headers,method='POST')response=request.urlopen(req)print(response.read().decode('utf-8'))(2)处理异常urllib的error模块定义了由request模块产生的异常。如果出现了问题,request模块便会抛出error模块中定义的异常。URLErrorURLError
类来自urllib库的error模块,它继承自
OSError
类,是error异常模块的基类,由request模块产生的异常都可以通过捕获这个类来处理。它具有一个属性
reason,即返回错误的原因。【实例】用测试网站捕获异常importsocketimporturllib.requestimporturllib.errortry:response=urllib.request.urlopen('/get',timeout=0.1)excepturllib.error.URLErrorase:ifisinstance(e.reason,socket.timeout):print('TIMEOUT')(3)解析链接urllib.parse模块,它定义了处理URL的标准接口。urlparse该方法可以实现URL的识别和分段。fromurllib.parseimporturlparseresult=urlparse('/index.html;user?id=5#comment')print(type(result))print(result)urlparse
方法拆分成了6个部分。大体观察可以发现,解析时有特定的分隔符。比如,://
前面的就是
scheme,代表协议;第一个
/
符号前面便是
netloc,即域名,后面是
path,即访问路径;分号
;
后面是
params,代表参数;问号
?
后面是查询条件
query,一般用作GET类型的URL;井号
#
后面是锚点,用于直接定位页面内部的下拉位置。urlunparse有了
urlparse
方法,相应地就有了它的对立方法
urlunparse。它接收的参数是一个可迭代对象,但是它的长度必须是6,否则会抛出参数数量不足或者过多的问题。fromurllib.parseimporturlunparsedata=['https','','index.html','user','a=6','comment']print(urlunparse(data))运行结果如下:/index.html;user?a=6#comment这样我们就成功实现了URL的构造。urlsplit这个方法和
urlparse
方法非常相似,只不过它不再单独解析
params
这一部分,只返回5个结果。urlunsplit与
urlunparse
方法类似,它也是将链接各个部分组合成完整链接的方法,传入的参数也是一个可迭代对象,例如列表、元组等,唯一的区别是长度必须为5。urljoin有了
urlunparse
和
urlunsplit
方法,我们可以完成链接的合并,不过前提是必须要有特定长度的对象,链接的每一部分都要清晰分开。urlencode它在构造GET请求参数的时候非常有用。fromurllib.parseimporturlencodeparams={'name':'germey','age':25}base_url='?'url=base_url+urlencode(params)print(url)这里首先声明一个字典来将参数表示出来,然后调用
urlencode
方法将其序列化为GET请求参数。运行结果如下:?name=germey&age=25有时为了更加方便地构造参数,我们会事先用字典来表示。要转化为URL的参数时,只需要调用该方法即可。parse_qs有了序列化,必然就有反序列化。如果我们有一串GET请求参数,利用
parse_qs
方法,就可以将它转回字典。fromurllib.parseimportparse_qsquery='name=germey&age=25'print(parse_qs(query))parse_qsl另外,还有一个
parse_qsl
方法,它用于将参数转化为元组组成的列表。fromurllib.parseimportparse_qslquery='name=germey&age=25'print(parse_qsl(query))quote该方法可以将内容转化为URL编码的格式。URL中带有中文参数时,有时可能会导致乱码的问题,此时可以用这个方法可以将中文字符转化为URL编码。fromurllib.parseimportquotekeyword='壁纸'url='/s?wd='+quote(keyword)print(url)unquote有了
quote
方法,当然还有
unquote
方法,它可以进行URL解码。fromurllib.parseimportunquoteurl='/s?wd=%E5%A3%81%E7%BA%B8'print(unquote(url))(4)分析Robots协议Robots协议也称作爬虫协议、机器人协议,它的全名叫作网络爬虫排除标准(RobotsExclusionProtocol),用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取。它通常是一个叫作robots.txt的文本文件,一般放在网站的根目录下。一个robots.txt的样例:User-agent:*Disallow:/Allow:/public/这实现了对所有搜索爬虫只允许爬取public目录的功能,将上述内容保存成robots.txt文件,放在网站的根目录下,和网站的入口文件放在一起。User-agent
描述了搜索爬虫的名称,将其设置为
*
则代表该协议对任何爬取爬虫有效;Disallow
指定了不允许抓取的目录;Allow
一般和
Disallow
一起使用,一般不会单独使用,用来排除某些限制。三、总结通过本次任务的学习和实践,我们了解了Python电子商务爬虫的基本模块,能够使用标准的urllib库,爬取学校的官方网站。同时建议大家树立爬取与反爬取的意识,遵守爬虫协议,在实际工作中,尽量少用多线程爬虫。作业布置使用urllib库,爬取网页教学反思教师总结本次课的知识点,重点强调爬虫的优点和应用领域,突出Python爬虫在数据采集中的重要性和应用性,从而提高同学们的学习兴趣。结合教学重点和难点,对所学知识进一步强化。情景一获取电子商务数据主题爬取京东商城“笔记本电脑”数据序号2课时2教学手段多媒体、板书、实训室教学方法讲授法、演示法、案例法教学课型□理论□实训√一体化□(其它)教学目标能力目标:会分析网页结构,能够在PyCharm集成开发环境中,编写程序实现京东商城数据爬取。知识目标:了解并会安装python爬虫库;安装excel库;运行Python爬虫程序。素质目标:接受新知识、自主学习的能力。教学重点网页结构分析,浏览器F12功能教学难点页面标签分析教学过程设计备注一、复习上一节上课内容并引出本节上课内容urllib库的基本内容,网页的解析,简单爬取网页的方法。本次课我们一起来学习让Python帮我们收集我们感兴趣的数据。二、教学内容(一)安装爬虫库1.安装爬虫库PipinstallrequestsPipinstallselectorsPipinstalllxml2.安装excel文件库Pipinstallopenpyxl(二)分析网页结构1.查看网页在googlechrome浏览器中输入:。再在京东商城提供的搜索框输入:笔记本,显示结果如图7-3所示。图7-3京东搜索页面在图7-3所示中,笔记本电脑的品牌很多,为了更进一步获取数据,把品牌点击为联想。最后简化的界面如图7-4所示。图7-4品牌为联想的笔记本电脑把这个页面的链接取出/search?keyword=笔记本&suggest=1.his.0.0&wq=笔记本&ev=exbrand_联想(lenovo)%5E注意地址是分2次复制后手工拼接而成。2.分析网页标签在浏览器里面按F12,分析网页标签。如图7-5所示,可以看到商品数据对应的网页标签。图7-5商品与对应的标签通过图7-5,可以看到在class标签id=J_goodsList里ul标签下的li标签,对应着所有商品列表。如p-price对应价格;p-name对应商品标题;p-commit对应评价。3.爬取数据importrequestsimportselectorsfromlxmlimportetreeurl=/search?keyword=笔记本&wq=笔记本&ev=exbrand_联想%5E&page=9&s=241&click=1headers={'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/86.0.4240.198Safari/537.36'}res=requests.get(url,headers=headers)res.encoding='utf-8'text=res.textselector=etree.HTML(text)list=selector.xpath('//*[@id="J_goodsList"]/ul/li')foriinlist:title=i.xpath('.//div[@class="p-namep-name-type-2"]/a/em/text()')[0]price=i.xpath('.//div[@class="p-price"]/strong/i/text()')[0]product_id=i.xpath('.//div[@class="p-commit"]/strong/a/@id')[0].replace("J_comment_","")print("title"+str(title))
print("price="+str(price))
print("product_id="+str(product_id))print("")程序运行后的结果如图7-6所示。图7-6获取商品数据4.获取评论数据在网页中,商品的评论数据无法直接捕获,要通过分析网页的URL。在F12对应的界面中,转到network页,找到以“productCommentSummaries.action”开头的项目,如图7-7所示。在图7-7中,把对应的URL地址取出并放到浏览器中执行,得到的页面就是所有商品ID以及对应的评论数据,如图7-8所示。图7-7productCommentSummaries.action图7-8商品评论数据在图7-8所示的界面中,可以把url地址中的refernceIds=后的IP只保留1个,把地址修改为以下形式:/comment/productCommentSummaries.action?referenceIds=10060141190483&callback=jQuery5358031&_=1667631915528在取不同商品的评论数据时,把商品的ID进行更换即可。Callback后的数据会根据情况不同有所变化,利用函数来完成要改成实际值。defcommentcount(product_id):url1=“/comment/productCommentSummaries.action?referenceIds=”+str(rpoduct_id)+”&callback=jQuery5358031&_=1667631915528”res1=requests.get(url1,headers=headers)res1.encoding='gbk'text1=(res1.text).replace("jQuery5358031(","").replace(");","")text1=json.loads(text1)comment_count=text1['CommentsCount'][0]['CommentCountStr']comment_count=comment_count.replace("+","")if"万"incomment_count:comment_count=comment_count.replace("万","")comment_count=str(int(comment_count)*10000)returncomment_countforiinlist:title=i.xpath('.//div[@class="p-namep-name-type-2"]/a/em/text()')[0]price=i.xpath('.//div[@class="p-price"]/strong/i/text()')[0]product_id=i.xpath('.//div[@class="p-commit"]/strong/a/@id')[0].replace("J_comment_","")comment_count=commentcount(product_id)print("title"+str(title))print("price="+str(price))print("comment_count="+str(comment_count))程序运行结果如图7-9所示。图7-9获取评论数5.保存到excelimportopenpyxloutwb=openpyxl.Workbook()outws=outwb.create_sheet(index=0)outws.cell(row=1,column=1,value="index")outws.cell(row=1,column=2,value="title")outws.cell(row=1,column=3,value="price")outws.cell(row=1,column=4,value="CommentCount")count=2foriinlist:title=i.xpath('.//div[@class="p-namep-name-type-2"]/a/em/text()')[0]price=i.xpath('.//div[@class="p-price"]/strong/i/text()')[0]product_id=i.xpath('.//div[@class="p-commit"]/strong/a/@id')[0].replace("J_comment_","")comment_count=commentcount(product_id)print("title"+str(title))print("price="+str(price))print("comment_count="+str(comment_count))outws.cell(row=count,column=1,value=str(count-1))outws.cell(row=count,column=2,value=str(title))outws.cell(row=count,column=3,value=str(price))outws.cell(row=count,column=4,value=str(comment_count))count+=1outwb.save("jdgood.xls")三、总结通过本次任务的学习和实践,掌握了电子商务网站数据的爬取。并且能够熟练使用浏览器的F12功能,对网页进行跟踪。同时了解了数据的重要性,能够对数据进行保存。在实际操作过程中,了解了团队合作在整个数据采集中的作用。作业布置爬取京东商城“手机”的相关数据。教学反思教师指出学生实践中可能出错和已经出错的地方,结合教学重点和难点,对所学知识进一步强化。情景二电子商务数据分析主题商务数据分析基础序号3课时2教学手段多媒体、板书、实训室教学方法讲授法、演示法、案例法教学课型□理论□实训√一体化□(其它)教学目标能力目标:掌握商务数据分析的方法。知识目标:了解数据清洗的过程,了解常用的分析算法素质目标:接受新知识、自主学习的能力。教学重点数据清洗教学难点数据分析算法算法教学过程设计备注一、引导本节上课内容对电商运营数据进行分析,发现问题,了解运营状况,对未来发展趋势进行预测。二、教学内容(一)数据预处理1.数据清洗数据清洗就是把“脏”的“洗掉”,指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。缺失值处理检测与处理缺失值。使用describe()查看数据后缺失情况。使用pandas的isnull()、notnull()进行检测与判断。使用dropna()删除缺失值,fillna(mean()|median()|mode())对缺失值进行插补。(1)读取数据并查看缺失比例,如图7-10所示。图7-10读取数据并查看缺失比例(2)空值处理方式,如图7-11、7-12、7-13、7-14、7-15所示。图7-11空值处理方式之直接删除图7-12空值处理方式之删除空值列图7-13空值处理方式之判断空值图7-14空值处理方式之缺失值使用固定值填充图7-15空值处理方式之用众数填充异常值处理异常值指那些偏离正常范围的值,不是错误值。一般使用箱线图进行处理,如图7-16所示。图7-16异常值处理(1)读取并转换数据,如图7-17所示。图7-17读取并转换数据(2)定义箱线图上下限,如图7-18所示。图7-18定义箱线图上下限(3)画出箱线图,如图7-19所示。图7-19画出箱线图(4)对照查看分布,如图7-20所示。图7-20对照查看分布重复值处理一般使用drop_duplicates()方法。注意以下情况不建议去重。(1)重复的记录用于分析事物的演变规律。(2)重复的记录用于样本不均衡处理。(3)重复的记录用于检测业务规则问题。(1)读取数据并显示表头,如图7-21所示。importnumpyasnpimportpandasaspddata=pd.read_csv(r'MotorcycleData.csv',encoding='gbk',na_values='Na')data.head(2)图7-21读取数据并显示表头(2)转换数据类型,如图7-22所示。#自定义函数用于把价格字段转换为floatdefstrtofloat(x):if'$'instr(x):x=str(x).strip('$')x=str(x).replace(',','')else:x=str(x).replace(',','')returnfloat(x)data['Mileage']=data['Mileage'].apply(strtofloat)data['Price']=data['Price'].apply(strtofloat)图7-22转换数据类型(3)查看是否有重复值,如图7-23所示。data.duplicated()print("是否有重复值:\n",any(data.duplicated()))图7-23查看是否有重复值(4)删除重复值,如图7-24所示。data=data.drop_duplicates()#删除重复值print("是否有重复值:\n",any(data.duplicated()))#再次查看是否有重复值图7-24删除重复值(二)数据标准化离差标准化离差标准化也叫Min-Max规范化,离差是最大值和最小值的差,用于消除大单位和小单位的影响(消除量纲)变异大小的差异影响;Min-Max规范化是将原始数据变换到[0,1]的空间中。公式:X1=(X-min)/(max-min);X当前的数据;(1)读取数据importnumpyasnpimportpandasaspddata=pd.read_csv(r'MotorcycleData.csv',encoding='gbk',na_values='Na')(2)定义离差标准化函数,如图7-25所示。defstrtofloat(x):if'$'instr(x):x=str(x).strip('$')x=str(x).replace(',','')else:x=str(x).replace(',','')returnfloat(x)data['Mileage']=data['Mileage'].apply(strtofloat)data['Price']=data['Price'].apply(strtofloat)defminmaxscale(Data):Data=(Data-Data.min())/(Data.max()-Data.min())returnData图7-25定义离差标准化函数(3)对数据进行标准化,如图7-26所示。data1=minmaxscale(data['Mileage'])data2=minmaxscale(data
['Price'])data3=pd.concat([data1,data2],axis=1)print('离差标准化之前里程和单价数据为:\n',
data[['Mileage','Price']].head())print('离差标准化之后里程和单价数据为:\n',data3.head())图7-26对数据进行标准化(4)调用机器学习库进行标准化,如图7-27所示。fromsklearnimportpreprocessingpreprocessing.minmax_scale(data['Price'])图7-27调用机器学习库进行标准化标准差标准化标准差标准化也叫Z-score规范化,用于消除单位影响及自身变量的差异。假设A与B的考试成绩都为80分,A的考卷满分是100分(及格60分),B的考卷满分是500分(及格300分)。虽然两个人都考了80分,但是A的80分与B的80分代表完全不同的含义。公式:X1=(X-平均数)/标准差(std)(零-均值标准化)(1)读取数据importnumpyasnpimportpandasaspddata=pd.read_csv(r'MotorcycleData.csv',encoding='gbk',na_values='Na')(2)定义标准差标准化函数defstrtofloat(x):if'$'instr(x):x=str(x).strip('$')x=str(x).replace(',','')else:x=str(x).replace(',','')returnfloat(x)data['Mileage']=data['Mileage'].apply(strtofloat)data['Price']=data['Price'].apply(strtofloat)defStandardScaler(Data):Data=(Data-Data.mean())/Data.std()returnData(3)对数据进行标准化,如图7-28所示。data1=StandardScaler(data['Mileage'])data2=StandardScaler(data['Price'])data3=pd.concat([data1,data2],axis=1)print('标准差标准化之前里程和单价数据为:\n',data[['Mileage','Price']].head())print('标准差标准化之后里程和单价数据为:\n',data3.head())图7-28对数据进行标准化(4)调用机器学习库进行标准化,如图7-29所示。from
sklearn
import
preprocessingpreprocessing.scale(data['Price'])图7-29调用机器学习库进行标准化(三)描述性统计分析基本术语1.数据类型截面数据:对多个个体在相同或近似相同的同一时间节点上搜集的数据时间序列数据:某个个体在一段时间内搜集到的数据集面板数据:既有截面维度又有时间维度的混合数据集,可分为平衡面板数据、非平衡面板数据2.数据的位置度量平均值:是衡量数据的中心位置的重要指标,反映了一些数据必然性的特点,包括算术平均值、加权算术平均值、调和平均值和几何平均值。加权平均数:当观测值具有不同的权重(重要性),使用加权平均数几何平均数:也是数据位置的一种度量,但它是n个数值乘积的n次方根。在财经领域中,几何平均数常用于分析财务数据的年、季度、月、周的平均变化率。中位数:是另外一种反映数据的中心位置的指标,其确定方法是将所有数据以由小到大的顺序排列,位于中央的数据值就是中位数。众数:是指在数据中发生频率最高的数据值。(四)探索性数据分析1.统计检验统计检验,如图7-30所示,用于检验数据是否符合正态性分布。importscipy.statsasssnorm_data=ss.norm.rvs(loc=0,scale=1,size=int(10e6))#loc为均值,scale为标准差,size为生成数据个数,可以为元组ss.normaltest(norm_data)图7-30统计检验2.卡方检验卡方检验,如图7-31所示,常用作检验两个样本数据之间是否有较强联系。ss.chi2_contingency([[15,95],[85,5]])图7-31卡方检验3.独立分布t检验独立分布t检验,如图7-32所示,常用作比较均值是否有相异性,不要求两个样本之间数据量一致。ss.ttest_ind(ss.norm.rvs(size=500),ss.norm.rvs(size=1000))图7-32独立分布t检验4.方差检验方差检验,如图7-33所示,常用作检验多组样本数据之间的均值是否有差异。ss.f_oneway(ss.norm.rvs(size=5000),ss.norm.rvs(size=10000),ss.norm.rvs(size=5000))图7-33方差检验5.Q-Q图横轴为:标准分布的分位数值(默认为正态分布)纵轴为:已知分布的分位数的值数据集中在对角线上则说明越符合正态分布,Q-Q图如图7-34所示。fromstatsmodels.graphics.apiimportqqplotimportmatplotlib.pyplotaspltqqplot(ss.norm.rvs(size=50))#plt.close()plt.show()图7-34Q-Q图6.相关系数pearson相关系数和具体数值有关,spearman相关系数和名次差有关,运用于相对比较的情况,如图7-35所示。s1=pd.Series(np.random.randn(10))s2=pd.Series(np.random.randn(10))s1.corr(s2,method="spearman")df=pd.DataFrame(np.array([s1,s2]).T)df.corr()图7-35相关系数三、总结通过本次任务的学习和实践,我们了解了数据分析之前要做的任务:数据清洗、数据标准化;了解数据的分析方法。能够对比使用公式的方式和使用机器学习库的方式对数据进行分析与标准化。这正如牛顿所说:“如果说我比别人看得更远些,那是因为我站在了巨人的肩上”。作业布置1.使用机器学习库实现数据的标准化2.画出数据的箱线图。教学反思情景二电子商务数据分析主题RFM模型序号4课时2教学手段多媒体、板书、实训室教学方法讲授法、演示法、案例法教学课型□理论□实训√一体化□(其它)教学目标能力目标:能够对给定的数据进行数据清洗,能够根据需要对数据进行初加工。知识目标:了解数据类型转换,了解RFM相关数据的意义素质目标:接受新知识、自主学习的能力。教学重点根据要求清洗数据教学难点RFM模型的实现教学过程设计备注一、复习上一节上课内容并引出本节上课内容数据清洗、标准化等是对数据进行基本整理的过程,所有拿到的数据都要经过本步骤。数据清洗完成后,我们能够怎么利用呢?二、教学内容(一)数据准备数据来源于数据科学竞赛平台Kaggle,网址为/jr2ngb/superstore-data,总共51290条数据,24个字段。超市数据字段属性如表7-4所示。表7-4数据字段属性表序号字段名字段属性说明0RowID行编号1OrderID订单号2OrderDate订单日期3ShipDate发货日期4ShipMode发货形式5CustomerID客户编号6CustomerName客户姓名7Segment客户类别8City客户所在城市9State客户所在的洲10Country客户所在的国家11PostalCode邮政编码12Market商店所属区域13Region商店所属洲14ProductID产品编号15Category产品类别16Sub-Category产品子类型17ProductName产品名称18Sales销售额19Quantity销售量20Discount折扣21Profit利润22ShippingCost发货成本23OrderPriority订单优先级表7-4的信息,可以通过读取数据并使用info()方法获得,如图7-36所示。读取数据并查看结构:importnumpyasnpimportpandasaspddata=pd.read_csv(r'superstore_dataset2011-2015.csv',encoding='iso-8859-1')()图7-36获取数据字段属性(二)数据清洗与整理1.查看是否含有缺失值data.isna().any()图7-37查看是否含有缺失值2.查看是否有异常值data.describe()图7-38查看是否有异常值3.数据整理通过datetime可以快速增加数据的维度,把时间列分解为年、月和季度等。data['OrderDate']=pd.to_datetime(data['OrderDate'])print(data['OrderDate'].dtype)#列表出转转换后的数据类型data['Order-year']=data['OrderDate'].dt.yeardata['Order-month']=data['OrderDate'].dt.monthdata['Quarter']=data['OrderDate'].dt.to_period('Q')图7-39数据修改成datetime类型经过把OrderDate列分解为年、月后,可以按不同的时间维度取出数据,例如需要获取2012年销售额前10的客户ID数据,可以使用如下方法,如图7-40所示。Order2012=data[data[‘Order-year’]==2012]Order2012_Sales_Sort=Order2012.sort_values(‘Sales’,ascending=False)Order2012_Sales_Sort[:10][[‘CustomerID’,’Sales’]]图7-40按不同的时间维度取出数据(三)商务数据分析目标1.每年销售额的增长率销售增长率是企业本年销售收入增长额同上年销售收入总额之比。销售额增长率=(本年销售额-上年销售额)/上年销售额*100%=(本年销售额/上年销售额-1)*100%(1)计算年销售额根据超市数据,按年份计算销售总额,并以年进行分组。再根据销售额增长率公式分别算出2012年、2013年和2014年的销售额增长率,如图7-41所示。sales_year=data.groupby(‘Order-year’)[‘Sales’].sum()sales_rate2012=sales_year[2012]/sales_year[2011]-1sales_rate2013=sales_year[2013]/sales_year[2013]-1sales_rate2014=sales_year[2014]/sales_year[2013]-1print(sales_rate2012,sales_rate2012,sales_rate2014)图7-41计算销售额增长率(2)用图形展示增长率,如图7-42所示。importmatplotlib.pyplotasplt%matplotlibinlineplt.rcParams['font.sans-serif']=['KaiTi']plt.rcParams['axes.unicode_minus']=Falsesales_rate2012=sales_year[2012]/sales_year[2011]-1sales_rate2013=sales_year[2013]/sales_year[2013]-1sales_rate2014=sales_year[2014]/sales_year[2013]-1plt.style.use('ggplot')sales_rate=pd.DataFrame({'sales_all':sales_year,'sales_rate':[0,sales_rate2012,sales_rate2013,sales_rate2014]})y1=sales_rate['sales_all']y2=sales_rate['sales_rate']x=[str(value)forvalueinsales_rate.index.tolist()]fig=plt.figure()ax1=fig.add_subplot(1,1,1)ax2=ax1.twinx()ax1.bar(x,y1,color='blue')ax2.plot(x,y2,marker='*',color='r')ax1.set_xlabel('年份/年')ax1.set_ylabel('销售额/元')ax2.set_xlabel('增长率')ax2.set_ylabel('销售额与增长率')plt.title('销售额与增长率')plt.show()图7-42销售额通过图形,可以看出2011~2014年该超市的销售额在稳步上升,说明企业市场占有能力在不断提高,2012~2014年增长率在增长后趋于平稳,说明企业经营在逐步稳定。2.分店销售额及对比对比不同分店的销售额,如图7-43所示,用于对不同地区分配下一年度的销售额指标,或者采取不同的营销策略。(1)对Market数据分组Sales_Area=data.groupby(‘Market’)[‘Sales’].sum()(2)各地区每年销售额分析Sales_Area=data.groupby([‘Market’,’Order-year’])[‘Sales’].sum()Sales_Area=Sales_Area.reset_index(level=[0,1])Sales_Area=pd.pivot_table(Sales_Area,index=’Market’,columns=’Order-year’,values=’Sales’)Sales_Area.plot(kind=’bar’,title=’2011-2014年不同地区销售额比较’)图7-43分店销售额及对比可以看出APAC地区和EU地区的增长速度比较快,企业市场前景比较好,下一年可以适当加大运营成本,其他地区可以根据自身地区消费特点,参考上面两个地区的运营模式。3.用户价值度RFM模型(1)模型简介RFM模型,R(Recency):客户最近一次交易时间的间隔。R值越大,表示客户交易发生的日期越久,反之则表示客户交易发生的日期越近。F(Frequency):值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。M(Monetary):客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。RFM模型是衡量客户价值和用户创利能力的经典工具,依托于客户最近一次购买时间、消费频次及消费金额。应用RFM模型时,要有客户基础的交易数据,至少包含客户号、交易金额和交易时间3个字段。根据R、F、M这3个维度,可以将客户分为以下8种类型,如表7-5所示表7-5RFM客户类型客户群体类型RFM客户等级重要价值高高高A重要发展高低高A重要保持低高高B重要挽留低低高B一般价值高高低B一般发展高低低B一般保持低高低C一般挽留低低低C表中将每个维度都分为高和低两种情况,进而将客户群体划分为8种类型,而这8种类型又可以划分成A、B、C三个等级。(2)RFM值的计算现有某用户的消费记录如表7-6所示。根据CustomerID、OrderDate、Sales三个字段计算R、F、M值,假设分析的时间是5/1/2014。表7-6某用户消费记录CustomerIDOrderDateSalesKN-67051/9/2014128.736KN-67053/9/2014795.408R:5/1/2014-3/9/2014=53。F:消费次数=2。M:消费金额=128.736+795.408。(3)评价方式当R、F、M每个值计算出来之后,可以使用评分的方式对每一个维度的数据进行评分。R:R值越大,评分越小。F:F值越大,评分越大。M:M值越大,评分越大。当R、F、M三个维度对应的评分值设置完成之后,再利用每个维度评分值的平均值,对数据的R、F、M进行高低维度的划分。当评分值大于等于对应的平均值时表示高,当评分值小于对应的平均值时表示低。(4)分析步骤步骤1:统计全年的数据。data_2014=data[data[‘Order-year’]==2014]data_2014=data[[‘CustomerID’,’OrderDate’,’Sales’]]步骤2:对数据分组deforder_sort(group):returngroup.sort_values(by=’OrderDate’)[-1:]data_2014_group=data_2014.groupby(by=’CustomerID’,as_index=False)data_max_time=data_2014_group.apply(order_sort)步骤3:计算F,M值data_max_time[‘F’]=data_2014_group.size().valuesdata_max_time[‘M’]=data_2014_group.sum()[‘Sales’].values步骤4:计算R值根据需要假定时间计算2014年12月31日,最近一次交易时间的间隔。注意,由于是历史数据,计算的时候时间跨度不要太大。stat_date=pd.to_datetime(‘2014-12-31)r_data=stat_date–data_max_time[‘OrderDate’]data_max_time[‘R’]=r_data.values以上4个步操作过程及计算结果如图7-44所示。图7-44计算出的RFM值步骤5:设定评分区间给定F的区间为[0,5,10,15,20,50],采用5分制的评
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农村盖房签合同范本
- 乡镇库房建造合同范本
- 创业老板合同范本
- 1997施工合同范本
- 公司购买材料合同范本
- 保险劳务合同范本
- mpp管采购合同范本
- app广告合同范本
- 加盟痘痘合同范本
- 住房公证合同范本
- 2025年湖南中医药高等专科学校高职单招职业技能测试近5年常考版参考题库含答案解析
- 2025年江苏信息职业技术学院高职单招职业适应性测试近5年常考版参考题库含答案解析
- 【历史】金与南宋对峙课件-2024-2025学年统编版七年级历史下册
- 2024年烟台汽车工程职业学院高职单招职业适应性测试历年参考题库含答案解析
- 2024年江西旅游商贸职业学院高职单招语文历年参考题库含答案解析
- 2025年春新人教PEP版英语三年级下册课件 Unit 1 Part C 第8课时 Reading time
- IIT临床医学项目管理
- 《消防检查指导手册》(2024版)
- 2024年萍乡卫生职业学院单招职业技能测试题库标准卷
- 2025年重庆三峰环境集团招聘笔试参考题库含答案解析
- 育婴培训课件
评论
0/150
提交评论