1. 程式人生 > >用pandas探索Movielens資料集

用pandas探索Movielens資料集

  1. 本文為譯文,原文連結
    Let’s begin
    1.資料集情況,
    # u.user檔案中為user_id,age,occupation,zip_code,格式如下:
    這裡寫圖片描述
    # u.data檔案中為user_id,movie_id,rating,unix_timestamp,格式如下:
    這裡寫圖片描述
    # u.item檔案中為movie_id,title, release_date, video_release_date,imdb_url,格式如下:
    這裡寫圖片描述
import pandas as pd
import numpy as np
import matplotlib.pylab as plt 
%matplotlib inline 

# 讀入資料
u_cols = ['user_id', 'age', 'sex', 'occupation', 'zip_code'] users = pd.read_csv('u.user', sep='|', names=u_cols,encoding='latin-1') r_cols = ['user_id', 'movie_id', 'rating', 'unix_timestamp'] ratings = pd.read_csv('u.data', sep='\t', names=r_cols,encoding='latin-1') m_cols = ['movie_id', 'title'
, 'release_date', 'video_release_date', 'imdb_url'] movies = pd.read_csv('u.item', sep='|', names=m_cols, usecols=range(5),encoding='latin-1')
# 資料集整合

movie_ratings = pd.merge(movies, ratings) 
lens = pd.merge(movie_ratings, users)

聯合後資料及情況如下:
這裡寫圖片描述

1. 列出被評價過次數最多的20部電影:按照電影標題將資料集分為不同的groups,並且用size( )函式得到每部電影的個數(即每部電影被評論的次數),按照從大到小排序,取最大的前20部電影列出如下:

most_rated = lens.groupby('title').size().sort_values(ascending=False)[:20]
most_rated

此語句等價於SQL中的:

SELECT title, count(1)
FROM lens
GROUP BY title
ORDER BY 2 DESC
LIMIT 20;

【輸出】
title
Star Wars (1977)                    583
Contact (1997)                      509
Fargo (1996)                        508
Return of the Jedi (1983)           507
Liar Liar (1997)                    485
English Patient, The (1996)         481
Scream (1996)                       478
Toy Story (1995)                    452
Air Force One (1997)                431
Independence Day (ID4) (1996)       429
Raiders of the Lost Ark (1981)      420
Godfather, The (1972)               413
Pulp Fiction (1994)                 394
Twelve Monkeys (1995)               392
Silence of the Lambs, The (1991)    390
Jerry Maguire (1996)                384
Chasing Amy (1997)                  379
Rock, The (1996)                    378
Empire Strikes Back, The (1980)     367
Star Trek: First Contact (1996)     365
dtype: int64

2. 評分最高的十部電影
按照電影名稱分組,用agg函式通過一個字典{‘rating’: [np.size, np.mean]}來按照key即rating這一列聚合,檢視每一部電影被評論過的次數和被打的平均分。取出至少被評論過100次的電影按照平均評分從大到小排序,取最大的10部電影。

movie_stats = lens.groupby('title').agg({'rating': [np.size, np.mean]})
atleast_100 = movie_stats['rating']['size'] >= 100
movie_stats[atleast_100].sort_values([('rating', 'mean')], ascending=False)[:10]

上述語句等價於SQL中的:

SELECT title, COUNT(1) size, AVG(rating) mean
FROM lens
GROUP BY title
HAVING COUNT(1) >= 100
ORDER BY 3 DESC
LIMIT 10;

【輸出】
                                    rating
                                    size    mean
title       
Close Shave, A (1995)               112 4.491071
Schindler's List (1993)             298 4.466443
Wrong Trousers, The (1993)          118 4.466102
Casablanca (1942)                   243 4.456790
Shawshank Redemption, The (1994)    283 4.445230
Rear Window (1954)                  209 4.387560
Usual Suspects, The (1995)          267 4.385768
Star Wars (1977)                    583 4.358491
12 Angry Men (1957)                 125 4.344000
Citizen Kane (1941)                 198 4.292929

