Faits : A. A.a. B._ (ci-après : l'assurée), née en 1963, est affiliée auprès de A._ SA (ci-après: la compagnie d'assurance) au titre de l'assurance-maladie complémentaire. Elle a pu bénéficier d'un rabais dans le cadre d'un contrat collectif conclu par son employeur. S'agissant de la couverture d'assurance en cas d'hospitalisation, l'assurée a opté pour le produit P1._ privé, sans franchise, couvrant notamment les frais supplémentaires de traitement et de pension en cas de séjour hospitalier en division privée, avec une participation aux frais de convalescence, d'aide à domicile et de transport. Le 1 er janvier 2008, la compagnie d'assurance a été intégrée dans le groupe C._, organisé sous forme de holding, qui comprend notamment C._ SA. A.b. En 2011, la prime d'assurance P1._ de l'assurée s'élevait à 125 fr. 80 par mois. En 2012, cette prime a été fixée à 394 fr. 50, après déduction d'un rabais de 20 fr. 80 en vertu du contrat-cadre souscrit par l'employeur. Par courrier du 24 janvier 2012, l'assurée a contesté cette augmentation de 213,6%, la qualifiant de « surprenante et injustifiée ». La compagnie d'assurance lui a répondu le 17 février 2012 qu'elle faisait partie du contrat collectif conclu avec son employeur, de sorte qu'elle bénéficiait depuis des années d'un rabais sur ses assurances complémentaires; au vu de la rentabilité du contrat et étant donné que les primes encaissées ne couvraient plus les prestations versées, l'assurance P1._ avait dû faire l'objet d'une adaptation plus importante que les autres années. Par pli du 21 février 2012, l'assurée a rétorqué qu'à l'évidence, P1._ était désormais une police fermée qui n'acceptait plus aucun assuré; partant, elle demandait à être transférée dans une police d'assurance complémentaire aux prestations équivalentes, avec effet rétroactif au 1 er janvier 2012. Diverses correspondances ont été échangées sans que la compagnie d'assurance n'accède à la requête de l'assurée. B. B.a. Le 28 août 2013, l'assurée a saisi la Chambre des assurances sociales de la Cour de justice du canton de Genève d'une demande dirigée contre la compagnie d'assurance, concluant d'une part à son transfert dans l'assurance hospitalisation P2._ avec effet rétroactif au 1 er janvier 2012, d'autre part au remboursement des montants perçus en trop en raison des primes plus élevées de l'assurance complémentaire P1._. En substance, la demanderesse a fait valoir que l'assurance P1._ était un portefeuille fermé. Elle a cité l'exemple de deux amies ayant demandé à conclure une assurance P1._, auxquelles la défenderesse avait répondu que le produit n'existait plus; ces personnes s'étaient vu proposer respectivement une assurance P2._ avec des prestations équivalentes moyennant une prime mensuelle de 271 fr. 10 et une assurance P3._ pour une prime de 112 fr. 60 par mois. Une copie des deux propositions d'assurance établies par C._ SA a été produite. Par réponse du 27 septembre 2013, la défenderesse a conclu au rejet de la demande. Elle a concédé que l'assurance litigieuse n'était plus spontanément proposée aux nouveaux assurés, tout en précisant que ceux-ci pouvaient en conclure une s'ils le souhaitaient; de son point de vue, il s'agissait d'une assurance passive se distinguant d'un portefeuille fermé. En annexe à sa réplique, la demanderesse a produit un courrier du 4 octobre 2013 par lequel la défenderesse lui annonçait la résiliation du contrat collectif avec son employeur pour fin 2013 et la continuation de sa couverture d'assurance P1._ sur une base individuelle à partir du 1 er janvier 2014. B.b. Le 3 mars 2014, la Cour de justice a adressé un questionnaire à la défenderesse en l'invitant à joindre « toutes pièces justificatives utiles (extraits statistiques informatisés...) » à l'appui de ses réponses. Elle demandait en particulier à quelle date remontait la dernière conclusion d'une police d'assurance P1._, quel était le nombre de polices P1._ conclues en 2011, 2012, 2013 et 2014, respectivement quelle était l'évolution du nombre total des assurés P1._ et leur âge moyen pendant cette même période. Par courrier du même jour, la Cour a posé à C._ SA des questions semblables à propos de la police d'assurance P2._. Elle a par ailleurs demandé à quelle assurance du groupe C._ SA le produit P1._ correspondait le mieux, si le produit P2._ n'était pas le contrat le plus équivalent possible à P1._. La défenderesse a répondu au questionnaire par courrier du 20 mars 2014, sans fournir de pièces justificatives. Elle a indiqué que la dernière conclusion d'une assurance P1._ remontait au 12 mars 2014. Les chiffres fournis montraient que la conclusion de contrats P1._ avait diminué de 63% entre 2011 et 2012, puis de 22% entre 2012 et 2013. Le nombre d'assurés entre le 1 er janvier 2011 et le 1 er janvier 2014 avait diminué de - 40,6 %, tandis que l'âge moyen du portefeuille, supérieur à 49 ans en 2011, avait augmenté les années suivantes (cf. au surplus consid. 3.2 infra). C._ SA a pour sa part indiqué que le nombre d'assurés à l'assurance hospitalisation P2._ avait augmenté de plus de 64% entre le 1 er janvier 2011 et le 1 er janvier 2014; l'âge moyen du portefeuille, inférieur à 40 ans en 2011, avait diminué en 2014. Selon ses indications, le montant des primes mensuelles pour une femme née en 1963, domiciliée à Genève, était de 231 fr. 30 en 2012, 240 fr. 60 en 2013 et 257 fr. 30 en 2014. Quant à savoir à quel produit du groupe l'assurance P1._ correspondait le mieux, si ce n'était pas l'assurance P2._, C._ SA a répondu que ce produit-ci était un produit de l'assurance complémentaire de C._ SA pour l'hospitalisation à titre privé, tout comme P1._ était un produit de l'assurance complémentaire de la défenderesse pour l'hospitalisation à titre privé. B.c. La Cour de justice a interrogé par écrit les deux personnes qui, selon les allégations de la demanderesse, avaient vainement demandé à conclure une assurance P1._. La défenderesse s'est déterminée par courrier du 10 novembre 2014 sur les réponses données. La demanderesse s'est encore exprimée par écritures des 22 janvier et 25 juin 2015, tandis que la défenderesse s'est déterminée par écriture du 23 juillet 2015. Le 12 août 2015, la demanderesse a persisté dans ses conclusions. Après avoir adressé une copie de cette écriture à la défenderesse, la Chambre des assurances sociales a gardé la cause à juger. B.d. Par arrêt du 8 octobre 2015, la Chambre des assurances sociales a partiellement admis la demande, en ce sens qu'elle a d'une part ordonné à la compagnie d'assurance de mettre en oeuvre le transfert de l'assurée dans l'assurance hospitalisation P2._ avec effet rétroactif au 1 er janvier 2012, et l'a d'autre part condamnée à rembourser à l'assurée la différence des primes payées en trop à partir du 1 er janvier 2012. Les juges cantonaux ont considéré en bref que la défenderesse n'avait pas établi par pièces justificatives les chiffres qu'elle avait communiqués, mais que quand bien même des polices d'assurance P1._ auraient encore été conclues à compter de 2012, ce portefeuille devait néanmoins être considéré comme un portefeuille fermé au sens de l'art. 156 de l'ordonnance du 9 novembre 2005 sur la surveillance des entreprises d'assurances privées (OS; RS 961.011); sur cette base, la demanderesse était en droit d'exiger son transfert dans un portefeuille ouvert d'une entreprise d'assurance appartenant au même groupe d'assurance, à savoir une assurance d'hospitalisation P2._ auprès de C._ SA. C. La compagnie d'assurance a interjeté un recours en matière civile et un recours constitutionnel subsidiaire auprès du Tribunal fédéral. Elle a conclu principalement au rejet de la demande. Une ordonnance présidentielle du 8 décembre 2015 a fait droit à la requête d'effet suspensif formée à l'appui du recours. L'assurée a conclu au rejet des recours en tant qu'ils sont recevables. Chaque partie a spontanément déposé une écriture supplémentaire.