Interpretation#

Viewing the top 10 game aspects tagged with a non-neutral sentiment polarity reveals that ‘game’ has by far the highest frequency.

Given the lack of specific information this aspect provides concerning specific design details, it will be useful to preclude this token from subsequent charts.

import matplotlib.pyplot as plt, seaborn as sns
df1=(df[df['sentiment']!=0]
     .groupby('aspect',as_index=False)['description']
     .count().rename(columns={'description':'Count'})
     .sort_values(by='Count',ascending=False)
     .head(10)).reset_index(drop=True)

sns.set_style('whitegrid')
p1=plt.bar(df1.aspect,df1.Count,align='center',color='#ffcc5c')
plt.xticks(rotation=45,ha='center')
plt.bar_label(p1,label_type='edge')
plt.yticks(list(range(0,13001,1000)));
_images/7_Interpretation_3_0.png

Aspect Frequency#

Charting the most frequent aspects tagged with a non-neutral score, it is clear how divisive many aspects of the game design are for the player base.

Several aspects feature in the top 20 of both sentiment lists which is indicative of the ‘mixed’ review score that game currently has on the Steam store.

While the campaign features promintently in both lists, the more than 1600 positive references far outstrip the number of negative references made in user reviews.

Similarly, the over 350 negative references to the game’s multiplayer aspect, is outweighed by almost 800 positive references.

The remainder of the overlapping aspects of design seem far more divisive and demonstrate more even splits in player opinion.

sns.set_style('whitegrid')
pos = (df[(df['sentiment']>0) & (df['aspect']!='game')]
                    .groupby('aspect')[['sentiment']]
                    .count().rename(columns={'sentiment':'Count'})
                    .sort_values(by='Count',ascending=False)
                    .reset_index()
                    .head(20))
                    
sns.catplot(data = pos,
            y='aspect',
            x='Count',
            kind='bar',
            palette = ['#88D8B0'],
            height = 6,
           aspect = 1.5)

plt.title('Positive Game Aspects',fontsize=14)
plt.tick_params(labelsize=12)
plt.ylabel('Aspect',fontsize=12)
plt.xlabel('Count',fontsize=12)
plt.xticks(list(range(0,1701,100)))
plt.tight_layout()
plt.show();

neg = (df[(df['sentiment']<0) & (df['aspect']!='game')]
                    .groupby('aspect')[['sentiment']]
                    .count().rename(columns={'sentiment':'Count'})
                    .sort_values(by='Count',ascending=False)
                    .reset_index()
                    .head(20))

sns.catplot(data = neg,
            y='aspect',
            x='Count',
            kind='bar',
            palette = ['#FF6F69'],
            height = 6,
           aspect = 1.5)
plt.title('Negative Game Aspects',fontsize=14)
plt.tick_params(labelsize=12)
plt.ylabel('Aspect',fontsize=12)
plt.xlabel('Count',fontsize=12)
plt.xticks(list(range(0,1701,100)))
plt.tight_layout()
plt.show();
_images/7_Interpretation_5_0.png _images/7_Interpretation_5_1.png

Shared Aspects#

neg1 = (df[(df['sentiment']<0) & (df['aspect']!='game')]
                    .groupby('aspect')[['sentiment']]
                    .count().rename(columns={'sentiment':'Count'})
                    .sort_values(by='Count',ascending=False)
                    .reset_index())
neg1 = neg1[neg1['Count']>99].set_index('aspect')

pos1 = (df[(df['sentiment']>0) & (df['aspect']!='game')]
                    .groupby('aspect')[['sentiment']]
                    .count().rename(columns={'sentiment':'Count'})
                    .sort_values(by='Count',ascending=False)
                    .reset_index())
pos1 = pos1[pos1['Count']>99].set_index('aspect')

pos1 = pos1.loc[pos1.index.intersection(neg1.index),].sort_index()
neg1 = neg1.loc[neg1.index.intersection(pos1.index),].sort_index()

graph, (plot1, plot2) = plt.subplots(1, 2,figsize=(10,6))
    
plot1.barh(neg1.index, neg1.Count, align='center',zorder=10,color = '#FF6F69')
plot1.set_xticks(list(range(0,1751,250)))
plot1.set_title('Negative Reviews',fontsize=14)
plot1.invert_xaxis()
plot1.invert_yaxis()
plot1.tick_params(axis='y',labelsize=12,right=False)

plot2.barh(neg1.index, pos1.Count, align='center',zorder=10,color = '#88D8B0')
plot2.set_xticks(list(range(0,1751,250)))
plot2.set_title('Positive Reviews',fontsize=15)
plot2.invert_yaxis()
plot2.yaxis.tick_right()
plot2.tick_params(axis='y',labelsize=12,right=False)

graph.tight_layout()
plt.subplots_adjust(wspace=0.02);
_images/7_Interpretation_7_0.png