I have table that contains widget orders for multiple departments, with each department represented by its buyer. The table structure looks like this:
+--------------------------+------------+------------+------------+
| order_id | order_date | dept_buyer | widget_mfg |
+--------------------------+------------+------------+------------+
| 56991ba89468d0fc1d53781d | 2/16/2015 | Gutierrez | OTHERSIDE |
| 56991ba8f020fc065e5b7219 | 11/14/2014 | Moreno | QUALITEX |
| 56991ba82340ecb7b2e9dda8 | 1/15/2015 | Gutierrez | PROGENEX |
| 56991ba87bacb0ee3161fd61 | 2/4/2015 | Glover | ULTRASURE |
| 56991ba8ade6acae3307a3e9 | 4/20/2015 | Hancock | WEBIOTIC |
| 56991ba80b404bcc73094e66 | 4/3/2014 | Castro | PROGENEX |
| 56991ba8cb37eda5e5557a74 | 7/21/2014 | Moreno | OTHERSIDE |
+--------------------------+------------+------------+------------+
Each row represents a single widget order, as widgets are generally ordered individually. The actual table has tens of thousands of rows representing ~3 years of orders. There are ~100 department buyers, ~1000 widget manufacturers.
I want to provide department buyers an order form that contains their most commonly ordered widgets for easier purchasing. From prior experience, I know that many department buyers order similar widgets. That is, department buyers can be clustered together by their widget buying behavior. For this reason, as well as for maintenance purposes, I would like to create as few forms as possible while still capturing the most commonly ordered widgets for the department buyers that will use the form.
This seems like a machine learning clustering problem to me, but I am not familiar enough with the subject area to get a foothold on the problem. Is there an established algorithm or library for tackling a problem like this one?