数据分析,从入门到放弃呆鸟的Python数据分析

数据分析 | 零基础入门数据分析(四):从入门到出家?

2018-06-23  本文已影响100人  娜某人

大家好,我是聪明绝顶秃秃娜。o(〃'▽'〃)o

今天开始学着用Markdown写东西了(兴奋地搓搓爪子.gif),也就是说终于可以优雅的插代码了。实不相瞒,娜姐我这两天睡一觉起来看看前一天写的东西,简直要点一首梦醒时分送给自己:这孙子都写了些什么傻逼玩意儿…… 真是让人秃头啊

首页推荐随便点点,发现别人的文章特别好看:叙事详略得当,衔接连贯自然,选材别致新颖,情节跌宕起伏。我当即暗下决心,决定好好培养自己的自信心,再也不随便乱看首页推荐了。
而且根据有关人士可靠回忆,我小时候写故事很有意思的,日记里都是写一些我姥姥的大公鸡如何如何了,我在我奶家猪圈的新发现,要不就是如何野在外面不回家偷吃邻居田里的葵花籽上山逮蚂蚱捉萤火虫云云,想必充满童趣。看来我妈的眼睛是雪亮的,我果然还是很有才华的。碰巧前段时间我们搬家整理,翻出来我大概10岁左右写的日记,捧着日记本我万分激动内心颤抖准备好好研读一番,擦...果然我妈看我的时候自带了无数个金光闪闪亲闺女光环。后来,后来我当然是趁没人注意把日记本扔了。我不管,娜某人写故事天下第一!不接受反驳!(≡•̀·̯•́≡)

话说这个零基础入门系列的初衷是想和大家分享我是怎么用python或者gis做数据分析小作业的,没想到整天写些鸡汤和废柴自白,港真我自己也非常着急,本来我准备按照技术博客那种高大上的路子发展的,无奈水平菜得抠脚写不了写不了,真的是一失足成大瘸子再回首又闪了腰。我给自己定了个大目标,这很不错,但是花了好长时间我才想明白,允许自己反复,允许自己有时候懦弱,退缩,插科打诨,才能更好的坚持。小烦恼都是反反复复找上我们的,所以一劳永逸的解决方案也是不存在的。人生不必分分秒秒都绷着,时时刻刻都一鼓作气。


今天分享的是娜娜酱的第三个python学习小作业:视频网站数据清洗整理和结论

作业要求:
1、数据清洗 - 创建函数去除空值
2、数据清洗 - 创建函数将时间字段转化为时间标签
3、问题1 分析出不同导演电影的好评率,并筛选出TOP20
① 计算统计不同导演的好评率
② 通过多系列柱状图,图表可视化
4、问题2 统计分析2001-2016年每年评影情况
① 计算统计2001-2016年每年评影人数总量
② 通过面积图,做图表可视化,分析每年人数总量变化规律
③ 验证是否有异常值(极度异常)
④ 创建函数分析数据外限最大最小值
⑤ 筛选查看异常值 → 异常值是否是每年的热门电影?


爱奇艺视频数据截图

见多识广娜娜酱(在jupyter notebook做的):
第1步:加载模块,读取爱奇艺视频数据,处理空值,时间标签转化

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
import datetime
% matplotlib inline
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

#读取爱奇艺视频数据
import os
os.chdir('C:/Users/my/Desktop/')
data1 = pd.read_csv('爱奇艺视频数据.csv',engine = 'python')

#1、数据清洗 - 去除空值
def cleanna(df):
    A = list(df.columns)
    for a in A:
        if df[a].dtype == 'object':
            df[a].fillna('缺失数据',inplace = True)
        else:
            df[a].fillna(0,inplace = True)
    return(df)
data1_clean = cleanna(data1)

#2、数据清洗 - 时间标签转化
def todate(df):
    B = list(df.columns)
    for b in B:
        if b == '数据获取日期':
            s = df[b].str.replace('年','-').str.replace('月','-').str.replace('日','')
            df[b] = pd.to_datetime(s)
    return(df)

data1_re = todate(data1_clean)
data1_re.head()

第2步:解决问题1,获得好评率Top20的导演是哪些?

#3、问题1 分析不同导演电影的好评率,并筛选出TOP20
#① 计算统计不同导演的好评率
df1 = pd.DataFrame({'导演':data1_re['导演'],
                    '好评数':data1_re['好评数'],
                    '评分人数':data1_re['评分人数']})
df1_re = df1.groupby('导演').sum()
df1_re['好评率'] = df1_re['好评数']/df1_re['评分人数']
df1_sort = df1_re.sort_values(by='好评率',ascending=False)[:20]
#df1_sort.head(20)

#② 通过多系列柱状图,图表可视化
#导演好评率TOP20
x1 = np.arange(20)
y1 = df1_sort

