手把手教你:电影数据分析与可视化系统

系列文章

手把手教你:基于Django的新闻文本分类可视化系统(文本分类由bert实现)

手把手教你:基于python的文本分类(sklearn-决策树和随机森林实现)

手把手教你:岩石样本智能识别系统


一、项目简介

本文主要介绍如何使用python搭建:一个基于Python的电影数据分析与可视化系统

项目功能和可视化展示界面涉及以下功能模块,包括:

  • 用户登录界面。
  • 爬虫电影数据收集。
  • 电影简介界面。根据用户偏好展示TOP10的电影。
  • 搜索功能界面。按照电影名、导演、演员,模糊匹配需要搜索的电影,并展示电影详情。
  • 电影数据分析可视化界面。用户选择关键词来查看数据和该分类下的数据可视化。
  • 数据分析可视化包括:①电影年代、产地、类型的饼状图或柱状体、②关于电影评价的词云图分析。

如各位童鞋需要更换自己的电影数据,完全可以根据源码备注将电影文本数据更换即可直接运行。

  • 登录成功后界面

登录成功界面

博主也参考过网上电影数据分析的相关文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,只需要搭建出一个基于Python的电影数据分析与可视化系统即可。

也正是因为我发现网上大多的帖子只是针对原理进行介绍,功能实现的相对很少。

如果您有以上想法,那就找对地方了!


不多废话,直接进入正题!

二、数据介绍

本数据集采集于豆瓣电影,电影与演员数据、影评数据(用户、评分、评论)收集于2019年9月初,共945万数据,其中包含14万部电影,7万演员,63万用户,416万条电影评分,442万条影评。

数据集共有5个文件: movies.csv、person.csv、users.csv、comments.csv、ratings.csv,关于各个文件的具体内容将在下文介绍:
数据集示例

  • Movie数据格式:电影数据共140502部,2019年之前的电影有139129,当前未上映的有1373部,包含21个字段
  • Person数据格式:Person文件只包括演员和导演,不包含豆瓣用户数据,共72959个名人数据,包含10个字段
  • User数据格式:users.csv数据为豆瓣用户的无脱敏信息,主要是与评论和评分绑定在一起,共获取了639125用户数据,包含4个字段
  • Rating数据:评分数据从评论数据中获得,由于豆瓣限制了未登录用户查看的数据量,所以每部电影最多320个评分,最终得到600384个用户的4169420条评分数据,涉及电影68471部,评分值为1-5分(1-很差,2-较差,3-还行,4-推荐,5-力荐),共包含5个字段
  • Comment数据格式:评论数据共4428475 条,包含6个字段

2.1 Movie数据

共计21个字段

- MOVIE_ID: 电影ID,对应豆瓣的DOUBAN_ID
- NAME: 电影名称
- ALIAS: 别名
- ACTORS: 主演
- COVER: 封面图片地址
- DIRECTORS: 导演
- GENRES: 类型
- OFFICIAL_SITE: 地址
- REGIONS: 制片国家/地区
- LANGUAGES: 语言
- RELEASE_DATE: 上映日期
- MINS: 片长
- IMDB_ID: IMDbID
- DOUBAN_SCORE: 豆瓣评分
- DOUBAN_VOTES: 豆瓣投票数
- TAGS: 标签
- STORYLINE: 电影描述
- SLUG: 加密的url,可忽略
- YEAR: 年份
- ACTOR_IDS: 演员与PERSON_ID的对应关系,多个演员采用“\|”符号分割,格式“演员A:ID\|演员B:ID”;
- DIRECTOR_IDS: 导演与PERSON_ID的对应关系,多个导演采用“\|”符号分割,格式“导演A:ID\|导演B:ID”;

Movie数据图示

2.2 Person数据

共计10个字段

- PERSON_ID: 名人ID
- NAME: 演员名称
- SEX: 性别
- NAME_EN: 更多英文名
- NAME_ZH: 更多中文名
- BIRTH: 出生日期
- BIRTHPLACE: 出生地
- CONSTELLATORY: 星座
- PROFESSION: 职业
- BIOGRAPHY: 简介

person数据图示

2.3 User数据

共计4个字段

