Analysis of E-Commerce Data: Profile Pictures

When setting up an e-commerce account, it may seem like common sense to ensure that your merchant profile has the appropriate branding, logos, and images. Taking these steps can help to elevate your profile, and lend it a sense of credibility in the eyes of potential customers. I recently found a dataset on Kaggle that contains product listings, ratings, and sales for “summer” products on Wish for August 2020. The dataset, “Sales of summer clothes in E-commerce Wish” by Jeffrey Mvutu Mabilama is licensed under CC BY 4.0, and contains all sorts of useful variables like product description tags, a flag to indicate the use of ads, and a flag for the use of a merchant profile picture.

If we look closer at the variable that tells us whether or not the merchant has a profile picture, we can generate a statistical graphic like the one below:

A graphic showing the tendencies of merchants that use profile pictures and those that do not.

In the top left we see that there are more merchants not using profile pictures, than there are merchants using them, in total there are about 13% of the total merchants in the dataset using profile pictures. The boxplot in the top right shows that merchants with profile pictures tend to have a higher median merchant rating with less variance than merchants without them. This story repeats itself in the two boxplots on the bottom of the graphic, showing that merchants with profile pictures tend to have higher-rated products and sell more units.

Remember, that correlation does not imply causation, there could be something other than profile pictures driving the better performance of these merchants. We could use the profile pictures variable as a proxy for a well-branded and highly-credible merchant profile, which would increase trust and willingness to purchase for potential customers. At the very least, if you’re setting up an e-commerce account, make sure to include a profile picture.

As a side note, I do just about all of my analysis in python, if you’re a fan of Matplotlib, you may be interested in the code that I used to build the above graphic, so I’ve included it below:

# Create figure
fig = plt.figure(figsize = (10,10))

# Create grid
gs = GridSpec(2,2, figure = fig)

# Create axes
ax1 = fig.add_subplot(gs[0,0])
ax2 = fig.add_subplot(gs[0,1])
ax3 = fig.add_subplot(gs[1,0])
ax4 = fig.add_subplot(gs[1,1])

# Count plot
prof_pic = df.groupby('merchant_has_profile_picture').agg({'title': 'count'}).reset_index()
prof_pic.columns = ['Prof_Pic', 'Count']
prof_pic['Prof_Pic'] = prof_pic['Prof_Pic'].map({0: 'No', 1: 'Yes'})
ax1.bar(prof_pic['Prof_Pic'], prof_pic['Count'])
ax1.set_title('Count of Merchants by Profile Picture Status')
ax1.yaxis.set_major_formatter(matplotlib.ticker.StrMethodFormatter('{x:,.0f}'))

# Rating box
ax2.boxplot((df.filter(items=['merchant_has_profile_picture','merchant_rating'])
               .query('merchant_has_profile_picture == 0')
               .reset_index(drop=True))['merchant_rating'], positions = [1])

ax2.boxplot((df.filter(items=['merchant_has_profile_picture','merchant_rating'])
               .query('merchant_has_profile_picture == 1')
               .reset_index(drop=True))['merchant_rating'], positions = [2])

ax2.set_title('Merchant Rating by Profile Picture Status')
ax2.set_xticks(range(4))
ax2.set_xticklabels(['','No','Yes',''])

# Product rating box
ax3.boxplot((df.filter(items=['merchant_has_profile_picture','rating'])
               .query('merchant_has_profile_picture == 0')
               .reset_index(drop=True))['rating'], positions = [1])

ax3.boxplot((df.filter(items=['merchant_has_profile_picture','rating'])
               .query('merchant_has_profile_picture == 1')
               .reset_index(drop=True))['rating'], positions = [2])

ax3.set_title('Product Rating by Merchant Profile Picture Status')
ax3.set_xticks(range(4))
ax3.set_xticklabels(['','No','Yes',''])

# Units sold box
ax4.boxplot(np.log10(df.filter(items=['merchant_has_profile_picture','units_sold'])
                       .query('merchant_has_profile_picture == 0')
                       .reset_index(drop=True)['units_sold']), positions = [1])

ax4.boxplot(np.log10(df.filter(items=['merchant_has_profile_picture','units_sold'])
                       .query('merchant_has_profile_picture == 1')
                       .reset_index(drop=True)['units_sold']), positions = [2])

ax4.set_title('Log10(Units Sold) by Merchant Profile Picture Status')
ax4.set_xticks(range(4))
ax4.set_xticklabels(['','No','Yes',''])

# Despine
for ax in [ax1,ax2,ax3,ax4]:
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)

plt.tight_layout()
#plt.show()
plt.savefig('Ratings_Profile_Picture.png', dpi = 300)

Leave a Reply