fig1 = plt.figure(figsize = (8,6))
plt.bar(x1,y1['好评率'],
        width = 0.9,
        facecolor = 'gold',
        alpha = 0.9,
        tick_label = y1.index,
        edgecolor = 'lightyellow')
plt.ylim([0.975,1]) 
plt.title('导演好评率TOP20')
plt.grid(True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'y') 

#加坐标轴标签
xlabel_obj=plt.xlabel('导演',fontsize=10,alpha=0.9)  
ylabel_obj=plt.ylabel('好评率',fontsize=10,alpha=0.9)

#X轴标签旋转45度
import pylab as pl
pl.xticks(rotation=60)

#Y轴标签以百分比显示
from matplotlib.ticker import FuncFormatter
def topercent(temp, position):  
    return '%0.1f'%(100*temp) + '%'  
plt.gca().yaxis.set_major_formatter(FuncFormatter(topercent))  

第3步:解决问题2,2001-2016年每年评影情况是怎么样的呢?

#4、问题2 统计分析2001-2016年每年评影情况
df2 = pd.DataFrame({'上映年份':data1_re['上映年份'],
                    '评分人数':data1_re['评分人数'],
                    '好评数':data1_re['好评数'],
                    '导演':data1_re['导演'],
                    '电影':data1_re['整理后剧名']})
df2_re= df2[(df2['上映年份']!= 0)&(df2['导演']!= '缺失数据')]

#① 计算统计2001-2016年每年评影人数总量
df2_year = df2_re.groupby('上映年份').sum()
df2_year_0116 = df2_year[2001:2016]
print(df2_year_0116)

#② 通过面积图,做图表可视化,分析每年人数总量变化规律
df2_year_0116['评分人数'].plot.area(color = 'violet',alpha = 0.5)
plt.grid()
plt.title('2001-2016年每年评影人数总量统计')
10年到12年发生了什么,我也好奇怪

第4步:解决问题2,2001-2016年每年评影情况有没有异常值?

#③ 验证是否有异常值(极度异常)
#电影按照名称和上映年份分组
df2_movie = df2_re.groupby(['电影','上映年份']).sum()
df2_movie.reset_index(level=0, inplace=True)

#2001-2016每年上映的电影(用locals方法动态生成)
for i in range(2001,2017):
    locals()['df2_movie_' + str(i)] = df2_movie[df2_movie.index == i]

#2001-2016每年上映的电影箱型图:存在异常值
fig = plt.figure(figsize=(10,14),facecolor = 'gray')
for j in range(2001,2017):
    locals()['ax'+str(j)] = fig.add_subplot(4,4,j-2000) 

    locals()['df2_movie_' + str(j)][['评分人数','好评数']].boxplot(sym = '+',
               vert = True,  # 是否垂直
               whis = 3,  
               patch_artist = False,  # 上下四分位框内是否填充,True为填充
               meanline = False,showmeans=True,  # 是否有均值线及其形状
               showbox = True,  # 是否显示箱线
               showcaps = True,  # 是否显示边缘线
               showfliers = True,  # 是否显示异常值
               return_type='dict'  # 返回类型为字典
               ) 
    plt.title('%i年'%j)
箱型图查看是否存在异常值

第5步:解决问题2,到底哪些电影剧集出现了异常值?

#④ 创建函数分析出数据外限最大最小值
#创建函数求外限最大最小值
def outlier(se):
    Q1 = se.quantile(q = 0.25)
    Q3 = se.quantile(q = 0.75)
    IQR = Q3 - Q1
    OUTmax = Q1 + IQR*3
    OUTmin = Q3 - IQR*3
    return (OUTmax,OUTmin)

#⑤ 筛选查看异常值 → 是否异常值就是每年的热门电影?
#2001-2016每年的异常值信息
for r in range(2001,2017):
    Vname = locals()['df2_movie_'+str(r)]
    Vname.reset_index(level=0, inplace=True)
    OUT = outlier(Vname['评分人数'])
    print(Vname[Vname['评分人数'] > OUT[0]])
异常值确实出现在每年的热门剧集(仅截取部分)

以上就是从计算机白痴到会用python做一点点点点点数据分析的人生赢家娜娜酱,暂时还没有出家!(但是秃了,划掉)

请继续期待后续娜娜酱打怪升级小作业(作业题目来自数据分析师(python)微专业)~

这是零基础入门数据分析系列的第四篇,其他内容在这里:
第一篇:零基础小白自学数据分析:从入门到摔门?
第二篇:零基础小白自学数据分析:从入门到绊倒?
第三篇:零基础小白自学数据分析:从入门到住院?
第五篇:零基础小白自学数据分析:从入门到脱发?
(-'๏_๏'-)谢谢您阅读,请勿转载。

上一篇 下一篇

猜你喜欢

热点阅读