Pikabu-dataset

Disarankan untuk melihat kumpulan data postingan dari pikabu.ru dari sudut pandang datastatistics. Dataset itu sendiri, terdiri dari 450 bagian, dirakit oleh pengurai terbaik sepanjang waktu, diproses dengan parfum yang menghilangkan duplikat artikel, dan juga diisi dengan kolom tambahan, yang artinya hanya tersedia bagi yang memulai. Di sini dataset itu sendiri tidak begitu menarik sebagai pendekatan untuk analisis situs-situs tersebut. Pada postingan selanjutnya kita akan mencoba menerapkan elemen dari machine learning untuk analisis.







Anda dapat bekerja dengan dataset baik di excel biasa dan di notebook jupyter, bidang data dipisahkan oleh tab. Kami akan fokus pada opsi terakhir, dan semua perintah akan diberikan dengan mempertimbangkan fakta bahwa pekerjaan sedang dilakukan di notebook jupyter.



Kami akan bekerja di jendela. Oleh karena itu, gunakan cmd untuk masuk ke folder dengan kumpulan data yang diunduh dan jalankan notebook jupyter dengan perintah dengan nama yang sama.



Selanjutnya, mari impor modul.



import pandas as pd
import numpy as np


Karena kumpulan data tidak berisi header, mari kita tentukan sebelum memuat kumpulan data:



headers=['story_title','link','story_id','data_rating','data_timestamp','story_comments','data_author_id','data_meta_rating','user_name','user_link','story__community_link']


Semuanya jelas di sini: judul artikel, tautan ke sana, id artikel, peringkat (jumlah plus), tanggal artikel, jumlah komentar, id penulis, peringkat meta artikel, nama penulis, tautan ke penulis, tautan ke komunitas.



Kami menghitung dataset.



df = pd.read_csv('400k-pikabu.csv',parse_dates=['data_timestamp'],
                   warn_bad_lines=True,
                   index_col = False,                   
                   dtype ={'story_title':'object','link':'object','story_id':'float32','data_rating':'float32',
                   'story_comments':'float32','data_author_id':'float32'},
                   delimiter='\t',names=headers)


Berikut ini sedikit pengoptimalan nilai baca sehingga beberapa kolom muncul sebagai numerik.



Jadi kumpulan data tersebut mewakili 468.595 baris, 11 kolom.



print(df.shape)#468595 ,11 


5 rekaman pertama



df.head(5)






Deskripsi statistik:



df.describe()






Bekerja dengan nilai kosong dalam kumpulan data



Terlepas dari kenyataan bahwa parser bekerja tanpa lelah, ada lubang kecil di dataset, dengan kata lain, lubang teknologi diwakili oleh celah. Celah pada panda ini memiliki nilai NaN. Mari kita lihat jumlah baris dengan rongga seperti itu:



len(df.loc[pd.isnull( df['story_title'])])


Bagaimana tampilannya di dataset:



df.loc[pd.isnull( df['story_title'])]






1444 baris dengan celah tidak merusak keseluruhan gambar, namun, bagaimanapun, mari kita singkirkan:



data1=df.dropna(axis=0, thresh=5)


Kami memeriksa bahwa penghapusan berhasil:



len(data1.loc[pd.isnull(data1['story_id'])]) 


Mari bekerja dengan dataset



Mari kita lihat nama kolomnya



df.columns






Mari pilih kolom pertama



col = df['story_title']
col






Mari kita lihat jumlah minimum dalam dataset



data1.min()






Maksimum



data1.max()






Hal yang sama lebih visual:



data1.loc[:,['user_name', 'data_rating', 'story_comments']].min()






Sekarang mari kumpulkan nilai dari kolom yang menarik ke dalam array:



arr = data1[['story_id', 'data_rating', 'data_timestamp','user_name']].values


Anda dapat melihat salah satu kolom dari array:



arr[:, 1] # 






Mari kita lihat jumlah artikel dengan rating lebih dari 10.000:



print((arr[:, 1] > 10000.0).sum())


Hanya 2672 artikel yang memiliki rating sangat tinggi dari 450k



Mari menggambar grafik



Pertama, mari impor modul:



import matplotlib.pyplot as plt


