Let me start by saying, I love coffee!
One element of a good brew is the way we grind the beans. I was in the market for a coffee grinder so I browsed grinders on Jet Black Espresso (https://www.jetblackespresso.com.au). But here’s the thing, they have over 100 grinders in stock ranging from hand grinders to full scale commercial. In my quest to find the right grinder I decided to look at customer reviews on Jet Black Espresso.
To answer this question I gathered all the coffee grinder reviews from Jet Black Espresso using BeatifulSoup. Before I get into the technical details of web scraping I’ll share some basics stats:
- 106 coffee grinders,
- 42 total reviews,
- 21 product reviews,
- Each grinder review was rated 1-5 stars (1 = worst, 5 = best).
The first step was to collect the URL’s of each grinder model. There are six pages of grinder models listed on the coffee grinder web page.
To get the URL’s of each model I used a simple for loop for each page and saved the model names in a list for later use:
Each grinder model has its own URL where the extension is the model model name. The next step is to format model names and append to the URL.
Now that we have a way to land on each model page we can now extract the price and review ratings. I will edit and reuse the above code in a for loop:
Convert dictionaries to dataframes then merge into one.
So far so good, but the ‘Model’ column needs some tidying up as it contains both brand and model name and the ‘Price’ column is actually an object. For simplicity I will convert this to an integer.
There was one more step before I was ready to start my analysis. I need to unpack the ‘Rating’ column so that each review occupied it’s own row. To do this I used the explode function.
Okay, so now I’m ready to start analysing the data through visualisation. I decided to use Tableau for this task because it is a small data set and creating plots is much faster. The first thing I want to look at is the number of grinder reviewed vs total grinders available.
Secondly, I subjectively grouped the models into four categories:
- Entry Level – Basic grinder less than $500
- Entry Level plus – All the features of the entry level grinder with one or two additional features and a price point less than $600.
- Mid Range – Represents a step up in features and less than $1000. This could be quieter, larger burrs or automatic dosing, etc.
- High End – Prosumer or commercial grade category where the unit price is greater than $1000.
After grouping the models into categories I was ready to plot on a bar chart.
After plotting the bar chart out there are a few things that stick out:
- There is a bias in positive reviews where all reviews are above 4.0. Perhaps this suggests that the sales team is doing a good job of matching the consumer with the right product or maybe the website has a filter and only posts positive reviews.
- There is a massive spread in price from $279 – $2949. That’s a ten fold gap!
- Review ratings indicate there is not enough data because 12/21 models have only one review
Going back to our original problem statement,
‘Can customer reviews provide guidance on which grinder I should purchase?‘
After looking at the web scrape results I think the data is useful but we must recognise that it is incomplete for the reasons stated above. For my own personal purposes, I was looking for an entry level grinder that had good reviews. Based on the review ratings, the Lelit PL043 fits my criteria. The price point is sub $500, a total of five customer reviews and all reviews received a five star rating. If I was willing to splash a bit more cash I would look at the Lelit PL72 or the ProfitecPro T64. Keep in mind, this information should not be the be all end all. It has simply provided me some insights as to which models might be more suitable for me. The next step is to have a conversation with sales staff and find out more about these models.