MtCars.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <?php
  2. namespace MathPHP\SampleData;
  3. /**
  4. * mtcars dataset (Motor Trend Car Road Tests)
  5. *
  6. * The data was extracted from the 1974 Motor Trend US magazine, and comprises fuel consumption and 10 aspects of
  7. * automobile design and performance for 32 automobiles (1973–74 models).
  8. *
  9. * 32 observations on 11 variables.
  10. * R mtcars
  11. *
  12. * Source: Henderson and Velleman (1981), Building multiple regression models interactively. Biometrics, 37, 391–411.
  13. */
  14. class MtCars
  15. {
  16. private const LABELS = ['mpg', 'cyl', 'disp', 'hp', 'drat', 'wt', 'qsec', 'vs', 'am', 'gear', 'carb'];
  17. private const DATA = [
  18. 'Mazda RX4' => [21, 6, 160, 110, 3.9, 2.62, 16.46, 0, 1, 4, 4],
  19. 'Mazda RX4 Wag' => [21, 6, 160, 110, 3.9, 2.875, 17.02, 0, 1, 4, 4],
  20. 'Datsun 710' => [22.8, 4, 108, 93, 3.85, 2.32, 18.61, 1, 1, 4, 1],
  21. 'Hornet 4 Drive' => [21.4, 6, 258, 110, 3.08, 3.215, 19.44, 1, 0, 3, 1],
  22. 'Hornet Sportabout' => [18.7, 8, 360, 175, 3.15, 3.44, 17.02, 0, 0, 3, 2],
  23. 'Valiant' => [18.1, 6, 225, 105, 2.76, 3.46, 20.22, 1, 0, 3, 1],
  24. 'Duster 360' => [14.3, 8, 360, 245, 3.21, 3.57, 15.84, 0, 0, 3, 4],
  25. 'Merc 240D' => [24.4, 4, 146.7, 62, 3.69, 3.19, 20, 1, 0, 4, 2],
  26. 'Merc 230' => [22.8, 4, 140.8, 95, 3.92, 3.15, 22.9, 1, 0, 4, 2],
  27. 'Merc 280' => [19.2, 6, 167.6, 123, 3.92, 3.44, 18.3, 1, 0, 4, 4],
  28. 'Merc 280C' => [17.8, 6, 167.6, 123, 3.92, 3.44, 18.9, 1, 0, 4, 4],
  29. 'Merc 450SE' => [16.4, 8, 275.8, 180, 3.07, 4.07, 17.4, 0, 0, 3, 3],
  30. 'Merc 450SL' => [17.3, 8, 275.8, 180, 3.07, 3.73, 17.6, 0, 0, 3, 3],
  31. 'Merc 450SLC' => [15.2, 8, 275.8, 180, 3.07, 3.78, 18, 0, 0, 3, 3],
  32. 'Cadillac Fleetwood' => [10.4, 8, 472, 205, 2.93, 5.25, 17.98, 0, 0, 3, 4],
  33. 'Lincoln Continental' => [10.4, 8, 460, 215, 3, 5.424, 17.82, 0, 0, 3, 4],
  34. 'Chrysler Imperial' => [14.7, 8, 440, 230, 3.23, 5.345, 17.42, 0, 0, 3, 4],
  35. 'Fiat 128' => [32.4, 4, 78.7, 66, 4.08, 2.2, 19.47, 1, 1, 4, 1],
  36. 'Honda Civic' => [30.4, 4, 75.7, 52, 4.93, 1.615, 18.52, 1, 1, 4, 2],
  37. 'Toyota Corolla' => [33.9, 4, 71.1, 65, 4.22, 1.835, 19.9, 1, 1, 4, 1],
  38. 'Toyota Corona' => [21.5, 4, 120.1, 97, 3.7, 2.465, 20.01, 1, 0, 3, 1],
  39. 'Dodge Challenger' => [15.5, 8, 318, 150, 2.76, 3.52, 16.87, 0, 0, 3, 2],
  40. 'AMC Javelin' => [15.2, 8, 304, 150, 3.15, 3.435, 17.3, 0, 0, 3, 2],
  41. 'Camaro Z28' => [13.3, 8, 350, 245, 3.73, 3.84, 15.41, 0, 0, 3, 4],
  42. 'Pontiac Firebird' => [19.2, 8, 400, 175, 3.08, 3.845, 17.05, 0, 0, 3, 2],
  43. 'Fiat X1-9' => [27.3, 4, 79, 66, 4.08, 1.935, 18.9, 1, 1, 4, 1],
  44. 'Porsche 914-2' => [26, 4, 120.3, 91, 4.43, 2.14, 16.7, 0, 1, 5, 2],
  45. 'Lotus Europa' => [30.4, 4, 95.1, 113, 3.77, 1.513, 16.9, 1, 1, 5, 2],
  46. 'Ford Pantera L' => [15.8, 8, 351, 264, 4.22, 3.17, 14.5, 0, 1, 5, 4],
  47. 'Ferrari Dino' => [19.7, 6, 145, 175, 3.62, 2.77, 15.5, 0, 1, 5, 6],
  48. 'Maserati Bora' => [15, 8, 301, 335, 3.54, 3.57, 14.6, 0, 1, 5, 8],
  49. 'Volvo 142E' => [21.4, 4, 121, 109, 4.11, 2.78, 18.6, 1, 1, 4, 2],
  50. ];
  51. /**
  52. * Raw data without labels
  53. * [[21, 6, 160, ... ], [30.4, 4, 71.1, ... ], ... ]
  54. *
  55. * @return int[][]|float[][]
  56. */
  57. public function getData(): array
  58. {
  59. return \array_values(self::DATA);
  60. }
  61. /**
  62. * Raw data with each observation labeled
  63. * ['Car Model' => ['mpg' => 21, 'cyl' => 6, 'disp' => 160, ... ]]
  64. *
  65. * @return array<string, array<string, int|float>>
  66. */
  67. public function getLabeledData(): array
  68. {
  69. /** @var array<string, array<string, int|float>> */
  70. return \array_map(
  71. function (array $data) {
  72. return \array_combine(self::LABELS, $data);
  73. },
  74. self::DATA
  75. );
  76. }
  77. /**
  78. * Car model names
  79. *
  80. * @return array<string>
  81. */
  82. public function getModels(): array
  83. {
  84. return \array_keys(self::DATA);
  85. }
  86. /**
  87. * Data for a car model, with labels
  88. * ['mpg' => 21, 'cyl' => 6, 'disp' => 160, ... ]
  89. *
  90. * @param string $model
  91. *
  92. * @return array<string, int|float>
  93. */
  94. public function getModelData(string $model): array
  95. {
  96. /** @var array<string, int|float> */
  97. return \array_combine(self::LABELS, self::DATA[$model]);
  98. }
  99. /**
  100. * Miles per gallon observations for all models
  101. * ['Mazda RX4' => 21, 'Honda civic' => 30.4, ... ]
  102. *
  103. * @return array<string, int|float>
  104. */
  105. public function getMpg(): array
  106. {
  107. /** @var array<string, int|float> */
  108. return \array_combine($this->getModels(), \array_column(self::DATA, 0));
  109. }
  110. /**
  111. * Number of cylinders observations for all models
  112. * ['Mazda RX4' => 6, 'Honda civic' => 4, ... ]
  113. *
  114. * @return int[]
  115. */
  116. public function getCyl(): array
  117. {
  118. return \array_column(self::DATA, 1);
  119. }
  120. /**
  121. * Displacement (cubic inches) observations for all models
  122. * ['Mazda RX4' => 160, 'Honda civic' => 75.7, ... ]
  123. *
  124. * @return int[]|float[]
  125. */
  126. public function getDisp(): array
  127. {
  128. return \array_column(self::DATA, 2);
  129. }
  130. /**
  131. * Gross horsepower observations for all models
  132. * ['Mazda RX4' => 110, 'Honda civic' => 52, ... ]
  133. *
  134. * @return int[]
  135. */
  136. public function getHp(): array
  137. {
  138. return \array_column(self::DATA, 3);
  139. }
  140. /**
  141. * Rear axle ratio observations for all models
  142. * ['Mazda RX4' => 3.9, 'Honda civic' => 4.93, ... ]
  143. *
  144. * @return float[]
  145. */
  146. public function getDrat(): array
  147. {
  148. return \array_column(self::DATA, 4);
  149. }
  150. /**
  151. * Weight (1,000 pounds) observations for all models
  152. * ['Mazda RX4' => 2.62, 'Honda civic' => 1.615, ... ]
  153. *
  154. * @return float[]
  155. */
  156. public function getWt(): array
  157. {
  158. return \array_column(self::DATA, 5);
  159. }
  160. /**
  161. * Quarter-mile time observations for all models
  162. * ['Mazda RX4' => 16.46, 'Honda civic' => 18.52, ... ]
  163. *
  164. * @return float[]
  165. */
  166. public function getQsec(): array
  167. {
  168. return \array_column(self::DATA, 6);
  169. }
  170. /**
  171. * V/S observations for all models
  172. * ['Mazda RX4' => 0, 'Honda civic' => 1, ... ]
  173. *
  174. * @return int[]
  175. */
  176. public function getVs(): array
  177. {
  178. return \array_column(self::DATA, 7);
  179. }
  180. /**
  181. * Transmission (automatic: 0, manual: 1) observations for all models
  182. * ['Mazda RX4' => 1, 'Honda civic' => 1, ... ]
  183. *
  184. * @return int[]
  185. */
  186. public function getAm(): array
  187. {
  188. return \array_column(self::DATA, 8);
  189. }
  190. /**
  191. * Number of forward gears observations for all models
  192. * ['Mazda RX4' => 4, 'Honda civic' => 4, ... ]
  193. *
  194. * @return int[]
  195. */
  196. public function getGear(): array
  197. {
  198. return \array_column(self::DATA, 9);
  199. }
  200. /**
  201. * Number of carburetors observations for all models
  202. * ['Mazda RX4' => 4, 'Honda civic' => 2, ... ]
  203. *
  204. * @return int[]
  205. */
  206. public function getCarb(): array
  207. {
  208. return \array_column(self::DATA, 10);
  209. }
  210. }