3. 檢視不同年齡見爭議最大的電影:
(1)。檢視使用者的年齡分佈:

users.age.plot.hist(bins=30)
plt.title("Distribution of users' ages")
plt.ylabel('count of users')
plt.xlabel('age');

這裡寫圖片描述
(2)用pandas.cut函式將使用者年齡分組:

labels = ['0-9', '10-19', '20-29', '30-39', '40-49', '50-59', '60-69', '70-79']
lens['age_group'] = pd.cut(lens.age, range(0, 81, 10), right=False, labels=labels)
lens[['age', 'age_group']].drop_duplicates()[:10]

這裡寫圖片描述
(3)每個年齡段使用者評分人數和打分偏好,看起來年輕人更挑剔一點點

lens.groupby('age_group').agg({'rating': [np.size, np.mean]})

這裡寫圖片描述
(4)檢視被評價過最多次的50部電影在不同年齡段之間的打分差異。並且用unstack函式將資料轉換為一個表格,每一行為電影名稱,每一列為年齡組,值為該年齡組的使用者對該電影的平均評分。

most_50 = lens.groupby('movie_id').size().sort_values(ascending=False)[:50]
lens.set_index('movie_id', inplace=True)
by_age = lens.loc[most_50.index].groupby(['title', 'age_group'])
by_age.rating.mean().head(15)
by_age.rating.mean().unstack(1).fillna(0)[10:20]

# 若將上面的一句改為如下,則將電影標題置為列將年齡組置為行:

by_age.rating.mean().unstack(0).fillna(0)

這裡寫圖片描述
4.不同性別間爭議最大的電影
(1)

lens.reset_index('movie_id', inplace=True)
pivoted = lens.pivot_table(index=['movie_id', 'title'],
                           columns=['sex'],
                           values='rating',
                           fill_value=0)
pivoted['diff'] = pivoted.M - pivoted.F
pivoted.head()

這裡寫圖片描述

(2)

pivoted.reset_index('movie_id', inplace=True)
disagreements = pivoted[pivoted.movie_id.isin(most_50.index)]['diff']
disagreements.sort_values().plot(kind='barh', figsize=[9, 15])
plt.title('Male vs. Female Avg. Ratings\n(Difference > 0 = Favored by Men)')
plt.ylabel('Title')
plt.xlabel('Average Rating Difference');

這裡寫圖片描述

相關推薦

pandas探索Movielens資料

本文為譯文,原文連結: Let’s begin 1.資料集情況, # u.user檔案中為user_id,age,occupation,zip_code,格式如下: # u.data檔案

MovieLens資料做推薦(Python推薦系統二)

              思路:下載MovieLens的資料集,對資料集進行函式定義,定義各資料列的名稱,根據上一篇Python寫出簡單的推薦系統(一) 文中的recommendations.py 的使用者相似度進行推薦。               下載MovieLe

MovieLens資料SVD進行評分預測【修正後】

參考了Yehuda Koren 08年的論文Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model程式碼如下:# -*- coding: UTF-8 -*- impo

MovieLens資料SVD進行評分預測