- USER_ID:豆瓣用户ID
- USER_NICKNAME: 评论用户昵称
- USER_AVATAR: 评论用户头像
- USER_URL: 评论用户url

2.4 Rating数据

共计5个字段

- RATING_ID: 评分ID
- USER_ID:豆瓣用户ID
- MOVIE_ID: 电影ID,对应豆瓣的DOUBAN_ID
- RATING: 评分
- RATING_TIME: 评分时间

2.5 Comment数据

共计6个字段

- COMMENT_ID: 评论ID
- USER_ID:用户ID
- MOVIE_ID: 电影ID,对应豆瓣的DOUBAN_ID
- CONTENT: 评论内容
- VOTES: 评论赞同数
- COMMENT_TIME: 评论时间

三、环境要求

  • pycharm 22版即可
  • anaconda 最新版
  • Django 最新版
  • Python 3.6

针对环境安装操作博主整理了操作说明,详情可见代码中对应操作文档

环境安装操作

四、系统功能及代码示例

4.1 系统架构

本系统采用了Django架构,前端使用的HTML+CSS+bootstrap实现
系统代码架构

4.2 数据处理

博主通过对数据进行预处理,对电影年份进行分析,生成词云图。此部分词云图生成代码为独立代码,大家可以借鉴进行修改生成自己的词云图。

from collections import Counter
from os import path

import numpy as np
import pandas as pd
from PIL import Image
from tqdm import tqdm


def create_movies_data():
    read_movies = pd.read_csv('./豆瓣电影数据集/movies.csv', encoding='utf-8')
    # 删除脏数据
    movies = read_movies.dropna(
        subset=['NAME', 'MOVIE_ID', 'COVER', 'ACTORS', 'DIRECTORS', 'GENRES',
                'REGIONS', 'RELEASE_DATE', 'DOUBAN_SCORE', 'STORYLINE'])
    # 删除豆瓣得分为0分的脏数据
    movies = movies.loc[movies['DOUBAN_SCORE'] != 0]
    movies.to_csv('./data/movies.csv', encoding='utf-8-sig')
    return print('创建电影数据成功,文件存放位置:data/movies.csv')


def create_years_data():
    """
    获取电影年份
    """
    read_movies = pd.read_csv('./data/movies.csv', encoding='utf-8')
    movie_years = read_movies['RELEASE_DATE'].to_list()
    year_list = []
    for i in range(len(movie_years)):
        year_list.append(str(movie_years[i]).split('-')[0])
    data_year = Counter(year_list)
    data_year = sorted(data_year.items(), key=lambda x: x[1], reverse=True)
    x_years = []
    y_years = []
    for k, v in data_year:
        x_years.append(k)
        y_years.append(v)


def rp_stop_words(data, stop_words):
    """
    定义删除停用词函数
    """
    if data in stop_words:
        data = ''
    else:
        data = data
    return data