Mari kita cari tahu apakah hubungan antara id penulis artikel dan peringkat artikel



plt.scatter(data1['data_author_id'], data1['data_rating'])
plt.xlabel('data_author_id') 
plt.ylabel('data_rating')






Karena banyaknya data, sulit untuk memahami hubungannya dan, kemungkinan besar, itu hilang.



Apakah ada hubungan antara id artikel dan peringkat artikel?



plt.scatter(data1['story_id'], data1['data_rating'])
plt.xlabel('story_id') 
plt.ylabel('data_rating')






Terlihat di sini bahwa posting dengan jumlah yang lebih tinggi (posting selanjutnya) menerima peringkat yang lebih tinggi, mereka lebih sering dipilih. Apakah sumber daya semakin populer?



Apakah ada hubungan antara tanggal artikel dan rating?



plt.scatter(data1['data_timestamp'], data1['data_rating'])
plt.xlabel('data_timestamp') 
plt.ylabel('data_rating')






Anda juga dapat melihat hubungan antara posting selanjutnya dan peringkat posting. Konten yang lebih baik atau, sekali lagi, hanya peningkatan lalu lintas situs web?



Apakah ada hubungan antara peringkat artikel dan jumlah komentar?



plt.scatter(data1['story_comments'], data1['data_rating'])
plt.xlabel('story_comments') 
plt.ylabel('data_rating')






Ada hubungan linier di sini, meskipun sangat tersebar. Ada logika tertentu, semakin tinggi peringkat postingan, semakin banyak komentar.



Mari kita lihat penulis teratas (penulis dengan total peringkat posting tertinggi):



top_users_df = data1.groupby('user_name')[['data_rating']].sum().sort_values('data_rating', ascending=False).head(10)   
top_users_df






Mari tambahkan kejelasan:



top_users_df.style.bar()






Mari coba alat visualisasi lainnya. Misalnya tumbuhan laut



#   
 ! pip3 install seaborn
from __future__ import (absolute_import, division,
                        print_function, unicode_literals)
#  
import warnings
warnings.simplefilter('ignore')

#      jupyter'e
%pylab inline
#  svg   
%config InlineBackend.figure_format = 'svg' 

#  
from pylab import rcParams
rcParams['figure.figsize'] = 6,3
import seaborn as sns


Mari buat grafik menggunakan kolom dengan id posting, peringkat dan komentarnya, simpan hasilnya di .png:



%config InlineBackend.figure_format = 'png' 
sns_plot = sns.pairplot(data1[['story_id', 'data_rating', 'story_comments']]);
sns_plot.savefig('pairplot.png')






Mari kita coba alat visualisasi Plotly



from plotly.offline import init_notebook_mode, iplot
import plotly
import plotly.graph_objs as go
init_notebook_mode(connected=True)


Mari kelompokkan data berdasarkan tanggal dan total rating artikel untuk tanggal ini:



df2 = data1.groupby('data_timestamp')[['data_rating']].sum()
df2.head()






Mari kita lihat berapa banyak artikel yang diterbitkan pada tanggal (bulan) tertentu:



released_stories = data1.groupby('data_timestamp')[['story_id']].count()
released_stories.head()






Mari rekatkan dua tabel:



years_df = df2.join(released_stories)
years_df.head()






Sekarang mari menggambar menggunakan plotly:



trace0 = go.Scatter(
    x=years_df.index,
    y=years_df.data_rating,
    name='data_rating'
)
trace1 = go.Scatter(
    x=years_df.index,
    y=years_df.story_id,
    name='story_id'
)
data = [trace0, trace1]
layout = {'title': 'Statistics'}
fig = go.Figure(data=data, layout=layout)
iplot(fig, show_link=False)






Keindahan plotly adalah interaktivitasnya. Dalam hal ini, saat mengarahkan kursor, grafik menunjukkan peringkat total artikel untuk tanggal (bulan) tertentu. Terlihat bahwa rating turun pada tahun 2020. Namun hal ini dapat dijelaskan dengan fakta bahwa jumlah artikel dari interval ini belum terkumpul secara memadai oleh para parser, serta fakta bahwa postingan belum mendapatkan nilai plus yang cukup.