參考了Yehuda Koren 08年的論文Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model 程式碼如下: ''' Version:1.0 Created

[譯]使用 Pandas 對 Kaggle 資料進行統計資料分析

原文地址:EXPLORATORY STATISTICAL DATA ANALYSIS WITH A KAGGLE DATASET USING PANDAS 原文作者:Strikingloo 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/gold-m…

機器學習(6) MovieLens資料

MovieLens資料集是一個關於電影評分的資料集,裡面包含了從IMDB, The Movie DataBase上面得到的使用者對電影的評分資訊,詳細請看下面的介紹。 介紹: links.csv: 檔案裡面的內容是幫助你如何通過網站id在對應網站上找到對應的電影連結的。資料格式如下:  m

Tensorflow1.8keras實現MNIST資料手寫字型識別例程

import tensorflow as tf tf.enable_eager_execution() eager是新版本加入的動態圖,可以直接計算出結果而不用使用Session。同時也支援微分操作。 class DataLoader(): def __init_

Tensorflow1.8keras實現MNIST資料手寫字型識別例程(二)

class CNN(tf.keras.Model): def __init__(self): super().__init__() self.conv1 = tf.keras.layers.Conv2D( f

速度搭建jupyter, pandas進行資料庫資料分析

安裝jupyter pip3 install jupyter 開啟jupyter文件 1: 在命令列輸入以下命令 jupyter notebook 2:完成之後,Jupyter Notebooks 就

keras訓練mnist資料手寫識別

%matplotlib inline import pickle import os import keras, theano from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten # ker

【筆記3】pandas實現矩陣資料格式的推薦演算法 (基於使用者的協同)

原書作者使用字典dict實現推薦演算法,並且驚歎於18行程式碼實現了向量的餘弦夾角公式。 我用pandas實現相同的公式只要3行。 特別說明:本篇筆記是針對矩陣資料,下篇筆記是針對條目資料。 ''' 基於使用者的協同推薦 矩陣資料 ''' import pandas as pd from io impor

《Spark機器學習》筆記——基於MovieLens資料使用Spark進行電影資料分析

1、資料集下載https://grouplens.org/datasets/movielens2、資料集下檔案格式u.user使用者屬性檔案包含user.id使用者ID    gender性別   occupation職業    ZIP code郵編等屬性,每個屬性之間用|分

Pandas之iris資料簡單分析

 匯出iris資料集 from sklearn import datasets import pandas as np iris_datas = datasets.load_iris() ir

R語言-模型協方差檢驗anova-模型擬合時沒有同樣大小的資料

筆者在使用R語言進行資料分析的時候,,遇到了這樣的問題,同時對模型使用aic準則進行變數篩選的時候遇到了別的問題這就奇怪了,,,what f....???????????,,,模型建立的時候如果有缺失值的話,往往會出現別的問題,因此我檢視資料是否有缺失值。因此該問題的出現時因

Movielens資料詳細介紹

下面以ml-100k資料集為例進行介紹: 最主要用的是u.data(評分)  |  u.item(電影資訊)  |  u.user(使用者資訊) 開啟資料集如下圖: 各檔案含義如下: allbu

YOLOv3訓練WIDER_FACE資料

- 剛開始想訓練的時候忘了百度一下沒有沒可以直接轉換的指令碼。。。就自己寫了。。。- 後來發現網上的轉換指令碼基本都是把 WIDER_FACE先轉換成VOC再用yolo提供的準換工具,轉成yolo所需格式。。。- 自己寫的是直接轉成yolo所需的格式的,版本python3.6

資料探勘-MovieLens資料_電影推薦_親和性分析_Aprioro演算法

#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Feb 7 14:38:33 2017 電影推薦分析: 使用 親和性分析方法 基於 Apriori演算法 推薦電影 @autho

多快好省地使用pandas分析大型資料

# 1 簡介   `pandas`雖然是個非常流行的資料分析利器,但很多朋友在使用`pandas`處理較大規模的資料集的時候經常會反映`pandas`運算“慢”,且記憶體開銷“大”。   特別是很多學生黨在使用自己效能一般的筆記本嘗試處理大型資料集時,往往會被捉襟見肘的算力所勸退。但其實只要掌握一定的`p

pandas劃分資料——訓練和測試

1、使用sklearn庫中model_select子模組進行劃分 資料:使用kaggle上Titanic資料集 劃分方法:隨機劃分 # 匯入pandas模組,sklearn中model_select模組 import pandas as pd from sklearn.

資料處理:pandas處理大型csv檔案

在訓練機器學習模型的過程中,源資料常常不符合我們的要求。大量繁雜的資料,需要按照我們的需求進行過濾。拿到我們想要的資料格式,並建立能夠反映資料間邏輯結構的資料表達形式。 最近就拿到一個小任務,需要處理70多萬條資料。 我們在處理csv檔案時,經常使用pandas,可以幫助處理較大的