def prt_word_cloud(s_num=10000):
    """
    如需修改云图样式在此处替换同路径下img.jpg文件
    s_num:评论抽样数量
    """
    import matplotlib.pyplot as plt
    from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
    import re
    import jieba
    import jieba.analyse as analyse
    # 获取评论信息
    file_encoding = 'gbk'
    # 忽略错误字符
    input_fd = open('./豆瓣电影数据集/comments.csv', encoding=file_encoding, errors='ignore')
    read_comments = pd.read_csv(input_fd)
    text_sap = read_comments.sample(s_num)['CONTENT']
    # 合并
    text = ' '.join(text_sap.to_list())
    # 数据清洗,删除脏字符,保留中文
    text_re = re.sub('[^\u4E00-\u9FFF]+', ' ', text)
    text_cut = ' '.join(jieba.cut(text_re))
    text_cut_list = text_cut.split(' ')
    # 去停用词
    # 加载停用词表,如需修改停用词,替换原文件“stopwords.txt”
    txt_stop = './data/stopwords.txt'
    # 将停用词库读入列表
    stop_words = []
    with open(txt_stop, encoding='utf-8') as fin:
        for line in fin.readlines():
            stop_words.append(str(line.replace(' \n', '')))
    # 形成最终结果
    text_last_list = []
    # 去停用词
    for word in text_cut_list:
        f_word = rp_stop_words(word, stop_words)
        if len(f_word) >= 2:
            text_last_list.append(f_word)

    text_last = ' '.join(text_last_list)
    # 文本分词,提取Tfi-Df模型中权重Top200的单词
    keywords_count_list = analyse.extract_tags(text_last, topK=500, withWeight=True)
    keywords_all = ' '.join([ite[0] for ite in keywords_count_list])
    # 读取词云背景图
    # background_image = plt.imread('./static/img/background_img.jpg')
    background_image = np.array(Image.open("./static/img/background_img.jpg"))
    # 词云实现
    wc = WordCloud(background_color='white',  # 设置背景颜色
                   max_words=200,  # 设置最大现实的字数
                   mask=background_image,  # 设置背景图片
                   stopwords=STOPWORDS,  # 设置停用词
                   font_path='simfang.ttf',  # 设置字体格式,如不设置显示不了中文
                   max_font_size=200,  # 设置字体最大值
                   random_state=9,  # 设置有多少种随机生成状态,即有多少种配色方案
                   )
    wc.generate(keywords_all)
    image_colors = ImageColorGenerator(background_image)
    wc.recolor(color_func=image_colors)
    plt.figure(figsize=(10, 10))
    plt.imshow(wc)
    plt.axis('off')
    plt.savefig('./static/img/WordCloud_img.jpg')
    # plt.show()
    return print('创建评论词云图成功,文件存放位置:/static/img/WordCloud_img.jpg')


if __name__ == '__main__':
    create_movies_data()
    prt_word_cloud()

数据预处理

4.3 系统登录功能

系统登录功能

<!doctype html>
<html lang="en">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"
          integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">
    {% load static %}
    <link rel="stylesheet" href="{% static 'css/mycss.css' %}" type="text/css">
    <title>电影数据可视化系统</title>
</head>
<body>
<!--导航栏-->
<div class="container">
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
                aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>

        <div class="collapse navbar-collapse" id="navbarSupportedContent">
            <ul class="navbar-nav mr-auto">
                <li class="nav-item">
                    <a class="nav-link active" href="{% url 'start' %}">Home <span class="sr-only">(current)</span></a>
                </li>
            </ul>
            <div class="text-center">
                <span class="navbar-brand mb-0 h1">电影数据可视化系统</span>
            </div>

        </div>
    </nav>
</div>
<br>
<div class="container">
    <div class="jumbotron">
        <!--搜索区-->
        <div id="serch">
            <h3 class="display-8 text-center">请登录
            </h3>
            <br>
            <!--搜索框-->
            <div class="row align-items-center col-auto">
                <div class="col-sm-12">
                    <form class="form-outline" method="post" action="{% url 'get_ans' %}">
                        {% csrf_token %}
                        <div>
                            <h5 class="display-10 text-danger">用户名:&nbsp&nbsp</h5>
                            <input class="form-control mr-sm-2" type="search" placeholder="name" aria-label="Search"
                                   name="user_name">
                        </div>
                        <br>
                        <div>
                            <h5 class="display-10 text-danger">密码:&nbsp&nbsp</h5>
                            <input class="form-control mr-sm-2" type="search" placeholder="password" aria-label="Search"
                                   name="password">
                        </div>
                        <br>
                        <button class="btn btn-outline-success my-2 my-sm-0" type="submit">登录</button>

                    </form>
                </div>
            </div>
        </div>
        <!--答案展示区-->
        <div id="answer" class="col-auto">
            <hr class="my-4">
            {% block content %}
            {% endblock %}
        </div>
    </div>
</div>
<br>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"
        integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
        crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns"
        crossorigin="anonymous"></script>
</body>
</html>

4.4 电影简介

电影简介

4.5 电影搜索界面

电影搜索界面