Di bagian bawah grafik, garis merah juga menunjukkan jumlah artikel unik untuk tanggal tertentu secara interaktif.



Mari simpan grafik sebagai file html.



plotly.offline.plot(fig, filename='stats_pikabu.html', show_link=False);


Pengelompokan data



Mari kita lihat berapa banyak penulis dalam kumpulan data:



data1.groupby('user_name').size()






Berapa banyak artikel per penulis:



data1['user_name'].value_counts()






Siapa yang paling sering menulis (lebih dari 500 artikel):



for i in data1.groupby('user_name').size():
    if i>500:        
        print (data1.iloc[i,8],i) #8-   user_name


Jadi itulah yang "membuang" sumber daya). Jumlahnya tidak banyak:



penulis
crackcraft 531

mpazzz 568

kastamurzik 589

pbdsu 773

RedCatBlackFox 4882

Wishhnya 1412

haalward 1190

iProcione 690

tooNormal 651

Drugayakuhnya 566

Ozzyab 1088

kalinkaElena9 711

Freshik04 665

100pudofff 905

100pudofff 1251

Elvina.Brestel 1533

1570525 543

Samorodok 597

Mr.Kolyma 592

kka2012 505

DENTAARIUM 963

4nat1k 600

chaserLI 650

kostas26 1192

portal13 895

exJustice 1477

alc19 525

kuchka70 572

SovietPosters 781

Grand.Bro 1051

Rogo3in 1068

fylhtq2222 774

deystvitelno 539

lilo26 802

al56.81 2498

Hebrew01 596

TheRovsh 803

ToBapuLLI 1143

ragnarok777 893

Ichizon 890

hoks1 610

arthik 700



Mari kita lihat berapa banyak komunitas yang ada di sumber daya secara total:



data1.groupby('story__community_link').size() 






Dan mana yang paling produktif:



data1['story__community_link'].value_counts()






* Data tentang komunitas tidak sepenuhnya benar, karena komunitas yang disebutkan pertama dikumpulkan selama penguraian, dan penulis sering menunjukkan beberapa bagian.



Terakhir, mari kita lihat bagaimana menerapkan fungsi dengan output dari hasil di kolom terpisah .



Ini akan dibutuhkan untuk studi lebih lanjut dari dataset.



Fungsi sederhana untuk menetapkan peringkat artikel ke grup.



Jika rating lebih dari <5000 - buruk,> 5000 - baik.



def ratingGroup( row ):
    # ,      NaN
    if not pd.isnull( row['data_rating'] ):
        if row['data_rating'] <= 5000:
            return 'bad'
        if row['data_rating'] >= 20000:
            return 'good'        
    
    #    NaN,   Undef
    return 'Undef'


Mari terapkan fungsi ratingGroup ke DataFrame dan tampilkan hasilnya di kolom terpisah -ratingGroup



data1['ratingGroup'] = data1.apply( ratingGroup, axis = 1 )
data1.head(10)


Sebuah kolom baru akan muncul di dataset dengan nilai-nilai berikut:







Download - dataset .



Unduh kumpulan data tidak bersih untuk membersihkan duplikat Anda sendiri - kumpulan data .



* python membersihkan (menghapus baris duplikat berdasarkan id artikel) selama hampir satu jam! Jika seseorang menulis ulang kode di C ++ saya akan berterima kasih!:



with open('f-final-clean-.txt','a',encoding='utf8',newline='') as f:
    for line in my_lines:
        try:
            b=line.split("\t")[2]
            if b in a:        
                pass
            else:
                a.append(b)            
                f.write(line)            
        except:
            print(line)


Pertanyaannya dihapus, tk. tanpa diduga) menemukan kamus di python yang bekerja 10 kali lebih cepat:

a={}
f = open("f-final.txt",'r',encoding='utf8',newline='')
f1 = open("f-final-.txt",'a',encoding='utf8',newline='') 
for line in f.readlines():
    try:            
        b=line.split("\t")[2]
        if b in a:        
            pass
        else:
            a[b]=b
            #print (a[b])
            f1.write(line) 
    except:
        pass
f.close()
f1.close()


Notebook Jupyter - unduh .



All Articles