Well, I am now just assuming that your question is meant to be answered in terms of WL. If not - than this might serve as a strong motivation to buy a license for this ingenious piece of software!
I start by importing and organizing you .csv data:
data0 = Import["<your datapath>/datapoints_hexagons.csv", "Data"];
pts = Map[Reverse, Transpose[Partition[#, 2] & /@ data0[[2 ;; -2, 2 ;;]]], {2}];
hex = Polygon /@ pts;
style = {#, EdgeForm[#]} & /@ {Red, Green, Blue, Gray};
Graphics[Flatten@{Opacity[.1], Riffle[style, hex]}, Frame -> True]
This gives:
Now the simple idea is to do a translation according to the center of every hexagon:
centers = RegionCentroid /@ hex;
subtract[pts_, pt_] := # - pt & /@ pts
newPoints = MapThread[subtract, {pts, centers}];
newHex = Polygon /@ newPoints;
Graphics[Flatten@{Opacity[.1], Riffle[style, newHex]}, Frame -> True]
which results in:
EDIT:
As a bonus: One can try a rotation correction like so:
getRotation[pts_List] := Module[{\[Phi]},
\[Phi] = Mod[(VectorAngle[{1, 0}, #] & /@ pts), Pi/6];
NArgMin[EuclideanDistance[\[Phi], ConstantArray[\[FormalA], 6]], \[FormalA]]
];
rot = getRotation /@ newPoints;
Graphics[Flatten@{Opacity[.1], Riffle[style, Thread[Rotate[newHex, rot]]]}, Frame -> True]