A mobile operator sees individuals; bundles, family plans and home services are sold to households. The billing account is the obvious proxy and a poor one: families split across accounts, and accounts carry lines that are not family. Treating a household as a small community in a graph of calls, night-time location and accounts — and finding it with Louvain community detection — recovers households the paperwork misses, and gives each an identifier that survives moves and churn.
Each pair of lines gets a weight from how often they call, whether they spend nights on the same cell, and whether they share a billing account. None of the three is reliable alone — neighbours share a cell, colleagues call daily, accounts carry employees' lines — so the weights combine them.
Louvain greedily moves lines between groups to raise modularity, then aggregates and repeats, which finds the social neighbourhood each line belongs to. Inside a neighbourhood a household is a set of lines joined by ties where at least two signals coincide; a group too large to be one home is split at its weakest tie. The parallel version used in the project does the same over tens of millions of lines.
Each detected household gets a head — its longest-tenured member — and an identifier keyed to it. A month later the detection is rerun: people churn, move out, join; the ID follows the household as long as most of it stays together, so campaigns and bundles see the same home over time.