def get_one_movie(text):
    """
    获取电影搜索数据
    """
    read_movies = pd.read_csv('./data/movies.csv', encoding='utf-8')
    # 正则表达式匹配电影名、演员、导演
    movies = read_movies.loc[read_movies['NAME'].str.contains(r'.*?' + text + '.*') |
                             read_movies['ACTORS'].str.contains(r'.*?' + text + '.*') |
                             read_movies['DIRECTORS'].str.contains(r'.*?' + text + '.*')
                             ]
    movies_name = movies['NAME'].to_list()
    movies_id = movies['MOVIE_ID'].to_list()
    movies_cover = movies['COVER'].to_list()
    movies_actors = movies['ACTORS'].to_list()
    movies_directors = movies['DIRECTORS'].to_list()
    movies_genres = movies['GENRES'].to_list()
    movies_regions = movies['REGIONS'].to_list()
    movies_date = movies['RELEASE_DATE'].to_list()
    movies_score = movies['DOUBAN_SCORE'].to_list()
    movies_list = []

    for i in range(len(movies)):
        movies_data = {
            "movies_name": movies_name[i],
            "movies_id": movies_id[i],
            "movies_cover": movies_cover[i],
            "movies_actors": movies_actors[i],
            "movies_directors": movies_directors[i],
            "movies_genres": movies_genres[i],
            "movies_regions": movies_regions[i],
            "movies_date": movies_date[i],
            "movies_score": movies_score[i]
        }
        movies_list.append(movies_data)
    return movies_list


def get_all_movie():
    """
    获取所有电影数据
    """
    # 此处设置电影明细中展示的电影数量。
    get_movie_number = 100
    read_movies = pd.read_csv('./data/movies.csv', encoding='utf-8')
    movies = read_movies.sample(get_movie_number)
    movies_name = movies['NAME'].to_list()
    movies_id = movies['MOVIE_ID'].to_list()
    movies_cover = movies['COVER'].to_list()
    movies_actors = movies['ACTORS'].to_list()
    movies_directors = movies['DIRECTORS'].to_list()
    movies_genres = movies['GENRES'].to_list()
    movies_regions = movies['REGIONS'].to_list()
    movies_date = movies['RELEASE_DATE'].to_list()
    movies_score = movies['DOUBAN_SCORE'].to_list()
    movies_list = []

    for i in range(len(movies)):
        movies_data = {
            "movies_name": movies_name[i],
            "movies_id": movies_id[i],
            "movies_cover": movies_cover[i],
            "movies_actors": movies_actors[i],
            "movies_directors": movies_directors[i],
            "movies_genres": movies_genres[i],
            "movies_regions": movies_regions[i],
            "movies_date": movies_date[i],
            "movies_score": movies_score[i]
        }
        movies_list.append(movies_data)
    return movies_list

4.6 数据可视化-电影年代分析

电影年代分析

4.7 数据可视化-电影产地分析

电影产地分析

def show_year(number=15):
    from pyecharts.charts import Bar
    from pyecharts import options as opts
    """
    获取电影年代展示功能实现
    """
    read_movies = pd.read_csv('./data/movies.csv', encoding='utf-8')
    movie_years = read_movies['RELEASE_DATE'].to_list()
    year_list = []
    # 处理日期格式
    for i in range(len(movie_years)):
        year_list.append(str(movie_years[i]).split('-')[0])
    data_year = Counter(year_list)
    # 排序
    data_year = sorted(data_year.items(), key=lambda x: x[1], reverse=True)
    x_years = []
    y_years = []
    for k, v in data_year:
        x_years.append(k)
        y_years.append(v)
    # 生成网页
    bar = Bar()
    # 展示年份最多的,前15个年份
    bar.add_xaxis(x_years[:number + 1])
    bar.add_yaxis("电影年代", y_years[:number + 1])
    bar.set_global_opts(title_opts=opts.TitleOpts(title="电影年代-电影数量", subtitle="统计"))
    # render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
    # 也可以传入路径参数,如 bar.render("mycharts.html")
    bar.render("templates/fc_show.html")

4.8 数据可视化-电影类型分析

电影类型分析

4.9 电影评价词云图分析

此部分使用了搜索中的模糊匹配的电影数据进行词云图展示,大家可以根据自己的喜好修改想展示的词云图内容,以及背景图片

电影评价词云图分析

五、完整代码地址

由于项目代码量和数据集较大,感兴趣的同学可以下载完整代码,使用过程中如遇到任何问题可以在评论区评论或者私信我,我都会一一解答。

完整代码下载:
【代码分享】手把手教你:电影数据分析与可视化系统

