Faits : A. B._ est locataire depuis juin 1998 d'une surface commerciale d'environ 140 m 2 au centre de Genève, dans un immeuble construit en 1953 et appartenant à A._ SA. Celle-ci est aussi propriétaire de deux immeubles voisins. Le loyer, qui n'a pas varié, s'élève à 28'020 fr. par an, auquel s'ajoutent 2'400 fr. d'acomptes pour les charges. Le 19 novembre 2010, la bailleresse a résilié en temps utile le bail du locataire pour la prochaine échéance ordinaire, soit le 31 mai 2011. Elle n'a donné aucun motif. B. B.a. Le locataire a saisi la commission de conciliation le 24 novembre 2010. Devant cette autorité, la bailleresse a justifié la résiliation par un motif économique. La commission de conciliation a annulé le congé par décision du 16 janvier 2012, notifiée le 2 avril 2012. Le 2 mai 2012, la bailleresse a déposé une demande en validation de congé devant le Tribunal des baux et loyers du canton de Genève. Elle a fait valoir qu'il était impossible d'effectuer un calcul de rendement complet comme l'immeuble avait été acquis à une date très ancienne; toutefois, un calcul de rendement partiel, limité à la couverture des charges d'exploitation et financières, montrait déjà qu'il était possible d'obtenir un loyer plus élevé. La méthode des loyers comparatifs conduisait selon elle à la même conclusion. A l'audience du 28 novembre 2012, le Tribunal a attiré l'attention du conseil de la bailleresse sur le fait que les charges figurant dans les pièces produites devaient être ventilées entre les différents immeubles de la bailleresse, et que certaines charges comptabilisées n'étaient pas nécessairement prises en compte dans un calcul de rendement. Le conseil de la bailleresse s'est engagé à préciser ces charges. Il a également été avisé du fait que parmi les exemples comparatifs, certains immeubles appartenaient au même propriétaire alors que d'autres avaient été construits à des dates très différentes de l'immeuble litigieux, de sorte que tous ces exemples ne pourraient pas être pris en considération. Statuant par jugement du 3 mars 2014, le Tribunal des baux et loyers a annulé le congé et rejeté toutes autres conclusions. B.b. Cette décision a été confirmée le 2 mars 2015 par la Chambre des baux et loyers de la Cour de justice, statuant sur appel de la bailleresse. En substance, la Chambre a jugé que la bailleresse avait échoué à prouver par un calcul de rendement même partiel qu'il était possible d'augmenter le loyer de manière non abusive; elle n'avait en effet pas produit les pièces suffisantes malgré l'octroi d'un second délai. Au demeurant, en se fondant sur les charges courantes, charges d'entretien, charges financières et impôt immobilier complémentaire, l'on arrivait à un loyer annuel admissible de 28'095 fr. 20, alors que le loyer actuel était de 28'020 francs; la hausse de loyer susceptible d'être obtenue était insignifiante et ne justifiait pas une résiliation. Pour le surplus, la bailleresse n'avait fourni que deux exemples exploitables de loyers comparatifs au lieu des cinq requis par la jurisprudence; dès lors, elle ne démontrait pas non plus que les loyers du quartier lui permettaient de majorer le loyer. C. La bailleresse saisit le Tribunal fédéral d'un recours en matière civile dans lequel elle requiert que le congé donné pour le 31 mai 2011 soit validé, que le locataire ne bénéficie d'aucune prolongation de bail et que la cause soit renvoyée à l'autorité précédente pour qu'elle ordonne l'évacuation des locaux. Le locataire intimé conclut au rejet du recours. L'autorité précédente se réfère à son arrêt.