ピカブ-データセット

データ統計の観点から、pikabu.ruからの投稿のデータセットを確認することをお勧めします。450個からなるデータセット自体は、最高の24時間パーサーによって組み立てられ、重複する記事を削除する香水で処理され、追加の列が詰め込まれています。その意味は、初心者だけが利用できます。ここでは、データセット自体は、そのようなサイトの分析へのアプローチほど興味深いものではありません。次の投稿では、分析のために機械学習の要素を適用しようとします。







通常のexcelとjupyterノートブックの両方でデータセットを操作できます。データフィールドはタブで区切られています。最後のオプションに焦点を当て、作業がジュピターノートブックで行われているという事実を考慮してすべてのコマンドが与えられます。



私たちは窓で働きます。したがって、cmdを使用して、ダウンロードしたデータセットのあるフォルダーに移動し、同じ名前のコマンドでjupyternotebookを実行します。



次に、モジュールをインポートしましょう。



import pandas as pd
import numpy as np


データセットにはヘッダーが含まれていないため、データセットをロードする前にヘッダーを指定しましょう。



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']


ここではすべてが明確です:記事のタイトル、それへのリンク、記事ID、評価(プラスの数)、記事の日付、コメントの数、著者ID、記事のメタ評価、著者名、著者へのリンク、コミュニティへのリンク。



データセットをカウントします。



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)


一部の列が数値として表示されるように、読み取り値を少し最適化します。



したがって、データセットは468,595行、11列を表します。



print(df.shape)#468595 ,11 


最初の5つのレコード



df.head(5)






統計的説明:



df.describe()






データセット内の空の値の操作



パーサーが精力的に機能したという事実にもかかわらず、データセットには小さな穴があります。言い換えると、ギャップによって表される技術的な穴です。パンダのこれらのギャップには、NaNという値があります。そのようなボイドのある行の数を見てみましょう。



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


データセットでの外観:



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






ギャップのある1444行は全体像を損なうことはありませんが、それでも、それらを取り除きましょう。



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


削除が成功したことを確認します。



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


データセットを操作してみましょう



列名を見てみましょう



df.columns






最初の列を選択しましょう



col = df['story_title']
col






データセットの最小値を見てみましょう



data1.min()






最大



data1.max()






同じことがより視覚的です:



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






それでは、興味深い列から配列に値を収集しましょう:



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


配列の列の1つを見ることができます:



arr[:, 1] # 






評価が10,000を超える記事の数を見てみましょう。



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


45万点中超高評価の記事は2672点のみ



チャートを描きましょう



まず、モジュールをインポートしましょう。



import matplotlib.pyplot as plt


記事の著者のIDと記事の評価の間に関係があるかどうかを調べてみましょう。



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






データ量が多いため、関係を把握することが難しく、欠落している可能性があります。



記事IDと記事の評価には関係がありますか?



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






ここで注目すべきは、数が多い投稿(後の投稿)の評価が高く、投票される頻度が高いことです。リソースの人気は高まっていますか?



記事の日付と評価の間に関係はありますか?



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






後の投稿と投稿ランクの関係も確認できます。より良いコンテンツですか、それともWebサイトのトラフィックの増加だけですか?



記事の評価とコメントの数には関係がありますか?



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






ここには、非常に分散していますが、線形の関係があります。特定の論理があり、投稿の評価が高いほど、コメントが多くなります。



上位の著者(投稿の評価の合計が最も高い著者)を見てみましょう。



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






明確さを追加しましょう:



top_users_df.style.bar()






他の視覚化ツールを試してみましょう。たとえば海生まれ



#   
 ! 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


投稿ID、その評価、コメントの列を使用してグラフを作成し、結果を.pngに保存しましょう。



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






Plotly視覚化ツールを試してみましょう



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


日付とこの日付の記事の合計評価でデータをグループ化しましょう。



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






特定の日付(月)に公開された記事の数を見てみましょう。



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






2つのテーブルを接着しましょう:



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






それでは、プロットを使用して描画しましょう。



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)






プロットの美しさは、その相互作用です。この場合、ホバーすると、グラフには特定の日付(月)の記事の合計評価が表示されます。2020年に格付けが下がったことがわかります。しかし、これは、この間隔の記事の数がパーサーによって十分に収集されておらず、投稿がまだ十分な数のプラスを獲得していないという事実によって説明できます。



グラフの下部にある赤い線は、特定の日付の一意の記事の数もインタラクティブに示しています。



チャートをhtmlファイルとして保存しましょう。



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


データのグループ化



データセットに含まれる作成者の数を見てみましょう。



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






著者あたりの記事数:



data1['user_name'].value_counts()






最も頻繁に書く人(500以上の記事):



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


つまり、リソースを「詰まらせる」のはその人です)。それらの多くはありません:



著者
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



リソースに合計でいくつのコミュニティがあるかを見てみましょう。



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






そして、どれが最も多作です:



data1['story__community_link'].value_counts()






*最初に言及されたコミュニティは解析中に収集されたものであり、著者はしばしばいくつかの部分を示しているため、コミュニティに関するデータは完全に正しいわけではありません。



最後に、別の列に結果を出力して関数を適用する方法を見てみましょう



これは、データセットをさらに調査するために必要になります。



記事の評価をグループに割り当てる簡単な機能。



評価が<5000-悪い、> 5000-良い以上の場合。



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'


RatingGroup関数をDataFrameに適用し、結果を別の列-ratingGroupに表示してみましょう。



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


次の値を持つ新しい列がデータセットに表示されます:







ダウンロード-データセット



重複を自分でクリーンアップするために、クリーンアップされていないデータセット(データセット)をダウンロードします



* pythonはほぼ1時間クリーンアップ(記事IDに基づいて重複行を削除)します!誰かがC ++でコードを書き直した場合、私は感謝します!:



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)


質問は削除されました、tk。予期せず)10倍速く動作するPythonの辞書を見つけました:

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()


Jupyterノートブック-ダウンロード



All Articles