一、数据分析项目介绍 1. 项目所需的模块库介绍 pandas用法: 需要导入以下模块 import numpy as np import pandas as pd from pandas import Series, Dataframe 2.项目背景介绍 互联网电影资料库(Internet Movie Database,简称IMDB)是一个关于电影演员、电影、电视节目、电视明星和电影制作的在线数据库。电影作为艺术和娱乐载体已成为我们生活中的一部分,作为电影爱好者之一,希望通过分析了解电影市场大体情况,以便于以后选择电影观看。 使用的数据是IMDB美国票房排名前1000的电影数据,数据包含了电影名称,票房金额,上映年份,演职人员,IMDB评分,电影类型等信息,数据中的很多电影大家也比较熟悉。相信不少人都有这样的经历,当想要看一部电影的时候,会去百度一下谁是导演,谁是主演。如果导演是克里斯托弗•诺兰,心里已经给电影打了个8分以上的评分了。而阿汤哥的动作片,预期也都能肾上腺素飙升。对于已上映的电影,不少人会去豆瓣搜索现时的评分,或是前作的评价,若是豆瓣高分、高评论数,也会按奈不住去蹭下热度。如果要去电影院观看的话,想必不少人会更倾向选择动作片或者科幻大片这类特效丰富,影音冲击强烈的电影。近几年特效技术和3D动画的日渐成熟,影院观影已经是越来越多人的第一选择。 IMDB的资料中包括了影片的众多信息、演员、片长、内容介绍、分级、评论等。对于电影的评分目前使用最多的就是IMDB评分。 截至2018年6月21日,IMDB共收录了4,734,693部作品资料以及8,702,001名人物资料。 3.项目所需数据介绍 数据的属性包括:电影名称、评论数、评分、导演、上映时间、上映国家、主要演员、语言、IMDB评分等。 理解数据: color 、director_name 、num_critic_for_reviews、duration、director_facebook_likes 、actor_3_facebook_likes、actor_2_name 、actor_1_facebook_likes 、gross 、genres 、actor_1_name 、movie_title 、num_voted_users、cast_total_facebook_likes 、actor_3_name 、facenumber_in_poster 、plot_keywords 、movie_imdb_link 、num_user_for_reviews、language 、country、content_rating、budget、title_year 、actor_2_facebook_likes 、imdb_score 、aspect_ratio 、movie_facebook_likes 4.项目功能详细介绍 显示电影评分分布的情况; 电影数量平均分年度变化的情况; 评论家评论数评分的关系; 评分电影票房的关系; 电影数量大于5前提下平均分前十的导演推荐的数据; 不同电影类型的年份累计分析; 电影时长的分布及时长是否和评分有相关性; 电影时长的分布及时长是否和评分有相关性。 二、数据分析过程 1.主要功能实现的类和方法介绍 # 清洗runtime电影时长列数据,可使用str.split()方法 df['runtime'] = df['runtime'].str.split('').str.get(0).astype(int) df['runtime'].head() # 清洗year列,使用str[:]选取年份数字并转换成int类型,使用df.unique()方法检查数据 df['year'] = df['year'].str[-5:-1].astype(int) df['year'].unique() 2. 数据分析过程代码和解释说明 导入包: 导入、查看、清洗数据: 评分分布图: 电影数量平均分布年度变化: 评论家评论数&评分、评分&票房: 电影数量大于5平均分前十的导演: 统计不同年份、不同类型电影的数量: cumsum = df.groupby(['main_genre', 'year']).title.count() # 使用累加功能统计1980年起不同年份不同电影类型的累计数量,对于中间出现的缺失值,使用前值填充 genre_cumsum = cumsum.unstack(level=0).cumsum().ffill() # 只选取总数量大于50的电影类型数据 genre_cumsum = genre_cumsum.loc[:,genre_cumsum.iloc[-1,:] >= 50] # 根据电影类型统计数据作图 fig, ax2 = plt.subplots(figsize=(12,6)) genre_cumsum.plot(ax=ax12, legend=False, linewidth=3) # 添加数据标签 for i in last_row.iteritems(): if i[0] == 'Adventure' or i[0] == 'Biography' or i[0] == 'Horror': ax2.annotate('{} {}'.format(int(i[1]), i[0]), xy=(2018.5, i[1]-5), fontsize=12) else: ax2.annotate('{} {}'.format(int(i[1]), i[0]), xy=(2018.5, i[1]+5), fontsize=12) # 美化图表 ax2.set_title('The Aggregate Movies of Different Genres Over Years', fontsize=16) ax2.spines['top'].set_visible(False) ax2.spines['right'].set_visible(False) ax2.spines['left'].set_visible(False) ax2.tick_params(bottom=True, labelleft=False) ax2.set_xlabel('') plt.tight_layout() 电影时长的分布及时长是否和评分有相关性: fig, ax4 = plt.subplots() df['runtime_min'].hist(range=(70,210), bins=14, color=(114/255,158/255,206/255)) ax4.set_title('The Runtime Distribution of US Top Box Office Movies') ax4.spines['top'].set_visible(False) ax4.spines['left'].set_visible(False) ax4.spines['right'].set_visible(False) ax4.set_xticklabels(np.arange(70,220,10)) ax4.set_xticks(np.arange(70,220,10)) ax4.grid() 绘制时长和IMDB评分相关性: fig = plt.figure(figsize=(14,7)) sns.lmplot(data=df, x='runtime_min', y='imdb_rate') sns.despine() 三、数据分析结果评估 1、评分分布主要在5.0~8.0之间,3.0以下和9.0以上分布很少。如果8.0算为优秀,则优秀电影占比较少。 2、电影数量在1990~2000年间快速增长,2009年达到较高值。而电影的平均分整体上呈下降趋势。 3、评论家评论数评分整体呈正相关关系,500以上评论家评论数对应的评分都高于6.0。 4、评分票房整体呈正相关关系,但关系不强。 IMDB评分人数和电影票房的相关性很弱,高票房不代表评分人数多,低票房电影也能有大量的IMDB评分人数。 5、电影数量大于5平均分前十的导演:Christopher Nolan、Quentin Tarantino 、 Stanley Kubrick、 James Cameron 、Peter Jackson 、Alejandro G. Iñárritu 、David Fincher 、Martin Scorsese 、 Wes Anderson 、Paul Greengrass。 6. 前五大电影类型分别是动作片Action,喜剧片Comedy,动画片Animation,剧情片Drama,冒险片Adventure。1995年之前,动作片和喜剧片都是影院观众最喜爱的电影类型,对应的高票房数量不分伯仲,剧情片是另一相对流行的电影类型。1995年后,高票房的动作片快速增长,甩开了喜剧片。喜剧片随仍是高票房数量第二多的电影类型,但近几年增速明显放缓。高票房动画片进入榜单的时间最晚,但在1998年前后迎来明显增长,此后的十年里完成了对剧情片和冒险片的超越。如果动画片保持目前的增速,有望在之后的十几二十年里超越喜剧片,成为高票房数量第二的电影类型。 7. 时长和IMDB评分呈一定的相关性,时长短的电影既有高分也有低分,但时长超过160分钟的电影基本都能获得6分以上的分数,时长最长的两部电影甚至得到了接近9分的超高得分,IMDB评分接近或低于4分的电影时长均小于130分钟。丰富的剧情和长长的故事也许也是一种容易感染观众的方式,这也和之前提到的好的故事打动观众相呼应。 四、总结 数据分析的过程往往是一个从宏观到微观的过程。先从宏观上把握数据大体的情况,大胆地提出假设,然后再将数据进行细分,小心地求证。通过数据的对比,就很容易看出调整的效果。 有关活动效果的数据分析往往也会涉及数据的对比。具体的思路是从要分析的目的入手,首先思考造成这种情况的可能原因有什么,再从每个可能的原因中找到相应的数据,要分析的目的的数据进行比较,看哪一个是造成该情况发生的主要原因。 这里要用到的是excel的图表工具,把每一种可能的数据都作出一个图表,要分析的目的的数据图表进行比较,如果有某一个数据的变化曲线之相差不多,则可以说这个所对应的原因是造成该情况发生的主要原因。 以上是分析活动的一些核心数据,核心数据的分析是最主要的,因为这直接反应了该活动最本质的效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雾的小屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值